From 42f289d994020e3e8ce8b35ce78128625679b4a6 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 9 Oct 2011 16:01:48 +0100 Subject: [PATCH 001/546] Updated bug message --- apps/files_texteditor/js/editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index f7b924d494d..87810702f62 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -72,7 +72,7 @@ function bindControlEvents(){ } function editorIsShown(){ - // Not working as intended. Always returns true. + // Not working as intended. if(window.aceEditor){ return true; } else { -- GitLab From 9bde002c95e35c84c2c53ddbf5f3d196cff5812d Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Fri, 14 Oct 2011 22:56:14 +0100 Subject: [PATCH 002/546] Fixed issue with opening editor multiple times. --- apps/files_texteditor/js/editor.js | 97 ++++++++++++++++-------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 87810702f62..a2581d4143f 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -4,6 +4,7 @@ function setEditorSize(){ } function getFileExtension(file){ + // Extracts the file extension from the full filename var parts=file.split('.'); return parts[parts.length-1]; } @@ -11,7 +12,6 @@ function getFileExtension(file){ function setSyntaxMode(ext){ // Loads the syntax mode files and tells the editor var filetype = new Array(); - // Todo finish these filetype["h"] = "c_cpp"; filetype["c"] = "c_cpp"; filetype["cpp"] = "c_cpp"; @@ -63,17 +63,21 @@ function showControls(filename){ function bindControlEvents(){ $("#editor_save").live('click',function() { - doFileSave(); + if(editorIsShown()){ + doFileSave(); + } }); $('#editor_close').live('click',function() { - hideFileEditor(); + if(editorIsShown()){ + hideFileEditor(); + } }); } function editorIsShown(){ // Not working as intended. - if(window.aceEditor){ + if($('#editor').attr('editorshown')=='true'){ return true; } else { return false; @@ -91,55 +95,56 @@ function updateSessionFileHash(path){ function doFileSave(){ if(editorIsShown()){ - $('#editor_save').after(''); - var filecontents = window.aceEditor.getSession().getValue(); - var dir = $('#editor').attr('data-dir'); - var file = $('#editor').attr('data-filename'); - $.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, file: file, dir: dir },function(jsondata){ - - if(jsondata.status == 'failure'){ - var answer = confirm(jsondata.data.message); - if(answer){ - $.post(OC.filePath('files_texteditor','ajax','savefile.php'),{ filecontents: filecontents, file: file, dir: dir, force: 'true' },function(jsondata){ - if(jsondata.status =='success'){ - $('#saving_icon').remove(); - $('#editor_save').after('

Saved!

') - setTimeout(function() { - $('#save_result').remove(); - }, 2000); - } - else { - // Save error - $('#saving_icon').remove(); - $('#editor_save').after('

Failed!

'); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); - }, 2000); - } - }, 'json'); + $('#editor_save').after(''); + var filecontents = window.aceEditor.getSession().getValue(); + var dir = $('#editor').attr('data-dir'); + var file = $('#editor').attr('data-filename'); + $.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, file: file, dir: dir },function(jsondata){ + + if(jsondata.status == 'failure'){ + var answer = confirm(jsondata.data.message); + if(answer){ + $.post(OC.filePath('files_texteditor','ajax','savefile.php'),{ filecontents: filecontents, file: file, dir: dir, force: 'true' },function(jsondata){ + if(jsondata.status =='success'){ + $('#saving_icon').remove(); + $('#editor_save').after('

Saved!

') + setTimeout(function() { + $('#save_result').remove(); + }, 2000); + } + else { + // Save error + $('#saving_icon').remove(); + $('#editor_save').after('

Failed!

'); + setTimeout(function() { + $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); + }, 2000); + } + }, 'json'); + } + else { + // Don't save! + $('#saving_icon').remove(); + // Temporary measure until we get a tick icon + $('#editor_save').after('

Saved!

'); + setTimeout(function() { + $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); + }, 2000); + } } - else { - // Don't save! + else if(jsondata.status == 'success'){ + // Success $('#saving_icon').remove(); // Temporary measure until we get a tick icon $('#editor_save').after('

Saved!

'); setTimeout(function() { $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); }, 2000); - } - } - else if(jsondata.status == 'success'){ - // Success - $('#saving_icon').remove(); - // Temporary measure until we get a tick icon - $('#editor_save').after('

Saved!

'); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); - }, 2000); - } - }, 'json'); - giveEditorFocus(); + } + }, 'json'); + giveEditorFocus(); } else { + $('#editor').data('editor','false'); return; } }; @@ -155,6 +160,7 @@ function showFileEditor(dir,filename){ url: OC.filePath('files','ajax','download.php')+'?files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent(dir), complete: function(data){ // Initialise the editor + $('#editor').attr('editorshown','true'); updateSessionFileHash(dir+'/'+filename); showControls(filename); $('table').fadeOut('slow', function() { @@ -178,6 +184,7 @@ function showFileEditor(dir,filename){ } function hideFileEditor(){ + $('#editor').attr('editorshown','false'); // Fade out controls $('#editor_close').fadeOut('slow'); // Fade out the save button -- GitLab From 55e8b02a0923ed33c2c3a17c21d2e6c5e1692192 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Tue, 18 Oct 2011 21:42:27 +0200 Subject: [PATCH 003/546] new way of showing gallery covers --- apps/gallery/lib/images_utils.php | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 apps/gallery/lib/images_utils.php diff --git a/apps/gallery/lib/images_utils.php b/apps/gallery/lib/images_utils.php new file mode 100644 index 00000000000..cb46bf3f160 --- /dev/null +++ b/apps/gallery/lib/images_utils.php @@ -0,0 +1,43 @@ + $ratio_orig) { + $new_height = $thumbnail_width/$ratio_orig; + $new_width = $thumbnail_width; + } else { + $new_width = $thumbnail_height*$ratio_orig; + $new_height = $thumbnail_height; + } + + $x_mid = $new_width/2; //horizontal middle + $y_mid = $new_height/2; //vertical middle + + $process = imagecreatetruecolor(round($new_width), round($new_height)); + + imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + imagecopyresampled($tgtImg, $process, $shift, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); + + imagedestroy($process); + imagedestroy($myImage); +} + +?> -- GitLab From c32cce4b35919c255089922abe64f5fe833ecb27 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Tue, 18 Oct 2011 21:43:33 +0200 Subject: [PATCH 004/546] new way of showing gallery covers, missing files --- apps/gallery/ajax/getAlbums.php | 2 +- apps/gallery/ajax/scanForAlbums.php | 1 + apps/gallery/index.php | 6 ++++++ apps/gallery/js/album_cover.js | 2 +- apps/gallery/js/albums.js | 6 +++--- apps/gallery/lib_scanner.php | 22 +++++++++++++++++++++- 6 files changed, 33 insertions(+), 6 deletions(-) diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php index 38bea74636f..60d3d42866d 100644 --- a/apps/gallery/ajax/getAlbums.php +++ b/apps/gallery/ajax/getAlbums.php @@ -11,7 +11,7 @@ while ($r = $result->fetchRow()) { $album_name = $r['album_name']; $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE `album_id` = ?'); $tmp_res = $stmt->execute(array($r['album_id'])); - $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10)); + $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10), 'bgPath' => OC::$WEBROOT.'/data/'.OC_User::getUser().'/gallery/'.$album_name.'.png'); } OC_JSON::success(array('albums'=>$a)); diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php index de0b141a367..bdd591d0422 100644 --- a/apps/gallery/ajax/scanForAlbums.php +++ b/apps/gallery/ajax/scanForAlbums.php @@ -5,6 +5,7 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); require_once('../lib_scanner.php'); +OC_GALLERY_SCANNER::cleanUp(); OC_JSON::success(array('albums' => OC_GALLERY_SCANNER::scan(''))); //OC_JSON::success(array('albums' => array(array('name' => 'test', 'imagesCount' => 1, 'images' => array('dupa'))))); diff --git a/apps/gallery/index.php b/apps/gallery/index.php index 87fdafcf13c..cb567e3c8f6 100644 --- a/apps/gallery/index.php +++ b/apps/gallery/index.php @@ -5,6 +5,12 @@ OC_Util::checkLoggedIn(); OC_Util::checkAppEnabled('gallery'); OC_App::setActiveNavigationEntry( 'gallery_index' ); +if (!file_exists(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery')) { + mkdir(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery'); + $f = fopen(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery/.htaccess', 'w'); + fwrite($f, "allow from all"); + fclose($f); +} if (!isset($_GET['view'])) { $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?'); diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js index 776feae32cc..c475c60d5da 100644 --- a/apps/gallery/js/album_cover.js +++ b/apps/gallery/js/album_cover.js @@ -4,7 +4,7 @@ $(document).ready(function() { if (r.status == 'success') { for (var i in r.albums) { var a = r.albums[i]; - Albums.add(a.name, a.numOfItems); + Albums.add(a.name, a.numOfItems, a.bgPath); } var targetDiv = document.getElementById('gallery_list'); if (targetDiv) { diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js index 7ab243ededf..a8e317159d5 100644 --- a/apps/gallery/js/albums.js +++ b/apps/gallery/js/albums.js @@ -12,13 +12,13 @@ Albums={ // album with the same name wont be insered, // and false will be returned // true on success - add: function(album_name, num) { + add: function(album_name, num, bgPath) { for (var a in Albums.albums) { if (a.name == album_name) { return false; } } - Albums.albums.push({name: album_name, numOfCovers: num}); + Albums.albums.push({name: album_name, numOfCovers: num, backgroundPath: bgPath}); return true; }, // remove element with given name @@ -63,7 +63,7 @@ Albums={ var local = $(displayTemplate.replace(/\*NAME\*/g, a.name)); local.css('background-repeat', 'no-repeat'); local.css('background-position', '0 0'); - local.css('background-image','url("ajax/getCovers.php?album_name='+a.name+'")'); + local.css('background-image','url("'+a.backgroundPath+'")'); local.mousemove(function(e) { var albumMetadata = Albums.find(this.title); if (albumMetadata == undefined) { diff --git a/apps/gallery/lib_scanner.php b/apps/gallery/lib_scanner.php index 5490c4a55ad..30a86b7405d 100644 --- a/apps/gallery/lib_scanner.php +++ b/apps/gallery/lib_scanner.php @@ -1,6 +1,7 @@ execute(array()); + $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos'); + $stmt->execute(array()); + } + public static function scanDir($path, &$albums) { $current_album = array('name'=> $path, 'imagesCount' => 0, 'images' => array()); $current_album['name'] = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $current_album['name'])); @@ -24,7 +32,7 @@ class OC_GALLERY_SCANNER { } elseif (self::isPhoto($path.'/'.$filename)) { $current_album['images'][] = $filepath; } - } + } } $current_album['imagesCount'] = count($current_album['images']); $albums[] = $current_album; @@ -46,6 +54,18 @@ class OC_GALLERY_SCANNER { $stmt->execute(array($albumId, $img)); } } + if (count($current_album['images'])) { + self::createThumbnail($current_album['name'],$current_album['images']); + } + } + + public static function createThumbnail($albumName, $files) { + $file_count = min(count($files), 10); + $thumbnail = imagecreatetruecolor($file_count*200, 200); + for ($i = 0; $i < $file_count; $i++) { + CroppedThumbnail(OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/files/'.$files[$i], 200, 200, $thumbnail, $i*200); + } + imagepng($thumbnail, OC_Config::getValue("datadirectory").'/'. OC_User::getUser() .'/gallery/' . $albumName.'.png'); } public static function isPhoto($filename) { -- GitLab From b40122832fdc3ebac05ca46e941f1c20698f1d06 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 21 Oct 2011 16:11:38 +0200 Subject: [PATCH 005/546] first implementation of fullcalendar plugin with old buttons working --- apps/calendar/templates/calendar.php | 84 +++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 1c948b948c2..eb50bc9541c 100644 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -6,6 +6,86 @@ var dayNamesShort = tA(array('Sun.', 'Mon.', 'Tue.', var monthNames = tA(array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'))) ?>; var monthNamesShort = tA(array('Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'))) ?>; var allDayText = 't('All day') ?>'; +var neweventtitle = 't('Title') ?>'; +$(document).ready(function() { + var date = new Date(); + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + + var calendar = $('#calendar').fullCalendar({ + selectable: true, + selectHelper: true, + select: function(start, end, allDay) { + var title = prompt(neweventtitle + ':'); + if (title) { + calendar.fullCalendar('renderEvent', + { + title: title, + start: start, + end: end, + allDay: allDay + }, + true // make the event "stick" + ); + } + calendar.fullCalendar('unselect'); + }, + editable: true, + events: [ + { + title: 'All Day Event', + start: new Date(y, m, 1) + }, + { + title: 'Long Event', + start: new Date(y, m, d-5), + end: new Date(y, m, d-2) + }, + { + id: 999, + title: 'Repeating Event', + start: new Date(y, m, d-3, 16, 0), + allDay: false + }, + { + id: 999, + title: 'Repeating Event', + start: new Date(y, m, d+4, 16, 0), + allDay: false + }, + { + title: 'Meeting', + start: new Date(y, m, d, 10, 30), + allDay: false + }, + { + title: 'Lunch', + start: new Date(y, m, d, 12, 0), + end: new Date(y, m, d, 14, 0), + allDay: false + }, + { + title: 'Birthday Party', + start: new Date(y, m, d+1, 19, 0), + end: new Date(y, m, d+1, 22, 30), + allDay: false + }, + { + title: 'Click for Google', + start: new Date(y, m, 28), + end: new Date(y, m, 29), + url: 'http://google.com/' + } + ] + }); + var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear()); + $('#oneweekview_radio').click(function(){$('#calendar').fullCalendar( 'changeView', 'agendaWeek');}); + $('#onemonthview_radio').click(function(){$('#calendar').fullCalendar( 'changeView', 'month');}); + $('#today_input').click(function(){$('#calendar').fullCalendar( 'today' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); + $('#datecontrol_left').click(function(){$('#calendar').fullCalendar( 'prev' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); + $('#datecontrol_right').click(function(){$('#calendar').fullCalendar( 'next' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); +});
@@ -13,7 +93,7 @@ var allDayText = 't('All day') ?>';
- +
@@ -31,7 +111,7 @@ var allDayText = 't('All day') ?>';
-
+
-- GitLab From d09b3ad2e74d34e8563322864aa0b452d0ad4e67 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 21 Oct 2011 17:50:10 +0200 Subject: [PATCH 006/546] Revert "first implementation of fullcalendar plugin with old buttons working" This reverts commit b40122832fdc3ebac05ca46e941f1c20698f1d06. --- apps/calendar/templates/calendar.php | 84 +--------------------------- 1 file changed, 2 insertions(+), 82 deletions(-) diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index eb50bc9541c..1c948b948c2 100644 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -6,86 +6,6 @@ var dayNamesShort = tA(array('Sun.', 'Mon.', 'Tue.', var monthNames = tA(array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'))) ?>; var monthNamesShort = tA(array('Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'))) ?>; var allDayText = 't('All day') ?>'; -var neweventtitle = 't('Title') ?>'; -$(document).ready(function() { - var date = new Date(); - var d = date.getDate(); - var m = date.getMonth(); - var y = date.getFullYear(); - - var calendar = $('#calendar').fullCalendar({ - selectable: true, - selectHelper: true, - select: function(start, end, allDay) { - var title = prompt(neweventtitle + ':'); - if (title) { - calendar.fullCalendar('renderEvent', - { - title: title, - start: start, - end: end, - allDay: allDay - }, - true // make the event "stick" - ); - } - calendar.fullCalendar('unselect'); - }, - editable: true, - events: [ - { - title: 'All Day Event', - start: new Date(y, m, 1) - }, - { - title: 'Long Event', - start: new Date(y, m, d-5), - end: new Date(y, m, d-2) - }, - { - id: 999, - title: 'Repeating Event', - start: new Date(y, m, d-3, 16, 0), - allDay: false - }, - { - id: 999, - title: 'Repeating Event', - start: new Date(y, m, d+4, 16, 0), - allDay: false - }, - { - title: 'Meeting', - start: new Date(y, m, d, 10, 30), - allDay: false - }, - { - title: 'Lunch', - start: new Date(y, m, d, 12, 0), - end: new Date(y, m, d, 14, 0), - allDay: false - }, - { - title: 'Birthday Party', - start: new Date(y, m, d+1, 19, 0), - end: new Date(y, m, d+1, 22, 30), - allDay: false - }, - { - title: 'Click for Google', - start: new Date(y, m, 28), - end: new Date(y, m, 29), - url: 'http://google.com/' - } - ] - }); - var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear()); - $('#oneweekview_radio').click(function(){$('#calendar').fullCalendar( 'changeView', 'agendaWeek');}); - $('#onemonthview_radio').click(function(){$('#calendar').fullCalendar( 'changeView', 'month');}); - $('#today_input').click(function(){$('#calendar').fullCalendar( 'today' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); - $('#datecontrol_left').click(function(){$('#calendar').fullCalendar( 'prev' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); - $('#datecontrol_right').click(function(){$('#calendar').fullCalendar( 'next' );var date = $('#calendar').fullCalendar('getDate');$('#datecontrol_date').html(date.getDate() + "." + date.getMonth() + "." + date.getFullYear());}); -});
@@ -93,7 +13,7 @@ $(document).ready(function() {
- +
@@ -111,7 +31,7 @@ $(document).ready(function() {
-
+
-- GitLab From e48377d85b49402e1ad441a44508af612b8dda2c Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 21 Oct 2011 18:19:44 +0200 Subject: [PATCH 007/546] added transition function from 'old' calendar to fullcalendar (fixed currentview bug) and removed listview (it is not implemented in fullcalendar yet) --- apps/calendar/ajax/changeview.php | 5 ++--- apps/calendar/index.php | 11 +++++++++++ apps/calendar/js/calendar.js | 4 ++-- apps/calendar/templates/calendar.php | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php index b396ff4945b..ef05c7cd496 100644 --- a/apps/calendar/ajax/changeview.php +++ b/apps/calendar/ajax/changeview.php @@ -7,10 +7,9 @@ */ require_once ("../../../lib/base.php"); -if(!OC_USER::isLoggedIn()) { - die(""); -} +OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('calendar'); $currentview = $_GET["v"]; OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", $currentview); +OC_JSON::success(); ?> diff --git a/apps/calendar/index.php b/apps/calendar/index.php index 7150fb8490e..2764184dac5 100644 --- a/apps/calendar/index.php +++ b/apps/calendar/index.php @@ -19,6 +19,17 @@ $eventSources = array(); foreach($calendars as $calendar){ $eventSources[] = OC_Calendar_Calendar::getEventSourceInfo($calendar); } +//Fix currentview for fullcalendar +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "oneweekview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "agendaWeek"); +} +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "onemonthview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "month"); +} +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "listview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "month"); +} + OC_Util::addScript('3rdparty/fullcalendar', 'fullcalendar'); OC_Util::addStyle('3rdparty/fullcalendar', 'fullcalendar'); OC_Util::addScript('calendar', 'calendar'); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index bf9e2628ff9..fccc301a91d 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -531,10 +531,10 @@ $(document).ready(function(){ }); $('#onemonthview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'month'); - }); + });/* $('#listview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'list'); - }); + });*/ $('#today_input').click(function(){ $('#calendar_holder').fullCalendar('today'); }); diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 1c948b948c2..d9c6a506e0b 100644 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -13,7 +13,7 @@ var allDayText = 't('All day') ?>';
- +
-- GitLab From c40383b6102130ca1e94a9ce2afe48af4d0ffc81 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 21 Oct 2011 18:27:12 +0200 Subject: [PATCH 008/546] enable listview button --- apps/calendar/index.php | 2 +- apps/calendar/js/calendar.js | 4 ++-- apps/calendar/templates/calendar.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/calendar/index.php b/apps/calendar/index.php index 2764184dac5..2442d27db49 100644 --- a/apps/calendar/index.php +++ b/apps/calendar/index.php @@ -27,7 +27,7 @@ if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'mont OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "month"); } if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "listview"){ - OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "month"); + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "list"); } OC_Util::addScript('3rdparty/fullcalendar', 'fullcalendar'); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index fccc301a91d..bf9e2628ff9 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -531,10 +531,10 @@ $(document).ready(function(){ }); $('#onemonthview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'month'); - });/* + }); $('#listview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'list'); - });*/ + }); $('#today_input').click(function(){ $('#calendar_holder').fullCalendar('today'); }); diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index d9c6a506e0b..1c948b948c2 100644 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -13,7 +13,7 @@ var allDayText = 't('All day') ?>';
- +
-- GitLab From d7a7c40a0f0e6d2a527fd93b7c65d16ff096c783 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Thu, 27 Oct 2011 17:08:58 +0100 Subject: [PATCH 009/546] Moved breacrumb styling to core for use outside files app. --- core/css/styles.css | 8 ++++++++ files/css/files.css | 9 +-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 0f591859f3a..4730eee56d4 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -98,6 +98,14 @@ label.infield { cursor: text !important; } #expand+span { position:relative; bottom:.4em; left:.2em; font-size:1.2em; color:#666; text-shadow:#f8f8f8 0 1px 0; } #logout { position:absolute; right:0; top:0; padding:1.2em 2em .55em 1.2em; } +/* BREADCRUMB */ + +div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; } +div.crumb:first-child { padding-left:1em; } +div.crumb.last { font-weight:bold; } +/* add breadcrumb divider to the File item in navigation panel */ +#navigation>ul>li:first-child { background:url('../../core/img/breadcrumb-start.svg') no-repeat 12.5em 0px; width:12.5em; padding-right:1em; position:fixed; } +#navigation>ul>li:first-child+li { padding-top:2.9em; } /* VARIOUS REUSABLE SELECTORS */ .hidden { display:none; } diff --git a/files/css/files.css b/files/css/files.css index ac1f523f862..12d14e843e3 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -32,9 +32,6 @@ tbody a { color:#000; } span.extention, td.date { color:#999; } span.extention { opacity:0; -webkit-transition:opacity 500ms; -moz-transition:opacity 500ms; -o-transition:opacity 500ms; transition:opacity 500ms; } tr:hover span.extention { opacity:1; } -div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; } -div.crumb:first-child { padding-left:1em; } -div.crumb.last { font-weight:bold; } table tr.mouseOver td { background-color:#eee; } table th { height:2em; padding:0 .5em; color:#999; } table th .name { float:left; margin-left:.5em; } @@ -60,8 +57,4 @@ table thead.fixed { height:2em; } #select_all { float:left; margin:.3em 0.6em 0 .5em; } #uploadsize-message,#delete-confirm { display:none; } .selectedActions a,#fileList a.action { float:right; display:inline; margin:0 .5em; padding:.3em .3em 0 .3em !important; } -.selectedActions { display:none; } - -/* add breadcrumb divider to the File item in navigation panel */ -#navigation>ul>li:first-child { background:url('../../core/img/breadcrumb-start.svg') no-repeat 12.5em 0px; width:12.5em; padding-right:1em; position:fixed; } -#navigation>ul>li:first-child+li { padding-top:2.9em; } \ No newline at end of file +.selectedActions { display:none; } \ No newline at end of file -- GitLab From 865be6064a1f2f896ca3657fa6eef590748a4e39 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Thu, 27 Oct 2011 21:16:04 +0200 Subject: [PATCH 010/546] adjusting to new db "api", merge with master --- .htaccess | 1 + apps/gallery/ajax/getAlbums.php | 4 ++-- apps/gallery/lib_scanner.php | 14 +++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.htaccess b/.htaccess index 34d4c719c8d..bd2f42d6658 100644 --- a/.htaccess +++ b/.htaccess @@ -2,6 +2,7 @@ ErrorDocument 404 /core/templates/404.php php_value upload_max_filesize 512M php_value post_max_size 512M +php_value memory_limit 512M SetEnv htaccessWorking true diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php index 60d3d42866d..98d92c5f31a 100644 --- a/apps/gallery/ajax/getAlbums.php +++ b/apps/gallery/ajax/getAlbums.php @@ -4,12 +4,12 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); $a = array(); -$stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE `uid_owner` = ?'); +$stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner LIKE ?'); $result = $stmt->execute(array(OC_User::getUser())); while ($r = $result->fetchRow()) { $album_name = $r['album_name']; - $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE `album_id` = ?'); + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ?'); $tmp_res = $stmt->execute(array($r['album_id'])); $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10), 'bgPath' => OC::$WEBROOT.'/data/'.OC_User::getUser().'/gallery/'.$album_name.'.png'); } diff --git a/apps/gallery/lib_scanner.php b/apps/gallery/lib_scanner.php index 871c1c38c5f..f72d54777a7 100644 --- a/apps/gallery/lib_scanner.php +++ b/apps/gallery/lib_scanner.php @@ -36,21 +36,21 @@ class OC_GALLERY_SCANNER { } $current_album['imagesCount'] = count($current_album['images']); $albums[] = $current_album; - $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE `uid_owner` = ? AND `album_name` = ?'); + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner LIKE ? AND album_name LIKE ?'); $result = $stmt->execute(array(OC_User::getUser(), $current_album['name'])); if ($result->numRows() == 0 && count($current_album['images'])) { - $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (`uid_owner`, `album_name`) VALUES (?, ?)'); + $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (uid_owner, album_name) VALUES (?, ?)'); $stmt->execute(array(OC_User::getUser(), $current_album['name'])); } - $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE `uid_owner` = ? AND `album_name` = ?'); + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner LIKE ? AND album_name LIKE ?'); $result = $stmt->execute(array(OC_User::getUser(), $current_album['name'])); - $albumId = $result->fetchRow(); - $albumId = $albumId['album_id']; + $albumId = $result->fetchAll(); + $albumId = $albumId[0]['album_id']; foreach ($current_album['images'] as $img) { - $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE `album_id` = ? AND `file_path` = ?'); + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ? AND file_path LIKE ?'); $result = $stmt->execute(array($albumId, $img)); if ($result->numRows() == 0) { - $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_photos (`album_id`, `file_path`) VALUES (?, ?)'); + $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_photos (album_id, file_path) VALUES (?, ?)'); $stmt->execute(array($albumId, $img)); } } -- GitLab From 059ab889bd1a7eaf399f69405e0151e34e2e760a Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 7 Nov 2011 22:27:49 +0000 Subject: [PATCH 011/546] Fixed error where saving message appears twice. --- apps/files_texteditor/js/editor.js | 51 +++++++++++++----------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index e3581a16a6d..c26139a4eb2 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -62,17 +62,8 @@ function showControls(filename){ } function bindControlEvents(){ - $("#editor_save").live('click',function() { - if(is_editor_shown){ - doFileSave(); - } - }); - - $('#editor_close').live('click',function() { - if(is_editor_shown){ - hideFileEditor(); - } - }); + $("#editor_save").die('click', doFileSave).live('click', doFileSave); + $('#editor_close').live('click', hideFileEditor); } function updateSessionFileHash(path){ @@ -175,24 +166,26 @@ function showFileEditor(dir,filename){ } function hideFileEditor(){ - $('#editor').attr('editorshown','false'); - // Fade out controls - $('#editor_close').fadeOut('slow'); - // Fade out the save button - $('#editor_save').fadeOut('slow'); - // Fade out breadcrumb - $('#breadcrumb_file').fadeOut('slow', function(){ $(this).remove();}); - // Fade out editor - $('#editor').fadeOut('slow', function(){ - $('#editor_close').remove(); - $('#editor_save').remove(); - $('#editor').remove(); - var editorhtml = '
'; - $('table').after(editorhtml); - $('.actions,#file_access_panel').fadeIn('slow'); - $('table').fadeIn('slow'); - }); - is_editor_shown = false; + if(!is_editor_shown){ + $('#editor').attr('editorshown','false'); + // Fade out controls + $('#editor_close').fadeOut('slow'); + // Fade out the save button + $('#editor_save').fadeOut('slow'); + // Fade out breadcrumb + $('#breadcrumb_file').fadeOut('slow', function(){ $(this).remove();}); + // Fade out editor + $('#editor').fadeOut('slow', function(){ + $('#editor_close').remove(); + $('#editor_save').remove(); + $('#editor').remove(); + var editorhtml = '
'; + $('table').after(editorhtml); + $('.actions,#file_access_panel').fadeIn('slow'); + $('table').fadeIn('slow'); + }); + is_editor_shown = false; + } } $(window).resize(function() { -- GitLab From c33884779d4e7fbfce33ee30fbe46f3df939a402 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 7 Nov 2011 22:45:26 +0000 Subject: [PATCH 012/546] Fixed problem closing the editor. --- apps/files_texteditor/js/editor.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index c26139a4eb2..fd93ac5a7a8 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -73,7 +73,9 @@ function updateSessionFileHash(path){ if(jsondata.status=='failure'){ alert('Failed to update session file hash.'); } - }, "json");} + }, + "json"); +} function doFileSave(){ if(is_editor_shown){ @@ -166,7 +168,7 @@ function showFileEditor(dir,filename){ } function hideFileEditor(){ - if(!is_editor_shown){ + if(is_editor_shown){ $('#editor').attr('editorshown','false'); // Fade out controls $('#editor_close').fadeOut('slow'); -- GitLab From 878fc1d197e8f1474d2a739da2ddb4c0e7214931 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 8 Nov 2011 22:18:41 +0100 Subject: [PATCH 013/546] remove outdated remote storage prototype --- lib/filestorage/remote.php | 350 ------------------------------------- 1 file changed, 350 deletions(-) delete mode 100644 lib/filestorage/remote.php diff --git a/lib/filestorage/remote.php b/lib/filestorage/remote.php deleted file mode 100644 index 88bdbca481c..00000000000 --- a/lib/filestorage/remote.php +++ /dev/null @@ -1,350 +0,0 @@ -. -* -*/ - -class OC_Filestorage_Remote extends OC_Filestorage{ - private $url; - private $username; - private $password; - private $remote=false; - private $statCache; - private $statCacheDir=false; - private $changed=array(); - - private function cacheDir($dir){ - if($this->statCacheDir!=$dir or $this->statCacheDir===false){ - $this->statCache=$this->remote->getFiles($dir); - $keys=array_keys($this->statCache); - $this->statCacheDir=$dir; - } - } - - public function __construct($arguments){ - $this->url=$arguments['url']; - $this->username=$arguments['username']; - $this->password=$arguments['password']; - } - private function connect(){ - if($this->remote===false){ - $this->remote=OC_Connect::connect($this->url,$this->username,$this->password); - } - } - public function mkdir($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $return=$this->remote->newFile($parent,$name,'dir'); - if($return){ - $this->notifyObservers($path,OC_FILEACTION_CREATE); - } - return $return; - } - public function rmdir($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $return=$this->remote->delete($parent,$name); - if($return){ - $this->notifyObservers($path,OC_FILEACTION_DELETE); - } - return $return; - } - public function opendir($path){ - $this->connect(); - $this->cacheDir($path); - $dirs=array_keys($this->statCache); - $id=uniqid(); - global $FAKEDIRS; - $FAKEDIRS[$id]=$dirs; - if($return=opendir("fakedir://$id")){ - $this->notifyObservers($path,OC_FILEACTION_READ); - } - return $return; - } - public function is_dir($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($path); - if($path=='' or $path=='/'){ - return true; - } - if(!isset($this->statCache[$name])){ - return false; - } - return ($this->statCache[$name]['type'=='dir']); - } - public function is_file($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return ($this->statCache[$name]['type'!='dir']); - } - public function stat($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return $false; - } - return $this->statCache[$name]; - } - public function filetype($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['type']; - } - public function filesize($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return $false; - } - return $this->statCache[$name]['size']; - } - public function is_readable($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['readable']; - } - public function is_writeable($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['writeable']; - } - public function file_exists($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - return isset($this->statCache[$name]); - } - public function readfile($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $file=$this->remote->getFile($parent,$name); - readfile($file); - unlink($file); - } - public function filectime($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['ctime']; - } - public function filemtime($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['mtime']; - } - public function fileatime($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['atime']; - } - public function file_get_contents($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $file=$this->remote->getFile($parent,$name); - file_get_contents($file); - unlink($file); - } - public function file_put_contents($path,$data){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $file=$this->remote->getFile($parent,$name); - $file=tempnam(get_temp_dir(),'oc_'); - file_put_contents($file,$data); - if($return=$this->remote->sendTmpFile($file,$parent,$name)){ - $this->notifyObservers($path,OC_FILEACTION_WRITE); - } - } - public function unlink($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - if($return=$this->remote->delete($paren,$name)){ - $this->notifyObservers($path,OC_FILEACTION_DELETE); - } - return $return; - } - public function rename($path1,$path2){ - $this->connect(); - $parent1=dirname($path1); - $name1=substr($path1,strlen($parent1)+1); - $parent2=dirname($path2); - $name2=substr($path2,strlen($parent2)+1); - if($return=$this->remote->move($parent1,$name1,$parent2,$name2)){ - $this->notifyObservers($path1.'->'.$path2,OC_FILEACTION_RENAME); - } - return $return; - } - public function copy($path1,$path2){ - $this->connect(); - $parent1=dirname($path1); - $name1=substr($path1,strlen($parent1)+1); - $parent2=dirname($path2); - $name2=substr($path2,strlen($parent2)+1); - if($return=$this->copy->rename($parent1,$name1,$parent2,$name2)){ - $this->notifyObservers($path1.'->'.$path2,OC_FILEACTION_RENAME); - } - return $return; - } - public function fopen($path,$mode){ - $this->connect(); - $changed=false; - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - $file=$this->remote->getFile($parent,$name); - if($return=fopen($file,$mode)){ - switch($mode){ - case 'r': - $this->notifyObservers($path,OC_FILEACTION_READ); - break; - case 'r+': - case 'w+': - case 'x+': - case 'a+': - $this->notifyObservers($path,OC_FILEACTION_READ | OC_FILEACTION_WRITE); - $this->changed[]=array('dir'=>$parent,'file'=>$name,'tmp'=>$file); - break; - case 'w': - case 'x': - case 'a': - $this->notifyObservers($path,OC_FILEACTION_WRITE); - $this->changed[]=array('dir'=>$parent,'file'=>$name,'tmp'=>$file); - break; - } - } - return $return; - } - - public function getMimeType($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - if(substr($name,0,1)=='/'){ - $name=substr($name,1); - } - $this->cacheDir($parent); - if(!isset($this->statCache[$name])){ - return false; - } - return $this->statCache[$name]['mime']; - } - - public function toTmpFile($path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - if(substr($name,0,1)=='/'){ - $name=substr($name,1); - } - $filename=$this->remote->getFile($parent,$name); - if($filename){ - $this->notifyObservers($path,OC_FILEACTION_READ); - return $filename; - }else{ - return false; - } - } - - public function fromTmpFile($tmpFile,$path){ - $this->connect(); - $parent=dirname($path); - $name=substr($path,strlen($parent)+1); - if($this->remote->sendTmpFile($tmpFile,$parent,$name)){ - $this->notifyObservers($path,OC_FILEACTION_CREATE); - return true; - }else{ - return false; - } - } - - public function delTree($dir) { - $this->connect(); - $parent=dirname($dir); - $name=substr($dir,strlen($parent)+1); - $return=$this->remote->delete($parent,$name); - if($return=rmdir($dir)){ - $this->notifyObservers($dir,OC_FILEACTION_DELETE); - } - return $return; - } - - public function find($path){ - return $this->getTree($path); - } - - public function getTree($dir) { - $this->connect(); - if($return=$this->remote->getTree($dir)){ - $this->notifyObservers($dir,OC_FILEACTION_READ); - } - return $return; - } - - public function __destruct(){ - foreach($this->changed as $changed){ - $this->remote->sendTmpFile($changed['tmp'],$changed['dir'],$changed['file']); - } - } -} -- GitLab From ec015a2e6806be90516e5cba009823050d98bcb0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 8 Nov 2011 22:21:25 +0100 Subject: [PATCH 014/546] remove the need to register storage providers, pass the classname during mounting instead --- apps/files_sharing/appinfo/app.php | 1 - apps/files_sharing/sharedstorage.php | 2 +- lib/base.php | 3 -- lib/filesystem.php | 47 +++++----------------------- lib/util.php | 2 +- 5 files changed, 9 insertions(+), 46 deletions(-) diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index c175142319f..a675175a8be 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -5,7 +5,6 @@ require_once('apps/files_sharing/sharedstorage.php'); OC::$CLASSPATH['OC_Share'] = "apps/files_sharing/lib_share.php"; OC_Hook::connect("OC_Filesystem", "post_delete", "OC_Share", "deleteItem"); OC_Hook::connect("OC_Filesystem", "post_rename", "OC_Share", "renameItem"); -OC_Filesystem::registerStorageType("shared", "OC_Filestorage_Shared", array("datadir" => "string")); OC_Util::addScript("files_sharing", "share"); OC_Util::addScript("3rdparty", "chosen/chosen.jquery.min"); OC_Util::addStyle( 'files_sharing', 'sharing' ); diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index faf4e68d9b1..5ab976aaf4f 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -25,7 +25,7 @@ require_once( 'lib_share.php' ); if (!OC_Filesystem::is_dir('/Shared')) { OC_Filesystem::mkdir('/Shared'); } -OC_Filesystem::mount('shared',array('datadir'=>'/'.OC_User::getUser().'/files/Shared'),'/'.OC_User::getUser().'/files/Shared/'); +OC_Filesystem::mount('OC_Filestorage_Shared',array('datadir'=>'/'.OC_User::getUser().'/files/Shared'),'/'.OC_User::getUser().'/files/Shared/'); /** * Convert target path to source path and pass the function call to the correct storage provider diff --git a/lib/base.php b/lib/base.php index c52b4493e01..2d0bb5fb250 100644 --- a/lib/base.php +++ b/lib/base.php @@ -157,9 +157,6 @@ class OC{ OC_User::useBackend( OC_Config::getValue( "userbackend", "database" )); OC_Group::setBackend( OC_Config::getValue( "groupbackend", "database" )); - // Was in required file ... put it here - OC_Filesystem::registerStorageType('local','OC_Filestorage_Local',array('datadir'=>'string')); - // Set up file system unless forbidden global $RUNTIME_NOSETUPFS; if(!$RUNTIME_NOSETUPFS ){ diff --git a/lib/filesystem.php b/lib/filesystem.php index cae8ead5b16..e28a3c5667e 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -46,35 +46,6 @@ class OC_Filesystem{ static private $storages=array(); static private $mounts=array(); static private $fakeRoot=''; - static private $storageTypes=array(); - - - /** - * register a storage type - * @param string type - * @param string classname - * @param array arguments an associative array in the form of name=>type (eg array('datadir'=>'string')) - */ - static public function registerStorageType($type,$classname,$arguments){ - self::$storageTypes[$type]=array('type'=>$type,'classname'=>$classname,'arguments'=>$arguments); - } - - /** - * check if the filesystem supports a specific storagetype - * @param string type - * @return bool - */ - static public function hasStorageType($type){ - return isset(self::$storageTypes[$type]); - } - - /** - * get the list of names of storagetypes that the filesystem supports - * @return array - */ - static public function getStorageTypeNames(){ - return array_keys(self::$storageTypes); - } /** * tear down the filesystem, removing all storage providers @@ -92,13 +63,9 @@ class OC_Filesystem{ * @param array arguments * @return OC_Filestorage */ - static private function createStorage($type,$arguments){ - if(!self::hasStorageType($type)){ - return false; - } - $className=self::$storageTypes[$type]['classname']; - if(class_exists($className)){ - return new $className($arguments); + static private function createStorage($class,$arguments){ + if(class_exists($class)){ + return new $class($arguments); }else{ return false; } @@ -164,11 +131,11 @@ class OC_Filesystem{ * @param OC_Filestorage storage * @param string mountpoint */ - static public function mount($type,$arguments,$mountpoint){ + static public function mount($class,$arguments,$mountpoint){ if(substr($mountpoint,0,1)!=='/'){ $mountpoint='/'.$mountpoint; } - self::$mounts[$mountpoint]=array('type'=>$type,'arguments'=>$arguments); + self::$mounts[$mountpoint]=array('class'=>$class,'arguments'=>$arguments); } /** @@ -181,7 +148,7 @@ class OC_Filesystem{ if($mountpoint){ if(!isset(self::$storages[$mountpoint])){ $mount=self::$mounts[$mountpoint]; - self::$storages[$mountpoint]=self::createStorage($mount['type'],$mount['arguments']); + self::$storages[$mountpoint]=self::createStorage($mount['class'],$mount['arguments']); } return self::$storages[$mountpoint]; } @@ -285,7 +252,7 @@ class OC_Filesystem{ return self::basicOperation('filemtime',$path); } static public function fileatime($path){ - return self::basicOperation('fileatime',$path); + return self::basicOperation('filemtime',$path); } static public function file_get_contents($path){ return self::basicOperation('file_get_contents',$path,array('read')); diff --git a/lib/util.php b/lib/util.php index 14313569a1d..e010a572e3a 100644 --- a/lib/util.php +++ b/lib/util.php @@ -37,7 +37,7 @@ class OC_Util { if( $user != "" ){ //if we aren't logged in, there is no use to set up the filesystem //first set up the local "root" storage - OC_Filesystem::mount('local',array('datadir'=>$CONFIG_DATADIRECTORY_ROOT),'/'); + OC_Filesystem::mount('OC_Filestorage_Local',array('datadir'=>$CONFIG_DATADIRECTORY_ROOT),'/'); OC::$CONFIG_DATADIRECTORY = $CONFIG_DATADIRECTORY_ROOT."/$user/$root"; if( !is_dir( OC::$CONFIG_DATADIRECTORY )){ -- GitLab From ca6c500799ec13c433ca74b8caa80875084c4943 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 8 Nov 2011 22:26:03 +0100 Subject: [PATCH 015/546] remove OC_Filesystem::fileatime --- apps/files_sharing/sharedstorage.php | 22 ---------------------- lib/fileproxy.php | 2 +- lib/filestorage.php | 1 - lib/filestorage/local.php | 3 --- lib/filesystem.php | 3 --- 5 files changed, 1 insertion(+), 30 deletions(-) diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index 5ab976aaf4f..431b6a1adb8 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -180,7 +180,6 @@ class OC_Filestorage_Shared extends OC_Filestorage { $stat["gid"] = ""; $stat["rdev"] = ""; $stat["size"] = $this->filesize($path); - $stat["atime"] = $this->fileatime($path); $stat["mtime"] = $this->filemtime($path); $stat["ctime"] = $this->filectime($path); $stat["blksize"] = ""; @@ -354,27 +353,6 @@ class OC_Filestorage_Shared extends OC_Filestorage { } } - public function fileatime($path) { - if ($path == "" || $path == "/") { - $atime = 0; - if ($dh = $this->opendir($path)) { - while (($filename = readdir($dh)) !== false) { - $tempatime = $this->fileatime($filename); - if ($tempatime > $atime) { - $atime = $tempatime; - } - } - return $atime; - } - } else { - $source = $this->getSource($path); - if ($source) { - $storage = OC_Filesystem::getStorage($source); - return $storage->fileatime($this->getInternalPath($source)); - } - } - } - public function file_get_contents($path) { $source = $this->getSource($path); if ($source) { diff --git a/lib/fileproxy.php b/lib/fileproxy.php index 549b7015a6a..235fc8bf284 100644 --- a/lib/fileproxy.php +++ b/lib/fileproxy.php @@ -34,7 +34,7 @@ * A post-proxy recieves 2 arguments, the filepath and the result of the operation. * The return calue of the post-proxy will be used as the new result of the operation * The operations that have a post-proxy are - * file_get_contents, is_file, is_dir, file_exists, stat, is_readable, is_writable, fileatime, filemtime, filectime, file_get_contents, getMimeType, hash, free_space and search + * file_get_contents, is_file, is_dir, file_exists, stat, is_readable, is_writable, filemtime, filectime, file_get_contents, getMimeType, hash, free_space and search */ class OC_FileProxy{ diff --git a/lib/filestorage.php b/lib/filestorage.php index 34fa6457fd2..90071a86dbe 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -39,7 +39,6 @@ class OC_Filestorage{ public function readfile($path){} public function filectime($path){} public function filemtime($path){} - public function fileatime($path){} public function file_get_contents($path){} public function file_put_contents($path,$data){} public function unlink($path){} diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index 9e29f85071a..7711116db35 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -67,9 +67,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ public function filemtime($path){ return filemtime($this->datadir.$path); } - public function fileatime($path){ - return fileatime($this->datadir.$path); - } public function file_get_contents($path){ return file_get_contents($this->datadir.$path); } diff --git a/lib/filesystem.php b/lib/filesystem.php index e28a3c5667e..a25e8697985 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -251,9 +251,6 @@ class OC_Filesystem{ static public function filemtime($path){ return self::basicOperation('filemtime',$path); } - static public function fileatime($path){ - return self::basicOperation('filemtime',$path); - } static public function file_get_contents($path){ return self::basicOperation('file_get_contents',$path,array('read')); } -- GitLab From 5cc6635eb81a8d76c04ee040a791f51ebbe389ef Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 8 Nov 2011 22:36:05 +0100 Subject: [PATCH 016/546] remove OC_Filesystem::fromUploadedFile --- apps/files_sharing/sharedstorage.php | 16 -------------- apps/files_texteditor/ajax/savefile.php | 2 +- files/ajax/upload.php | 2 +- lib/filestorage.php | 1 - lib/filestorage/local.php | 11 ---------- lib/filesystem.php | 28 ++++--------------------- 6 files changed, 6 insertions(+), 54 deletions(-) diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index 431b6a1adb8..b37806c75d9 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -481,22 +481,6 @@ class OC_Filestorage_Shared extends OC_Filestorage { } } - public function fromUploadedFile($tmpFile, $path) { - if ($this->is_writeable($path)) { - $source = $this->getSource($path); - if ($source) { - $storage = OC_Filesystem::getStorage($source); - $result = $storage->fromUploadedFile($tmpFile, $this->getInternalPath($source)); - if ($result) { - $this->clearFolderSizeCache($path); - } - return $result; - } - } else { - return false; - } - } - public function getMimeType($path) { $source = $this->getSource($path); if ($source) { diff --git a/apps/files_texteditor/ajax/savefile.php b/apps/files_texteditor/ajax/savefile.php index f1a2bafc12b..a9777eb4133 100644 --- a/apps/files_texteditor/ajax/savefile.php +++ b/apps/files_texteditor/ajax/savefile.php @@ -37,7 +37,7 @@ $sessionname = sha1('oc_file_hash_'.$path); function do_save($path,$filecontents){ $sessionname = md5('oc_file_hash_'.$path); - OC_Filesystem::update_session_file_hash($sessionname,sha1(htmlspecialchars($filecontents))); + $_SESSION[$sessionname] = sha1(htmlspecialchars($filecontents)); OC_Filesystem::file_put_contents($path, $filecontents); } diff --git a/files/ajax/upload.php b/files/ajax/upload.php index 041ec0c92e3..d9dafde7779 100644 --- a/files/ajax/upload.php +++ b/files/ajax/upload.php @@ -46,7 +46,7 @@ if(strpos($dir,'..') === false){ $fileCount=count($files['name']); for($i=0;$i<$fileCount;$i++){ $target=stripslashes($dir) . $files['name'][$i]; - if(OC_Filesystem::fromUploadedFile($files['tmp_name'][$i],$target)){ + if(is_uploaded_file($files['tmp_name'][$i]) and OC_Filesystem::fromTmpFile($files['tmp_name'][$i],$target)){ $result[]=array( "status" => "success", 'mime'=>OC_Filesystem::getMimeType($target),'size'=>OC_Filesystem::filesize($target),'name'=>$files['name'][$i]); } } diff --git a/lib/filestorage.php b/lib/filestorage.php index 90071a86dbe..70aaf985b8b 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -47,7 +47,6 @@ class OC_Filestorage{ public function fopen($path,$mode){} public function toTmpFile($path){}//copy the file to a temporary file, used for cross-storage file actions public function fromTmpFile($tmpPath,$path){}//copy a file from a temporary file, used for cross-storage file actions - public function fromUploadedFile($tmpPath,$path){}//copy a file from a temporary file, used for cross-storage file actions public function getMimeType($path){} public function hash($type,$path,$raw){} public function free_space($path){} diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index 7711116db35..b5d6023c494 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -189,17 +189,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ } } - public function fromUploadedFile($tmpFile,$path){ - $fileStats = stat($tmpFile); - if(move_uploaded_file($tmpFile,$this->datadir.$path)){ - touch($this->datadir.$path, $fileStats['mtime'], $fileStats['atime']); - $this->clearFolderSizeCache($path); - return true; - }else{ - return false; - } - } - private function delTree($dir) { $dirRelative=$dir; $dir=$this->datadir.$dir; diff --git a/lib/filesystem.php b/lib/filesystem.php index a25e8697985..268f7ddbd28 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -200,6 +200,10 @@ class OC_Filesystem{ } } + /** + * following functions are equivilent to their php buildin equivilents for arguments/return values. + */ + static public function mkdir($path){ return self::basicOperation('mkdir',$path,array('create','write')); } @@ -362,26 +366,6 @@ class OC_Filesystem{ } } } - static public function fromUploadedFile($tmpFile,$path){ - if(OC_FileProxy::runPreProxies('fromUploadedFile',$tmpFile,$path) and self::canWrite($path) and $storage=self::getStorage($path)){ - $run=true; - $exists=self::file_exists($path); - if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'create', array( 'path' => $path, 'run' => &$run)); - } - if($run){ - OC_Hook::emit( 'OC_Filesystem', 'write', array( 'path' => $path, 'run' => &$run)); - } - if($run){ - $result=$storage->fromUploadedFile($tmpFile,self::getInternalPath($path)); - if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'post_create', array( 'path' => $path)); - } - OC_Hook::emit( 'OC_Filesystem', 'post_write', array( 'path' => $path)); - return $result; - } - } - } static public function getMimeType($path){ return self::basicOperation('getMimeType',$path); } @@ -413,10 +397,6 @@ class OC_Filesystem{ } - static public function update_session_file_hash($sessionname,$sessionvalue){ - $_SESSION[$sessionname] = $sessionvalue; - } - /** * abstraction for running most basic operations * @param string $operation -- GitLab From 5a6aba1e1114707942c613c2402eed3237b43a21 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Nov 2011 18:41:57 +0100 Subject: [PATCH 017/546] provide caching for file metadata --- apps/files_sharing/lib_share.php | 4 +- apps/files_sharing/sharedstorage.php | 12 +- db_structure.xml | 86 ++++++- files/templates/part.list.php | 4 +- lib/filecache.php | 331 +++++++++++++++++++++++++++ lib/files.php | 41 +--- lib/filestorage/local.php | 83 +------ lib/filesystem.php | 9 + lib/util.php | 5 + 9 files changed, 446 insertions(+), 129 deletions(-) create mode 100644 lib/filecache.php diff --git a/apps/files_sharing/lib_share.php b/apps/files_sharing/lib_share.php index cde33fd1dc5..c1957d7b6c4 100644 --- a/apps/files_sharing/lib_share.php +++ b/apps/files_sharing/lib_share.php @@ -89,8 +89,8 @@ class OC_Share { } $query->execute(array($uid_owner, $uid, $source, $target, $permissions)); // Clear the folder size cache for the 'Shared' folder - $clearFolderSize = OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); - $clearFolderSize->execute(array($sharedFolder)); +// $clearFolderSize = OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); +// $clearFolderSize->execute(array($sharedFolder)); } } } diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index b37806c75d9..5e5360e8991 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -225,8 +225,8 @@ class OC_Filestorage_Shared extends OC_Filestorage { $path = ltrim($path, "/"); $path = preg_replace('{(/)\1+}', "/", $path); $dbpath = rtrim($this->datadir.$path, "/"); - $query = OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path = ?"); - $size = $query->execute(array($dbpath))->fetchAll(); +// $query = OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path = ?"); +// $size = $query->execute(array($dbpath))->fetchAll(); if (count($size) > 0) { return $size[0]['size']; } else { @@ -252,8 +252,8 @@ class OC_Filestorage_Shared extends OC_Filestorage { } if ($size > 0) { $dbpath = rtrim($this->datadir.$path, "/"); - $query = OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)"); - $result = $query->execute(array($dbpath, $size)); +// $query = OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)"); +// $result = $query->execute(array($dbpath, $size)); } } return $size; @@ -266,8 +266,8 @@ class OC_Filestorage_Shared extends OC_Filestorage { $path = dirname($path); } $dbpath = rtrim($this->datadir.$path, "/"); - $query = OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); - $result = $query->execute(array($dbpath)); +// $query = OC_DB::prepare("DELETE FROM *PREFIX*/*foldersize*/ WHERE path = ?"); +// $result = $query->execute(array($dbpath)); if ($path != "/" && $path != "") { $parts = explode("/", $path); $part = array_pop($parts); diff --git a/db_structure.xml b/db_structure.xml index ddb8c44d19d..c7fa423e14e 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -43,10 +43,19 @@ - *dbprefix*foldersize + *dbprefix*fscache + + id + 1 + integer + 0 + true + 4 + + path text @@ -55,6 +64,24 @@ 512 + + parent + integer + + + true + 4 + + + + name + text + + + true + 512 + + size integer @@ -63,14 +90,71 @@ 4 + + ctime + integer + + + true + 4 + + + + mtime + integer + + + true + 4 + + + + mimetype + text + + + true + 32 + + + + mimepart + text + + + true + 32 + + path_index + true path ascending + + parent_index + + parent + ascending + + + + + parent_name_index + + parent + ascending + + + name + ascending + + +
diff --git a/files/templates/part.list.php b/files/templates/part.list.php index 46830ba3a37..7ae5756c22e 100644 --- a/files/templates/part.list.php +++ b/files/templates/part.list.php @@ -5,8 +5,8 @@ $relative_modified_date = relative_modified_date($file['mtime']); $relative_date_color = round((time()-$file['mtime'])/60/60/24*14); // the older the file, the brighter the shade of grey; days*14 if($relative_date_color>200) $relative_date_color = 200; ?> - '> - + '> + diff --git a/lib/filecache.php b/lib/filecache.php new file mode 100644 index 00000000000..41e31b5de25 --- /dev/null +++ b/lib/filecache.php @@ -0,0 +1,331 @@ +. +* +*/ + +/** + * provide caching for filesystem info in the database + * + * not used by OC_Filesystem for reading filesystem info, + * instread apps should use OC_FileCache::get where possible + * + * It will try to keep the data up to date but changes from outside ownCloud can invalidate the cache + */ +class OC_FileCache{ + /** + * get the filesystem info from the cache + * @param string path + * @return array + * + * returns an assiciative array with the following keys: + * - size + * - mtime + * - ctime + * - mimetype + */ + public static function get($path){ + $path=OC_Filesystem::getRoot().$path; + $query=OC_DB::prepare('SELECT ctime,mtime,mimetype,size FROM *PREFIX*fscache WHERE path=?'); + $result=$query->execute(array($path))->fetchRow(); + if(is_array($result)){ + return $result; + }else{ + OC_Log::write('file not found in cache ('.$path.')','core',OC_Log::DEBUG); + return false; + } + } + + /** + * put filesystem info in the cache + * @param string $path + * @param array data + * + * $data is an assiciative array in the same format as returned by get + */ + public static function put($path,$data){ + $path=OC_Filesystem::getRoot().$path; + if($id=self::getFileId($path)!=-1){ + self::update($id,$data); + } + if($path=='/'){ + $parent=-1; + }else{ + $parent=self::getFileId(dirname($path)); + } + $mimePart=dirname($data['mimetype']); + $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart) VALUES(?,?,?,?,?,?,?,?)'); + $query->execute(array($parent,basename($path),$path,$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart)); + + } + + /** + * update filesystem info of a file + * @param int $id + * @param array $data + */ + private static function update($id,$data){ + $mimePart=dirname($data['mimetype']); + $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=? ,mtime=? ,ctime=? ,mimetype=? , mimepart=? WHERE id=?'); + $query->execute(array($data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$id)); + } + + /** + * register a file move in the cache + * @param string oldPath + * @param string newPath + */ + public static function move($oldPath,$newPath){ + $oldPath=OC_Filesystem::getRoot().$oldPath; + $newPath=OC_Filesystem::getRoot().$newPath; + $newParent=self::getParentId($newPath); + $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET parent=? ,name=?, path=? WHERE path=?'); + $query->execute(array($newParent,basename($newPath),$newPath,$oldPath)); + } + + /** + * delete info from the cache + * @param string $path + */ + public static function delete($path){ + $path=OC_Filesystem::getRoot().$path; + $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE path=?'); + $query->execute(array($path)); + } + + /** + * return array of filenames matching the querty + * @param string $query + * @return array of filepaths + */ + public static function search($query){ + $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ?'); + $result=$query->execute(array("%$query%")); + $names=array(); + while($row=$result->fetchRow()){ + $names[]=$row['path']; + } + return $names; + } + + /** + * get all files and folders in a folder + * @param string path + * @return array + * + * returns an array of assiciative arrays with the following keys: + * - name + * - size + * - mtime + * - ctime + * - mimetype + */ + public static function getFolderContent($path){ + $path=OC_Filesystem::getRoot().$path; + $parent=self::getFileId($path); + $query=OC_DB::prepare('SELECT name,ctime,mtime,mimetype,size FROM *PREFIX*fscache WHERE parent=?'); + $result=$query->execute(array($parent))->fetchAll(); + if(is_array($result)){ + return $result; + }else{ + OC_Log::write('file not found in cache ('.$path.')','core',OC_Log::DEBUG); + return false; + } + } + + /** + * check if a file or folder is in the cache + * @param string $path + * @return bool + */ + public static function inCache($path){ + $path=OC_Filesystem::getRoot().$path; + $inCache=self::getFileId($path)!=-1; + return $inCache; + } + + /** + * get the file id as used in the cache + * @param string $path + * @return int + */ + private static function getFileId($path){ + $query=OC_DB::prepare('SELECT id FROM *PREFIX*fscache WHERE path=?'); + $result=$query->execute(array($path))->fetchRow(); + if(is_array($result)){ + return $result['id']; + }else{ + OC_Log::write('file not found in cache ('.$path.')','core',OC_Log::DEBUG); + return -1; + } + } + + /** + * get the file id of the parent folder, taking into account '/' has no parent + * @param string $path + * @return int + */ + private static function getParentId($path){ + if($path=='/'){ + return -1; + }else{ + return self::getFileId(dirname($path)); + } + } + + /** + * called when changes are made to files + */ + public static function fileSystemWatcherWrite($params){ + $path=$params['path']; + $fullPath=OC_Filesystem::getRoot().$path; + $mimetype=OC_Filesystem::getMimeType($path); + if($mimetype=='httpd/unix-directory'){ + $size=0; + }else{ + if(($id=self::getFileId($fullPath))!=-1){ + $oldInfo=self::get($fullPath); + $oldSize=$oldInfo['size']; + }else{ + $oldSize=0; + } + $size=OC_Filesystem::filesize($path); + self::increaseSize(dirname($fullPath),$size-$oldSize); + } + $mtime=OC_Filesystem::filemtime($path); + $ctime=OC_Filesystem::filectime($path); + self::put($path,array('size'=>$size,'mtime'=>$mtime,'ctime'=>$ctime,'mimetype'=>$mimetype)); + } + + /** + * called when files are deleted + */ + public static function fileSystemWatcherDelete($params){ + $path=$params['path']; + $fullPath=OC_Filesystem::getRoot().$path; + error_log("delete $path"); + if(self::getFileId($fullPath)==-1){ + return; + } + $size=OC_Filesystem::filesize($path); + self::increaseSize(dirname($fullPath),-$size); + self::delete($path); + } + + /** + * called when files are deleted + */ + public static function fileSystemWatcherRename($params){ + $oldPath=$params['oldpath']; + $newPath=$params['newpath']; + $fullOldPath=OC_Filesystem::getRoot().$oldPath; + $fullNewPath=OC_Filesystem::getRoot().$newPath; + if(($id=self::getFileId($fullOldPath))!=-1){ + $oldInfo=self::get($fullOldPath); + $oldSize=$oldInfo['size']; + }else{ + return; + } + $size=OC_Filesystem::filesize($oldPath); + self::increaseSize(dirname($fullOldPath),-$oldSize); + self::increaseSize(dirname($fullNewPath),$oldSize); + self::move($oldPath,$newPath); + } + + /** + * adjust the size of the parent folders + * @param string $path + * @param int $sizeDiff + */ + private static function increaseSize($path,$sizeDiff){ + while(($id=self::getFileId($path))!=-1){ + $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=size+? WHERE id=?'); + error_log('diff '.$path.' '.$sizeDiff); + $query->execute(array($sizeDiff,$id)); + $path=dirname($path); + } + } + + /** + * recursively scan the filesystem and fill the cache + * @param string $path + * @param bool $onlyChilds + */ + public static function scan($path,$onlyChilds=false){//PROBLEM due to the order things are added, all parents are -1 + $dh=OC_Filesystem::opendir($path); + $stat=OC_Filesystem::stat($path); + $mimetype=OC_Filesystem::getMimeType($path); + $stat['mimetype']=$mimetype; + if($path=='/'){ + $path=''; + } + self::put($path,$stat); + $fullPath=OC_Filesystem::getRoot().$path; + $totalSize=0; + if($dh){ + while (($filename = readdir($dh)) !== false) { + if($filename != '.' and $filename != '..'){ + $file=$path.'/'.$filename; + if(OC_Filesystem::is_dir($file)){ + self::scan($file,true); + }else{ + $stat=OC_Filesystem::stat($file); + $mimetype=OC_Filesystem::getMimeType($file); + $stat['mimetype']=$mimetype; + self::put($file,$stat); + $totalSize+=$stat['size']; + } + } + } + } + self::increaseSize($fullPath,$totalSize); + } + + /** + * fine files by mimetype + * @param string $part1 + * @param string $part2 (optional) + * @return array of file paths + * + * $part1 and $part2 together form the complete mimetype. + * e.g. searchByMime('text','plain') + * + * seccond mimetype part can be ommited + * e.g. searchByMime('audio') + */ + public static function searchByMime($part1,$part2=''){ + if($part2){ + $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE mimepart=?'); + $result=$query->execute(array($part1)); + }else{ + $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE mimetype=?'); + $result=$query->execute(array($part1.'/'.$part2)); + } + $names=array(); + while($row=$result->fetchRow()){ + $names[]=$row['path']; + } + return $names; + } +} + +//watch for changes and try to keep the cache up to date +OC_Hook::connect('OC_Filesystem','post_write','OC_FileCache','fileSystemWatcherWrite'); +OC_Hook::connect('OC_Filesystem','delete','OC_FileCache','fileSystemWatcherDelete'); +OC_Hook::connect('OC_Filesystem','rename','OC_FileCache','fileSystemWatcherRename'); + diff --git a/lib/files.php b/lib/files.php index 88b559059f0..143aab5c72d 100644 --- a/lib/files.php +++ b/lib/files.php @@ -36,44 +36,13 @@ class OC_Files { if(strpos($directory,OC::$CONFIG_DATADIRECTORY)===0){ $directory=substr($directory,strlen(OC::$CONFIG_DATADIRECTORY)); } - $filesfound=true; - $content=array(); - $dirs=array(); - $file=array(); - $files=array(); - if(OC_Filesystem::is_dir($directory)) { - if ($dh = OC_Filesystem::opendir($directory)) { - while (($filename = readdir($dh)) !== false) { - if($filename<>'.' and $filename<>'..' and substr($filename,0,1)!='.'){ - $file=array(); - $filesfound=true; - $file['name']=$filename; - $file['directory']=$directory; - $stat=OC_Filesystem::stat($directory.'/'.$filename); - $file=array_merge($file,$stat); - $file['size']=OC_Filesystem::filesize($directory.'/'.$filename); - $file['mime']=OC_Files::getMimeType($directory .'/'. $filename); - $file['readable']=OC_Filesystem::is_readable($directory .'/'. $filename); - $file['writeable']=OC_Filesystem::is_writeable($directory .'/'. $filename); - $file['type']=OC_Filesystem::filetype($directory .'/'. $filename); - if($file['type']=='dir'){ - $dirs[$file['name']]=$file; - }else{ - $files[$file['name']]=$file; - } - } - } - closedir($dh); - } + $files=OC_FileCache::getFolderContent($directory); + foreach($files as &$file){ + $file['directory']=$directory; + $file['type']=($file['mimetype']=='httpd/unix-directory')?'dir':'file'; } - uksort($dirs, "strnatcasecmp"); uksort($files, "strnatcasecmp"); - $content=array_merge($dirs,$files); - if($filesfound){ - return $content; - }else{ - return false; - } + return $files; } diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index b5d6023c494..87efdb15ad2 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -13,13 +13,11 @@ class OC_Filestorage_Local extends OC_Filestorage{ } public function mkdir($path){ if($return=mkdir($this->datadir.$path)){ - $this->clearFolderSizeCache($path); } return $return; } public function rmdir($path){ if($return=rmdir($this->datadir.$path)){ - $this->clearFolderSizeCache($path); } return $return; } @@ -72,12 +70,10 @@ class OC_Filestorage_Local extends OC_Filestorage{ } public function file_put_contents($path,$data){ if($return=file_put_contents($this->datadir.$path,$data)){ - $this->clearFolderSizeCache($path); } } public function unlink($path){ $return=$this->delTree($path); - $this->clearFolderSizeCache($path); return $return; } public function rename($path1,$path2){ @@ -87,8 +83,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ } if($return=rename($this->datadir.$path1,$this->datadir.$path2)){ - $this->clearFolderSizeCache($path1); - $this->clearFolderSizeCache($path2); } return $return; } @@ -101,7 +95,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ $path2.=$source; } if($return=copy($this->datadir.$path1,$this->datadir.$path2)){ - $this->clearFolderSizeCache($path2); } return $return; } @@ -114,12 +107,10 @@ class OC_Filestorage_Local extends OC_Filestorage{ case 'w+': case 'x+': case 'a+': - $this->clearFolderSizeCache($path); break; case 'w': case 'x': case 'a': - $this->clearFolderSizeCache($path); break; } } @@ -182,7 +173,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ $fileStats = stat($tmpFile); if(rename($tmpFile,$this->datadir.$path)){ touch($this->datadir.$path, $fileStats['mtime'], $fileStats['atime']); - $this->clearFolderSizeCache($path); return true; }else{ return false; @@ -198,7 +188,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ if ($item == '.' || $item == '..') continue; if(is_file($dir.'/'.$item)){ if(unlink($dir.'/'.$item)){ - $this->clearFolderSizeCache($dir); } }elseif(is_dir($dir.'/'.$item)){ if (!$this->delTree($dirRelative. "/" . $item)){ @@ -207,7 +196,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ } } if($return=rmdir($dir)){ - $this->clearFolderSizeCache($dir); } return $return; } @@ -247,75 +235,6 @@ class OC_Filestorage_Local extends OC_Filestorage{ * @return int size of folder and it's content */ public function getFolderSize($path){ - $path=str_replace('//','/',$path); - if($this->is_dir($path) and substr($path,-1)!='/'){ - $path.='/'; - } - $query=OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path=?"); - $size=$query->execute(array($path))->fetchAll(); - if(count($size)>0){// we already the size, just return it - return $size[0]['size']; - }else{//the size of the folder isn't know, calulate it - return $this->calculateFolderSize($path); - } - } - - /** - * @brief calulate the size of folder and it's content and cache it - * @param string $path file path - * @return int size of folder and it's content - */ - public function calculateFolderSize($path){ - if($this->is_file($path)){ - $path=dirname($path); - } - $path=str_replace('//','/',$path); - if($this->is_dir($path) and substr($path,-1)!='/'){ - $path.='/'; - } - $size=0; - if ($dh = $this->opendir($path)) { - while (($filename = readdir($dh)) !== false) { - if($filename!='.' and $filename!='..'){ - $subFile=$path.'/'.$filename; - if($this->is_file($subFile)){ - $size+=$this->filesize($subFile); - }else{ - $size+=$this->getFolderSize($subFile); - } - } - } - if($size>0){ - $query=OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)"); - $result=$query->execute(array($path,$size)); - } - } - return $size; - } - - /** - * @brief clear the folder size cache of folders containing a file - * @param string $path - */ - public function clearFolderSizeCache($path){ - if($this->is_file($path)){ - $path=dirname($path); - } - $path=str_replace('//','/',$path); - if($this->is_dir($path) and substr($path,-1)!='/'){ - $path.='/'; - } - $query=OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); - $result=$query->execute(array($path)); - if($path!='/' and $path!=''){ - $parts=explode('/',$path); - //pop empty part - $part=array_pop($parts); - if(empty($part)){ - array_pop($parts); - } - $parent=implode('/',$parts); - $this->clearFolderSizeCache($parent); - } + return 0;//depricated, use OC_FileCach instead } } diff --git a/lib/filesystem.php b/lib/filesystem.php index 268f7ddbd28..bd68831a711 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -42,6 +42,7 @@ * * the &run parameter can be set to false to prevent the operation from occuring */ + class OC_Filesystem{ static private $storages=array(); static private $mounts=array(); @@ -84,6 +85,14 @@ class OC_Filesystem{ } self::$fakeRoot=$fakeRoot; } + + /** + * get the fake root + * @return string + */ + static public function getRoot(){ + return self::$fakeRoot; + } /** * get the part of the path relative to the mountpoint of the storage it's stored in diff --git a/lib/util.php b/lib/util.php index e010a572e3a..b20e8e69e73 100644 --- a/lib/util.php +++ b/lib/util.php @@ -49,6 +49,11 @@ class OC_Util { $quotaProxy=new OC_FileProxy_Quota(); OC_FileProxy::register($quotaProxy); self::$fsSetup=true; + + //create the file cache if necesary + if(!OC_FileCache::inCache('')){ + OC_FileCache::scan(''); + } } } -- GitLab From 524e3686a0da79493a6048d8d92b7bbb0982ec08 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Nov 2011 16:40:09 +0100 Subject: [PATCH 018/546] tell the user when the files are being scanned --- apps/files_sharing/sharedstorage.php | 29 ++++++--------------------- files/ajax/scan.php | 16 +++++++++++++++ files/css/files.css | 4 +++- files/js/files.js | 19 ++++++++++++++++++ files/templates/index.php | 5 +++++ lib/filecache.php | 2 ++ lib/util.php | 5 ----- owncloud.db.filesystem | Bin 0 -> 2348032 bytes 8 files changed, 51 insertions(+), 29 deletions(-) create mode 100644 files/ajax/scan.php create mode 100644 owncloud.db.filesystem diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index 5e5360e8991..f7849d499f0 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -172,18 +172,9 @@ class OC_Filestorage_Shared extends OC_Filestorage { // TODO fill in other components of array public function stat($path) { if ($path == "" || $path == "/") { - $stat["dev"] = ""; - $stat["ino"] = ""; - $stat["mode"] = ""; - $stat["nlink"] = ""; - $stat["uid"] = ""; - $stat["gid"] = ""; - $stat["rdev"] = ""; $stat["size"] = $this->filesize($path); $stat["mtime"] = $this->filemtime($path); $stat["ctime"] = $this->filectime($path); - $stat["blksize"] = ""; - $stat["blocks"] = ""; return $stat; } else { $source = $this->getSource($path); @@ -220,18 +211,7 @@ class OC_Filestorage_Shared extends OC_Filestorage { } public function getFolderSize($path) { - // Shared folder sizes are cached separately from the source folder sizes because folders can have different names - $path = rtrim($path, "/"); - $path = ltrim($path, "/"); - $path = preg_replace('{(/)\1+}', "/", $path); - $dbpath = rtrim($this->datadir.$path, "/"); -// $query = OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path = ?"); -// $size = $query->execute(array($dbpath))->fetchAll(); - if (count($size) > 0) { - return $size[0]['size']; - } else { - return $this->calculateFolderSize($path); - } + return 0; //depricated } private function calculateFolderSize($path) { @@ -321,8 +301,8 @@ class OC_Filestorage_Shared extends OC_Filestorage { $ctime = $tempctime; } } - return $ctime; } + return $ctime; } else { $source = $this->getSource($path); if ($source) { @@ -342,8 +322,8 @@ class OC_Filestorage_Shared extends OC_Filestorage { $mtime = $tempmtime; } } - return $mtime; } + return $mtime; } else { $source = $this->getSource($path); if ($source) { @@ -482,6 +462,9 @@ class OC_Filestorage_Shared extends OC_Filestorage { } public function getMimeType($path) { + if ($path2 == "" || $path2 == "/") { + return 'httpd/unix-directory'; + } $source = $this->getSource($path); if ($source) { $storage = OC_Filesystem::getStorage($source); diff --git a/files/ajax/scan.php b/files/ajax/scan.php new file mode 100644 index 00000000000..dec949a819b --- /dev/null +++ b/files/ajax/scan.php @@ -0,0 +1,16 @@ + array( "done" => true))); +}else{ + OC_JSON::success(array("data" => array( "done" => false))); +} \ No newline at end of file diff --git a/files/css/files.css b/files/css/files.css index 22f4810d0a6..39f0b9fe780 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -73,4 +73,6 @@ table thead.fixed { height:2em; } /* add breadcrumb divider to the File item in navigation panel */ #navigation>ul>li:first-child { background:url('../../core/img/breadcrumb-start.svg') no-repeat 12.5em 0px; width:12.5em; padding-right:1em; position:fixed; } -#navigation>ul>li:first-child+li { padding-top:2.9em; } \ No newline at end of file +#navigation>ul>li:first-child+li { padding-top:2.9em; } + +#scanning-message{ top:40%; left:40%; position:absolute; display:none } \ No newline at end of file diff --git a/files/js/files.js b/files/js/files.js index 4eaa098241b..4dca1a110ec 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -334,8 +334,27 @@ $(document).ready(function() { $('#new>a').click(); }); }); + + //check if we need to scan the filesystem + $.get(OC.filePath('files','ajax','scan.php'),{checkonly:'true'}, function(response) { + if(response.data.done){ + scanFiles(); + } + }, "json"); }); +function scanFiles(force){ + force=!!force; //cast to bool + $('#scanning-message').show(); + $.get(OC.filePath('files','ajax','scan.php'), function(response) { + if(response && response.data && response.data.done){ + window.location.reload(); + }else{ + alert('error') + } + }, "json"); +} + function boolOperationFinished(data, callback) { result = jQuery.parseJSON(data.responseText); if(result.status == 'success'){ diff --git a/files/templates/index.php b/files/templates/index.php index 722c38e4776..21a4e2df010 100644 --- a/files/templates/index.php +++ b/files/templates/index.php @@ -63,3 +63,8 @@ if (isset($_['files'])) { t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?>

+
+

+ t('Files are being scanned, please wait.');?> +

+
diff --git a/lib/filecache.php b/lib/filecache.php index 41e31b5de25..902a8052afc 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -70,6 +70,8 @@ class OC_FileCache{ } $mimePart=dirname($data['mimetype']); $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart) VALUES(?,?,?,?,?,?,?,?)'); +// echo $path; +// print_r($data); $query->execute(array($parent,basename($path),$path,$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart)); } diff --git a/lib/util.php b/lib/util.php index b20e8e69e73..e010a572e3a 100644 --- a/lib/util.php +++ b/lib/util.php @@ -49,11 +49,6 @@ class OC_Util { $quotaProxy=new OC_FileProxy_Quota(); OC_FileProxy::register($quotaProxy); self::$fsSetup=true; - - //create the file cache if necesary - if(!OC_FileCache::inCache('')){ - OC_FileCache::scan(''); - } } } diff --git a/owncloud.db.filesystem b/owncloud.db.filesystem new file mode 100644 index 0000000000000000000000000000000000000000..082977a37eff00bc5a0e6aeffa6a8fa9f57025fd GIT binary patch literal 2348032 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%0A`O%8%9QYO{Jk{aR{Xzs{G*F1f1px5(I$0U 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 Date: Thu, 10 Nov 2011 16:53:08 +0100 Subject: [PATCH 019/546] always load the filecache --- lib/filesystem.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/filesystem.php b/lib/filesystem.php index bd68831a711..93f52423332 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -443,3 +443,5 @@ class OC_Filesystem{ return null; } } + +require_once('filecache.php'); -- GitLab From 5a8235eca0c282d79d48f65a5419c6c855ecdc36 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Nov 2011 16:54:45 +0100 Subject: [PATCH 020/546] use force parameter --- files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/js/files.js b/files/js/files.js index 4dca1a110ec..3e1bffccca5 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -346,7 +346,7 @@ $(document).ready(function() { function scanFiles(force){ force=!!force; //cast to bool $('#scanning-message').show(); - $.get(OC.filePath('files','ajax','scan.php'), function(response) { + $.get(OC.filePath('files','ajax','scan.php'),{force:force}, function(response) { if(response && response.data && response.data.done){ window.location.reload(); }else{ -- GitLab From b2f2a8774586a49dee066a1fef674b26c04c5755 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Nov 2011 23:50:43 +0100 Subject: [PATCH 021/546] use cache for searching files --- lib/filecache.php | 6 +++--- lib/filesystem.php | 16 +++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/filecache.php b/lib/filecache.php index 902a8052afc..db3d6ca1d5b 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -62,6 +62,7 @@ class OC_FileCache{ $path=OC_Filesystem::getRoot().$path; if($id=self::getFileId($path)!=-1){ self::update($id,$data); + return; } if($path=='/'){ $parent=-1; @@ -115,9 +116,9 @@ class OC_FileCache{ * @param string $query * @return array of filepaths */ - public static function search($query){ + public static function search($search){ $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ?'); - $result=$query->execute(array("%$query%")); + $result=$query->execute(array("%$search%")); $names=array(); while($row=$result->fetchRow()){ $names[]=$row['path']; @@ -330,4 +331,3 @@ class OC_FileCache{ OC_Hook::connect('OC_Filesystem','post_write','OC_FileCache','fileSystemWatcherWrite'); OC_Hook::connect('OC_Filesystem','delete','OC_FileCache','fileSystemWatcherDelete'); OC_Hook::connect('OC_Filesystem','rename','OC_FileCache','fileSystemWatcherRename'); - diff --git a/lib/filesystem.php b/lib/filesystem.php index 93f52423332..c3830b34168 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -390,15 +390,13 @@ class OC_Filesystem{ $files=array(); $fakeRoot=self::$fakeRoot; $fakeRootLength=strlen($fakeRoot); - foreach(self::$storages as $mountpoint=>$storage){ - $results=$storage->search($query); - if(is_array($results)){ - foreach($results as $result){ - $file=str_replace('//','/',$mountpoint.$result); - if(substr($file,0,$fakeRootLength)==$fakeRoot){ - $file=substr($file,$fakeRootLength); - $files[]=$file; - } + $results=OC_FileCache::search($query); + if(is_array($results)){ + foreach($results as $result){ + $file=str_replace('//','/',$mountpoint.$result); + if(substr($file,0,$fakeRootLength)==$fakeRoot){ + $file=substr($file,$fakeRootLength); + $files[]=$file; } } } -- GitLab From 88de9e40503833f76e79e8ac722025ceafd15c4b Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Fri, 11 Nov 2011 20:46:06 +0000 Subject: [PATCH 022/546] Keyboard shortcuts for saving. Refined code. --- apps/files_texteditor/js/editor.js | 59 +++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index fd93ac5a7a8..828839cbc92 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -77,8 +77,10 @@ function updateSessionFileHash(path){ "json"); } +var editor_is_saving = false; function doFileSave(){ if(is_editor_shown){ + editor_is_saving = true; $('#editor_save').after(''); var filecontents = window.aceEditor.getSession().getValue(); var dir = $('#editor').attr('data-dir'); @@ -93,7 +95,10 @@ function doFileSave(){ $('#saving_icon').remove(); $('#editor_save').after('

Saved!

') setTimeout(function() { - $('#save_result').remove(); + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + editor_is_saving = false; + }); }, 2000); } else { @@ -101,7 +106,10 @@ function doFileSave(){ $('#saving_icon').remove(); $('#editor_save').after('

Failed!

'); setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + editor_is_saving = false; + }); }, 2000); } }, 'json'); @@ -112,7 +120,10 @@ function doFileSave(){ // Temporary measure until we get a tick icon $('#editor_save').after('

Saved!

'); setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + editor_is_saving = false; + }); }, 2000); } } @@ -122,21 +133,17 @@ function doFileSave(){ // Temporary measure until we get a tick icon $('#editor_save').after('

Saved!

'); setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ $(this).remove(); }); + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + editor_is_saving = false; + }); }, 2000); } }, 'json'); - giveEditorFocus(); - } else { - $('#editor').data('editor','false'); - return; + window.aceEditor.focus(); } }; -function giveEditorFocus(){ - window.aceEditor.focus(); -}; - function showFileEditor(dir,filename){ if(!is_editor_shown){ // Loads the file editor and display it. @@ -190,9 +197,31 @@ function hideFileEditor(){ } } +// Keyboard Shortcuts +var ctrlBtn = false; + +function checkForCtrlKey(e){ + if(e.which == 17 || e.which == 91) ctrlBtn=false; + } + +function checkForSaveKeyPress(e){ + if(!editor_is_saving){ + if(e.which == 17 || e.which == 91) ctrlBtn=true; + if(e.which == 83 && ctrlBtn == true) { + e.preventDefault(); + doFileSave(); + return false; + } + } else { + e.preventDefault(); + } +} + +// Sets the correct size of the editor window $(window).resize(function() { setEditorSize(); }); + var is_editor_shown = false; $(document).ready(function(){ @@ -220,4 +249,8 @@ $(document).ready(function(){ } // Binds the file save and close editor events to the buttons bindControlEvents(); -}); + + // Binds the save keyboard shortcut events + $(document).unbind('keyup').bind('keyup',checkForCtrlKey).unbind('keydown').bind('keydown',checkForSaveKeyPress); + + }); -- GitLab From 024f4375b6fc476033dbd13f03e663076d44398b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 12 Nov 2011 01:00:04 +0100 Subject: [PATCH 023/546] keep encrypted and versioned flag in fscache --- db_structure.xml | 16 +++++++++++++++ lib/filecache.php | 50 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index c7fa423e14e..39dea564b0f 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -126,6 +126,22 @@ 32 + + encrypted + integer + 0 + true + 1 + + + + versioned + integer + 0 + true + 1 + + path_index true diff --git a/lib/filecache.php b/lib/filecache.php index db3d6ca1d5b..928fc02e669 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -38,10 +38,12 @@ class OC_FileCache{ * - mtime * - ctime * - mimetype + * - encrypted + * - versioned */ public static function get($path){ $path=OC_Filesystem::getRoot().$path; - $query=OC_DB::prepare('SELECT ctime,mtime,mimetype,size FROM *PREFIX*fscache WHERE path=?'); + $query=OC_DB::prepare('SELECT ctime,mtime,mimetype,size,encrypted,versioned FROM *PREFIX*fscache WHERE path=?'); $result=$query->execute(array($path))->fetchRow(); if(is_array($result)){ return $result; @@ -60,19 +62,24 @@ class OC_FileCache{ */ public static function put($path,$data){ $path=OC_Filesystem::getRoot().$path; - if($id=self::getFileId($path)!=-1){ - self::update($id,$data); - return; - } if($path=='/'){ $parent=-1; }else{ $parent=self::getFileId(dirname($path)); } + $id=self::getFileId($path); + if($id!=-1){ + self::update($id,$data); + return; + } + if(!isset($data['encrypted'])){ + $data['encrypted']=false; + } + if(!isset($data['versioned'])){ + $data['versioned']=false; + } $mimePart=dirname($data['mimetype']); $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart) VALUES(?,?,?,?,?,?,?,?)'); -// echo $path; -// print_r($data); $query->execute(array($parent,basename($path),$path,$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart)); } @@ -83,9 +90,21 @@ class OC_FileCache{ * @param array $data */ private static function update($id,$data){ - $mimePart=dirname($data['mimetype']); - $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=? ,mtime=? ,ctime=? ,mimetype=? , mimepart=? WHERE id=?'); - $query->execute(array($data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$id)); + $arguments=array(); + $queryParts=array(); + foreach(array('size','mtime','ctime','mimetype','encrypted','versioned') as $attribute){ + if(isset($data[$attribute])){ + $arguments[]=$data[$attribute]; + $queryParts[]=$attribute.'=?'; + } + } + if(isset($data['mimetype'])){ + $arguments[]=dirname($data['mimetype']); + $queryParts[]='mimepart=?'; + } + $arguments[]=$id; + $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET '.implode(' , ',$queryParts).' WHERE id=?'); + $query->execute($arguments); } /** @@ -137,11 +156,13 @@ class OC_FileCache{ * - mtime * - ctime * - mimetype + * - encrypted + * - versioned */ public static function getFolderContent($path){ $path=OC_Filesystem::getRoot().$path; $parent=self::getFileId($path); - $query=OC_DB::prepare('SELECT name,ctime,mtime,mimetype,size FROM *PREFIX*fscache WHERE parent=?'); + $query=OC_DB::prepare('SELECT name,ctime,mtime,mimetype,size,encrypted,versioned FROM *PREFIX*fscache WHERE parent=?'); $result=$query->execute(array($parent))->fetchAll(); if(is_array($result)){ return $result; @@ -201,8 +222,9 @@ class OC_FileCache{ if($mimetype=='httpd/unix-directory'){ $size=0; }else{ - if(($id=self::getFileId($fullPath))!=-1){ - $oldInfo=self::get($fullPath); + $id=self::getFileId($fullPath); + if($id!=-1){ + $oldInfo=self::get($path); $oldSize=$oldInfo['size']; }else{ $oldSize=0; @@ -221,7 +243,6 @@ class OC_FileCache{ public static function fileSystemWatcherDelete($params){ $path=$params['path']; $fullPath=OC_Filesystem::getRoot().$path; - error_log("delete $path"); if(self::getFileId($fullPath)==-1){ return; } @@ -258,7 +279,6 @@ class OC_FileCache{ private static function increaseSize($path,$sizeDiff){ while(($id=self::getFileId($path))!=-1){ $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=size+? WHERE id=?'); - error_log('diff '.$path.' '.$sizeDiff); $query->execute(array($sizeDiff,$id)); $path=dirname($path); } -- GitLab From bf40691acef66d8ef14b0917d12c32633804d3c7 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 12 Nov 2011 18:06:07 +0100 Subject: [PATCH 024/546] some fixes in the sqlite3 driver --- lib/MDB2/Driver/Manager/sqlite3.php | 2 +- lib/MDB2/Driver/Reverse/sqlite3.php | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index c5c19a90fb5..7e30755fc3a 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -798,7 +798,7 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return $db; } - $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name"; + $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL AND name!='sqlite_sequence' ORDER BY name"; $table_names = $db->queryCol($query); if (PEAR::isError($table_names)) { return $table_names; diff --git a/lib/MDB2/Driver/Reverse/sqlite3.php b/lib/MDB2/Driver/Reverse/sqlite3.php index d5595da84c5..33e5b590268 100644 --- a/lib/MDB2/Driver/Reverse/sqlite3.php +++ b/lib/MDB2/Driver/Reverse/sqlite3.php @@ -69,7 +69,7 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, 'unexpected empty table column definition list', __FUNCTION__); } - $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i'; + $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( AUTOINCREMENT)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i'; $regexp2 = '/^\s*([^ ]+) +(PRIMARY|UNIQUE|CHECK)$/i'; for ($i=0, $j=0; $i<$count; ++$i) { if (!preg_match($regexp, trim($column_sql[$i]), $matches)) { @@ -90,11 +90,16 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common if (isset($matches[8]) && strlen($matches[8])) { $columns[$j]['unsigned'] = true; } - if (isset($matches[9]) && strlen($matches[9])) { + if (isset($matches[10]) && strlen($matches[10])) { $columns[$j]['autoincrement'] = true; + $columns[$j]['notnull']=true; } - if (isset($matches[12]) && strlen($matches[12])) { - $default = $matches[12]; + if (isset($matches[10]) && strlen($matches[10])) { + $columns[$j]['autoincrement'] = true; + $columns[$j]['notnull']=true; + } + if (isset($matches[13]) && strlen($matches[13])) { + $default = $matches[13]; if (strlen($default) && $default[0]=="'") { $default = str_replace("''", "'", substr($default, 1, strlen($default)-2)); } @@ -107,8 +112,8 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common $columns[$j]['notnull'] = ($matches[7] === ' NOT NULL'); } else if (isset($matches[9]) && strlen($matches[9])) { $columns[$j]['notnull'] = ($matches[9] === ' NOT NULL'); - } else if (isset($matches[13]) && strlen($matches[13])) { - $columns[$j]['notnull'] = ($matches[13] === ' NOT NULL'); + } else if (isset($matches[14]) && strlen($matches[14])) { + $columns[$j]['notnull'] = ($matches[14] === ' NOT NULL'); } ++$j; } -- GitLab From 486a31bfa38c0cd0dc02f46d65d3a443359441a9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:06:29 +0100 Subject: [PATCH 025/546] minor changes to mysql setup --- lib/setup.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index e2d56ddaf4a..1beb9e4936f 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -158,8 +158,8 @@ class OC_Setup { //add prefix to the postgresql user name to prevent collissions $dbusername='oc_'.$username; - //hash the password so we don't need to store the admin config in the config file - $dbpassword=md5(time().$password); + //create a new password so we don't need to store the admin config in the config file + $dbpassword=md5(time()); self::pg_createDBUser($dbusername, $dbpassword, $connection); @@ -219,7 +219,7 @@ class OC_Setup { } public static function createDatabase($name,$user,$connection) { - //we cant user OC_BD functions here because we need to connect as the administrative user. + //we cant use OC_BD functions here because we need to connect as the administrative user. $query = "CREATE DATABASE IF NOT EXISTS `$name`"; $result = mysql_query($query, $connection); if(!$result) { @@ -241,7 +241,7 @@ class OC_Setup { } public static function pg_createDatabase($name,$user,$connection) { - //we cant user OC_BD functions here because we need to connect as the administrative user. + //we cant use OC_BD functions here because we need to connect as the administrative user. $query = "CREATE DATABASE $name OWNER $user"; $result = pg_query($connection, $query); if(!$result) { -- GitLab From aa7c5a971ce9431c0a51e1110046f211fa446c11 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:08:47 +0100 Subject: [PATCH 026/546] small fix in sqlite3 driver --- lib/MDB2/Driver/Manager/sqlite3.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index 7e30755fc3a..71b9597d202 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -168,9 +168,6 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common if (PEAR::isError($query_fields)) { return $query_fields; } - if (!empty($options['primary'])) { - $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')'; - } if (!empty($options['foreign_keys'])) { foreach ($options['foreign_keys'] as $fkname => $fkdef) { if (empty($fkdef)) { -- GitLab From b2f1429b75085eaa3dc2be37df43283b47cd1e39 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:16:21 +0100 Subject: [PATCH 027/546] automatically upgrade the main database on version number increase (doesnt work with sqlite for now) --- lib/base.php | 10 ++++++++-- lib/db.php | 9 ++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/base.php b/lib/base.php index c52b4493e01..554036164e6 100644 --- a/lib/base.php +++ b/lib/base.php @@ -119,6 +119,12 @@ class OC{ } } + $installedVersion=OC_Config::getValue('version','0.0.0'); + $currentVersion=implode('.',OC_Util::getVersion()); + if (version_compare($currentVersion, $installedVersion, '>')) { + OC_DB::updateDbFromStructure('../db_structure.xml'); + } + ini_set('session.cookie_httponly','1;'); session_start(); @@ -187,8 +193,6 @@ if( !isset( $RUNTIME_NOAPPS )){ $RUNTIME_NOAPPS = false; } -OC::init(); - if(!function_exists('get_temp_dir')) { function get_temp_dir() { if( $temp=ini_get('upload_tmp_dir') ) return $temp; @@ -204,6 +208,8 @@ if(!function_exists('get_temp_dir')) { } } +OC::init(); + require_once('fakedirstream.php'); // FROM search.php diff --git a/lib/db.php b/lib/db.php index c059f5ab336..0fee5e03816 100644 --- a/lib/db.php +++ b/lib/db.php @@ -338,7 +338,6 @@ class OC_DB { * @param $file file to read structure from */ public static function updateDbFromStructure($file){ - $CONFIG_DBNAME = OC_Config::getValue( "dbname", "owncloud" ); $CONFIG_DBTABLEPREFIX = OC_Config::getValue( "dbtableprefix", "oc_" ); $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); @@ -347,17 +346,17 @@ class OC_DB { // read file $content = file_get_contents( $file ); + $previousSchema = self::$schema->getDefinitionFromDatabase(); + // Make changes and save them to a temporary file $file2 = tempnam( get_temp_dir(), 'oc_db_scheme_' ); - $content = str_replace( '*dbname*', $CONFIG_DBNAME, $content ); + $content = str_replace( '*dbname*', $previousSchema['name'], $content ); $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content ); if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); } file_put_contents( $file2, $content ); - $previousSchema = self::$schema->getDefinitionFromDatabase(); - $op = $schema->updateDatabase($file2, $previousSchema, array(), false); - + $op = self::$schema->updateDatabase($file2, $previousSchema, array(), false); if (PEAR::isError($op)) { $error = $op->getMessage(); OC_Log::write('core','Failed to update database structure ('.$error.')',OC_Log::FATAL); -- GitLab From 9686c5b6aa981481063477efa54f21e9debfa453 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 15:58:12 +0100 Subject: [PATCH 028/546] fixes in the sqlite manager driver --- lib/MDB2/Driver/Manager/sqlite3.php | 72 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index 71b9597d202..a6fde69d6c4 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -531,9 +531,26 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return MDB2_OK; } + if (empty($changes['remove']) and empty($changes['rename']) and empty($changes['change']) ){//if only rename or add changes are required, we can use ALTER TABLE + $query = ''; + if (!empty($changes['name'])) { + $change_name = $db->quoteIdentifier($changes['name'], true); + $query = 'RENAME TO ' . $change_name; + $db->exec("ALTER TABLE $name $query"); + } + + if (!empty($changes['add']) && is_array($changes['add'])) { + foreach ($changes['add'] as $field_name => $field) { + $query= 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field); + $db->exec("ALTER TABLE $name $query"); + } + } + return MDB2_OK; + } + $db->loadModule('Reverse', null, true); - // actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it + // for other operations we need to emulate them with sqlite3 $fields = $db->manager->listTableFields($name); if (PEAR::isError($fields)) { return $fields; @@ -633,16 +650,10 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common } } + //rename the old table so we can create the new one + $db->exec("ALTER TABLE $name RENAME TO __$name"); $data = null; - if (!empty($select_fields)) { - $query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true); - $data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED); - } - $result = $this->dropTable($name); - if (PEAR::isError($result)) { - return $result; - } $result = $this->createTable($name_new, $fields, $options); if (PEAR::isError($result)) { @@ -657,20 +668,35 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common $this->createConstraint($name_new, $constraint, $definition); } - if (!empty($select_fields) && !empty($data)) { - $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); - $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; - $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; - $stmt =$db->prepare($query, null, MDB2_PREPARE_MANIP); - if (PEAR::isError($stmt)) { - return $stmt; - } - foreach ($data as $row) { - $result = $stmt->execute($row); - if (PEAR::isError($result)) { - return $result; - } - } + //fill the new table with data from the old one + if (!empty($select_fields)) { + $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); + $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; + $query .= ' SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier('__'.$name, true); + $db->exec($query); + } + +// if (!empty($select_fields) && !empty($data)) { +// $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); +// $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; +// $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; +// $stmt =$db->prepare($query, null, MDB2_PREPARE_MANIP); +// if (PEAR::isError($stmt)) { +// return $stmt; +// } +// foreach ($data as $row) { +// $result = $stmt->execute($row); +// if (PEAR::isError($result)) { +// return $result; +// } +// } +// } + echo "changes $name"; + + //remove the old table + $result = $this->dropTable('__'.$name); + if (PEAR::isError($result)) { + return $result; } return MDB2_OK; } -- GitLab From 916c72b40be8db891856669643e7b605c087297e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 15:59:01 +0100 Subject: [PATCH 029/546] set the installed version after updating the database --- lib/base.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/base.php b/lib/base.php index 554036164e6..b6e8ccbe283 100644 --- a/lib/base.php +++ b/lib/base.php @@ -123,6 +123,7 @@ class OC{ $currentVersion=implode('.',OC_Util::getVersion()); if (version_compare($currentVersion, $installedVersion, '>')) { OC_DB::updateDbFromStructure('../db_structure.xml'); + OC_Config::setValue('version',implode('.',OC_Util::getVersion())); } ini_set('session.cookie_httponly','1;'); -- GitLab From 98dc0882cbba43e892d2a5a7bf015d0218e026cb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 16:08:08 +0100 Subject: [PATCH 030/546] fix errors during database migration --- lib/MDB2/Driver/Manager/sqlite3.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index a6fde69d6c4..8f4e1312eb8 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -660,13 +660,15 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return $result; } - foreach ($indexes as $index => $definition) { - $this->createIndex($name_new, $index, $definition); - } + //these seem to only give errors - foreach ($constraints as $constraint => $definition) { - $this->createConstraint($name_new, $constraint, $definition); - } +// foreach ($indexes as $index => $definition) { +// $this->createIndex($name_new, $index, $definition); +// } + +// foreach ($constraints as $constraint => $definition) { +// $this->createConstraint($name_new, $constraint, $definition); +// } //fill the new table with data from the old one if (!empty($select_fields)) { @@ -691,7 +693,6 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common // } // } // } - echo "changes $name"; //remove the old table $result = $this->dropTable('__'.$name); -- GitLab From 153029a1705fbeb16bd70b73f46550c0c902d0f4 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 26 Nov 2011 01:26:01 +0100 Subject: [PATCH 031/546] increase version to trigger database upgrade --- lib/util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index e010a572e3a..d70c7c605c1 100644 --- a/lib/util.php +++ b/lib/util.php @@ -62,7 +62,7 @@ class OC_Util { * @return array */ public static function getVersion(){ - return array(2,90,0); + return array(2,90,1); } /** -- GitLab From dd7a411f9aaceab1bf8eab551e5f95ff5feff6fb Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Tue, 29 Nov 2011 22:11:42 +0000 Subject: [PATCH 032/546] Disable save button while saving. Streamlined code. --- .gitignore | 1 + 3rdparty/css/chosen/chosen-sprite.png | Bin 742 -> 3998 bytes 3rdparty/css/chosen/chosen.css | 84 +- 3rdparty/fullcalendar/GPL-LICENSE.txt | 278 + 3rdparty/fullcalendar/MIT-LICENSE.txt | 20 + 3rdparty/fullcalendar/changelog.txt | 313 + 3rdparty/fullcalendar/css/fullcalendar.css | 616 ++ .../fullcalendar/css/fullcalendar.print.css | 59 + 3rdparty/fullcalendar/js/fullcalendar.js | 5210 +++++++++++++++++ 3rdparty/fullcalendar/js/fullcalendar.min.js | 113 + 3rdparty/fullcalendar/js/gcal.js | 112 + 3rdparty/js/chosen/VERSION | 2 +- 3rdparty/js/chosen/chosen.jquery.js | 169 +- 3rdparty/js/chosen/chosen.jquery.min.js | 4 +- 3rdparty/when/MIT-LICENSE.txt | 9 + 3rdparty/when/When.php | 725 +++ apps/admin_dependencies_chk/settings.php | 2 +- apps/bookmarks/bookmarksHelper.php | 5 +- apps/calendar/ajax/activation.php | 7 +- apps/calendar/ajax/changeview.php | 5 +- apps/calendar/ajax/createcalendar.php | 5 +- apps/calendar/ajax/editevent.php | 9 +- apps/calendar/ajax/editeventform.php | 9 +- apps/calendar/ajax/events.php | 84 + apps/calendar/ajax/guesstimezone.php | 39 + apps/calendar/ajax/moveevent.php | 118 +- apps/calendar/ajax/neweventform.php | 52 +- apps/calendar/ajax/resizeevent.php | 49 + apps/calendar/ajax/updatecalendar.php | 5 +- apps/calendar/appinfo/app.php | 2 + apps/calendar/css/style.css | 83 +- apps/calendar/index.php | 39 +- apps/calendar/js/calendar.js | 1123 ++-- apps/calendar/js/geo.js | 20 + apps/calendar/l10n/xgettextfiles | 10 +- apps/calendar/lib/calendar.php | 8 + apps/calendar/lib/object.php | 37 +- apps/calendar/lib/search.php | 26 + apps/calendar/templates/calendar.php | 223 +- .../part.choosecalendar.rowfields.php | 2 +- apps/calendar/templates/part.editevent.php | 1 + apps/calendar/templates/part.eventform.php | 12 +- apps/contacts/ajax/addcard.php | 5 + apps/contacts/ajax/getdetails.php | 12 + apps/contacts/ajax/setproperty.php | 17 +- apps/contacts/ajax/showaddcard.php | 5 + apps/contacts/ajax/showsetproperty.php | 4 + apps/contacts/css/formtastic.css | 8 +- apps/contacts/css/styles.css | 16 +- apps/contacts/index.php | 6 + apps/contacts/js/interface.js | 19 +- apps/contacts/lib/vcard.php | 50 +- apps/contacts/templates/part.addcardform.php | 18 +- apps/contacts/templates/part.details.php | 24 +- apps/contacts/templates/part.property.php | 27 +- .../templates/part.setpropertyform.php | 15 +- apps/external/ajax/seturls.php | 20 +- apps/external/appinfo/app.php | 10 +- apps/external/index.php | 2 +- apps/external/settings.php | 20 +- apps/files_sharing/ajax/getitem.php | 2 +- apps/files_sharing/ajax/setpermissions.php | 2 +- apps/files_sharing/ajax/share.php | 2 +- apps/files_sharing/ajax/unshare.php | 2 +- apps/files_sharing/ajax/userautocomplete.php | 2 +- apps/files_sharing/js/share.js | 2 +- apps/files_texteditor/js/editor.js | 113 +- apps/media/css/music.css | 3 +- apps/media/lib_ampache.php | 12 +- apps/media/lib_scanner.php | 6 +- apps/user_ldap/appinfo/app.php | 5 +- apps/user_ldap/settings.php | 21 +- apps/user_ldap/templates/settings.php | 17 +- apps/user_ldap/user_ldap.php | 78 +- core/css/styles.css | 8 - core/js/jquery-tipsy.js | 7 +- files/css/files.css | 9 +- files/index.php | 4 + files/js/files.js | 4 +- l10n/templates/calendar.pot | 366 +- lib/app.php | 4 +- lib/base.php | 8 + lib/config.php | 1 - lib/hook.php | 2 +- lib/l10n.php | 16 + lib/setup.php | 2 + lib/template.php | 27 + lib/updater.php | 91 + lib/util.php | 16 - settings/templates/personal.php | 4 +- 90 files changed, 9150 insertions(+), 1654 deletions(-) create mode 100644 3rdparty/fullcalendar/GPL-LICENSE.txt create mode 100644 3rdparty/fullcalendar/MIT-LICENSE.txt create mode 100644 3rdparty/fullcalendar/changelog.txt create mode 100644 3rdparty/fullcalendar/css/fullcalendar.css create mode 100644 3rdparty/fullcalendar/css/fullcalendar.print.css create mode 100644 3rdparty/fullcalendar/js/fullcalendar.js create mode 100644 3rdparty/fullcalendar/js/fullcalendar.min.js create mode 100644 3rdparty/fullcalendar/js/gcal.js create mode 100644 3rdparty/when/MIT-LICENSE.txt create mode 100755 3rdparty/when/When.php create mode 100644 apps/calendar/ajax/events.php create mode 100755 apps/calendar/ajax/guesstimezone.php create mode 100644 apps/calendar/ajax/resizeevent.php create mode 100755 apps/calendar/js/geo.js create mode 100644 apps/calendar/lib/search.php mode change 100644 => 100755 apps/calendar/templates/calendar.php create mode 100644 lib/updater.php diff --git a/.gitignore b/.gitignore index a84615cf138..68c48822e9d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ nbproject # WebFinger .well-known +/.buildpath diff --git a/3rdparty/css/chosen/chosen-sprite.png b/3rdparty/css/chosen/chosen-sprite.png index f20db4439ea5c1038126bf326c8fd048b03a8226..9edce05a6a899eaf98481d12dddbc433331a01ee 100644 GIT binary patch delta 3675 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 delta 395 zcmV;60d)SJALa#+7Y-%}0{{R3uWtyw00026hW2H=$?x#9xGbV7#^2p!UU?|T2Ii5zE`@j;o)o^r^4@E+uEG;9AL5Yg|RggC18 zQMd^X&mV%1!lnTZ1H(jNQeptiBq%KM5<6S~%8q~;z&Hxm#5>!HTsTvr`c-+u!kZqCC5mm$tL^@ay66=w7#;zQa^u)dMjNZr&1fIxv4F1=b& zcadNb06;rcUjqO(x?<;Ih0@*WcIOs&sq-FrQzYhPPl@+Z-p#CxH zIMkgMhm@g85_XG(@cS18PL%|ofBbiG&?#J$-*DK{d~1+fzG!0bqh{GcR3GYR2<-WG zJWTBwfeThLb2|w9jqK$u0uOqp@wnF32y7N=2g089a+e4!qPiwi*LE5REUGhWvbM9@ pegj?4jMSL~<8&5_rJi)+@d=yNidHAaT2cT2002ovPDHLkV1fyUx26C9 diff --git a/3rdparty/css/chosen/chosen.css b/3rdparty/css/chosen/chosen.css index 247d07bf021..b9c6d88028f 100644 --- a/3rdparty/css/chosen/chosen.css +++ b/3rdparty/css/chosen/chosen.css @@ -1,9 +1,4 @@ /* @group Base */ -select.chzn-select { - visibility: hidden; - height: 28px !important; - min-height: 28px !important; -} .chzn-container { font-size: 13px; position: relative; @@ -60,9 +55,21 @@ select.chzn-select { white-space: nowrap; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; - -moz-binding: url('/xml/ellipsis.xml#ellipsis'); text-overflow: ellipsis; } +.chzn-container-single .chzn-single abbr { + display: block; + position: absolute; + right: 26px; + top: 8px; + width: 12px; + height: 13px; + font-size: 1px; + background: url(chosen-sprite.png) right top no-repeat; +} +.chzn-container-single .chzn-single abbr:hover { + background-position: right -11px; +} .chzn-container-single .chzn-single div { -webkit-border-radius: 0 4px 4px 0; -moz-border-radius : 0 4px 4px 0; @@ -94,18 +101,19 @@ select.chzn-select { } .chzn-container-single .chzn-search { padding: 3px 4px; + position: relative; margin: 0; white-space: nowrap; } .chzn-container-single .chzn-search input { - background: #fff url('chosen-sprite.png') no-repeat 100% -20px; - background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: #fff url('chosen-sprite.png') no-repeat 100% -22px; + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); margin: 1px 0; padding: 4px 20px 4px 5px; outline: 0; @@ -123,6 +131,11 @@ select.chzn-select { } /* @end */ +.chzn-container-single-nosearch .chzn-search input { + position: absolute; + left: -9000px; +} + /* @group Multi Chosen */ .chzn-container-multi .chzn-choices { background-color: #fff; @@ -197,18 +210,18 @@ select.chzn-select { .chzn-container-multi .chzn-choices .search-choice .search-choice-close { display: block; position: absolute; - right: 5px; - top: 6px; - width: 8px; - height: 9px; + right: 3px; + top: 4px; + width: 12px; + height: 13px; font-size: 1px; background: url(chosen-sprite.png) right top no-repeat; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { - background-position: right -9px; + background-position: right -11px; } .chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { - background-position: right -9px; + background-position: right -11px; } /* @end */ @@ -226,6 +239,7 @@ select.chzn-select { padding: 0; } .chzn-container .chzn-results li { + display: none; line-height: 80%; padding: 7px 7px 8px; margin: 0; @@ -233,6 +247,7 @@ select.chzn-select { } .chzn-container .chzn-results .active-result { cursor: pointer; + display: list-item; } .chzn-container .chzn-results .highlighted { background: #3875d7; @@ -247,6 +262,7 @@ select.chzn-select { } .chzn-container .chzn-results .no-results { background: #f4f4f4; + display: list-item; } .chzn-container .chzn-results .group-result { cursor: default; @@ -309,6 +325,18 @@ select.chzn-select { } /* @end */ +/* @group Disabled Support */ +.chzn-disabled { + cursor: default; + opacity:0.5 !important; +} +.chzn-disabled .chzn-single { + cursor: default; +} +.chzn-disabled .chzn-choices .search-choice .search-choice-close { + cursor: default; +} + /* @group Right to Left */ .chzn-rtl { direction:rtl;text-align: right; } .chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; } @@ -327,14 +355,14 @@ select.chzn-select { .chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; } .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; } .chzn-rtl .chzn-search input { - background: url('chosen-sprite.png') no-repeat -38px -20px, #ffffff; - background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff; + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); padding: 4px 5px 4px 20px; } /* @end */ \ No newline at end of file diff --git a/3rdparty/fullcalendar/GPL-LICENSE.txt b/3rdparty/fullcalendar/GPL-LICENSE.txt new file mode 100644 index 00000000000..11dddd00ef0 --- /dev/null +++ b/3rdparty/fullcalendar/GPL-LICENSE.txt @@ -0,0 +1,278 @@ + 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. diff --git a/3rdparty/fullcalendar/MIT-LICENSE.txt b/3rdparty/fullcalendar/MIT-LICENSE.txt new file mode 100644 index 00000000000..46d47544964 --- /dev/null +++ b/3rdparty/fullcalendar/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2009 Adam Shaw + +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. diff --git a/3rdparty/fullcalendar/changelog.txt b/3rdparty/fullcalendar/changelog.txt new file mode 100644 index 00000000000..50d0880fd7a --- /dev/null +++ b/3rdparty/fullcalendar/changelog.txt @@ -0,0 +1,313 @@ + +version 1.5.2 (8/21/11) + - correctly process UTC "Z" ISO8601 date strings (issue 750) + +version 1.5.1 (4/9/11) + - more flexible ISO8601 date parsing (issue 814) + - more flexible parsing of UNIX timestamps (issue 826) + - FullCalendar now buildable from source on a Mac (issue 795) + - FullCalendar QA'd in FF4 (issue 883) + - upgraded to jQuery 1.5.2 (which supports IE9) and jQuery UI 1.8.11 + +version 1.5 (3/19/11) + - slicker default styling for buttons + - reworked a lot of the calendar's HTML and accompanying CSS + (solves issues 327 and 395) + - more printer-friendly (fullcalendar-print.css) + - fullcalendar now inherits styles from jquery-ui themes differently. + styles for buttons are distinct from styles for calendar cells. + (solves issue 299) + - can now color events through FullCalendar options and Event-Object properties (issue 117) + THIS IS NOW THE PREFERRED METHOD OF COLORING EVENTS (as opposed to using className and CSS) + - FullCalendar options: + - eventColor (changes both background and border) + - eventBackgroundColor + - eventBorderColor + - eventTextColor + - Event-Object options: + - color (changes both background and border) + - backgroundColor + - borderColor + - textColor + - can now specify an event source as an *object* with a `url` property (json feed) or + an `events` property (function or array) with additional properties that will + be applied to the entire event source: + - color (changes both background and border) + - backgroudColor + - borderColor + - textColor + - className + - editable + - allDayDefault + - ignoreTimezone + - startParam (for a feed) + - endParam (for a feed) + - ANY OF THE JQUERY $.ajax OPTIONS + allows for easily changing from GET to POST and sending additional parameters (issue 386) + allows for easily attaching ajax handlers such as `error` (issue 754) + allows for turning caching on (issue 355) + - Google Calendar feeds are now specified differently: + - specify a simple string of your feed's URL + - specify an *object* with a `url` property of your feed's URL. + you can include any of the new Event-Source options in this object. + - the old `$.fullCalendar.gcalFeed` method still works + - no more IE7 SSL popup (issue 504) + - remove `cacheParam` - use json event source `cache` option instead + - latest jquery/jquery-ui + +version 1.4.11 (2/22/11) + - fixed rerenderEvents bug (issue 790) + - fixed bug with faulty dragging of events from all-day slot in agenda views + - bundled with jquery 1.5 and jquery-ui 1.8.9 + +version 1.4.10 (1/2/11) + - fixed bug with resizing event to different week in 5-day month view (issue 740) + - fixed bug with events not sticking after a removeEvents call (issue 757) + - fixed bug with underlying parseTime method, and other uses of parseInt (issue 688) + +version 1.4.9 (11/16/10) + - new algorithm for vertically stacking events (issue 111) + - resizing an event to a different week (issue 306) + - bug: some events not rendered with consecutive calls to addEventSource (issue 679) + +version 1.4.8 (10/16/10) + - ignoreTimezone option (set to `false` to process UTC offsets in ISO8601 dates) + - bugfixes + - event refetching not being called under certain conditions (issues 417, 554) + - event refetching being called multiple times under certain conditions (issues 586, 616) + - selection cannot be triggered by right mouse button (issue 558) + - agenda view left axis sized incorrectly (issue 465) + - IE js error when calendar is too narrow (issue 517) + - agenda view looks strange when no scrollbars (issue 235) + - improved parsing of ISO8601 dates with UTC offsets + - $.fullCalendar.version + - an internal refactor of the code, for easier future development and modularity + +version 1.4.7 (7/5/10) + - "dropping" external objects onto the calendar + - droppable (boolean, to turn on/off) + - dropAccept (to filter which events the calendar will accept) + - drop (trigger) + - selectable options can now be specified with a View Option Hash + - bugfixes + - dragged & reverted events having wrong time text (issue 406) + - bug rendering events that have an endtime with seconds, but no hours/minutes (issue 477) + - gotoDate date overflow bug (issue 429) + - wrong date reported when clicking on edge of last column in agenda views (412) + - support newlines in event titles + - select/unselect callbacks now passes native js event + +version 1.4.6 (5/31/10) + - "selecting" days or timeslots + - options: selectable, selectHelper, unselectAuto, unselectCancel + - callbacks: select, unselect + - methods: select, unselect + - when dragging an event, the highlighting reflects the duration of the event + - code compressing by Google Closure Compiler + - bundled with jQuery 1.4.2 and jQuery UI 1.8.1 + +version 1.4.5 (2/21/10) + - lazyFetching option, which can force the calendar to fetch events on every view/date change + - scroll state of agenda views are preserved when switching back to view + - bugfixes + - calling methods on an uninitialized fullcalendar throws error + - IE6/7 bug where an entire view becomes invisible (issue 320) + - error when rendering a hidden calendar (in jquery ui tabs for example) in IE (issue 340) + - interconnected bugs related to calendar resizing and scrollbars + - when switching views or clicking prev/next, calendar would "blink" (issue 333) + - liquid-width calendar's events shifted (depending on initial height of browser) (issue 341) + - more robust underlying algorithm for calendar resizing + +version 1.4.4 (2/3/10) + - optimized event rendering in all views (events render in 1/10 the time) + - gotoDate() does not force the calendar to unnecessarily rerender + - render() method now correctly readjusts height + +version 1.4.3 (12/22/09) + - added destroy method + - Google Calendar event pages respect currentTimezone + - caching now handled by jQuery's ajax + - protection from setting aspectRatio to zero + - bugfixes + - parseISO8601 and DST caused certain events to display day before + - button positioning problem in IE6 + - ajax event source removed after recently being added, events still displayed + - event not displayed when end is an empty string + - dynamically setting calendar height when no events have been fetched, throws error + +version 1.4.2 (12/02/09) + - eventAfterRender trigger + - getDate & getView methods + - height & contentHeight options (explicitly sets the pixel height) + - minTime & maxTime options (restricts shown hours in agenda view) + - getters [for all options] and setters [for height, contentHeight, and aspectRatio ONLY! stay tuned..] + - render method now readjusts calendar's size + - bugfixes + - lightbox scripts that use iframes (like fancybox) + - day-of-week classNames were off when firstDay=1 + - guaranteed space on right side of agenda events (even when stacked) + - accepts ISO8601 dates with a space (instead of 'T') + +version 1.4.1 (10/31/09) + - can exclude weekends with new 'weekends' option + - gcal feed 'currentTimezone' option + - bugfixes + - year/month/date option sometimes wouldn't set correctly (depending on current date) + - daylight savings issue caused agenda views to start at 1am (for BST users) + - cleanup of gcal.js code + +version 1.4 (10/19/09) + - agendaWeek and agendaDay views + - added some options for agenda views: + - allDaySlot + - allDayText + - firstHour + - slotMinutes + - defaultEventMinutes + - axisFormat + - modified some existing options/triggers to work with agenda views: + - dragOpacity and timeFormat can now accept a "View Hash" (a new concept) + - dayClick now has an allDay parameter + - eventDrop now has an an allDay parameter + (this will affect those who use revertFunc, adjust parameter list) + - added 'prevYear' and 'nextYear' for buttons in header + - minor change for theme users, ui-state-hover not applied to active/inactive buttons + - added event-color-changing example in docs + - better defaults for right-to-left themed button icons + +version 1.3.2 (10/13/09) + - Bugfixes (please upgrade from 1.3.1!) + - squashed potential infinite loop when addMonths and addDays + is called with an invalid date + - $.fullCalendar.parseDate() now correctly parses IETF format + - when switching views, the 'today' button sticks inactive, fixed + - gotoDate now can accept a single Date argument + - documentation for changes in 1.3.1 and 1.3.2 now on website + +version 1.3.1 (9/30/09) + - Important Bugfixes (please upgrade from 1.3!) + - When current date was late in the month, for long months, and prev/next buttons + were clicked in month-view, some months would be skipped/repeated + - In certain time zones, daylight savings time would cause certain days + to be misnumbered in month-view + - Subtle change in way week interval is chosen when switching from month to basicWeek/basicDay view + - Added 'allDayDefault' option + - Added 'changeView' and 'render' methods + +version 1.3 (9/21/09) + - different 'views': month/basicWeek/basicDay + - more flexible 'header' system for buttons + - themable by jQuery UI themes + - resizable events (require jQuery UI resizable plugin) + - rescoped & rewritten CSS, enhanced default look + - cleaner css & rendering techniques for right-to-left + - reworked options & API to support multiple views / be consistent with jQuery UI + - refactoring of entire codebase + - broken into different JS & CSS files, assembled w/ build scripts + - new test suite for new features, uses firebug-lite + - refactored docs + - Options + + date + + defaultView + + aspectRatio + + disableResizing + + monthNames (use instead of $.fullCalendar.monthNames) + + monthNamesShort (use instead of $.fullCalendar.monthAbbrevs) + + dayNames (use instead of $.fullCalendar.dayNames) + + dayNamesShort (use instead of $.fullCalendar.dayAbbrevs) + + theme + + buttonText + + buttonIcons + x draggable -> editable/disableDragging + x fixedWeeks -> weekMode + x abbrevDayHeadings -> columnFormat + x buttons/title -> header + x eventDragOpacity -> dragOpacity + x eventRevertDuration -> dragRevertDuration + x weekStart -> firstDay + x rightToLeft -> isRTL + x showTime (use 'allDay' CalEvent property instead) + - Triggered Actions + + eventResizeStart + + eventResizeStop + + eventResize + x monthDisplay -> viewDisplay + x resize -> windowResize + 'eventDrop' params changed, can revert if ajax cuts out + - CalEvent Properties + x showTime -> allDay + x draggable -> editable + 'end' is now INCLUSIVE when allDay=true + 'url' now produces a real
tag, more native clicking/tab behavior + - Methods: + + renderEvent + x prevMonth -> prev + x nextMonth -> next + x prevYear/nextYear -> moveDate + x refresh -> rerenderEvents/refetchEvents + x removeEvent -> removeEvents + x getEventsByID -> clientEvents + - Utilities: + 'formatDate' format string completely changed (inspired by jQuery UI datepicker + datejs) + 'formatDates' added to support date-ranges + - Google Calendar Options: + x draggable -> editable + - Bugfixes + - gcal extension fetched 25 results max, now fetches all + +version 1.2.1 (6/29/09) + - bugfixes + - allows and corrects invalid end dates for events + - doesn't throw an error in IE while rendering when display:none + - fixed 'loading' callback when used w/ multiple addEventSource calls + - gcal className can now be an array + +version 1.2 (5/31/09) + - expanded API + - 'className' CalEvent attribute + - 'source' CalEvent attribute + - dynamically get/add/remove/update events of current month + - locale improvements: change month/day name text + - better date formatting ($.fullCalendar.formatDate) + - multiple 'event sources' allowed + - dynamically add/remove event sources + - options for prevYear and nextYear buttons + - docs have been reworked (include addition of Google Calendar docs) + - changed behavior of parseDate for number strings + (now interpets as unix timestamp, not MS times) + - bugfixes + - rightToLeft month start bug + - off-by-one errors with month formatting commands + - events from previous months sticking when clicking prev/next quickly + - Google Calendar API changed to work w/ multiple event sources + - can also provide 'className' and 'draggable' options + - date utilties moved from $ to $.fullCalendar + - more documentation in source code + - minified version of fullcalendar.js + - test suit (available from svn) + - top buttons now use ').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", -handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, -originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", -f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): -[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); -if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): -e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= -this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- -b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.14",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), -create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()

g3%x6s!X;(4e%Y+U(b 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 z%0D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

").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), -height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); -b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(a.range==="min"||a.range==="max"?" ui-slider-range-"+a.range:""))}for(var j=c.length;j"); -this.handles=c.add(d(e.join("")).appendTo(b.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", -g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!b.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");i=b._start(g,l);if(i===false)return}break}m=b.options.step;i=b.options.values&&b.options.values.length? -(h=b.values(l)):(h=b.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=b._valueMin();break;case d.ui.keyCode.END:h=b._valueMax();break;case d.ui.keyCode.PAGE_UP:h=b._trimAlignValue(i+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(i-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===b._valueMax())return;h=b._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===b._valueMin())return;h=b._trimAlignValue(i- -m);break}b._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(g,k);b._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); -return this},_mouseCapture:function(b){var a=this.options,c,f,e,j,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(a.range===true&&this.values(1)===a.min){g+=1;e=d(this.handles[g])}if(this._start(b,g)===false)return false; -this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();a=e.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-e.width()/2,top:b.pageY-a.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(b){var a= -this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;if(this.orientation==="horizontal"){a= -this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a); -c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var f;if(this.options.values&&this.options.values.length){f=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>f||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, -_refreshValue:function(){var b=this.options.range,a=this.options,c=this,f=!this._animateOff?a.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},a.animate); -if(h===1)c.range[f?"animate":"css"]({width:e-g+"%"},{queue:false,duration:a.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},a.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:a.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, -1)[f?"animate":"css"]({width:e+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.14"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.14"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.bind("mouseout",function(b){b= -d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b.addClass("ui-state-hover"); -b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.14"}});var A=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults, -a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0, -selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
    '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]= -h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c= -this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a, -"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker", -function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput); -a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left", -this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus", -this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b= -b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5", -cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a); -d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c= -d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c= -{left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover"); -if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv); -J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"); -a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]|| -c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+ -i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b= -this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute", -left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&& -d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth= -b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear= -!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a); -a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a)); -d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()% -100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=B+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y", -TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay= -a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(), -b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n= -this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),B= -this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right": -"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
    '+(/all|left/.test(t)&&x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,B,v)+'
    ';var z=j?'": -"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
    '+this._get(a,"weekHeader")+"
    '+ -this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+r.getDate()+"":''+ -r.getDate()+"")+"
    "+(l?""+(i[0]>0&&G==i[1]-1?'
    ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'':"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"), -l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()): -g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c== -"Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear"); -if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); -c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, -"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= -function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker, -[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.14";window["DP_jQuery_"+A]=d})(jQuery); -;/* - * jQuery UI Progressbar 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* -this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.14"})})(jQuery); -;/* - * jQuery UI Effects 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, -a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= -a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", -"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, -0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, -211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, -d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; -f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, -[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.14",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}); -c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c, -a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments); -a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%", -"pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d* -((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/= -e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/= -e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ -e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); -;/* - * jQuery UI Effects Fade 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fade - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Fold 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ -(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], -10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); -;/* - * jQuery UI Effects Highlight 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& -this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Pulsate 1.8.14 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ -(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); -b.dequeue()})})}})(jQuery); -; \ No newline at end of file -- GitLab From 5a5b216ba0c2d58352364b9fc908f6547989ef72 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Fri, 30 Dec 2011 23:20:44 +0000 Subject: [PATCH 101/546] Fixed error message --- files/ajax/move.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/ajax/move.php b/files/ajax/move.php index 8a56a015486..c2490ecc6b3 100644 --- a/files/ajax/move.php +++ b/files/ajax/move.php @@ -14,7 +14,7 @@ $target = $_GET["target"]; if(OC_Files::move($dir,$file,$target,$file)){ OC_JSON::success(array("data" => array( "dir" => $dir, "files" => $file ))); }else{ - OC_JSON::error(array("data" => array( "message" => "Could move $file" ))); + OC_JSON::error(array("data" => array( "message" => "Couldn't move $file" ))); } ?> -- GitLab From 1b146b85d2b645dc4ae4f16d9757ad4bd939c0e2 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sat, 31 Dec 2011 01:34:22 +0100 Subject: [PATCH 102/546] Removed redundant DB queries. --- apps/contacts/lib/addressbook.php | 20 ++++++++++++++++---- apps/contacts/lib/vcard.php | 3 --- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php index b3c981a541e..78792f5f948 100644 --- a/apps/contacts/lib/addressbook.php +++ b/apps/contacts/lib/addressbook.php @@ -189,9 +189,21 @@ class OC_Contacts_Addressbook{ public static function active($uid){ $active = self::activeIds($uid); $addressbooks = array(); - /* FIXME: Is there a way to prepare a statement 'WHERE id IN ([range])'? - * See OC_Contacts_VCard:all. - */ + $ids_sql = join(',', array_fill(0, count($active), '?')); + $prep = 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id IN ('.$ids_sql.') ORDER BY displayname'; + try { + $stmt = OC_DB::prepare( $prep ); + $result = $stmt->execute($active); + } catch(Exception $e) { + OC_Log::write('contacts','OC_Contacts_Addressbook:active:, exception: '.$e->getMessage(),OC_Log::DEBUG); + OC_Log::write('contacts','OC_Contacts_Addressbook:active, ids: '.join(',', $active),OC_Log::DEBUG); + OC_Log::write('contacts','OC_Contacts_Addressbook::active, SQL:'.$prep,OC_Log::DEBUG); + } + + while( $row = $result->fetchRow()){ + $addressbooks[] = $row; + } + /* foreach( $active as $aid ){ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ? ORDER BY displayname' ); $result = $stmt->execute(array($aid,)); @@ -199,7 +211,7 @@ class OC_Contacts_Addressbook{ while( $row = $result->fetchRow()){ $addressbooks[] = $row; } - } + }*/ return $addressbooks; } diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index 81519b3d051..beb291b481e 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -47,9 +47,6 @@ class OC_Contacts_VCard{ * ['carddata'] */ public static function all($id){ - //$stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? ORDER BY fullname' ); - //$result = $stmt->execute(array($id)); - if(is_array($id)) { $id_sql = join(',', array_fill(0, count($id), '?')); $prep = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid IN ('.$id_sql.') ORDER BY fullname'; -- GitLab From 8efec8e900a21fde4382f543d877ef6cb421f7ad Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sat, 31 Dec 2011 12:23:08 +0000 Subject: [PATCH 103/546] Remove repeated code --- files/index.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/files/index.php b/files/index.php index fc69a42bec6..7f3c5c579e7 100644 --- a/files/index.php +++ b/files/index.php @@ -29,9 +29,6 @@ require_once('../lib/base.php'); OC_Util::checkLoggedIn(); // Load the files we need -OC_Util::addStyle( 'files_texteditor', 'style' ); -OC_Util::addScript( 'files_texteditor', 'editor'); -OC_Util::addScript( 'files_texteditor', 'aceeditor/ace'); OC_Util::addStyle( "files", "files" ); OC_Util::addScript( "files", "files" ); OC_Util::addScript( 'files', 'filelist' ); -- GitLab From e04951f8fdc8dcbff896eb4d9cdbf3d31db24e7f Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sat, 31 Dec 2011 12:28:25 +0000 Subject: [PATCH 104/546] Fixed keyboard shortcuts --- apps/files_texteditor/js/editor.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 94402dd00d8..dce3a359d82 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -203,18 +203,15 @@ function hideFileEditor(){ // Keyboard Shortcuts var ctrlBtn = false; - -function checkForCtrlKey(e){ - if(e.which == 17 || e.which == 91) ctrlBtn=false; - } function checkForSaveKeyPress(e){ - if(e.which == 17 || e.which == 91) ctrlBtn=true; - if(e.which == 83 && ctrlBtn == true) { - e.preventDefault(); - $('#editor_save').trigger('click'); - return false; - } + if(e.which == 17 || e.which == 91) ctrlBtn=true; + if(e.which == 83 && ctrlBtn == true) { + e.preventDefault(); + $('#editor_save').trigger('click'); + return false; + + } } $(window).resize(function() { @@ -247,5 +244,5 @@ $(document).ready(function(){ bindControlEvents(); // Binds the save keyboard shortcut events - $(document).unbind('keyup').bind('keyup',checkForCtrlKey).unbind('keydown').bind('keydown',checkForSaveKeyPress); + $(document).unbind('keydown').bind('keydown',checkForSaveKeyPress); }); -- GitLab From 2c4ab355ac3ace893cc06c645d4a8d25a63dbdc1 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 1 Jan 2012 00:47:24 +0000 Subject: [PATCH 105/546] Shared folder no longer draggable or droppable --- files/js/files.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/files/js/files.js b/files/js/files.js index 53437453ff9..8df7aa35357 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -11,8 +11,8 @@ $(document).ready(function() { $('#file_action_panel').attr('activeAction', false); //drag/drop of files - $('#fileList tr td.filename').draggable(dragOptions); - $('#fileList tr[data-type="dir"] td.filename').droppable(folderDropOptions); + $('#fileList tr[data-file!=Shared] td.filename').draggable(dragOptions); + $('#fileList tr[data-type="dir"][data-file!=Shared] td.filename').droppable(folderDropOptions); $('div.crumb').droppable(crumbDropOptions); $('ul#apps>li:first-child').data('dir',''); $('ul#apps>li:first-child').droppable(crumbDropOptions); @@ -70,7 +70,9 @@ $(document).ready(function() { procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - if(!FileList.isLoading(filename)){ + var tr=$('tr').filterAttr('data-file',filename); + var renaming=tr.data('renaming') + if(!renaming && !FileList.isLoading(filename)){ var mime=$(this).parent().parent().data('mime'); var type=$(this).parent().parent().data('type'); var action=FileActions.getDefault(mime,type); -- GitLab From 06d2a87ee4759f3fc26e0f6b16027080036ba34a Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 1 Jan 2012 00:52:53 +0000 Subject: [PATCH 106/546] Fix js error --- files/js/files.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/files/js/files.js b/files/js/files.js index 8df7aa35357..e37eac9bf6a 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -11,8 +11,8 @@ $(document).ready(function() { $('#file_action_panel').attr('activeAction', false); //drag/drop of files - $('#fileList tr[data-file!=Shared] td.filename').draggable(dragOptions); - $('#fileList tr[data-type="dir"][data-file!=Shared] td.filename').droppable(folderDropOptions); + $('#fileList tr[data-file!="Shared"] td.filename').draggable(dragOptions); + $('#fileList tr[data-type="dir"][data-file!="Shared"] td.filename').droppable(folderDropOptions); $('div.crumb').droppable(crumbDropOptions); $('ul#apps>li:first-child').data('dir',''); $('ul#apps>li:first-child').droppable(crumbDropOptions); @@ -70,9 +70,7 @@ $(document).ready(function() { procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - var tr=$('tr').filterAttr('data-file',filename); - var renaming=tr.data('renaming') - if(!renaming && !FileList.isLoading(filename)){ + if(!FileList.isLoading(filename)){ var mime=$(this).parent().parent().data('mime'); var type=$(this).parent().parent().data('type'); var action=FileActions.getDefault(mime,type); -- GitLab From e7de25434206a4849a7c7315d4d9926325c7b730 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 1 Jan 2012 01:14:00 +0000 Subject: [PATCH 107/546] Fix missing ; --- files/js/files.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/js/files.js b/files/js/files.js index e37eac9bf6a..88a07a0776e 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -70,7 +70,9 @@ $(document).ready(function() { procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - if(!FileList.isLoading(filename)){ + var tr=$('tr').filterAttr('data-file',filename); + var renaming=tr.data('renaming'); + if(!renaming && !FileList.isLoading(filename)){ var mime=$(this).parent().parent().data('mime'); var type=$(this).parent().parent().data('type'); var action=FileActions.getDefault(mime,type); -- GitLab From 6207c0444be7c383838beb0ddc3d684ffee0262b Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sun, 1 Jan 2012 17:57:26 +0100 Subject: [PATCH 108/546] Added class OC_Image --- lib/image.php | 297 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 lib/image.php diff --git a/lib/image.php b/lib/image.php new file mode 100644 index 00000000000..4b63ea5ff36 --- /dev/null +++ b/lib/image.php @@ -0,0 +1,297 @@ + +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see . +* +*/ + +/** + * Class for image manipulation + * Ideas: imagerotate, chunk_split(base64_encode()) + * + */ +class OC_Image { + static private $resource = false; // tmp resource. + static private $destroy = false; // if the resource is created withing the object. + /** + * @brief Constructor. + * @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function. + * If a resource is passed it is the job of the caller to destroy it using imagedestroy($var) + * @returns bool False on error + */ + function __construct($imageref = null) { + OC_Log::write('core','OC_Image::__construct, start', OC_Log::DEBUG); + if(!function_exists('imagecreatefromjpeg')) { // FIXME: Find a better way to check for GD + OC_Log::write('core','OC_Image::__construct, GD module not installed', OC_Log::ERROR); + return false; + } + if(!is_null($imageref)) { + self::load($imageref); + } + } + + /** + * @brief Destructor. + */ + function __destruct() { + if(self::$resource && self::$destroy) { + imagedestroy(self::$resource); // Why does this issue a warning. + } + } + + /** + * @brief Prints the image. + */ + public function show() { + header('Content-Type: image/png'); + imagepng(self::$resource); + } + + /** + * @brief Prints the image when called as $image(). + */ + public function __invoke() { + self::show(); + } + + /** + * @returns Returns the image resource in any. + */ + public function imageResource() { + return self::$resource; + } + + /** + * @returns Returns a base64 encoded string suitable for embedding in a VCard. + */ + function __toString() { + ob_start(); + $res = imagepng(self::$resource); + if (!$res) { + OC_Log::write('core','OC_Image::_string. Error writing image',OC_Log::ERROR); + } + return chunk_split(base64_encode(ob_get_clean())); + } + + /** + * @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function. + * @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function. + * If a resource is passed it is the job of the caller to destroy it using imagedestroy($var) + * @returns An image resource or false on error + */ + static public function load($imageref) { + if(self::loadFromFile($imageref) !== false) { + return self::$resource; + } elseif(self::loadFromBase64($imageref) !== false) { + return self::$resource; + } elseif(self::loadFromData($imageref) !== false) { + return self::$resource; + } elseif(self::loadFromResource($imageref) !== false) { + return self::$resource; + } else { + OC_Log::write('core','OC_Image::load, couldn\'t load anything. Giving up!', OC_Log::DEBUG); + return false; + } + } + + /** + * @brief Loads an image from a local file. + * @param $imageref The path to a local file. + * @returns An image resource or false on error + */ + static public function loadFromFile($imagepath=false) { + if(!is_string($imagepath)) { + return false; + } + if(!is_file($imagepath) || !file_exists($imagepath) || !is_readable($imagepath)) { + OC_Log::write('core','OC_Image::loadFromFile, couldn\'t load'.$imagepath, OC_Log::DEBUG); + return false; + } + self::$resource = imagecreatefromstring(file_get_contents($imagepath)); + self::$destroy = true; + return self::$resource; + } + + /** + * @brief Loads an image from a string of data. + * @param $str A string of image data as read from a file. + * @returns An image resource or false on error + */ + static public function loadFromData($str) { + if(is_resource($str)) { + return false; + } + self::$resource = imagecreatefromstring($str); + if(!self::$resource) { + OC_Log::write('core','OC_Image::loadFromData, couldn\'t load', OC_Log::DEBUG); + return false; + } + self::$destroy = true; + return self::$resource; + } + + /** + * @brief Loads an image from a base64 encoded string. + * @param $str A string base64 encoded string of image data. + * @returns An image resource or false on error + */ + static public function loadFromBase64($str) { + if(!is_string($str)) { + return false; + } + $data = base64_decode($str); + if($data) { // try to load from string data + self::$resource = imagecreatefromstring($data); + if(!self::$resource) { + OC_Log::write('core','OC_Image::loadFromBase64, couldn\'t load', OC_Log::DEBUG); + return false; + } + self::$destroy = true; + return self::$resource; + } else { + return false; + } + } + + /** + * @brief Checks if image resource is valid and assigns it to self::$resource. + * @param $res An image resource. + * @returns An image resource or false on error + */ + static public function loadFromResource($res) { + if(!is_resource($res)) { + return false; + } + self::$resource = $res; + } + + /** + * @brief Resizes the image preserving ratio. + * @param $maxsize The maximum size of either the width or height. + * @returns bool + */ + public function resize($maxsize) { + if(!self::$resource) { + OC_Log::write('core','OC_Image::resize, No image loaded', OC_Log::ERROR); + throw new Exception('OC_Image::resize, No image loaded!', self::ERR_NO_IMAGE); + } + $width_orig=imageSX(self::$resource); + $height_orig=imageSY(self::$resource); + $ratio_orig = $width_orig/$height_orig; + + if ($ratio_orig > 1) { + $new_height = round($maxsize/$ratio_orig); + $new_width = $maxsize; + } else { + $new_width = round($maxsize*$ratio_orig); + $new_height = $maxsize; + } + + $process = imagecreatetruecolor(round($new_width), round($new_height)); + if ($process == false) { + OC_Log::write('core','OC_Image::resize. Error creating true color image',OC_Log::ERROR); + imagedestroy($process); + return false; + } + + imagecopyresampled($process, self::$resource, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + if ($process == false) { + OC_Log::write('core','OC_Image::resize. Error resampling process image '.$new_width.'x'.$new_height,OC_Log::ERROR); + imagedestroy($process); + return false; + } + self::$resource = $process; + return true; + } + + /** + * @brief Crops the image to the middle square. If the image is already square it just returns. + * @returns bool for success or failure + */ + public function centerCrop() { + if(!self::$resource) { + OC_Log::write('core','OC_Image::centerCrop, No image loaded', OC_Log::ERROR); + return false; + } + $width_orig=imageSX(self::$resource); + $height_orig=imageSY(self::$resource); + OC_Log::write('core','OC_Image::centerCrop. Original size: '.$width_orig.'x'.$height_orig, OC_Log::DEBUG); + if($width_orig === $height_orig) { + return true; + } + $ratio_orig = $width_orig/$height_orig; + OC_Log::write('core','OC_Image::centerCrop. Ratio: '.$ratio_orig, OC_Log::DEBUG); + $width = $height = min($width_orig, $height_orig); + OC_Log::write('core','OC_Image::centerCrop. New size: '.$width.'x'.$height, OC_Log::DEBUG); + + if ($ratio_orig > 1) { + $x = ($width_orig/2) - ($width/2); + $y = 0; + } else { + $y = ($height_orig/2) - ($height/2); + $x = 0; + } + $process = imagecreatetruecolor($width, $height); + if ($process == false) { + OC_Log::write('core','OC_Image::centerCrop. Error creating true color image',OC_Log::ERROR); + imagedestroy($process); + return false; + } + imagecopyresampled($process, self::$resource, 0, 0, $x, $y, $width, $height, $width, $height); + if ($process == false) { + OC_Log::write('core','OC_Image::centerCrop. Error resampling process image '.$width.'x'.$height,OC_Log::ERROR); + imagedestroy($process); + return false; + } + self::$resource = $process; + return true; + } + + /** + * @brief Crops the image from point $x$y with dimension $wx$h. + * @param $x Horizontal position + * @param $y Vertical position + * @param $w Width + * @param $h Hight + * @returns bool for success or failure + */ + public function crop($x, $y, $w, $h) { + if(!self::$resource) { + OC_Log::write('core','OC_Image::crop, No image loaded', OC_Log::ERROR); + return false; + } + $width_orig=imageSX(self::$resource); + $height_orig=imageSY(self::$resource); + //OC_Log::write('core','OC_Image::crop. Original size: '.$width_orig.'x'.$height_orig, OC_Log::DEBUG); + $process = imagecreatetruecolor($w, $h); + if ($process == false) { + OC_Log::write('core','OC_Image::crop. Error creating true color image',OC_Log::ERROR); + imagedestroy($process); + return false; + } + imagecopyresampled($process, self::$resource, 0, 0, $x, $y, $w, $h, $w, $h); + if ($process == false) { + OC_Log::write('core','OC_Image::crop. Error resampling process image '.$w.'x'.$h,OC_Log::ERROR); + imagedestroy($process); + return false; + } + self::$resource = $process; + return true; + } +} -- GitLab From c500c1e9307fd10f009f19351a101083969bfed2 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sun, 1 Jan 2012 18:07:46 +0100 Subject: [PATCH 109/546] Removed some denug statements and an exception thrown. --- lib/image.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/image.php b/lib/image.php index 4b63ea5ff36..67290d21f3a 100644 --- a/lib/image.php +++ b/lib/image.php @@ -189,7 +189,7 @@ class OC_Image { public function resize($maxsize) { if(!self::$resource) { OC_Log::write('core','OC_Image::resize, No image loaded', OC_Log::ERROR); - throw new Exception('OC_Image::resize, No image loaded!', self::ERR_NO_IMAGE); + return false; } $width_orig=imageSX(self::$resource); $height_orig=imageSY(self::$resource); @@ -231,14 +231,11 @@ class OC_Image { } $width_orig=imageSX(self::$resource); $height_orig=imageSY(self::$resource); - OC_Log::write('core','OC_Image::centerCrop. Original size: '.$width_orig.'x'.$height_orig, OC_Log::DEBUG); if($width_orig === $height_orig) { return true; } $ratio_orig = $width_orig/$height_orig; - OC_Log::write('core','OC_Image::centerCrop. Ratio: '.$ratio_orig, OC_Log::DEBUG); $width = $height = min($width_orig, $height_orig); - OC_Log::write('core','OC_Image::centerCrop. New size: '.$width.'x'.$height, OC_Log::DEBUG); if ($ratio_orig > 1) { $x = ($width_orig/2) - ($width/2); -- GitLab From 64a24191a3880af5b8c574eb2482d479f9024677 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Sun, 1 Jan 2012 14:04:16 -0500 Subject: [PATCH 110/546] Fix return for empty Shared folder in opendir() --- apps/files_sharing/sharedstorage.php | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index d78e273bf38..b0eaeecf723 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -79,20 +79,16 @@ class OC_Filestorage_Shared extends OC_Filestorage { if ($path == "" || $path == "/") { $path = $this->datadir.$path; $sharedItems = OC_Share::getItemsInFolder($path); - if (empty($sharedItems)) { - return false; - } else { - global $FAKEDIRS; - $files = array(); - foreach ($sharedItems as $item) { - // If item is in the root of the shared storage provider and the item exists add it to the fakedirs - if (dirname($item['target'])."/" == $path && $this->file_exists(basename($item['target']))) { - $files[] = basename($item['target']); - } + global $FAKEDIRS; + $files = array(); + foreach ($sharedItems as $item) { + // If item is in the root of the shared storage provider and the item exists add it to the fakedirs + if (dirname($item['target'])."/" == $path && $this->file_exists(basename($item['target']))) { + $files[] = basename($item['target']); } - $FAKEDIRS['shared'] = $files; - return opendir('fakedir://shared'); } + $FAKEDIRS['shared'] = $files; + return opendir('fakedir://shared'); } else { $source = $this->getSource($path); if ($source) { -- GitLab From 929ce2b56621ceda47b910a0fea5452f01812554 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sun, 1 Jan 2012 20:06:35 +0100 Subject: [PATCH 111/546] Small fixes --- lib/image.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/image.php b/lib/image.php index 67290d21f3a..0e1d1ee327f 100644 --- a/lib/image.php +++ b/lib/image.php @@ -55,6 +55,15 @@ class OC_Image { } } + /** + * @brief Determine whether the object contains an image resource. + * returns bool + */ + function empty() { + if(self::$resource && self::$destroy) { + } + } + /** * @brief Prints the image. */ @@ -116,9 +125,6 @@ class OC_Image { * @returns An image resource or false on error */ static public function loadFromFile($imagepath=false) { - if(!is_string($imagepath)) { - return false; - } if(!is_file($imagepath) || !file_exists($imagepath) || !is_readable($imagepath)) { OC_Log::write('core','OC_Image::loadFromFile, couldn\'t load'.$imagepath, OC_Log::DEBUG); return false; -- GitLab From 4eb7487e61e4d018e4d75bddc79576b13d693362 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 1 Jan 2012 19:45:30 +0000 Subject: [PATCH 112/546] Updated ace-editor software --- .../js/aceeditor/ace-compat.js | 1 + apps/files_texteditor/js/aceeditor/ace.js | 2 +- .../js/aceeditor/keybinding-emacs.js | 2 +- .../js/aceeditor/keybinding-vim.js | 2 +- .../js/aceeditor/mode-c_cpp.js | 2 +- .../js/aceeditor/mode-clojure.js | 2 +- .../js/aceeditor/mode-coffee.js | 2 +- .../js/aceeditor/mode-coldfusion.js | 1 + .../js/aceeditor/mode-csharp.js | 2 +- .../files_texteditor/js/aceeditor/mode-css.js | 2 +- .../js/aceeditor/mode-groovy.js | 2 +- .../js/aceeditor/mode-haxe.js | 1 + .../js/aceeditor/mode-html.js | 2 +- .../js/aceeditor/mode-java.js | 2 +- .../js/aceeditor/mode-javascript.js | 2 +- .../js/aceeditor/mode-json.js | 2 +- .../js/aceeditor/mode-latex.js | 1 + .../files_texteditor/js/aceeditor/mode-lua.js | 1 + .../js/aceeditor/mode-markdown.js | 1 + .../js/aceeditor/mode-ocaml.js | 2 +- .../js/aceeditor/mode-perl.js | 2 +- .../files_texteditor/js/aceeditor/mode-php.js | 2 +- .../js/aceeditor/mode-powershell.js | 1 + .../js/aceeditor/mode-python.js | 2 +- .../js/aceeditor/mode-ruby.js | 2 +- .../js/aceeditor/mode-scad.js | 2 +- .../js/aceeditor/mode-scala.js | 2 +- .../js/aceeditor/mode-scss.js | 2 +- .../files_texteditor/js/aceeditor/mode-sql.js | 1 + .../files_texteditor/js/aceeditor/mode-svg.js | 2 +- .../js/aceeditor/mode-textile.js | 2 +- .../files_texteditor/js/aceeditor/mode-xml.js | 2 +- .../js/aceeditor/theme-clouds.js | 2 +- .../js/aceeditor/worker-coffee.js | 7055 +++++++++++- .../js/aceeditor/worker-css.js | 9539 +++++++++++++++- .../js/aceeditor/worker-javascript.js | 9753 ++++++++++++++++- 36 files changed, 26377 insertions(+), 28 deletions(-) create mode 100755 apps/files_texteditor/js/aceeditor/ace-compat.js mode change 100644 => 100755 apps/files_texteditor/js/aceeditor/keybinding-emacs.js mode change 100644 => 100755 apps/files_texteditor/js/aceeditor/keybinding-vim.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-coldfusion.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-haxe.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-latex.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-lua.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-markdown.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-powershell.js create mode 100755 apps/files_texteditor/js/aceeditor/mode-sql.js diff --git a/apps/files_texteditor/js/aceeditor/ace-compat.js b/apps/files_texteditor/js/aceeditor/ace-compat.js new file mode 100755 index 00000000000..5dcbb1cc38a --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/ace-compat.js @@ -0,0 +1 @@ +define("pilot/index",["require","exports","module","pilot/browser_focus","pilot/dom","pilot/event","pilot/event_emitter","pilot/fixoldbrowsers","pilot/keys","pilot/lang","pilot/oop","pilot/useragent","pilot/canon"],function(a,b,c){a("pilot/browser_focus"),a("pilot/dom"),a("pilot/event"),a("pilot/event_emitter"),a("pilot/fixoldbrowsers"),a("pilot/keys"),a("pilot/lang"),a("pilot/oop"),a("pilot/useragent"),a("pilot/canon")}),define("pilot/browser_focus",["require","exports","module","ace/lib/browser_focus"],function(a,b,c){console.warn("DEPRECATED: 'pilot/browser_focus' is deprecated. Use 'ace/lib/browser_focus' instead"),c.exports=a("ace/lib/browser_focus")}),define("pilot/dom",["require","exports","module","ace/lib/dom"],function(a,b,c){console.warn("DEPRECATED: 'pilot/dom' is deprecated. Use 'ace/lib/dom' instead"),c.exports=a("ace/lib/dom")}),define("pilot/event",["require","exports","module","ace/lib/event"],function(a,b,c){console.warn("DEPRECATED: 'pilot/event' is deprecated. Use 'ace/lib/event' instead"),c.exports=a("ace/lib/event")}),define("pilot/event_emitter",["require","exports","module","ace/lib/event_emitter"],function(a,b,c){console.warn("DEPRECATED: 'pilot/event_emitter' is deprecated. Use 'ace/lib/event_emitter' instead"),c.exports=a("ace/lib/event_emitter")}),define("pilot/fixoldbrowsers",["require","exports","module","ace/lib/fixoldbrowsers"],function(a,b,c){console.warn("DEPRECATED: 'pilot/fixoldbrowsers' is deprecated. Use 'ace/lib/fixoldbrowsers' instead"),c.exports=a("ace/lib/fixoldbrowsers")}),define("pilot/keys",["require","exports","module","ace/lib/keys"],function(a,b,c){console.warn("DEPRECATED: 'pilot/keys' is deprecated. Use 'ace/lib/keys' instead"),c.exports=a("ace/lib/keys")}),define("pilot/lang",["require","exports","module","ace/lib/lang"],function(a,b,c){console.warn("DEPRECATED: 'pilot/lang' is deprecated. Use 'ace/lib/lang' instead"),c.exports=a("ace/lib/lang")}),define("pilot/oop",["require","exports","module","ace/lib/oop"],function(a,b,c){console.warn("DEPRECATED: 'pilot/oop' is deprecated. Use 'ace/lib/oop' instead"),c.exports=a("ace/lib/oop")}),define("pilot/useragent",["require","exports","module","ace/lib/useragent"],function(a,b,c){console.warn("DEPRECATED: 'pilot/useragent' is deprecated. Use 'ace/lib/useragent' instead"),c.exports=a("ace/lib/useragent")}),define("pilot/canon",["require","exports","module"],function(a,b,c){console.warn("DEPRECATED: 'pilot/canon' is deprecated."),b.addCommand=function(){console.warn("DEPRECATED: 'canon.addCommand()' is deprecated. Use 'editor.commands.addCommand(command)' instead."),console.trace()},b.removeCommand=function(){console.warn("DEPRECATED: 'canon.removeCommand()' is deprecated. Use 'editor.commands.removeCommand(command)' instead."),console.trace()}}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/ace.js b/apps/files_texteditor/js/aceeditor/ace.js index d3b0ccc3f46..d8f08d58878 100644 --- a/apps/files_texteditor/js/aceeditor/ace.js +++ b/apps/files_texteditor/js/aceeditor/ace.js @@ -1 +1 @@ -(function(){var a=function(){return this}();if(a.require&&a.define)require.packaged=!0;else{var b=function(a,c,d){typeof a!="string"?b.original?b.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace()):(arguments.length==2&&(d=c),define.modules||(define.modules={}),define.modules[a]=d)};a.define&&(b.original=a.define),a.define=b;var c=function(a,b){if(Object.prototype.toString.call(a)==="[object Array]"){var e=[];for(var f=0,g=a.length;f=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c=2)var d=arguments[1];else do{if(c in this){d=this[c--];break}if(--c<0)throw new TypeError}while(!0);for(;c>=0;c--)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length;if(!b)return-1;var c=arguments[1]||0;if(c>=b)return-1;c<0&&(c+=b);for(;c=0;c--){if(!h(this,c))continue;if(a===this[c])return c}return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||a.constructor.prototype});if(!Object.getOwnPropertyDescriptor){var n="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(n+a);if(!h(a,b))return undefined;var c,d,e;c={enumerable:!0,configurable:!0};if(m){var f=a.__proto__;a.__proto__=g;var d=k(a,b),e=l(a,b);a.__proto__=f;if(d||e){d&&(descriptor.get=d),e&&(descriptor.set=e);return descriptor}}descriptor.value=a[b];return descriptor}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}typeof b!="undefined"&&Object.defineProperties(c,b);return c});if(!Object.defineProperty){var o="Property description must be an object: ",p="Object.defineProperty called on non-object: ",q="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function")throw new TypeError(p+a);if(typeof a!="object"||a===null)throw new TypeError(o+c);if(h(c,"value"))if(m&&(k(a,b)||l(a,b))){var d=a.__proto__;a.__proto__=g,delete a[b],a[b]=c.value,a.prototype}else a[b]=c.value;else{if(!m)throw new TypeError(q);h(c,"get")&&i(a,b,c.get),h(c,"set")&&j(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)h(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(r){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){return!0});if(!Object.keys){var s=!0,t=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=t.length;for(var v in{toString:null})s=!1;Object.keys=function W(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var W=[];for(var b in a)h(a,b)&&W.push(b);if(s)for(var c=0,d=u;c=7?new a(c,d,e,f,g,h,i):j>=6?new a(c,d,e,f,g,h):j>=5?new a(c,d,e,f,g):j>=4?new a(c,d,e,f):j>=3?new a(c,d,e):j>=2?new a(c,d):j>=1?new a(c):new a;k.constructor=b;return k}return a.apply(this,arguments)},c=new RegExp("^(?:((?:[+-]\\d\\d)?\\d\\d\\d\\d)(?:-(\\d\\d)(?:-(\\d\\d))?)?)?(?:T(\\d\\d):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?)?(?:Z|([+-])(\\d\\d):(\\d\\d))?$");for(var d in a)b[d]=a[d];b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function e(b){var d=c.exec(b);if(d){d.shift();var e=d[0]===undefined;for(var f=0;f<10;f++){if(f===7)continue;d[f]=+(d[f]||(f<3?1:0)),f===1&&d[f]--}if(e)return((d[3]*60+d[4])*60+d[5])*1e3+d[6];var g=(d[8]*60+d[9])*60*1e3;d[6]==="-"&&(g=-g);return a.UTC.apply(this,d.slice(0,7))+g}return a.parse.apply(this,arguments)};return b}(Date));if(!String.prototype.trim){var w=/^\s\s*/,x=/\s\s*$/;String.prototype.trim=function(){return String(this).replace(w,"").replace(x,"")}}}),define("ace/ace",["require","exports","module","pilot/index","pilot/fixoldbrowsers","pilot/plugin_manager","pilot/dom","pilot/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/theme/textmate","pilot/environment"],function(a,b,c){a("pilot/index"),a("pilot/fixoldbrowsers");var d=a("pilot/plugin_manager").catalog;d.registerPlugins(["pilot/index"]);var e=a("pilot/dom"),f=a("pilot/event"),g=a("ace/editor").Editor,h=a("ace/edit_session").EditSession,i=a("ace/undomanager").UndoManager,j=a("ace/virtual_renderer").VirtualRenderer;b.edit=function(b){typeof b=="string"&&(b=document.getElementById(b));var c=new h(e.getInnerText(b));c.setUndoManager(new i),b.innerHTML="";var k=new g(new j(b,a("ace/theme/textmate")));k.setSession(c);var l=a("pilot/environment").create();d.startupPlugins({env:l}).then(function(){l.document=c,l.editor=k,k.resize(),f.addListener(window,"resize",function(){k.resize()}),b.env=l}),k.env=l;return k}}),define("pilot/index",["require","exports","module","pilot/fixoldbrowsers","pilot/types/basic","pilot/types/command","pilot/types/settings","pilot/commands/settings","pilot/commands/basic","pilot/settings/canon","pilot/canon"],function(a,b,c){b.startup=function(b,c){a("pilot/fixoldbrowsers"),a("pilot/types/basic").startup(b,c),a("pilot/types/command").startup(b,c),a("pilot/types/settings").startup(b,c),a("pilot/commands/settings").startup(b,c),a("pilot/commands/basic").startup(b,c),a("pilot/settings/canon").startup(b,c),a("pilot/canon").startup(b,c)},b.shutdown=function(b,c){a("pilot/types/basic").shutdown(b,c),a("pilot/types/command").shutdown(b,c),a("pilot/types/settings").shutdown(b,c),a("pilot/commands/settings").shutdown(b,c),a("pilot/commands/basic").shutdown(b,c),a("pilot/settings/canon").shutdown(b,c),a("pilot/canon").shutdown(b,c)}}),define("pilot/types/basic",["require","exports","module","pilot/types"],function(a,b,c){function m(a){if(a instanceof e)this.subtype=a;else{if(typeof a!="string")throw new Error("Can' handle array subtype");this.subtype=d.getType(a);if(this.subtype==null)throw new Error("Unknown array subtype: "+a)}}function l(a){if(typeof a.defer!="function")throw new Error("Instances of DeferredType need typeSpec.defer to be a function that returns a type");Object.keys(a).forEach(function(b){this[b]=a[b]},this)}function j(a){if(!Array.isArray(a.data)&&typeof a.data!="function")throw new Error("instances of SelectionType need typeSpec.data to be an array or function that returns an array:"+JSON.stringify(a));Object.keys(a).forEach(function(b){this[b]=a[b]},this)}var d=a("pilot/types"),e=d.Type,f=d.Conversion,g=d.Status,h=new e;h.stringify=function(a){return a},h.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to text.parse()");return new f(a)},h.name="text";var i=new e;i.stringify=function(a){return a?""+a:null},i.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to number.parse()");if(a.replace(/\s/g,"").length===0)return new f(null,g.INCOMPLETE,"");var b=new f(parseInt(a,10));isNaN(b.value)&&(b.status=g.INVALID,b.message="Can't convert \""+a+'" to a number.');return b},i.decrement=function(a){return a-1},i.increment=function(a){return a+1},i.name="number",j.prototype=new e,j.prototype.stringify=function(a){return a},j.prototype.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to parse()");if(!this.data)throw new Error("Missing data on selection type extension.");var b=typeof this.data=="function"?this.data():this.data,c=!1,d,e=[];b.forEach(function(b){a==b?(d=this.fromString(b),c=!0):b.indexOf(a)===0&&e.push(this.fromString(b))},this);if(c)return new f(d);this.noMatch&&this.noMatch();if(e.length>0){var h="Possibilities"+(a.length===0?"":" for '"+a+"'");return new f(null,g.INCOMPLETE,h,e)}var h="Can't use '"+a+"'.";return new f(null,g.INVALID,h,e)},j.prototype.fromString=function(a){return a},j.prototype.decrement=function(a){var b=typeof this.data=="function"?this.data():this.data,c;if(a==null)c=b.length-1;else{var d=this.stringify(a),c=b.indexOf(d);c=c===0?b.length-1:c-1}return this.fromString(b[c])},j.prototype.increment=function(a){var b=typeof this.data=="function"?this.data():this.data,c;if(a==null)c=0;else{var d=this.stringify(a),c=b.indexOf(d);c=c===b.length-1?0:c+1}return this.fromString(b[c])},j.prototype.name="selection",b.SelectionType=j;var k=new j({name:"bool",data:["true","false"],stringify:function(a){return""+a},fromString:function(a){return a==="true"?!0:!1}});l.prototype=new e,l.prototype.stringify=function(a){return this.defer().stringify(a)},l.prototype.parse=function(a){return this.defer().parse(a)},l.prototype.decrement=function(a){var b=this.defer();return b.decrement?b.decrement(a):undefined},l.prototype.increment=function(a){var b=this.defer();return b.increment?b.increment(a):undefined},l.prototype.name="deferred",b.DeferredType=l,m.prototype=new e,m.prototype.stringify=function(a){return a.join(" ")},m.prototype.parse=function(a){return this.defer().parse(a)},m.prototype.name="array";var n=!1;b.startup=function(){n||(n=!0,d.registerType(h),d.registerType(i),d.registerType(k),d.registerType(j),d.registerType(l),d.registerType(m))},b.shutdown=function(){n=!1,d.unregisterType(h),d.unregisterType(i),d.unregisterType(k),d.unregisterType(j),d.unregisterType(l),d.unregisterType(m)}}),define("pilot/types",["require","exports","module"],function(a,b,c){function h(a,b){if(a.substr(-2)==="[]"){var c=a.slice(0,-2);return new g.array(c)}var d=g[a];typeof d=="function"&&(d=new d(b));return d}function f(){}function e(a,b,c,e){this.value=a,this.status=b||d.VALID,this.message=c,this.predictions=e||[]}var d={VALID:{toString:function(){return"VALID"},valueOf:function(){return 0}},INCOMPLETE:{toString:function(){return"INCOMPLETE"},valueOf:function(){return 1}},INVALID:{toString:function(){return"INVALID"},valueOf:function(){return 2}},combine:function(a){var b=d.VALID;for(var c=0;cb.valueOf()&&(b=a[c]);return b}};b.Status=d,b.Conversion=e,f.prototype={stringify:function(a){throw new Error("not implemented")},parse:function(a){throw new Error("not implemented")},name:undefined,increment:function(a){return undefined},decrement:function(a){return undefined},getDefault:function(){return this.parse("")}},b.Type=f;var g={};b.registerType=function(a){if(typeof a=="object"){if(!(a instanceof f))throw new Error("Can't registerType using: "+a);if(!a.name)throw new Error("All registered types must have a name");g[a.name]=a}else{if(typeof a!="function")throw new Error("Unknown type: "+a);if(!a.prototype.name)throw new Error("All registered types must have a name");g[a.prototype.name]=a}},b.registerTypes=function(a){Object.keys(a).forEach(function(c){var d=a[c];d.name=c,b.registerType(d)})},b.deregisterType=function(a){delete g[a.name]},b.getType=function(a){if(typeof a=="string")return h(a);if(typeof a=="object"){if(!a.name)throw new Error("Missing 'name' member to typeSpec");return h(a.name,a)}throw new Error("Can't extract type from "+a)}}),define("pilot/types/command",["require","exports","module","pilot/canon","pilot/types/basic","pilot/types"],function(a,b,c){var d=a("pilot/canon"),e=a("pilot/types/basic").SelectionType,f=a("pilot/types"),g=new e({name:"command",data:function(){return d.getCommandNames()},stringify:function(a){return a.name},fromString:function(a){return d.getCommand(a)}});b.startup=function(){f.registerType(g)},b.shutdown=function(){f.unregisterType(g)}}),define("pilot/canon",["require","exports","module","pilot/console","pilot/stacktrace","pilot/oop","pilot/useragent","pilot/keys","pilot/event_emitter","pilot/typecheck","pilot/catalog","pilot/types","pilot/lang"],function(a,b,c){function J(a){a=a||{},this.command=a.command,this.args=a.args,this.typed=a.typed,this._begunOutput=!1,this.start=new Date,this.end=null,this.completed=!1,this.error=!1}function G(a,b,c,e,f){function h(){a.exec(b,g.args,g),!g.isAsync&&!g.isDone&&g.done()}typeof a=="string"&&(a=q[a]);if(!a)return!1;var g=new J({sender:c,command:a,args:e||{},typed:f});if(g.getStatus()==l.INVALID){d.error("Canon.exec: Invalid parameter(s) passed to "+a.name);return!1}if(g.getStatus()==l.INCOMPLETE){var i,j=b[c];if(!j||!j.getArgsProvider||!(i=j.getArgsProvider()))i=F;i(g,function(){g.getStatus()==l.VALID&&h()});return!0}h();return!0}function F(a,b){var c=a.args,d=a.command.params;for(var e=0;eI)H.shiftObject();b._dispatchEvent("output",{requests:H,request:this})},J.prototype.doneWithError=function(a){this.error=!0,this.done(a)},J.prototype.async=function(){this.isAsync=!0,this._begunOutput||this._beginOutput()},J.prototype.output=function(a){this._begunOutput||this._beginOutput(),typeof a!="string"&&!(a instanceof Node)&&(a=a.toString()),this.outputs.push(a),this.isDone=!0,this._dispatchEvent("output",{});return this},J.prototype.done=function(a){this.completed=!0,this.end=new Date,this.duration=this.end.getTime()-this.start.getTime(),a&&this.output(a),this.isDone||(this.isDone=!0,this._dispatchEvent("output",{}))},b.Request=J}),define("pilot/console",["require","exports","module"],function(a,b,c){var d=function(){},e=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","log","profile","profileEnd","time","timeEnd","trace","warn"];typeof window=="undefined"?e.forEach(function(a){b[a]=function(){var b=Array.prototype.slice.call(arguments),c={op:"log",method:a,args:b};postMessage(JSON.stringify(c))}}):e.forEach(function(a){window.console&&window.console[a]?b[a]=Function.prototype.bind.call(window.console[a],window.console):b[a]=d})}),define("pilot/stacktrace",["require","exports","module","pilot/useragent","pilot/console"],function(a,b,c){function i(){}function g(a){for(var b=0;b\s*\(/gm,"{anonymous}()@").split("\n")},firefox:function(a){var b=a.stack;if(!b){e.log(a);return[]}b=b.replace(/(?:\n@:0)?\s+$/m,""),b=b.replace(/^\(/gm,"{anonymous}(");return b.split("\n")},opera:function(a){var b=a.message.split("\n"),c="{anonymous}",d=/Line\s+(\d+).*?script\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,e,f,g;for(e=4,f=0,g=b.length;e=0,b.isIPad=e.indexOf("iPad")>=0,b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS}}),define("pilot/oop",["require","exports","module"],function(a,b,c){b.inherits=function(){var a=function(){};return function(b,c){a.prototype=c.prototype,b.super_=c.prototype,b.prototype=new a,b.prototype.constructor=b}}(),b.mixin=function(a,b){for(var c in b)a[c]=b[c]},b.implement=function(a,c){b.mixin(a,c)}}),define("pilot/keys",["require","exports","module","pilot/oop"],function(a,b,c){var d=a("pilot/oop"),e=function(){var a={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:'"'}};for(i in a.FUNCTION_KEYS){var b=a.FUNCTION_KEYS[i].toUpperCase();a[b]=parseInt(i,10)}d.mixin(a,a.MODIFIER_KEYS),d.mixin(a,a.PRINTABLE_KEYS),d.mixin(a,a.FUNCTION_KEYS);return a}();d.mixin(b,e),b.keyCodeToString=function(a){return(e[a]||String.fromCharCode(a)).toLowerCase()}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!!c&&!!c.length){var b=b||{};b.type=a;for(var d=0;d'+c.name+" = "+c.value+"
    "})}else b.value===undefined?d=""+setting.name+" = "+setting.get():(b.setting.set(b.value),d="Setting: "+b.setting.name+" = "+b.setting.get());c.done(d)}},e={name:"unset",params:[{name:"setting",type:"setting",description:"The name of the setting to return to defaults"}],description:"unset a setting entirely",exec:function(a,b,c){var d=a.settings.get(b.setting);d?(d.reset(),c.done("Reset "+d.name+" to default: "+a.settings.get(b.setting))):c.doneWithError("No setting with the name "+b.setting+".")}},f=a("pilot/canon");b.startup=function(a,b){f.addCommand(d),f.addCommand(e)},b.shutdown=function(a,b){f.removeCommand(d),f.removeCommand(e)}}),define("pilot/commands/basic",["require","exports","module","pilot/typecheck","pilot/canon"],function(require,exports,module){var checks=require("pilot/typecheck"),canon=require("pilot/canon"),helpCommandSpec={name:"help",params:[{name:"search",type:"text",description:"Search string to narrow the output.",defaultValue:null}],description:"Get help on the available commands.",exec:function(a,b,c){var d=[],e=canon.getCommand(b.search);if(e&&e.exec)d.push(e.description?e.description:"No description for "+b.search);else{var f=!1;e?(d.push("

    Sub-Commands of "+e.name+"

    "),d.push("

    "+e.description+"

    ")):b.search?(b.search=="hidden"&&(b.search="",f=!0),d.push("

    Commands starting with '"+b.search+"':

    ")):d.push("

    Available Commands:

    ");var g=canon.getCommandNames();g.sort(),d.push("");for(var h=0;h"),d.push('"),d.push(""),d.push("")}d.push("
    '+e.name+""+e.description+"
    ")}c.done(d.join(""))}},evalCommandSpec={name:"eval",params:[{name:"javascript",type:"text",description:"The JavaScript to evaluate"}],description:"evals given js code and show the result",hidden:!0,exec:function(env,args,request){var result,javascript=args.javascript;try{result=eval(javascript)}catch(e){result="Error: "+e.message+""}var msg="",type="",x;if(checks.isFunction(result))msg=(result+"").replace(/\n/g,"
    ").replace(/ /g," "),type="function";else if(checks.isObject(result)){Array.isArray(result)?type="array":type="object";var items=[],value;for(x in result)result.hasOwnProperty(x)&&(checks.isFunction(result[x])?value="[function]":checks.isObject(result[x])?value="[object]":value=result[x],items.push({name:x,value:value}));items.sort(function(a,b){return a.name.toLowerCase()"+items[x].name+"
    : "+items[x].value+"
    "}else msg=result,type=typeof result;request.done("Result for eval '"+javascript+"'"+" (type: "+type+"):

    "+msg)}},canon=require("pilot/canon");exports.startup=function(a,b){canon.addCommand(helpCommandSpec),canon.addCommand(evalCommandSpec)},exports.shutdown=function(a,b){canon.removeCommand(helpCommandSpec),canon.removeCommand(evalCommandSpec)}}),define("pilot/settings/canon",["require","exports","module"],function(a,b,c){var d={name:"historyLength",description:"How many typed commands do we recall for reference?",type:"number",defaultValue:50};b.startup=function(a,b){a.env.settings.addSetting(d)},b.shutdown=function(a,b){a.env.settings.removeSetting(d)}}),define("pilot/plugin_manager",["require","exports","module","pilot/promise"],function(a,b,c){var d=a("pilot/promise").Promise;b.REASONS={APP_STARTUP:1,APP_SHUTDOWN:2,PLUGIN_ENABLE:3,PLUGIN_DISABLE:4,PLUGIN_INSTALL:5,PLUGIN_UNINSTALL:6,PLUGIN_UPGRADE:7,PLUGIN_DOWNGRADE:8},b.Plugin=function(a){this.name=a,this.status=this.INSTALLED},b.Plugin.prototype={NEW:0,INSTALLED:1,REGISTERED:2,STARTED:3,UNREGISTERED:4,SHUTDOWN:5,install:function(b,c){var e=new d;if(this.status>this.NEW){e.resolve(this);return e}a([this.name],function(a){a.install&&a.install(b,c),this.status=this.INSTALLED,e.resolve(this)}.bind(this));return e},register:function(b,c){var e=new d;if(this.status!=this.INSTALLED){e.resolve(this);return e}a([this.name],function(a){a.register&&a.register(b,c),this.status=this.REGISTERED,e.resolve(this)}.bind(this));return e},startup:function(c,e){e=e||b.REASONS.APP_STARTUP;var f=new d;if(this.status!=this.REGISTERED){f.resolve(this);return f}a([this.name],function(a){a.startup&&a.startup(c,e),this.status=this.STARTED,f.resolve(this)}.bind(this));return f},shutdown:function(b,c){this.status==this.STARTED&&(pluginModule=a(this.name),pluginModule.shutdown&&pluginModule.shutdown(b,c))}},b.PluginCatalog=function(){this.plugins={}},b.PluginCatalog.prototype={registerPlugins:function(a,c,e){var f=[];a.forEach(function(a){var d=this.plugins[a];d===undefined&&(d=new b.Plugin(a),this.plugins[a]=d,f.push(d.register(c,e)))}.bind(this));return d.group(f)},startupPlugins:function(a,b){var c=[];for(var e in this.plugins){var f=this.plugins[e];c.push(f.startup(a,b))}return d.group(c)}},b.catalog=new b.PluginCatalog}),define("pilot/promise",["require","exports","module","pilot/console","pilot/stacktrace"],function(a,b,c){var d=a("pilot/console"),e=a("pilot/stacktrace").Trace,f=-1,g=0,h=1,i=0,j=!1,k=[],l=[];Promise=function(){this._status=g,this._value=undefined,this._onSuccessHandlers=[],this._onErrorHandlers=[],this._id=i++,k[this._id]=this},Promise.prototype.isPromise=!0,Promise.prototype.isComplete=function(){return this._status!=g},Promise.prototype.isResolved=function(){return this._status==h},Promise.prototype.isRejected=function(){return this._status==f},Promise.prototype.then=function(a,b){typeof a=="function"&&(this._status===h?a.call(null,this._value):this._status===g&&this._onSuccessHandlers.push(a)),typeof b=="function"&&(this._status===f?b.call(null,this._value):this._status===g&&this._onErrorHandlers.push(b));return this},Promise.prototype.chainPromise=function(a){var b=new Promise;b._chainedFrom=this,this.then(function(c){try{b.resolve(a(c))}catch(d){b.reject(d)}},function(a){b.reject(a)});return b},Promise.prototype.resolve=function(a){return this._complete(this._onSuccessHandlers,h,a,"resolve")},Promise.prototype.reject=function(a){return this._complete(this._onErrorHandlers,f,a,"reject")},Promise.prototype._complete=function(a,b,c,f){if(this._status!=g){d.group("Promise already closed"),d.error("Attempted "+f+"() with ",c),d.error("Previous status = ",this._status,", previous value = ",this._value),d.trace(),this._completeTrace&&(d.error("Trace of previous completion:"),this._completeTrace.log(5)),d.groupEnd();return this}j&&(this._completeTrace=new e(new Error)),this._status=b,this._value=c,a.forEach(function(a){a.call(null,this._value)},this),this._onSuccessHandlers.length=0,this._onErrorHandlers.length=0,delete k[this._id],l.push(this);while(l.length>20)l.shift();return this},Promise.group=function(a){a instanceof Array||(a=Array.prototype.slice.call(arguments));if(a.length===0)return(new Promise).resolve([]);var b=new Promise,c=[],d=0,e=function(e){return function(g){c[e]=g,d++,b._status!==f&&d===a.length&&b.resolve(c)}};a.forEach(function(a,c){var d=e(c),f=b.reject.bind(b);a.then(d,f)});return b},b.Promise=Promise,b._outstanding=k,b._recent=l}),define("pilot/dom",["require","exports","module"],function(a,b,c){var d="http://www.w3.org/1999/xhtml";b.createElement=function(a,b){return document.createElementNS?document.createElementNS(b||d,a):document.createElement(a)},b.setText=function(a,b){a.innerText!==undefined&&(a.innerText=b),a.textContent!==undefined&&(a.textContent=b)},document.documentElement.classList?(b.hasCssClass=function(a,b){return a.classList.contains(b)},b.addCssClass=function(a,b){a.classList.add(b)},b.removeCssClass=function(a,b){a.classList.remove(b)},b.toggleCssClass=function(a,b){return a.classList.toggle(b)}):(b.hasCssClass=function(a,b){var c=a.className.split(/\s+/g);return c.indexOf(b)!==-1},b.addCssClass=function(a,c){b.hasCssClass(a,c)||(a.className+=" "+c)},b.removeCssClass=function(a,b){var c=a.className.split(/\s+/g);for(;;){var d=c.indexOf(b);if(d==-1)break;c.splice(d,1)}a.className=c.join(" ")},b.toggleCssClass=function(a,b){var c=a.className.split(/\s+/g),d=!0;for(;;){var e=c.indexOf(b);if(e==-1)break;d=!1,c.splice(e,1)}d&&c.push(b),a.className=c.join(" ");return d}),b.setCssClass=function(a,c,d){d?b.addCssClass(a,c):b.removeCssClass(a,c)},b.importCssString=function(a,b){b=b||document;if(b.createStyleSheet){var c=b.createStyleSheet();c.cssText=a}else{var e=b.createElementNS?b.createElementNS(d,"style"):b.createElement("style");e.appendChild(b.createTextNode(a));var f=b.getElementsByTagName("head")[0]||b.documentElement;f.appendChild(e)}},b.getInnerWidth=function(a){return parseInt(b.computedStyle(a,"paddingLeft"))+parseInt(b.computedStyle(a,"paddingRight"))+a.clientWidth},b.getInnerHeight=function(a){return parseInt(b.computedStyle(a,"paddingTop"))+parseInt(b.computedStyle(a,"paddingBottom"))+a.clientHeight},window.pageYOffset!==undefined?(b.getPageScrollTop=function(){return window.pageYOffset},b.getPageScrollLeft=function(){return window.pageXOffset}):(b.getPageScrollTop=function(){return document.body.scrollTop},b.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?b.computedStyle=function(a,b){return b?(window.getComputedStyle(a,"")||{})[b]||"":window.getComputedStyle(a,"")||{}}:b.computedStyle=function(a,b){return b?a.currentStyle[b]:a.currentStyle},b.scrollbarWidth=function(){var a=b.createElement("p");a.style.width="100%",a.style.minWidth="0px",a.style.height="200px";var c=b.createElement("div"),d=c.style;d.position="absolute",d.left="-10000px",d.overflow="hidden",d.width="200px",d.minWidth="0px",d.height="150px",c.appendChild(a);var e=document.body||document.documentElement;e.appendChild(c);var f=a.offsetWidth;d.overflow="scroll";var g=a.offsetWidth;f==g&&(g=c.clientWidth),e.removeChild(c);return f-g},b.setInnerHtml=function(a,b){var c=a.cloneNode(!1);c.innerHTML=b,a.parentNode.replaceChild(c,a);return c},b.setInnerText=function(a,b){document.body&&"textContent"in document.body?a.textContent=b:a.innerText=b},b.getInnerText=function(a){return document.body&&"textContent"in document.body?a.textContent:a.innerText||a.textContent||""},b.getParentWindow=function(a){return a.defaultView||a.parentWindow},b.getSelectionStart=function(a){var b;try{b=a.selectionStart||0}catch(c){b=0}return b},b.setSelectionStart=function(a,b){return a.selectionStart=b},b.getSelectionEnd=function(a){var b;try{b=a.selectionEnd||0}catch(c){b=0}return b},b.setSelectionEnd=function(a,b){return a.selectionEnd=b}}),define("pilot/event",["require","exports","module","pilot/keys","pilot/useragent","pilot/dom"],function(a,b,c){function g(a,b,c){var f=0;e.isOpera&&e.isMac?f=0|(b.metaKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.ctrlKey?8:0):f=0|(b.ctrlKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.metaKey?8:0);if(c in d.MODIFIER_KEYS){switch(d.MODIFIER_KEYS[c]){case"Alt":f=2;break;case"Shift":f=4;break;case"Ctrl":f=1;break;default:f=8}c=0}f&8&&(c==91||c==93)&&(c=0);return f!=0||c in d.FUNCTION_KEYS?a(b,f,c):!1}var d=a("pilot/keys"),e=a("pilot/useragent"),f=a("pilot/dom");b.addListener=function(a,b,c){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent){var d=function(){c(window.event)};c._wrapper=d,a.attachEvent("on"+b,d)}},b.removeListener=function(a,b,c){if(a.removeEventListener)return a.removeEventListener(b,c,!1);a.detachEvent&&a.detachEvent("on"+b,c._wrapper||c)},b.stopEvent=function(a){b.stopPropagation(a),b.preventDefault(a);return!1},b.stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},b.preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},b.getDocumentX=function(a){return a.clientX?a.clientX+f.getPageScrollLeft():a.pageX},b.getDocumentY=function(a){return a.clientY?a.clientY+f.getPageScrollTop():a.pageY},b.getButton=function(a){if(a.type=="dblclick")return 0;if(a.type=="contextmenu")return 2;return a.preventDefault?a.button:{1:0,2:2,4:1}[a.button]},document.documentElement.setCapture?b.capture=function(a,c,d){function f(e){c&&c(e),d&&d(),b.removeListener(a,"mousemove",c),b.removeListener(a,"mouseup",f),b.removeListener(a,"losecapture",f),a.releaseCapture()}function e(a){c(a);return b.stopPropagation(a)}b.addListener(a,"mousemove",c),b.addListener(a,"mouseup",f),b.addListener(a,"losecapture",f),a.setCapture()}:b.capture=function(a,b,c){function e(a){b&&b(a),c&&c(),document.removeEventListener("mousemove",d,!0),document.removeEventListener("mouseup",e,!0),a.stopPropagation()}function d(a){b(a),a.stopPropagation()}document.addEventListener("mousemove",d,!0),document.addEventListener("mouseup",e,!0)},b.addMouseWheelListener=function(a,c){var d=function(a){a.wheelDelta!==undefined?a.wheelDeltaX!==undefined?(a.wheelX=-a.wheelDeltaX/8,a.wheelY=-a.wheelDeltaY/8):(a.wheelX=0,a.wheelY=-a.wheelDelta/8):a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=(a.detail||0)*5,a.wheelY=0):(a.wheelX=0,a.wheelY=(a.detail||0)*5),c(a)};b.addListener(a,"DOMMouseScroll",d),b.addListener(a,"mousewheel",d)},b.addMultiMouseDownListener=function(a,c,d,f,g){var h=0,i,j,k=function(a){h+=1,h==1&&(i=a.clientX,j=a.clientY,setTimeout(function(){h=0},f||600));var e=b.getButton(a)==c;if(!e||Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5)h=0;h==d&&(h=0,g(a));if(e)return b.preventDefault(a)};b.addListener(a,"mousedown",k),e.isIE&&b.addListener(a,"dblclick",k)},b.addCommandKeyListener=function(a,c){var d=b.addListener;if(e.isOldGecko){var f=null;d(a,"keydown",function(a){f=a.keyCode}),d(a,"keypress",function(a){return g(c,a,f)})}else{var h=null;d(a,"keydown",function(a){h=a.keyIdentifier||a.keyCode;return g(c,a,a.keyCode)}),e.isMac&&e.isOpera&&d(a,"keypress",function(a){var b=a.keyIdentifier||a.keyCode;if(h!==b)return g(c,a,a.keyCode);h=null})}}}),define("ace/editor",["require","exports","module","pilot/fixoldbrowsers","pilot/oop","pilot/event","pilot/lang","pilot/useragent","ace/keyboard/textinput","ace/mouse_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","pilot/event_emitter"],function(a,b,c){a("pilot/fixoldbrowsers");var d=a("pilot/oop"),e=a("pilot/event"),f=a("pilot/lang"),g=a("pilot/useragent"),h=a("ace/keyboard/textinput").TextInput,i=a("ace/mouse_handler").MouseHandler,j=a("ace/keyboard/keybinding").KeyBinding,k=a("ace/edit_session").EditSession,l=a("ace/search").Search,m=a("ace/range").Range,n=a("pilot/event_emitter").EventEmitter,o=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.textInput=new h(a.getTextAreaContainer(),this),this.keyBinding=new j(this),g.isIPad||(this.$mouseHandler=new i(this)),this.$blockScrolling=0,this.$search=(new l).set({wrap:!0}),this.setSession(b||new k(""))};(function(){d.implement(this,n),this.$forwardEvents={gutterclick:1,gutterdblclick:1},this.$originalAddEventListener=this.addEventListener,this.$originalRemoveEventListener=this.removeEventListener,this.addEventListener=function(a,b){return this.$forwardEvents[a]?this.renderer.addEventListener(a,b):this.$originalAddEventListener(a,b)},this.removeEventListener=function(a,b){return this.$forwardEvents[a]?this.renderer.removeEventListener(a,b):this.$originalRemoveEventListener(a,b)},this.setKeyboardHandler=function(a){this.keyBinding.setKeyboardHandler(a)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session!=a){if(this.session){var b=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange),this.session.setScrollTopRow(this.renderer.getScrollTopRow())}this.session=a,this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.updateText.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.scrollToRow(a.getScrollTopRow()),this.renderer.updateFull(),this._dispatchEvent("changeSession",{session:a,oldSession:b})}},this.getSession=function(){return this.session},this.getSelection=function(){return this.selection},this.resize=function(){this.renderer.onResize()},this.setTheme=function(a){this.renderer.setTheme(a)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.setFontSize=function(a){this.container.style.fontSize=a},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(!this.$highlightPending){var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b){var c=new m(b.row,b.column,b.row,b.column+1);a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text")}},10)}},this.focus=function(){var a=this;g.isIE||setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.renderer.showCursor(),this.renderer.visualizeFocus(),this._dispatchEvent("focus")},this.onBlur=function(){this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._dispatchEvent("blur")},this.onDocumentChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&b.action!="insertLines"&&b.action!="removeLines")var d=c.end.row;else d=Infinity;this.renderer.updateLines(c.start.row,d),this.renderer.updateCursor()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onCursorChange=function(a){this.renderer.updateCursor(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.renderer.moveTextAreaToCursor(this.textInput.getElement()),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.$updateHighlightActiveLine=function(){var a=this.getSession();a.$highlightLineMarker&&a.removeMarker(a.$highlightLineMarker),a.$highlightLineMarker=null;if(this.getHighlightActiveLine()&&(this.getSelectionStyle()!="line"||!this.selection.isMultiLine())){var b=this.getCursorPosition(),c=this.session.getFoldLine(b.row),d;c?d=new m(c.start.row,0,c.end.row+1,0):d=new m(b.row,0,b.row+1,0),a.$highlightLineMarker=a.addMarker(d,"ace_active_line","background")}},this.onSelectionChange=function(a){var b=this.getSession();b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null;if(!this.selection.isEmpty()){var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}else this.$updateHighlightActiveLine();this.$highlightSelectedWord&&this.session.getMode().highlightSelection(this)},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.setBreakpoints(this.session.getBreakpoints())},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(){this.renderer.updateText()},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){return this.selection.isEmpty()?"":this.session.getTextRange(this.getSelectionRange())},this.onCut=function(){this.$readOnly||this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection())},this.insert=function(a){if(!this.$readOnly){var b=this.session,c=b.getMode(),d=this.getCursorPosition();if(this.getBehavioursEnabled()){var e=c.transformAction(b.getState(d.row),"insertion",this,b,a);e&&(a=e.text)}a=a.replace("\t",this.session.getTabString());if(!this.selection.isEmpty()){var d=this.session.remove(this.getSelectionRange());this.clearSelection()}else if(this.session.getOverwrite()){var f=new m.fromPoints(d,d);f.end.column+=a.length,this.session.remove(f)}this.clearSelection();var g=d.column,h=b.getState(d.row),i=c.checkOutdent(h,b.getLine(d.row),a),j=b.getLine(d.row),k=c.getNextLineIndent(h,j.slice(0,d.column),b.getTabString()),l=b.insert(d,a);e&&e.selection&&(e.selection.length==2?this.selection.setSelectionRange(new m(d.row,g+e.selection[0],d.row,g+e.selection[1])):this.selection.setSelectionRange(new m(d.row+e.selection[0],e.selection[1],d.row+e.selection[2],e.selection[3])));var h=b.getState(d.row);if(b.getDocument().isNewLine(a)){this.moveCursorTo(d.row+1,0);var n=b.getTabSize(),o=Number.MAX_VALUE;for(var p=d.row+1;p<=l.row;++p){var q=0;j=b.getLine(p);for(var r=0;r0;++r)j.charAt(r)=="\t"?s-=n:j.charAt(r)==" "&&(s-=1);b.remove(new m(p,0,p,r))}b.indentRows(d.row+1,l.row,k)}else i&&c.autoOutdent(h,b,d.row)}},this.onTextInput=function(a,b){if(b&&a.length==1){var c=this.keyBinding.onCommandKey({},0,null,a);c||this.insert(a)}else this.keyBinding.onTextInput(a)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.$mouseHandler.setScrollSpeed(a)},this.getScrollSpeed=function(){return this.$mouseHandler.getScrollSpeed()},this.$selectionStyle="line",this.setSelectionStyle=function(a){this.$selectionStyle!=a&&(this.$selectionStyle=a,this.onSelectionChange(),this._dispatchEvent("changeSelectionStyle",{data:a}))},this.getSelectionStyle=function(){return this.$selectionStyle},this.$highlightActiveLine=!0,this.setHighlightActiveLine=function(a){this.$highlightActiveLine!=a&&(this.$highlightActiveLine=a,this.$updateHighlightActiveLine())},this.getHighlightActiveLine=function(){return this.$highlightActiveLine},this.$highlightSelectedWord=!0,this.setHighlightSelectedWord=function(a){this.$highlightSelectedWord!=a&&(this.$highlightSelectedWord=a,a?this.session.getMode().highlightSelection(this):this.session.getMode().clearSelectionHighlight(this))},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setShowInvisibles=function(a){this.getShowInvisibles()!=a&&this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.$readOnly=!1,this.setReadOnly=function(a){this.$readOnly=a},this.getReadOnly=function(){return this.$readOnly},this.$modeBehaviours=!0,this.setBehavioursEnabled=function(a){this.$modeBehaviours=a},this.getBehavioursEnabled=function(){return this.$modeBehaviours},this.removeRight=function(){this.$readOnly||(this.selection.isEmpty()&&this.selection.selectRight(),this.session.remove(this.getSelectionRange()),this.clearSelection())},this.removeLeft=function(){if(!this.$readOnly){this.selection.isEmpty()&&this.selection.selectLeft();var a=this.getSelectionRange();if(this.getBehavioursEnabled()){var b=this.session,c=b.getState(a.start.row),d=b.getMode().transformAction(c,"deletion",this,b,a);d!==!1&&(a=d)}this.session.remove(a),this.clearSelection()}},this.removeWordRight=function(){this.$readOnly||(this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection())},this.removeWordLeft=function(){this.$readOnly||(this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection())},this.removeToLineStart=function(){this.$readOnly||(this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection())},this.removeToLineEnd=function(){if(!this.$readOnly){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()}},this.splitLine=function(){if(!this.$readOnly){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)}},this.transposeLetters=function(){if(!this.$readOnly){if(!this.selection.isEmpty())return;var a=this.getCursorPosition(),b=a.column;if(b==0)return;var c=this.session.getLine(a.row);if(b=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$getPageDownRow=function(){return this.renderer.getScrollBottomRow()},this.$getPageUpRow=function(){var a=this.renderer.getScrollTopRow(),b=this.renderer.getScrollBottomRow();return a-(b-a)},this.selectPageDown=function(){var a=this.$getPageDownRow()+Math.floor(this.$getVisibleRowCount()/2);this.scrollPageDown();var b=this.getSelection(),c=this.session.documentToScreenPosition(b.getSelectionLead()),d=this.session.screenToDocumentPosition(a,c.column);b.selectTo(d.row,d.column)},this.selectPageUp=function(){var a=this.renderer.getScrollTopRow()-this.renderer.getScrollBottomRow(),b=this.$getPageUpRow()+Math.round(a/2);this.scrollPageUp();var c=this.getSelection(),d=this.session.documentToScreenPosition(c.getSelectionLead()),e=this.session.screenToDocumentPosition(b,d.column);c.selectTo(e.row,e.column)},this.gotoPageDown=function(){var a=this.$getPageDownRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.gotoPageUp=function(){var a=this.$getPageUpRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.scrollPageDown=function(){this.scrollToRow(this.$getPageDownRow())},this.scrollPageUp=function(){this.renderer.scrollToRow(this.$getPageUpRow())},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b){this.renderer.scrollToLine(a,b)},this.centerSelection=function(){var a=this.getSelectionRange(),b=Math.floor(a.start.row+(a.end.row-a.start.row)/2);this.renderer.scrollToLine(b,!0)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.gotoLine=function(a,b){this.selection.clearSelection(),this.$blockScrolling+=1,this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowVisible(this.getCursorPosition().row)||this.scrollToLine(a,!0)},this.navigateTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.navigateUp=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(-a,0)},this.navigateDown=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(a,0)},this.navigateLeft=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session);!c||(this.$tryReplace(c,a),c!==null&&this.selection.setSelectionRange(c))},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session);if(!!c.length){var d=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0),this.$blockScrolling+=1;for(var e=c.length-1;e>=0;--e)this.$tryReplace(c[e],a);this.selection.setSelectionRange(d),this.$blockScrolling-=1}},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a),b=this.$search.replace(c,b);if(b!==null){a.end=this.session.replace(a,b);return a}return null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b){this.clearSelection(),b=b||{},b.needle=a,this.$search.set(b),this.$find()},this.findNext=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!1),this.$search.set(a),this.$find()},this.findPrevious=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!0),this.$search.set(a),this.$find()},this.$find=function(a){this.selection.isEmpty()||this.$search.set({needle:this.session.getTextRange(this.getSelectionRange())}),typeof a!="undefined"&&this.$search.set({backwards:a});var b=this.$search.find(this.session);b&&(this.gotoLine(b.end.row+1,b.end.column),this.selection.setSelectionRange(b))},this.undo=function(){this.session.getUndoManager().undo()},this.redo=function(){this.session.getUndoManager().redo()},this.destroy=function(){this.renderer.destroy()}}).call(o.prototype),b.Editor=o}),define("ace/keyboard/textinput",["require","exports","module","pilot/event","pilot/useragent","pilot/dom"],function(a,b,c){var d=a("pilot/event"),e=a("pilot/useragent"),f=a("pilot/dom"),g=function(a,b){function u(){return document.activeElement===c}function l(a){if(!i){var d=a||c.value;if(d){d.charCodeAt(d.length-1)==g.charCodeAt(0)?(d=d.slice(0,-1),d&&b.onTextInput(d,!j)):b.onTextInput(d,!j);if(!u())return!1}}i=!1,j=!1,c.value=g,c.select()}var c=f.createElement("textarea");c.style.left="-10000px",a.appendChild(c);var g=String.fromCharCode(0);l();var h=!1,i=!1,j=!1,k="",m=function(a){setTimeout(function(){h||l(a.data)},0)},n=function(a){e.isIE&&c.value.charCodeAt(0)>128||setTimeout(function(){h||l()},0)},o=function(a){h=!0,b.onCompositionStart(),e.isGecko||setTimeout(p,0)},p=function(){!h||b.onCompositionUpdate(c.value)},q=function(a){h=!1,b.onCompositionEnd()},r=function(a){i=!0;var d=b.getCopyText();d?c.value=d:a.preventDefault(),c.select(),setTimeout(function(){l()},0)},s=function(a){i=!0;var d=b.getCopyText();d?(c.value=d,b.onCut()):a.preventDefault(),c.select(),setTimeout(function(){l()},0)};d.addCommandKeyListener(c,b.onCommandKey.bind(b));if(e.isIE){var t={13:1,27:1};d.addListener(c,"keyup",function(a){h&&(!c.value||t[a.keyCode])&&setTimeout(q,0);(c.value.charCodeAt(0)|0)<129||(h?p():o())})}c.attachEvent?d.addListener(c,"propertychange",n):e.isChrome||e.isSafari?d.addListener(c,"textInput",m):e.isIE?d.addListener(c,"textinput",m):d.addListener(c,"input",m),d.addListener(c,"paste",function(a){j=!0,a.clipboardData&&a.clipboardData.getData?(l(a.clipboardData.getData("text/plain")),a.preventDefault()):n()}),e.isIE?(d.addListener(c,"beforecopy",function(a){var c=b.getCopyText();c?clipboardData.setData("Text",c):a.preventDefault()}),d.addListener(a,"keydown",function(a){if(a.ctrlKey&&a.keyCode==88){var c=b.getCopyText();c&&(clipboardData.setData("Text",c),b.onCut()),d.preventDefault(a)}})):(d.addListener(c,"copy",r),d.addListener(c,"cut",s)),d.addListener(c,"compositionstart",o),e.isGecko&&d.addListener(c,"text",p),e.isWebKit&&d.addListener(c,"keyup",p),d.addListener(c,"compositionend",q),d.addListener(c,"blur",function(){b.onBlur()}),d.addListener(c,"focus",function(){b.onFocus(),c.select()}),this.focus=function(){b.onFocus(),c.select(),c.focus()},this.blur=function(){c.blur()},this.isFocused=u,this.getElement=function(){return c},this.onContextMenu=function(a,b){a&&(k||(k=c.style.cssText),c.style.cssText="position:fixed; z-index:1000;left:"+(a.x-2)+"px; top:"+(a.y-2)+"px;"),b&&(c.value="")},this.onContextMenuClose=function(){setTimeout(function(){k&&(c.style.cssText=k,k=""),l()},0)}};b.TextInput=g}),define("ace/mouse_handler",["require","exports","module","pilot/event","pilot/dom","pilot/browser_focus"],function(a,b,c){var d=a("pilot/event"),e=a("pilot/dom"),f=a("pilot/browser_focus").BrowserFocus,g=0,h=1,i=2,j=250,k=5,l=function(a){this.editor=a,this.browserFocus=new f,d.addListener(a.container,"mousedown",function(b){a.focus();return d.preventDefault(b)}),d.addListener(a.container,"selectstart",function(a){return d.preventDefault(a)});var b=a.renderer.getMouseEventTarget();d.addListener(b,"mousedown",this.onMouseDown.bind(this)),d.addMultiMouseDownListener(b,0,2,500,this.onMouseDoubleClick.bind(this)),d.addMultiMouseDownListener(b,0,3,600,this.onMouseTripleClick.bind(this)),d.addMultiMouseDownListener(b,0,4,600,this.onMouseQuadClick.bind(this)),d.addMouseWheelListener(b,this.onMouseWheel.bind(this))};(function(){this.$scrollSpeed=1,this.setScrollSpeed=function(a){this.$scrollSpeed=a},this.getScrollSpeed=function(){return this.$scrollSpeed},this.$getEventPosition=function(a){var b=d.getDocumentX(a),c=d.getDocumentY(a),e=this.editor.renderer.screenToTextCoordinates(b,c);e.row=Math.max(0,Math.min(e.row,this.editor.session.getLength()-1));return e},this.$distance=function(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))},this.onMouseDown=function(a){function D(b){a.shiftKey?l.selection.selectToPosition(b):m.$clickSelection||(l.moveCursorToPosition(b),l.selection.clearSelection(b.row,b.column)),p=h}if(!(!this.browserFocus.isFocused()||(new Date).getTime()-this.browserFocus.lastFocus<20||!this.editor.isFocused())){var b=d.getDocumentX(a),c=d.getDocumentY(a),f=this.$getEventPosition(a),l=this.editor,m=this,n=l.getSelectionRange(),o=n.isEmpty(),p=g,q=!1,r=d.getButton(a);if(r!==0){o&&l.moveCursorToPosition(f),r==2&&(l.textInput.onContextMenu({x:b,y:c},o),d.capture(l.container,function(){},l.textInput.onContextMenuClose));return}var s=l.session.getFoldAt(f.row,f.column,1);if(s){l.selection.setSelectionRange(s.range);return}q=!l.getReadOnly()&&!o&&n.contains(f.row,f.column),q||D(f);var t,u,v=l.getOverwrite(),w=(new Date).getTime(),x,y,z=function(a){t=d.getDocumentX(a),u=d.getDocumentY(a)},A=function(){clearInterval(G),p==g?D(f):p==i&&B(),m.$clickSelection=null,p=g},B=function(){e.removeCssClass(l.container,"ace_dragging"),l.session.removeMarker(dragSelectionMarker),m.$clickSelection||x||(l.moveCursorToPosition(f),l.selection.clearSelection(f.row,f.column));if(!!x){if(y.contains(x.row,x.column)){x=null;return}l.clearSelection();var a=l.moveText(y,x);if(!a){x=null;return}l.selection.setSelectionRange(a)}},C=function(){if(t!==undefined&&u!==undefined){if(p==g){var a=m.$distance(b,c,t,u),d=(new Date).getTime();if(a>k){p=h;var f=l.renderer.screenToTextCoordinates(t,u);f.row=Math.max(0,Math.min(f.row,l.session.getLength()-1)),D(f)}else if(d-w>j){p=i,y=l.getSelectionRange();var n=l.getSelectionStyle();dragSelectionMarker=l.session.addMarker(y,"ace_selection",n),l.clearSelection(),e.addCssClass(l.container,"ace_dragging")}}p==i?F():p==h&&E()}},E=function(){var a=l.renderer.screenToTextCoordinates(t,u);a.row=Math.max(0,Math.min(a.row,l.session.getLength()-1));if(m.$clickSelection)if(m.$clickSelection.contains(a.row,a.column))l.selection.setSelectionRange(m.$clickSelection);else{if(m.$clickSelection.compare(a.row,a.column)==-1)var b=m.$clickSelection.end;else var b=m.$clickSelection.start;l.selection.setSelectionAnchor(b.row,b.column),l.selection.selectToPosition(a)}else l.selection.selectToPosition(a);l.renderer.scrollCursorIntoView()},F=function(){x=l.renderer.screenToTextCoordinates(t,u),x.row=Math.max(0,Math.min(x.row,l.session.getLength()-1)),l.moveCursorToPosition(x)};d.capture(l.container,z,A);var G=setInterval(C,20);return d.preventDefault(a)}},this.onMouseDoubleClick=function(a){var b=this.editor,c=this.$getEventPosition(a),d=b.session.getFoldAt(c.row,c.column,1);d?b.session.expandFold(d):(b.moveCursorToPosition(c),b.selection.selectWord(),this.$clickSelection=b.getSelectionRange())},this.onMouseTripleClick=function(a){var b=this.$getEventPosition(a);this.editor.moveCursorToPosition(b),this.editor.selection.selectLine(),this.$clickSelection=this.editor.getSelectionRange()},this.onMouseQuadClick=function(a){this.editor.selectAll(),this.$clickSelection=this.editor.getSelectionRange()},this.onMouseWheel=function(a){var b=this.$scrollSpeed*2;this.editor.renderer.scrollBy(a.wheelX*b,a.wheelY*b);return d.preventDefault(a)}}).call(l.prototype),b.MouseHandler=l}),define("pilot/browser_focus",["require","exports","module","pilot/oop","pilot/event","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event"),f=a("pilot/event_emitter").EventEmitter,g=function(a){a=a||window,this.lastFocus=(new Date).getTime(),this._isFocused=!0;var b=this;e.addListener(a,"blur",function(a){b._setFocused(!1)}),e.addListener(a,"focus",function(a){b._setFocused(!0)})};(function(){d.implement(this,f),this.isFocused=function(){return this._isFocused},this._setFocused=function(a){this._isFocused!=a&&(a&&(this.lastFocus=(new Date).getTime()),this._isFocused=a,this._emit("changeFocus"))}}).call(g.prototype),b.BrowserFocus=g}),define("ace/keyboard/keybinding",["require","exports","module","pilot/useragent","pilot/keys","pilot/event","pilot/settings","pilot/canon","ace/commands/default_commands"],function(a,b,c){var d=a("pilot/useragent"),e=a("pilot/keys"),f=a("pilot/event"),g=a("pilot/settings").settings,h=a("pilot/canon");a("ace/commands/default_commands");var i=function(a){this.$editor=a,this.$data={},this.$keyboardHandler=null};(function(){this.setKeyboardHandler=function(a){this.$keyboardHandler!=a&&(this.$data={},this.$keyboardHandler=a)},this.getKeyboardHandler=function(){return this.$keyboardHandler},this.$callKeyboardHandler=function(a,b,c,d){var e={editor:this.$editor},g;this.$keyboardHandler&&(g=this.$keyboardHandler.handleKeyboard(this.$data,b,c,d,a));if(!g||!g.command)b!=0||d!=0?g={command:h.findKeyCommand(e,"editor",b,c)}:g={command:"inserttext",args:{text:c}};var i=!1;g&&(i=h.exec(g.command,e,"editor",g.args),i&&f.stopEvent(a));return i},this.onCommandKey=function(a,b,c,d){d||(d=e.keyCodeToString(c));return this.$callKeyboardHandler(a,b,d,c)},this.onTextInput=function(a){return this.$callKeyboardHandler({},0,a,0)}}).call(i.prototype),b.KeyBinding=i}),define("ace/commands/default_commands",["require","exports","module","pilot/lang","pilot/canon"],function(a,b,c){function f(a,b){return{win:a,mac:b,sender:"editor"}}var d=a("pilot/lang"),e=a("pilot/canon");e.addCommand({name:"null",exec:function(a,b,c){}}),e.addCommand({name:"selectall",bindKey:f("Ctrl-A","Command-A"),exec:function(a,b,c){a.editor.selectAll()}}),e.addCommand({name:"removeline",bindKey:f("Ctrl-D","Command-D"),exec:function(a,b,c){a.editor.removeLines()}}),e.addCommand({name:"gotoline",bindKey:f("Ctrl-L","Command-L"),exec:function(a,b,c){var d=parseInt(prompt("Enter line number:"));isNaN(d)||a.editor.gotoLine(d)}}),e.addCommand({name:"togglecomment",bindKey:f("Ctrl-7","Command-7"),exec:function(a,b,c){a.editor.toggleCommentLines()}}),e.addCommand({name:"findnext",bindKey:f("Ctrl-K","Command-G"),exec:function(a,b,c){a.editor.findNext()}}),e.addCommand({name:"findprevious",bindKey:f("Ctrl-Shift-K","Command-Shift-G"),exec:function(a,b,c){a.editor.findPrevious()}}),e.addCommand({name:"find",bindKey:f("Ctrl-F","Command-F"),exec:function(a,b,c){var d=prompt("Find:");a.editor.find(d)}}),e.addCommand({name:"replace",bindKey:f("Ctrl-R","Command-Option-F"),exec:function(a,b,c){var d=prompt("Find:");if(!!d){var e=prompt("Replacement:");if(!e)return;a.editor.replace(e,{needle:d})}}}),e.addCommand({name:"replaceall",bindKey:f("Ctrl-Shift-R","Command-Shift-Option-F"),exec:function(a,b,c){var d=prompt("Find:");if(!!d){var e=prompt("Replacement:");if(!e)return;a.editor.replaceAll(e,{needle:d})}}}),e.addCommand({name:"undo",bindKey:f("Ctrl-Z","Command-Z"),exec:function(a,b,c){a.editor.undo()}}),e.addCommand({name:"redo",bindKey:f("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a,b,c){a.editor.redo()}}),e.addCommand({name:"overwrite",bindKey:f("Insert","Insert"),exec:function(a,b,c){a.editor.toggleOverwrite()}}),e.addCommand({name:"copylinesup",bindKey:f("Ctrl-Alt-Up","Command-Option-Up"),exec:function(a,b,c){a.editor.copyLinesUp()}}),e.addCommand({name:"movelinesup",bindKey:f("Alt-Up","Option-Up"),exec:function(a,b,c){a.editor.moveLinesUp()}}),e.addCommand({name:"selecttostart",bindKey:f("Ctrl-Shift-Home|Alt-Shift-Up","Command-Shift-Up"),exec:function(a,b,c){a.editor.getSelection().selectFileStart()}}),e.addCommand({name:"gotostart",bindKey:f("Ctrl-Home|Ctrl-Up","Command-Home|Command-Up"),exec:function(a,b,c){a.editor.navigateFileStart()}}),e.addCommand({name:"selectup",bindKey:f("Shift-Up","Shift-Up"),exec:function(a,b,c){a.editor.getSelection().selectUp()}}),e.addCommand({name:"golineup",bindKey:f("Up","Up|Ctrl-P"),exec:function(a,b,c){a.editor.navigateUp(b.times)}}),e.addCommand({name:"copylinesdown",bindKey:f("Ctrl-Alt-Down","Command-Option-Down"),exec:function(a,b,c){a.editor.copyLinesDown()}}),e.addCommand({name:"movelinesdown",bindKey:f("Alt-Down","Option-Down"),exec:function(a,b,c){a.editor.moveLinesDown()}}),e.addCommand({name:"selecttoend",bindKey:f("Ctrl-Shift-End|Alt-Shift-Down","Command-Shift-Down"),exec:function(a,b,c){a.editor.getSelection().selectFileEnd()}}),e.addCommand({name:"gotoend",bindKey:f("Ctrl-End|Ctrl-Down","Command-End|Command-Down"),exec:function(a,b,c){a.editor.navigateFileEnd()}}),e.addCommand({name:"selectdown",bindKey:f("Shift-Down","Shift-Down"),exec:function(a,b,c){a.editor.getSelection().selectDown()}}),e.addCommand({name:"golinedown",bindKey:f("Down","Down|Ctrl-N"),exec:function(a,b,c){a.editor.navigateDown(b.times)}}),e.addCommand({name:"selectwordleft",bindKey:f("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectWordLeft()}}),e.addCommand({name:"gotowordleft",bindKey:f("Ctrl-Left","Option-Left"),exec:function(a,b,c){a.editor.navigateWordLeft()}}),e.addCommand({name:"selecttolinestart",bindKey:f("Alt-Shift-Left","Command-Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectLineStart()}}),e.addCommand({name:"gotolinestart",bindKey:f("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a,b,c){a.editor.navigateLineStart()}}),e.addCommand({name:"selectleft",bindKey:f("Shift-Left","Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectLeft()}}),e.addCommand({name:"gotoleft",bindKey:f("Left","Left|Ctrl-B"),exec:function(a,b,c){a.editor.navigateLeft(b.times)}}),e.addCommand({name:"selectwordright",bindKey:f("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectWordRight()}}),e.addCommand({name:"gotowordright",bindKey:f("Ctrl-Right","Option-Right"),exec:function(a,b,c){a.editor.navigateWordRight()}}),e.addCommand({name:"selecttolineend",bindKey:f("Alt-Shift-Right","Command-Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectLineEnd()}}),e.addCommand({name:"gotolineend",bindKey:f("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a,b,c){a.editor.navigateLineEnd()}}),e.addCommand({name:"selectright",bindKey:f("Shift-Right","Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectRight()}}),e.addCommand({name:"gotoright",bindKey:f("Right","Right|Ctrl-F"),exec:function(a,b,c){a.editor.navigateRight(b.times)}}),e.addCommand({name:"selectpagedown",bindKey:f("Shift-PageDown","Shift-PageDown"),exec:function(a,b,c){a.editor.selectPageDown()}}),e.addCommand({name:"pagedown",bindKey:f(null,"PageDown"),exec:function(a,b,c){a.editor.scrollPageDown()}}),e.addCommand({name:"gotopagedown",bindKey:f("PageDown","Option-PageDown|Ctrl-V"),exec:function(a,b,c){a.editor.gotoPageDown()}}),e.addCommand({name:"selectpageup",bindKey:f("Shift-PageUp","Shift-PageUp"),exec:function(a,b,c){a.editor.selectPageUp()}}),e.addCommand({name:"pageup",bindKey:f(null,"PageUp"),exec:function(a,b,c){a.editor.scrollPageUp()}}),e.addCommand({name:"gotopageup",bindKey:f("PageUp","Option-PageUp"),exec:function(a,b,c){a.editor.gotoPageUp()}}),e.addCommand({name:"selectlinestart",bindKey:f("Shift-Home","Shift-Home"),exec:function(a,b,c){a.editor.getSelection().selectLineStart()}}),e.addCommand({name:"selectlineend",bindKey:f("Shift-End","Shift-End"),exec:function(a,b,c){a.editor.getSelection().selectLineEnd()}}),e.addCommand({name:"del",bindKey:f("Delete","Delete|Ctrl-D"),exec:function(a,b,c){a.editor.removeRight()}}),e.addCommand({name:"backspace",bindKey:f("Ctrl-Backspace|Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a,b,c){a.editor.removeLeft()}}),e.addCommand({name:"removetolinestart",bindKey:f(null,"Option-Backspace"),exec:function(a,b,c){a.editor.removeToLineStart()}}),e.addCommand({name:"removetolineend",bindKey:f(null,"Ctrl-K"),exec:function(a,b,c){a.editor.removeToLineEnd()}}),e.addCommand({name:"removewordleft",bindKey:f("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a,b,c){a.editor.removeWordLeft()}}),e.addCommand({name:"removewordright",bindKey:f(null,"Alt-Delete"),exec:function(a,b,c){a.editor.removeWordRight()}}),e.addCommand({name:"outdent",bindKey:f("Shift-Tab","Shift-Tab"),exec:function(a,b,c){a.editor.blockOutdent()}}),e.addCommand({name:"indent",bindKey:f("Tab","Tab"),exec:function(a,b,c){a.editor.indent()}}),e.addCommand({name:"inserttext",exec:function(a,b,c){a.editor.insert(d.stringRepeat(b.text||"",b.times||1))}}),e.addCommand({name:"centerselection",bindKey:f(null,"Ctrl-L"),exec:function(a,b,c){a.editor.centerSelection()}}),e.addCommand({name:"splitline",bindKey:f(null,"Ctrl-O"),exec:function(a,b,c){a.editor.splitLine()}}),e.addCommand({name:"transposeletters",bindKey:f("Ctrl-T","Ctrl-T"),exec:function(a,b,c){a.editor.transposeLetters()}})}),define("ace/edit_session",["require","exports","module","pilot/oop","pilot/lang","pilot/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/edit_session/folding"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("pilot/event_emitter").EventEmitter,g=a("ace/selection").Selection,h=a("ace/mode/text").Mode,j=a("ace/range").Range,k=a("ace/document").Document,l=a("ace/background_tokenizer").BackgroundTokenizer,m=function(a,b){this.$modified=!0,this.$breakpoints=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$rowCache=[],this.$wrapData=[],this.$foldData=[],this.$foldData.toString=function(){var a="";this.forEach(function(b){a+="\n"+b.toString()});return a},a instanceof k?this.setDocument(a):this.setDocument(new k(a)),this.selection=new g(this),b?this.setMode(b):this.setMode(new h)};(function(){function o(a){return a<4352?!1:a>=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510}d.implement(this,f),this.setDocument=function(a){if(this.doc)throw new Error("Document is already set");this.doc=a,a.on("change",this.onChange.bind(this)),this.on("changeFold",this.onChangeFold.bind(this))},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(a==0)this.$rowCache=[];else{var b=this.$rowCache;for(var c=0;c=a){b.splice(c,b.length);return}}},this.onChangeFold=function(a){var b=a.data;this.$resetRowCache(b.start.row)},this.onChange=function(a){var b=a.data;this.$modified=!0,this.$resetRowCache(b.range.start.row);var c=this.$updateInternalDataOnChange(a);!this.$fromUndo&&this.$undoManager&&!b.ignore&&(this.$deltasDoc.push(b),c&&c.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:c}),this.$informUndoManager.schedule()),this.bgTokenizer.start(b.range.start.row),this._dispatchEvent("change",a)},this.setValue=function(a){this.doc.setValue(a),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(a){return this.bgTokenizer.getState(a)},this.getTokens=function(a,b){return this.bgTokenizer.getTokens(a,b)},this.setUndoManager=function(a){this.$undoManager=a,this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b]}),b.$deltas=[]},this.$informUndoManager=e.deferredCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?e.stringRepeat(" ",this.getTabSize()):"\t"},this.$useSoftTabs=!0,this.setUseSoftTabs=function(a){this.$useSoftTabs!==a&&(this.$useSoftTabs=a)},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.$tabSize=4,this.setTabSize=function(a){!isNaN(a)&&this.$tabSize!==a&&(this.$modified=!0,this.$tabSize=a,this._dispatchEvent("changeTabSize"))},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(a){this.$overwrite!=a&&(this.$overwrite=a,this._dispatchEvent("changeOverwrite"))},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe));var e=d?this.tokenRe:this.nonTokenRe,f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}var g=b;while(g=0){var h=g.charAt(d);if(h==c){f-=1;if(f==0)return{row:e,column:d}}else h==a&&(f+=1);d-=1}e-=1;if(e<0)break;var g=this.getLine(e),d=g.length-1}return null},this.$findClosingBracket=function(a,b){var c=this.$brackets[a],d=b.column,e=b.row,f=1,g=this.getLine(e),h=this.getLength();for(;;){while(d=h)break;var g=this.getLine(e),d=0}return null},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.undoChanges=function(a,b){if(!!a.length){this.$fromUndo=!0;var c=null;for(var d=a.length-1;d!=-1;d--)delta=a[d],delta.group=="doc"?(this.doc.revertDeltas(delta.deltas),c=this.$getUndoSelection(delta.deltas,!0,c)):delta.deltas.forEach(function(a){this.addFolds(a.folds)},this);this.$fromUndo=!1,c&&!b&&this.selection.setSelectionRange(c);return c}},this.redoChanges=function(a,b){if(!!a.length){this.$fromUndo=!0;var c=null;for(var d=0;d=this.doc.getLength()-1)return 0;var c=this.doc.removeLines(a,b);this.doc.insertLines(a+1,c);return 1},this.duplicateLines=function(a,b){var a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b),c=this.getLines(a,b);this.doc.insertLines(a,c);var d=b-a+1;return d},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipPositionToDocument=function(a,b){b=Math.max(0,b);if(a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0);if(a){var b=this.getLength();this.$wrapData=[];for(i=0;i0){this.$wrapLimit=b,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._dispatchEvent("changeWrapLimit"));return!0}return!1},this.$constrainWrapLimit=function(a){var b=this.$wrapLimitRange.min;b&&(a=Math.max(b,a));var c=this.$wrapLimitRange.max;c&&(a=Math.min(c,a));return Math.max(1,a)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;d.indexOf("Lines")!=-1?(d=="insertLines"?f=e+a.data.lines.length:f=e,c=a.data.lines.length):c=f-e;if(c!=0)if(d.indexOf("remove")!=-1){b&&this.$wrapData.splice(e,c);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-c);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l=h.row&&k.shiftRow(-c)}f=e}else{var n;if(b){n=[e,0];for(var o=0;o=e&&k.shiftRow(c)}}else{var q;c=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),c=-c);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,c)}b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),b&&this.$updateWrapData(e,f);return i},this.$updateWrapData=function(a,b){var c=this.doc.getAllLines(),d=this.getTabSize(),f=this.$wrapData,i=this.$wrapLimit,j,l,m=a;b=Math.min(b,c.length-1);while(m<=b){l=this.getFoldLine(m);if(!l)j=this.$getDisplayTokens(e.stringTrimRight(c[m]));else{j=[],l.walk(function(a,b,d,e){var f;if(a){f=this.$getDisplayTokens(a,j.length),f[0]=g;for(var i=1;i=k)j.pop()}f[m]=this.$computeWrapSplits(j,i,d),m=this.getRowFoldEnd(m)+1}};var b=1,c=2,g=3,h=4,k=10,m=11,n=12;this.$computeWrapSplits=function(a,b,c){function j(b){var c=a.slice(f,b),e=c.length;c.join("").replace(/12/g,function(a){e-=1}).replace(/2/g,function(a){e-=1}),i+=e,d.push(i),f=b}if(a.length==0)return[];var c=this.getTabSize(),d=[],e=a.length,f=0,i=0;while(e-f>b){var l=f+b;if(a[l]>=k){while(a[l]>=k)l++;j(l);continue}if(a[l]==g||a[l]==h){for(l;l!=f-1;l--)if(a[l]==g)break;if(l>f){j(l);continue}l=f+b;for(l;l=g){l++;break}if(l>f){j(l);continue}l=f+b,j(f+b)}return d},this.$getDisplayTokens=function(a,d){var e=[],f;d=d||0;for(var g=0;gb)break}return[c,e]},this.getRowLength=function(a){return!this.$useWrapMode||!this.$wrapData[a]?1:this.$wrapData[a].length+1},this.getRowHeight=function(a,b){return this.getRowLength(b)*a.lineHeight},this.getScreenLastRowColumn=function(a){return this.documentToScreenColumn(a,this.doc.getLine(a).length)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:undefined},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d=0,e=0,f,g,h=0,i=0,j=this.$rowCache;for(var k=0;k=a||d>=m)break;h+=i,d++,d>o&&(d=n.end.row+1,n=this.getNextFold(d),o=n?n.start.row:Infinity),l&&j.push({docRow:d,screenRow:h})}n&&n.start.row<=d?c=this.getFoldDisplayLine(n):(c=this.getLine(d),n=null);var p=[];this.$useWrapMode&&(p=this.$wrapData[d],p&&(f=p[a-h],a>h&&p.length&&(e=p[a-h-1]||p[p.length-1],c=c.substring(e)))),e+=this.$getStringScreenWidth(c,b)[1],h+p.length=f&&(e=f-1):e=Math.min(e,c.length);return n?n.idxToPosition(e):{row:d,column:e}},this.documentToScreenPosition=function(a,b){if(typeof b=="undefined")var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d=this.$rowCache.length,e;if(this.$useWrapMode){e=this.$wrapData;if(a>e.length-1)return{row:this.getScreenLength(),column:e.length==0?0:e[e.length-1].length-1}}var f=0,g=0,h=null,i=null;i=this.getFoldAt(a,b,1),i&&(a=i.start.row,b=i.start.column);var j,k=0,l=this.$rowCache;for(var m=0;m=p){j=o.end.row+1;if(j>a)break;o=this.getNextFold(j),p=o?o.start.row:Infinity}else j=k+1;f+=this.getRowLength(k),k=j,n&&l.push({docRow:k,screenRow:f})}var q="";o&&k>=p?(q=this.getFoldDisplayLine(o,a,b),h=o.start.row):(q=this.getLine(a).substring(0,b),h=a);if(this.$useWrapMode){var r=e[h],s=0;while(q.length>=r[s])f++,s++;q=q.substring(r[s-1]||0,q.length)}return{row:f,column:this.$getStringScreenWidth(q)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null,c=null;if(!this.$useWrapMode){a=this.getLength();var d=this.$foldData;for(var e=0;eb.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.selectionAnchor,b=this.selectionLead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._dispatchEvent("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(a,this.doc.getLine(a).length),this.moveCursorTo(0,0)},this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.$updateDesiredColumn()},this.$updateDesiredColumn=function(){var a=this.getCursor();this.$desiredColumn=this.session.documentToScreenColumn(a.row,a.column)},this.$moveSelection=function(a){var b=this.selectionLead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.selectWord=function(){var a=this.getCursor(),b=this.session.getWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectLine=function(){var a=this.selectionLead.row,b,c=this.session.getFoldLine(a);c?(a=c.start.row,b=c.end.row):b=a,this.setSelectionAnchor(a,0),this.$moveSelection(function(){this.moveCursorTo(b+1,0)})},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,-1))this.moveCursorTo(b.start.row,b.start.column);else if(a.column==0)a.row>0&&this.moveCursorTo(a.row-1,this.doc.getLine(a.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column-c,a.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,1))this.moveCursorTo(b.end.row,b.end.column);else if(this.selectionLead.column==this.doc.getLine(this.selectionLead.row).length)this.selectionLead.row ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;b=this.compare(c.row,c.column);if(b==1){b=this.compare(d.row,d.column);return b==1?2:b==0?1:0}if(b==-1)return-2;b=this.compare(d.row,d.column);return b==-1?-1:b==1?42:0},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)||this.isStart(a,b)?!1:!0;return!1},this.insideStart=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)?!1:!0;return!1},this.insideEnd=function(a,b){if(this.compare(a,b)==0)return this.isStart(a,b)?!1:!0;return!1},this.compare=function(a,b){if(!this.isMultiLine()&&a===this.start.row)return bthis.end.column?1:0;return athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.row=0&&/^[\w\d]/.test(h)||e<=g&&/[\w\d]$/.test(h))return;h=f.substring(c.start.column,c.end.column);if(!/^[\w\d]+$/.test(h))return;var i=a.getCursorPosition(),j={wrap:!0,wholeWord:!0,caseSensitive:!0,needle:h},k=a.$search.getOptions();a.$search.set(j);var l=a.$search.findAll(b);l.forEach(function(a){if(!a.contains(i.row,i.column)){var c=b.addMarker(a,"ace_selected_word","text");b.$selectionOccurrences.push(c)}}),a.$search.set(k)}},this.clearSelectionHighlight=function(a){!a.session.$selectionOccurrences||(a.session.$selectionOccurrences.forEach(function(b){a.session.removeMarker(b)}),a.session.$selectionOccurrences=[])},this.createModeDelegates=function(a){if(!!this.$embeds){this.$modes={};for(var b=0;b1&&(m=g.slice(n+2,n+1+e[n].len)),typeof l.token=="function"?k=l.token.apply(this,m):k=l.token;var o=l.next;o&&o!==c&&(c=o,d=this.rules[c],e=this.matchMappings[c],i=f.lastIndex,f=this.regExps[c],f.lastIndex=i);break}if(m[0]){typeof k=="string"&&(m=[m.join("")],k=[k]);for(var n=0;n=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length);return a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||""));return a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};this._dispatchEvent("change",{data:e});return d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:d});return c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};this._dispatchEvent("change",{data:e});return d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b!=c){var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};this._dispatchEvent("change",{data:i});return d.start}},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};this._dispatchEvent("change",{data:e});return d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/anchor",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=b.Anchor=function(a,b,c){this.document=a,typeof c=="undefined"?this.setPosition(b.row,b.column):this.setPosition(b,c),this.$onChange=this.onChange.bind(this),a.on("change",this.$onChange)};(function(){d.implement(this,e),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(a){var b=a.data,c=b.range;if(c.start.row!=c.end.row||c.start.row==this.row){if(c.start.row>this.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0);return c}}).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(!!c.running){var a=new Date,b=c.currentLine,d=c.doc,e=0,f=d.getLength();while(c.currentLine20){c.fireUpdateEvent(b,c.currentLine-1),c.running=setTimeout(c.$worker,20);return}}c.running=!1,c.fireUpdateEvent(b,f-1)}}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._dispatchEvent("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a,b){return this.$tokenizeRows(a,b)},this.getState=function(a){return this.$tokenizeRows(a,a)[0].state},this.$tokenizeRows=function(a,b){if(!this.doc)return[];var c=[],d="start",e=!1;a>0&&this.lines[a-1]?(d=this.lines[a-1].state,e=!0):a==0?(d="start",e=!0):this.lines.length>0&&(d=this.lines[this.lines.length-1].state);var f=this.doc.getLines(a,b);for(var g=a;g<=b;g++)if(!this.lines[g]){var h=this.tokenizer.getLineTokens(f[g-a]||"",d),d=h.state;c.push(h),e&&(this.lines[g]=h)}else{var h=this.lines[g];d=h.state,c.push(h)}return c}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold"],function(a,b,c){function g(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;var e=d.folds;for(var f=0;f=a)return e;if(e.end.row>a)return null}return null},this.getNextFold=function(a,b){var c=this.$foldData,d,e=0;b&&(e=c.indexOf(b)),e==-1&&(e=0);for(e;e=a)return f}return null},this.getFoldedRowCount=function(a,b){var c=this.$foldData,d=b-a+1;for(var e=0;e=b){h=a?d-=b-h:d=0);break}g>=a&&(h>=a?d-=g-h:d-=g-a+1)}return d},this.$addFoldLine=function(a){this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row});return a},this.addFold=function(a,b){var c=this.$foldData,d=!1;if(a instanceof f)var g=a;else g=new f(b,a);var h=g.start.row,i=g.start.column,j=g.end.row,k=g.end.column;if(g.placeholder.length<2)throw"Placeholder has to be at least 2 characters";if(h==j&&k-i<2)throw"The range has to be at least 2 characters width";var l=this.getFoldAt(h,i,1);if(l&&l.range.isEnd(j,k)&&l.range.isStart(h,i))return g;l=this.getFoldAt(h,i,1);if(l&&!l.range.isStart(h,i))throw"A fold can't start inside of an already existing fold";l=this.getFoldAt(j,k,-1);if(l&&!l.range.isEnd(j,k))throw"A fold can't end inside of an already existing fold";if(j>=this.doc.getLength())throw"End of fold is outside of the document.";if(k>this.getLine(j).length||i>this.getLine(h).length)throw"End of fold is outside of the document.";var m=this.getFoldsInRange(g.range);m.length>0&&(this.removeFolds(m),g.subFolds=m);for(var n=0;nthis.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else if(a.end.row==this.start.row)this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column;else throw"Trying to add fold to FoldRow that doesn't have a matching row";a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d=0,e=this.folds,f,g,h,i=!0;b==null&&(b=this.end.row,c=this.end.column);for(var j=0;j=0;h--){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$rangeFromMatch=function(a,b,c){return new f(a,b,a,b+c)},this.$assembleRegExp=function(){if(this.$options.regExp)var a=this.$options.needle;else a=d.escapeRegExp(this.$options.needle);this.$options.wholeWord&&(a="\\b"+a+"\\b");var b="g";this.$options.caseSensitive||(b+="i");var c=new RegExp(a,b);return c},this.$forwardLineIterator=function(a){function k(e){var f=a.getLine(e);b&&e==c.end.row&&(f=f.substring(0,c.end.column)),j&&e==d.row&&(f=f.substring(0,d.column));return f}var b=this.$options.scope==g.SELECTION,c=a.getSelection().getRange(),d=a.getSelection().getCursor(),e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap,j=!1;return{forEach:function(a){var b=d.row,c=k(b),g=d.column,l=!1;j=!1;while(!a(c,g,b)){if(l)return;b++,g=0;if(b>h)if(i)b=e,g=f,j=!0;else return;b==d.row&&(l=!0),c=k(b)}}}},this.$backwardLineIterator=function(a){var b=this.$options.scope==g.SELECTION,c=a.getSelection().getRange(),d=b?c.end:c.start,e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap;return{forEach:function(g){var j=d.row,k=a.getLine(j).substring(0,d.column),l=0,m=!1,n=!1;while(!g(k,l,j)){if(m)return;j--,l=0;if(j0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","pilot/oop","pilot/dom","pilot/event","pilot/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","pilot/event_emitter","text/ace/css/editor.css"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/event"),g=a("pilot/useragent"),h=a("ace/layer/gutter").Gutter,i=a("ace/layer/marker").Marker,j=a("ace/layer/text").Text,k=a("ace/layer/cursor").Cursor,l=a("ace/scrollbar").ScrollBar,m=a("ace/renderloop").RenderLoop,n=a("pilot/event_emitter").EventEmitter,o=a("text/ace/css/editor.css");e.importCssString(o);var p=function(a,b){this.container=a,e.addCssClass(this.container,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new h(this.$gutter),this.$markerBack=new i(this.content);var c=this.$textLayer=new j(this.content);this.canvas=c.element,this.$markerFront=new i(this.content),this.characterWidth=c.getCharacterWidth(),this.lineHeight=c.getLineHeight(),this.$cursorLayer=new k(this.content),this.$cursorPadding=8,this.$horizScroll=!0,this.$horizScrollAlwaysVisible=!0,this.scrollBar=new l(a),this.scrollBar.addEventListener("scroll",this.onScroll.bind(this)),this.scrollTop=0,this.cursorPos={row:0,column:0};var d=this;this.$textLayer.addEventListener("changeCharaterSize",function(){d.characterWidth=c.getCharacterWidth(),d.lineHeight=c.getLineHeight(),d.$updatePrintMargin(),d.onResize(!0),d.$loop.schedule(d.CHANGE_FULL)}),f.addListener(this.$gutter,"click",this.$onGutterClick.bind(this)),f.addListener(this.$gutter,"dblclick",this.$onGutterClick.bind(this)),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new m(this.$renderChanges.bind(this)),this.$loop.schedule(this.CHANGE_FULL),this.setPadding(4),this.$updatePrintMargin()};(function(){this.showGutter=!0,this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,d.implement(this,n),this.setSession=function(a){this.session=a,this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(a,b){b===undefined&&(b=Infinity),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRowc.lastRow+1)){if(bc&&this.scrollToY(c),this.scrollTop+this.$size.scrollerHeightb&&this.scrollToX(b),d+this.$size.scrollerWidththis.layerConfig.width?this.$desiredScrollLeft=b+2*this.characterWidth:this.scrollToX(Math.round(b+this.characterWidth-this.$size.scrollerWidth)))}},this.getScrollTop=function(){return this.scrollTop},this.getScrollLeft=function(){return this.scroller.scrollLeft},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(a){this.scrollToY(a*this.lineHeight)},this.scrollToLine=function(a,b){var c={lineHeight:this.lineHeight},d=0;for(var e=1;eh&&(e=g.end.row+1,g=this.session.getNextFold(e),h=g?g.start.row:Infinity);if(e>f)break;var i=this.$annotations[e]||b;c.push("
    ",e+1);var j=this.session.getRowLength(e)-1;while(j--)c.push("
    ¦
    ");c.push(""),e++}this.element=d.setInnerHtml(this.element,c.join("")),this.element.style.height=a.minHeight+"px"}}).call(e.prototype),b.Gutter=e}),define("ace/layer/marker",["require","exports","module","ace/range","pilot/dom"],function(a,b,c){var d=a("ace/range").Range,e=a("pilot/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(!!a){this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c],f=d.range.clipRows(a.firstRow,a.lastRow);if(f.isEmpty())continue;f=f.toScreenRange(this.session);if(d.renderer){var g=this.$getTop(f.start.row,a),h=Math.round(this.$padding+f.start.column*a.characterWidth);d.renderer(b,f,h,g,a)}else f.isMultiLine()?d.type=="text"?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a,d.type):this.drawSingleLineMarker(b,f,d.clazz,a,null,d.type)}this.element=e.setInnerHtml(this.element,b.join(""))}},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e){var f=b.start.row,g=new d(f,b.start.column,f,this.session.getScreenLastRowColumn(f));this.drawSingleLineMarker(a,g,c,e,1,"text"),f=b.end.row,g=new d(f,0,f,b.end.column),this.drawSingleLineMarker(a,g,c,e,0,"text");for(f=b.start.row+1;f"),i=this.$getTop(b.end.row,d),h=Math.round(b.end.column*d.characterWidth),a.push("
    "),g=(b.end.row-b.start.row-1)*d.lineHeight;g<0||(i=this.$getTop(b.start.row+1,d),h=d.width,a.push("
    "))},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=f==="background"?0:this.$padding,h=d.lineHeight;if(f==="background")var i=d.width;else i=Math.round((b.end.column+(e||0)-b.start.column)*d.characterWidth);var j=this.$getTop(b.start.row,d),k=Math.round(g+b.start.column*d.characterWidth);a.push("
    ")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","pilot/oop","pilot/dom","pilot/lang","pilot/useragent","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/lang"),g=a("pilot/useragent"),h=a("pilot/event_emitter").EventEmitter,i=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",this.element.style.width="auto",a.appendChild(this.element),this.$characterSize=this.$measureSizes()||{width:0,height:0},this.$pollSizeChanges()};(function(){d.implement(this,h),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var a=this.$measureSizes();a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)&&(this.$characterSize=a,this._dispatchEvent("changeCharaterSize",{data:a}))},this.$pollSizeChanges=function(){var a=this;this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=function(){var a=1e3;if(!this.$measureNode){var b=this.$measureNode=e.createElement("div"),c=b.style;c.width=c.height="auto",c.left=c.top=-a*40+"px",c.visibility="hidden",c.position="absolute",c.overflow="visible",c.whiteSpace="nowrap",b.innerHTML=f.stringRepeat("Xy",a);if(document.body)document.body.appendChild(b);else{var d=this.element.parentNode;while(!e.hasCssClass(d,"ace_editor"))d=d.parentNode;d.appendChild(b)}}var c=this.$measureNode.style,g=e.computedStyle(this.element);for(var h in this.$fontStyles)c[h]=g[h];var i={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(a*2)};return i.width==0&&i.height==0?null:i},this.setSession=function(a){this.session=a},this.showInvisibles=!1,this.setShowInvisibles=function(a){if(this.showInvisibles==a)return!1;this.showInvisibles=a;return!0},this.$tabStrings=[],this.$computeTabString=function(){var a=this.session.getTabSize(),b=this.$tabStrings=[0];for(var c=1;c"+this.TAB_CHAR+Array(c).join(" ")+""):b.push(Array(c+1).join(" "))},this.updateLines=function(a,b,c){this.$computeTabString(),(this.config.lastRow!=a.lastRow||this.config.firstRow!=a.firstRow)&&this.scrollLines(a),this.config=a;var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0;for(var i=a.firstRow;i0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRowb.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){var d=document.createDocumentFragment(),f=b,g=this.session.getNextFold(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFold(f),h=g?g.start.row:Infinity);if(f>c)break;var i=e.createElement("div"),j=[],k=this.session.getTokens(f,f);k.length==1&&this.$renderLine(j,f,k[0].tokens,!1),i.innerHTML=j.join("");var l=i.childNodes;while(l.length)d.appendChild(l[0]);f++}return d},this.update=function(a){this.$computeTabString(),this.config=a;var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFold(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFold(f),h=g?g.start.row:Infinity);if(f>d)break;var i=this.session.getTokens(f,f);i.length==1&&this.$renderLine(b,f,i[0].tokens,!1),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,f=/\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])|[\u1100-\u115F]|[\u11A3-\u11A7]|[\u11FA-\u11FF]|[\u2329-\u232A]|[\u2E80-\u2E99]|[\u2E9B-\u2EF3]|[\u2F00-\u2FD5]|[\u2FF0-\u2FFB]|[\u3000-\u303E]|[\u3041-\u3096]|[\u3099-\u30FF]|[\u3105-\u312D]|[\u3131-\u318E]|[\u3190-\u31BA]|[\u31C0-\u31E3]|[\u31F0-\u321E]|[\u3220-\u3247]|[\u3250-\u32FE]|[\u3300-\u4DBF]|[\u4E00-\uA48C]|[\uA490-\uA4C6]|[\uA960-\uA97C]|[\uAC00-\uD7A3]|[\uD7B0-\uD7C6]|[\uD7CB-\uD7FB]|[\uF900-\uFAFF]|[\uFE10-\uFE19]|[\uFE30-\uFE52]|[\uFE54-\uFE66]|[\uFE68-\uFE6B]|[\uFF01-\uFF60]|[\uFFE0-\uFFE6]/g,h=function(a,c,d,f,h){if(a.charCodeAt(0)==32)return Array(a.length+1).join(" ");if(a=="\t"){var i=e.session.getScreenTabSize(b+f);b+=i-1;return e.$tabStrings[i]}if(a=="&")return g.isOldGecko?"&":"&";if(a=="<")return"<";if(a.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)){if(e.showInvisibles){var j=Array(a.length+1).join(e.SPACE_CHAR);return""+j+""}return" "}b+=1;return""+a+""},i=d.replace(f,h);if(!this.$textToken[c.type]){var j="ace_"+c.type.replace(/\./g," ace_");a.push("",i,"")}else a.push(i);return b+d.length},this.$renderLineCore=function(a,b,c,d,e){var f=0,g=0,h,i=this.config.characterWidth,j=0,k=this;!d||d.length==0?h=Number.MAX_VALUE:h=d[0],e||a.push("
    ");for(var l=0;l=h)j=k.$renderToken(a,j,m,n.substring(0,h-f)),n=n.substring(h-f),f=h,e||a.push("
    ","
    "),g++,j=0,h=d[g]||Number.MAX_VALUE;n.length!=0&&(f+=n.length,j=k.$renderToken(a,j,m,n))}}this.showInvisibles&&(b!==this.session.getLength()-1?a.push(""+this.EOL_CHAR+""):a.push(""+this.EOF_CHAR+"")),a.push("
    ")},this.$renderLine=function(a,b,c,d){if(!this.session.isRowFolded(b)){var e=this.session.getRowSplitData(b);this.$renderLineCore(a,b,c,e,d)}else this.$renderFoldLine(a,b,c,d)},this.$renderFoldLine=function(a,b,c,d){function h(a,b,c){var d=0,e=0;while(e+a[d].value.lengthc-b&&(f=f.substring(0,c-b)),g.push({type:a[d].type,value:f}),e=b+f.length,d+=1}while(ec&&(f=f.substring(0,c-e)),g.push({type:a[d].type,value:f}),e+=f.length,d+=1}}var e=this.session,f=e.getFoldLine(b),g=[];f.walk(function(a,b,d,e,f){a?g.push({type:"fold",value:a}):(f&&(c=this.session.getTokens(b,b)[0].tokens),c.length!=0&&h(c,e,d))}.bind(this),f.end.row,this.session.getLine(f.end.row).length);var i=this.session.$useWrapMode?this.session.$wrapData[b]:null;this.$renderLineCore(a,b,g,i,d)},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(i.prototype),b.Text=i}),define("ace/layer/cursor",["require","exports","module","pilot/dom"],function(a,b,c){var d=a("pilot/dom"),e=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),this.cursor=d.createElement("div"),this.cursor.className="ace_cursor ace_hidden",this.element.appendChild(this.cursor),this.isVisible=!1};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.hideCursor=function(){this.isVisible=!1,d.addCssClass(this.cursor,"ace_hidden"),clearInterval(this.blinkId)},this.showCursor=function(){this.isVisible=!0,d.removeCssClass(this.cursor,"ace_hidden"),this.cursor.style.visibility="visible",this.restartTimer()},this.restartTimer=function(){clearInterval(this.blinkId);if(!!this.isVisible){var a=this.cursor;this.blinkId=setInterval(function(){a.style.visibility="hidden",setTimeout(function(){a.style.visibility="visible"},400)},1e3)}},this.getPixelPosition=function(a){if(!this.config||!this.session)return{left:0,top:0};var b=this.session.selection.getCursor(),c=this.session.documentToScreenPosition(b),d=Math.round(this.$padding+c.column*this.config.characterWidth),e=(c.row-(a?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a,this.pixelPos=this.getPixelPosition(!0),this.cursor.style.left=this.pixelPos.left+"px",this.cursor.style.top=this.pixelPos.top+"px",this.cursor.style.width=a.characterWidth+"px",this.cursor.style.height=a.lineHeight+"px";var b=this.session.getOverwrite();b!=this.overwrite&&(this.overwrite=b,b?d.addCssClass(this.cursor,"ace_overwrite"):d.removeCssClass(this.cursor,"ace_overwrite")),this.restartTimer()},this.destroy=function(){clearInterval(this.blinkId)}}).call(e.prototype),b.Cursor=e}),define("ace/scrollbar",["require","exports","module","pilot/oop","pilot/dom","pilot/event","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/event"),g=a("pilot/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_sb",this.inner=e.createElement("div"),this.element.appendChild(this.inner),a.appendChild(this.element),this.width=e.scrollbarWidth(),this.element.style.width=(this.width||15)+"px",f.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){d.implement(this,g),this.onScroll=function(){this._dispatchEvent("scroll",{data:this.element.scrollTop})},this.getWidth=function(){return this.width},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.element.scrollTop=a}}).call(h.prototype),b.ScrollBar=h}),define("ace/renderloop",["require","exports","module","pilot/event"],function(a,b,c){var d=a("pilot/event"),e=function(a){this.onRender=a,this.pending=!1,this.changes=0};(function(){this.schedule=function(a){this.changes=this.changes|a;if(!this.pending){this.pending=!0;var b=this;this.setTimeoutZero(function(){b.pending=!1;var a=b.changes;b.changes=0,b.onRender(a)})}},this.setTimeoutZero=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame,this.setTimeoutZero?this.setTimeoutZero=this.setTimeoutZero.bind(window):window.postMessage?(this.messageName="zero-timeout-message",this.setTimeoutZero=function(a){if(!this.attached){var b=this;d.addListener(window,"message",function(a){b.callback&&a.data==b.messageName&&(d.stopPropagation(a),b.callback())}),this.attached=!0}this.callback=a,window.postMessage(this.messageName,"*")}):this.setTimeoutZero=function(a){setTimeout(a,0)}}).call(e.prototype),b.RenderLoop=e}),define("ace/theme/textmate",["require","exports","module","pilot/dom"],function(a,b,c){var d=a("pilot/dom"),e=".ace-tm .ace_editor {\n border: 2px solid rgb(159, 159, 159);\n}\n\n.ace-tm .ace_editor.ace_focus {\n border: 2px solid #327fbd;\n}\n\n.ace-tm .ace_gutter {\n width: 50px;\n background: #e8e8e8;\n color: #333;\n overflow : hidden;\n}\n\n.ace-tm .ace_gutter-layer {\n width: 100%;\n text-align: right;\n}\n\n.ace-tm .ace_gutter-layer .ace_gutter-cell {\n padding-right: 6px;\n}\n\n.ace-tm .ace_print_margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-tm .ace_text-layer {\n cursor: text;\n}\n\n.ace-tm .ace_cursor {\n border-left: 2px solid black;\n}\n\n.ace-tm .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid black;\n}\n \n.ace-tm .ace_line .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-tm .ace_line .ace_keyword {\n color: blue;\n}\n\n.ace-tm .ace_line .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-tm .ace_line .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-tm .ace_line .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_line .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-tm .ace_line .ace_fold {\n background-color: #E4E4E4;\n border-radius: 3px;\n}\n\n.ace-tm .ace_line .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-tm .ace_line .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_line .ace_support.ace_type,\n.ace-tm .ace_line .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-tm .ace_line .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-tm .ace_line .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-tm .ace_line .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-tm .ace_line .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-tm .ace_line .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-tm .ace_line .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-tm .ace_line .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-tm .ace_line .ace_xml_pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-tm .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-tm .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-tm .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-tm .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-tm .ace_marker-layer .ace_active_line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-tm .ace_marker-layer .ace_selected_word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-tm .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}";d.importCssString(e),b.cssClass="ace-tm"}),define("pilot/environment",["require","exports","module","pilot/settings"],function(a,b,c){function e(){return{settings:d}}var d=a("pilot/settings").settings;b.create=e}),define("text/cockpit/ui/cli_view.css",[],"#cockpitInput { padding-left: 16px; }.cptOutput { overflow: auto; position: absolute; z-index: 999; display: none; }.cptCompletion { padding: 0; position: absolute; z-index: -1000; }.cptCompletion.VALID { background: #FFF; }.cptCompletion.INCOMPLETE { background: #DDD; }.cptCompletion.INVALID { background: #DDD; }.cptCompletion span { color: #FFF; }.cptCompletion span.INCOMPLETE { color: #DDD; border-bottom: 2px dotted #F80; }.cptCompletion span.INVALID { color: #DDD; border-bottom: 2px dotted #F00; }span.cptPrompt { color: #66F; font-weight: bold; }.cptHints { color: #000; position: absolute; border: 1px solid rgba(230, 230, 230, 0.8); background: rgba(250, 250, 250, 0.8); -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 10px; border-top-left-radius: 10px; border-top-right-radius: 10px; z-index: 1000; padding: 8px; display: none;}.cptFocusPopup { display: block; }.cptFocusPopup.cptNoPopup { display: none; }.cptHints ul { margin: 0; padding: 0 15px; }.cptGt { font-weight: bold; font-size: 120%; }"),define("text/cockpit/ui/request_view.css",[],".cptRowIn { display: box; display: -moz-box; display: -webkit-box; box-orient: horizontal; -moz-box-orient: horizontal; -webkit-box-orient: horizontal; box-align: center; -moz-box-align: center; -webkit-box-align: center; color: #333; background-color: #EEE; width: 100%; font-family: consolas, courier, monospace;}.cptRowIn > * { padding-left: 2px; padding-right: 2px; }.cptRowIn > img { cursor: pointer; }.cptHover { display: none; }.cptRowIn:hover > .cptHover { display: block; }.cptRowIn:hover > .cptHover.cptHidden { display: none; }.cptOutTyped { box-flex: 1; -moz-box-flex: 1; -webkit-box-flex: 1; font-weight: bold; color: #000; font-size: 120%;}.cptRowOutput { padding-left: 10px; line-height: 1.2em; }.cptRowOutput strong,.cptRowOutput b,.cptRowOutput th,.cptRowOutput h1,.cptRowOutput h2,.cptRowOutput h3 { color: #000; }.cptRowOutput a { font-weight: bold; color: #666; text-decoration: none; }.cptRowOutput a: hover { text-decoration: underline; cursor: pointer; }.cptRowOutput input[type=password],.cptRowOutput input[type=text],.cptRowOutput textarea { color: #000; font-size: 120%; background: transparent; padding: 3px; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;}.cptRowOutput table,.cptRowOutput td,.cptRowOutput th { border: 0; padding: 0 2px; }.cptRowOutput .right { text-align: right; }"),define("text/ace/css/editor.css",[],'.ace_editor { position: absolute; overflow: hidden; font-family: Monaco, "Menlo", "Courier New", monospace; font-size: 12px;}.ace_scroller { position: absolute; overflow-x: scroll; overflow-y: hidden;}.ace_content { position: absolute; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;}.ace_composition { position: absolute; background: #555; color: #DDD; z-index: 4;}.ace_gutter { position: absolute; overflow-x: hidden; overflow-y: hidden; height: 100%;}.ace_gutter-cell.ace_error { background-image: url("data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B"); background-repeat: no-repeat; background-position: 4px center;}.ace_gutter-cell.ace_warning { background-image: url("data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03\'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B"); background-repeat: no-repeat; background-position: 4px center;}.ace_editor .ace_sb { position: absolute; overflow-x: hidden; overflow-y: scroll; right: 0;}.ace_editor .ace_sb div { position: absolute; width: 1px; left: 0;}.ace_editor .ace_print_margin_layer { z-index: 0; position: absolute; overflow: hidden; margin: 0; left: 0; height: 100%; width: 100%;}.ace_editor .ace_print_margin { position: absolute; height: 100%;}.ace_editor textarea { position: fixed; z-index: -1; width: 10px; height: 30px; opacity: 0; background: transparent; appearance: none; -moz-appearance: none; border: none; resize: none; outline: none; overflow: hidden;}.ace_layer { z-index: 1; position: absolute; overflow: hidden; white-space: nowrap; height: 100%; width: 100%;}.ace_text-layer { color: black;}.ace_cjk { display: inline-block; text-align: center;}.ace_cursor-layer { z-index: 4; cursor: text; /* setting pointer-events: none; here will break mouse wheel scrolling in Safari */}.ace_cursor { z-index: 4; position: absolute;}.ace_cursor.ace_hidden { opacity: 0.2;}.ace_line { white-space: nowrap;}.ace_marker-layer { cursor: text; pointer-events: none;}.ace_marker-layer .ace_step { position: absolute; z-index: 3;}.ace_marker-layer .ace_selection { position: absolute; z-index: 4;}.ace_marker-layer .ace_bracket { position: absolute; z-index: 5;}.ace_marker-layer .ace_active_line { position: absolute; z-index: 2;}.ace_marker-layer .ace_selected_word { position: absolute; z-index: 6; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;}.ace_line .ace_fold { cursor: pointer;}.ace_dragging .ace_marker-layer, .ace_dragging .ace_text-layer { cursor: move;}'),define("text/build/demo/styles.css",[],"html { height: 100%; width: 100%; overflow: hidden;}body { overflow: hidden; margin: 0; padding: 0; height: 100%; width: 100%; font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif; font-size: 12px; background: rgb(14, 98, 165); color: white;}#logo { padding: 15px; margin-left: 65px;}#editor { position: absolute; top: 0px; left: 280px; bottom: 0px; right: 0px; background: white;}#controls { padding: 5px;}#controls td { text-align: right;}#controls td + td { text-align: left;}#cockpitInput { position: absolute; left: 280px; right: 0px; bottom: 0; border: none; outline: none; font-family: consolas, courier, monospace; font-size: 120%;}#cockpitOutput { padding: 10px; margin: 0 15px; border: 1px solid #AAA; -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 10px; border-top-left-radius: 4px; border-top-right-radius: 4px; background: #DDD; color: #000;}"),define("text/build_support/style.css",[],"body { margin:0; padding:0; background-color:#e6f5fc; }H2, H3, H4 { font-family:Trebuchet MS; font-weight:bold; margin:0; padding:0;}H2 { font-size:28px; color:#263842; padding-bottom:6px;}H3 { font-family:Trebuchet MS; font-weight:bold; font-size:22px; color:#253741; margin-top:43px; margin-bottom:8px;}H4 { font-family:Trebuchet MS; font-weight:bold; font-size:21px; color:#222222; margin-bottom:4px;}P { padding:13px 0; margin:0; line-height:22px;}UL{ line-height : 22px;}PRE{ background : #333; color : white; padding : 10px;}#header { height : 227px; position:relative; overflow:hidden; background: url(images/background.png) repeat-x 0 0; border-bottom:1px solid #c9e8fa; }#header .content .signature { font-family:Trebuchet MS; font-size:11px; color:#ebe4d6; position:absolute; bottom:5px; right:42px; letter-spacing : 1px;}.content { width:970px; position:relative; overflow:hidden; margin:0 auto;}#header .content { height:184px; margin-top:22px;}#header .content .logo { width : 282px; height : 184px; background:url(images/logo.png) no-repeat 0 0; position:absolute; top:0; left:0;}#header .content .title { width : 605px; height : 58px; background:url(images/ace.png) no-repeat 0 0; position:absolute; top:98px; left:329px;}#wrapper { background:url(images/body_background.png) repeat-x 0 0; min-height:250px;}#wrapper .content { font-family:Arial; font-size:14px; color:#222222; width:1000px;}#wrapper .content .column1 { position:relative; overflow:hidden; float:left; width:315px; margin-right:31px;}#wrapper .content .column2 { position:relative; overflow:hidden; float:left; width:600px; padding-top:47px;}.fork_on_github { width:310px; height:80px; background:url(images/fork_on_github.png) no-repeat 0 0; position:relative; overflow:hidden; margin-top:49px; cursor:pointer;}.fork_on_github:hover { background-position:0 -80px;}.divider { height:3px; background-color:#bedaea; margin-bottom:3px;}.menu { padding:23px 0 0 24px;}UL.content-list { padding:15px; margin:0;}UL.menu-list { padding:0; margin:0 0 20px 0; list-style-type:none; line-height : 16px;}UL.menu-list LI { color:#2557b4; font-family:Trebuchet MS; font-size:14px; padding:7px 0; border-bottom:1px dotted #d6e2e7;}UL.menu-list LI:last-child { border-bottom:0;}A { color:#2557b4; text-decoration:none;}A:hover { text-decoration:underline;}P#first{ background : rgba(255,255,255,0.5); padding : 20px; font-size : 16px; line-height : 24px; margin : 0 0 20px 0;}#footer { height:40px; position:relative; overflow:hidden; background:url(images/bottombar.png) repeat-x 0 0; position:relative; margin-top:40px;}UL.menu-footer { padding:0; margin:8px 11px 0 0; list-style-type:none; float:right;}UL.menu-footer LI { color:white; font-family:Arial; font-size:12px; display:inline-block; margin:0 1px;}UL.menu-footer LI A { color:#8dd0ff; text-decoration:none;}UL.menu-footer LI A:hover { text-decoration:underline;}"),define("text/demo/styles.css",[],"html { height: 100%; width: 100%; overflow: hidden;}body { overflow: hidden; margin: 0; padding: 0; height: 100%; width: 100%; font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif; font-size: 12px; background: rgb(14, 98, 165); color: white;}#logo { padding: 15px; margin-left: 65px;}#editor { position: absolute; top: 0px; left: 280px; bottom: 0px; right: 0px; background: white;}#controls { padding: 5px;}#controls td { text-align: right;}#controls td + td { text-align: left;}#cockpitInput { position: absolute; left: 280px; right: 0px; bottom: 0; border: none; outline: none; font-family: consolas, courier, monospace; font-size: 120%;}#cockpitOutput { padding: 10px; margin: 0 15px; border: 1px solid #AAA; -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 10px; border-top-left-radius: 4px; border-top-right-radius: 4px; background: #DDD; color: #000;}"),define("text/deps/csslint/demos/demo.css",[],'@charset "UTF-8";@import url("booya.css") print,screen;@import "whatup.css" screen;@import "wicked.css";@namespace "http://www.w3.org/1999/xhtml";@namespace svg "http://www.w3.org/2000/svg";li.inline #foo { background: url("something.png"); display: inline; padding-left: 3px; padding-right: 7px; border-right: 1px dotted #066;}li.last.first { display: inline; padding-left: 3px !important; padding-right: 3px; border-right: 0px;}@media print { li.inline { color: black; }@charset "UTF-8"; @page { margin: 10%; counter-increment: page; @top-center { font-family: sans-serif; font-weight: bold; font-size: 2em; content: counter(page); }}'),define("text/deps/requirejs/dist/ie.css",[],"body .sect { display: none;}#content ul.index { list-style: none;}"),define("text/deps/requirejs/dist/main.css",[],'@font-face { font-family: Inconsolata; src: url("fonts/Inconsolata.ttf");}* { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; margin: 0; padding: 0;}body { font-size: 12px; line-height: 21px; background-color: #fff; font-family: "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif; color: #0a0a0a;}#wrapper { margin: 0;}#grid { position: fixed; top: 0; left: 0; width: 796px; background-image: url("i/grid.png"); z-index: 100;}pre { line-height: 18px; font-size: 13px; margin: 7px 0 21px; padding: 5px 10px; overflow: auto; background-color: #fafafa; border: 1px solid #e6e6e6; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);}/* typography stuff*/.mono { font-family: "Inconsolata", Andale Mono, Monaco, Monospace;}.sans { font-family: "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;}.serif { font-family: "Georgia", Times New Roman, Times, serif;}a { color: #2e87dd; text-decoration: none;}a:hover { text-decoration: underline;}/* navigation*/#navBg { background-color: #f2f2f2; background-image: url("i/shadow.png"); background-position: right top; background-repeat: repeat-y; width: 220px; position: fixed; top: 0; left: 0; z-index: 0;}#nav { background-image: url("i/logo.png"); background-repeat: no-repeat; background-position: center 10px; width: 220px; float: left; margin: 0; padding: 150px 20px 0; font-size: 13px; text-shadow: 1px 1px #fff; position: relative; z-index: 1;}#nav .homeImageLink { position: absolute; display: block; top: 10px; left: 0; width: 220px; height: 138px;}#nav ul { list-style-type:none; padding: 0; margin: 21px 0 0 0;}#nav ul li { width: 100%;}#nav ul li.version { text-align: center; color: #4d4d4d;}#nav h1 { color: #4d4d4d; text-align: center; font-size: 15px; font-weight: normal; text-transform: uppercase; letter-spacing: 3px;}span.spacer { color: #2e87dd; margin: 0 3px 0 5px; background-image: url("i/dot.png"); background-repeat: repeat-x; background-position: left 13px;}/* icons*/span.icon { width: 16px; display: block; background-image: url("i/sprite.png"); background-repeat: no-repeat;}span.icon.home { background-position: center 5px;}span.icon.start { background-position: center -27px;}span.icon.download { background-position: center -59px;}span.icon.api { background-position: center -89px;}span.icon.optimize { background-position: center -119px;}span.icon.script { background-position: center -150px;}span.icon.question { background-position: center -182px;}span.icon.requirement { background-position: center -214px;}span.icon.history { background-position: center -247px;}span.icon.help { background-position: center -279px;}span.icon.blog { background-position: center -311px;}span.icon.twitter { background-position: center -343px;}span.icon.git { background-position: center -375px;}span.icon.fork { background-position: center -407px;}/* content*/#content { margin: 0 0 0 220px; padding: 0 20px; background-color: #fff; font-family: "Georgia", Times New Roman, Times, serif; position: relative;}#content p { padding: 7px 0; color: #333; font-size: 14px;}#content h1,#content h2,#content h3,#content h4,#content h5 { font-weight: normal; padding: 21px 0 7px;}#content h1 { font-size: 21px;}#content h2 { padding: 0 0 18px 0; margin: 0 0 7px 0; font-weight: normal; font-size: 21px; line-height: 24px; text-align: center; color: #222; background-image: url("i/arrow.png"); background-repeat: no-repeat; background-position: center bottom; font-family: "Inconsolata", Andale Mono, Monaco, Monospace; text-transform: uppercase; letter-spacing: 2px; text-shadow: 1px 1px 0 #fff;}#content h2 a { color: #222;}#content h2 a:hover,#content h3 a:hover,#content h4 a:hover { text-decoration: none;}span.sectionMark { display: block; color: #aaa; text-shadow: 1px 1px 0 #fff; font-size: 15px; font-family: "Inconsolata", Andale Mono, Monaco, Monospace;}#content h3 { font-size: 17px;}#content h4 { padding-top: 0; font-size: 15px;}#content h5 { font-size: 10px;}#content ul { list-style-type: disc;}#content ul,#content ol { /* border-left: 1px solid #333; */ color: #333; font-size: 14px; list-style-position: outside; margin: 7px 0 21px 0; /* padding: 0 0 0 28px; */}#content ul { font-style: italic;}#content ol { border: none; list-style-position: inside; padding: 0; font-family: "Georgia", Times New Roman, Times, serif;}#content ul ul,#content ol ol { border: none; padding: 0; margin: 0 0 0 28px;}#content .section { padding: 48px 0; background-image: url("i/line.png"); background-repeat: no-repeat; background-position: center bottom; width: 576px; margin: 0 auto;}#content .section .subSection { padding: 0 0 0 48px; margin: 28px 0 0 0; display: block; border-left: 2px solid #ddd;}#content .section:last-child { background-image: none;}#content .note { color: #222; background-color: #ffff99; padding: 5px 10px; margin: 7px 0; display: inline-block;}/* page directory*/#content #directory.section { background-color: #fff; width: 576px;}#content #directory.section ul ul ul { margin: 0 0 0 48px;}#content #directory.section ul ul li { background-image: url("i/sprite.png"); background-repeat: no-repeat; background-position: left -437px; padding-left: 18px; font-style: normal;}#content #directory h1 { padding: 0 0 65px 0; margin: 0 0 14px 0; font-weight: normal; font-size: 21px; text-align: center; text-transform: uppercase; letter-spacing: 2px; color: #222; background-image: url("i/arrow-x.png"); background-repeat: no-repeat; background-position: center bottom; font-family: "Inconsolata", Andale Mono, Monaco, Monospace;}#content ul.index { padding: 0; background-color: transparent; border: none; -moz-box-shadow: none; font-style: normal; font-family: "Inconsolata", Andale Mono, Monaco, Monospace;}#content ul.index li { width: 100%; font-size: 15px; color: #333; padding: 0 0 7px 0;}/* intro page specific*/#content #intro { width: 576px; margin: 0 auto; padding: 21px 0;}#content #intro p,#content #intro h1 { font-size: 19px; line-height: 28px; color: green; letter-spacing: 2px; padding: 0 0 28px 0;}#content #intro p:last-child,#content #intro h1:last-child { padding: 0;}#content #intro p a { color: green; text-decoration: underline;}/* download page*/#content h4 a.download { -webkit-border-radius: 5px; -moz-border-radius: 5px; background-color: #F2F2F2; background-image: url("i/sprite.png"), -moz-linear-gradient(center top , #FAFAFA 0%, #F2F2F2 100%); background-image: url("i/sprite.png"), -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #f2f2f2)); background-position: 7px -58px, center center; background-repeat: no-repeat, no-repeat; border: 1px solid #CCCCCC; color: #333333; font-size: 12px; margin: 0 0 0 5px; padding: 0 10px 0 25px; text-shadow: 1px 1px 0 #FFFFFF;}/* footer*/#footer { color: #4d4d4d; padding: 65px 20px 20px; margin: 20px 0 0 220px; text-align: center; display: block; font-size: 13px; background-image: url("i/arrow-x.png"); background-repeat: no-repeat; background-position: center top; background-color: #fff;}#footer .line { display: block;}#footer .line a { color: #4d4d4d; text-decoration: underline;}/* Pygments manni style*/code {background-color: #fafafa; color: #333;}code .comment {color: green; font-style: italic}code .comment.preproc {color: #099; font-style: normal}code .comment.special {font-weight: bold}code .keyword {color: #069; font-weight: bold}code .keyword.pseudo {font-weight: normal}code .keyword.type {color: #078}code .operator {color: #555}code .operator.word {color: #000; font-weight: bold}code .name.builtin {color: #366}code .name.function {color: #c0f}code .name.class {color: #0a8; font-weight: bold}code .name.namespace {color: #0cf; font-weight: bold}code .name.exception {color: #c00; font-weight: bold}code .name.variable {color: #033}code .name.constant {color: #360}code .name.label {color: #99f}code .name.entity {color: #999; font-weight: bold}code .name.attribute {color: #309}code .name.tag {color: #309; font-weight: bold}code .name.decorator {color: #99f}code .string {color: #c30}code .string.doc {font-style: italic}code .string.interpol {color: #a00}code .string.escape {color: #c30; font-weight: bold}code .string.regex {color: #3aa}code .string.symbol {color: #fc3}code .string.other {color: #c30}code .number {color: #f60}/* webkit scroll bars*/pre::-webkit-scrollbar { width: 6px; height: 6px;}pre::-webkit-scrollbar-button:start:decrement,pre::-webkit-scrollbar-button:end:increment { display: block; height: 0; width: 0;}pre::-webkit-scrollbar-button:vertical:increment,pre::-webkit-scrollbar-button:horizontal:increment { background-color: transparent; display: block; height: 0; width: 0;}pre::-webkit-scrollbar-track-piece { -webkit-border-radius: 3px;}pre::-webkit-scrollbar-thumb:vertical { background-color: #aaa; -webkit-border-radius: 3px;}pre::-webkit-scrollbar-thumb:horizontal { background-color: #aaa; -webkit-border-radius: 3px;}/* hbox*/.hbox {\tdisplay: -webkit-box;\t-webkit-box-orient: horizontal;\t-webkit-box-align: stretch;\tdisplay: -moz-box;\t-moz-box-orient: horizontal;\t-moz-box-align: stretch;\tdisplay: box;\tbox-orient: horizontal;\tbox-align: stretch;\twidth: 100%;}.hbox > * {\t-webkit-box-flex: 0;\t-moz-box-flex: 0;\tbox-flex: 0;\tdisplay: block;}.vbox {\tdisplay: -webkit-box;\t-webkit-box-orient: vertical;\t-webkit-box-align: stretch;\tdisplay: -moz-box;\t-moz-box-orient: vertical;\t-moz-box-align: stretch;\tdisplay: box;\tbox-orient: vertical;\tbox-align: stretch;}.vbox > * {\t-webkit-box-flex: 0;\t-moz-box-flex: 0;\tbox-flex: 0;\tdisplay: block;}.spacer {\t-webkit-box-flex: 1;\t-moz-box-flex: 1;\tbox-flex: 1;}.reverse {\t-webkit-box-direction: reverse;\t-moz-box-direction: reverse;\tbox-direction: reverse;}.boxFlex0 {\t-webkit-box-flex: 0;\t-moz-box-flex: 0;\tbox-flex: 0;}.boxFlex1, .boxFlex {\t-webkit-box-flex: 1;\t-moz-box-flex: 1;\tbox-flex: 1;}.boxFlex2 {\t-webkit-box-flex: 2;\t-moz-box-flex: 2;\tbox-flex: 2;}.boxGroup1 {\t-webkit-box-flex-group: 1;\t-moz-box-flex-group: 1;\tbox-flex-group: 1;}.boxGroup2 {\t-webkit-box-flex-group: 2;\t-moz-box-flex-group: 2;\tbox-flex-group: 2;}.start {\t-webkit-box-pack: start;\t-moz-box-pack: start;\tbox-pack: start;}.end {\t-webkit-box-pack: end;\t-moz-box-pack: end;\tbox-pack: end;}.center {\t-webkit-box-pack: center;\t-moz-box-pack: center;\tbox-pack: center;}/* clearfix*/.clearfix:after {\tcontent: ".";\tdisplay: block;\tclear: both;\tvisibility: hidden;\tline-height: 0;\theight: 0;}html[xmlns] .clearfix {\tdisplay: block;}* html .clearfix {\theight: 1%;}'),define("text/lib/ace/css/editor.css",[],'.ace_editor { position: absolute; overflow: hidden; font-family: Monaco, "Menlo", "Courier New", monospace; font-size: 12px;}.ace_scroller { position: absolute; overflow-x: scroll; overflow-y: hidden;}.ace_content { position: absolute; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;}.ace_composition { position: absolute; background: #555; color: #DDD; z-index: 4;}.ace_gutter { position: absolute; overflow-x: hidden; overflow-y: hidden; height: 100%;}.ace_gutter-cell.ace_error { background-image: url("data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B"); background-repeat: no-repeat; background-position: 4px center;}.ace_gutter-cell.ace_warning { background-image: url("data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03\'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B"); background-repeat: no-repeat; background-position: 4px center;}.ace_editor .ace_sb { position: absolute; overflow-x: hidden; overflow-y: scroll; right: 0;}.ace_editor .ace_sb div { position: absolute; width: 1px; left: 0;}.ace_editor .ace_print_margin_layer { z-index: 0; position: absolute; overflow: hidden; margin: 0; left: 0; height: 100%; width: 100%;}.ace_editor .ace_print_margin { position: absolute; height: 100%;}.ace_editor textarea { position: fixed; z-index: -1; width: 10px; height: 30px; opacity: 0; background: transparent; appearance: none; -moz-appearance: none; border: none; resize: none; outline: none; overflow: hidden;}.ace_layer { z-index: 1; position: absolute; overflow: hidden; white-space: nowrap; height: 100%; width: 100%;}.ace_text-layer { color: black;}.ace_cjk { display: inline-block; text-align: center;}.ace_cursor-layer { z-index: 4; cursor: text; /* setting pointer-events: none; here will break mouse wheel scrolling in Safari */}.ace_cursor { z-index: 4; position: absolute;}.ace_cursor.ace_hidden { opacity: 0.2;}.ace_line { white-space: nowrap;}.ace_marker-layer { cursor: text; pointer-events: none;}.ace_marker-layer .ace_step { position: absolute; z-index: 3;}.ace_marker-layer .ace_selection { position: absolute; z-index: 4;}.ace_marker-layer .ace_bracket { position: absolute; z-index: 5;}.ace_marker-layer .ace_active_line { position: absolute; z-index: 2;}.ace_marker-layer .ace_selected_word { position: absolute; z-index: 6; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;}.ace_line .ace_fold { cursor: pointer;}.ace_dragging .ace_marker-layer, .ace_dragging .ace_text-layer { cursor: move;}'),define("text/node_modules/uglify-js/docstyle.css",[],'html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }body { max-width: 60em; }.title { text-align: center; }.todo { color: red; }.done { color: green; }.tag { background-color:lightblue; font-weight:normal }.target { }.timestamp { color: grey }.timestamp-kwd { color: CadetBlue }p.verse { margin-left: 3% }pre { border: 1pt solid #AEBDCC; background-color: #F3F5F7; padding: 5pt; font-family: monospace; font-size: 90%; overflow:auto;}pre.src { background-color: #eee; color: #112; border: 1px solid #000;}table { border-collapse: collapse; }td, th { vertical-align: top; }dt { font-weight: bold; }div.figure { padding: 0.5em; }div.figure p { text-align: center; }.linenr { font-size:smaller }.code-highlighted {background-color:#ffff00;}.org-info-js_info-navigation { border-style:none; }#org-info-js_console-label { font-size:10px; font-weight:bold; white-space:nowrap; }.org-info-js_search-highlight {background-color:#ffff00; color:#000000; font-weight:bold; }sup { vertical-align: baseline; position: relative; top: -0.5em; font-size: 80%;}sup a:link, sup a:visited { text-decoration: none; color: #c00;}sup a:before { content: "["; color: #999; }sup a:after { content: "]"; color: #999; }h1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }#postamble { color: #777; font-size: 90%; padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999; margin-top: 2em; padding-left: 2em; padding-right: 2em; text-align: right;}#postamble p { margin: 0; }#footnotes { border-top: 1px solid #000; }h1 { font-size: 200% }h2 { font-size: 175% }h3 { font-size: 150% }h4 { font-size: 125% }h1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }@media print { html { font-size: 11pt; }}'),define("text/support/cockpit/lib/cockpit/ui/cli_view.css",[],"#cockpitInput { padding-left: 16px; }.cptOutput { overflow: auto; position: absolute; z-index: 999; display: none; }.cptCompletion { padding: 0; position: absolute; z-index: -1000; }.cptCompletion.VALID { background: #FFF; }.cptCompletion.INCOMPLETE { background: #DDD; }.cptCompletion.INVALID { background: #DDD; }.cptCompletion span { color: #FFF; }.cptCompletion span.INCOMPLETE { color: #DDD; border-bottom: 2px dotted #F80; }.cptCompletion span.INVALID { color: #DDD; border-bottom: 2px dotted #F00; }span.cptPrompt { color: #66F; font-weight: bold; }.cptHints { color: #000; position: absolute; border: 1px solid rgba(230, 230, 230, 0.8); background: rgba(250, 250, 250, 0.8); -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 10px; border-top-left-radius: 10px; border-top-right-radius: 10px; z-index: 1000; padding: 8px; display: none;}.cptFocusPopup { display: block; }.cptFocusPopup.cptNoPopup { display: none; }.cptHints ul { margin: 0; padding: 0 15px; }.cptGt { font-weight: bold; font-size: 120%; }"),define("text/support/cockpit/lib/cockpit/ui/request_view.css",[],".cptRowIn { display: box; display: -moz-box; display: -webkit-box; box-orient: horizontal; -moz-box-orient: horizontal; -webkit-box-orient: horizontal; box-align: center; -moz-box-align: center; -webkit-box-align: center; color: #333; background-color: #EEE; width: 100%; font-family: consolas, courier, monospace;}.cptRowIn > * { padding-left: 2px; padding-right: 2px; }.cptRowIn > img { cursor: pointer; }.cptHover { display: none; }.cptRowIn:hover > .cptHover { display: block; }.cptRowIn:hover > .cptHover.cptHidden { display: none; }.cptOutTyped { box-flex: 1; -moz-box-flex: 1; -webkit-box-flex: 1; font-weight: bold; color: #000; font-size: 120%;}.cptRowOutput { padding-left: 10px; line-height: 1.2em; }.cptRowOutput strong,.cptRowOutput b,.cptRowOutput th,.cptRowOutput h1,.cptRowOutput h2,.cptRowOutput h3 { color: #000; }.cptRowOutput a { font-weight: bold; color: #666; text-decoration: none; }.cptRowOutput a: hover { text-decoration: underline; cursor: pointer; }.cptRowOutput input[type=password],.cptRowOutput input[type=text],.cptRowOutput textarea { color: #000; font-size: 120%; background: transparent; padding: 3px; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;}.cptRowOutput table,.cptRowOutput td,.cptRowOutput th { border: 0; padding: 0 2px; }.cptRowOutput .right { text-align: right; }"),define("text/tool/Theme.tmpl.css",[],".%cssClass% .ace_editor { border: 2px solid rgb(159, 159, 159);}.%cssClass% .ace_editor.ace_focus { border: 2px solid #327fbd;}.%cssClass% .ace_gutter { width: 50px; background: #e8e8e8; color: #333; overflow : hidden;}.%cssClass% .ace_gutter-layer { width: 100%; text-align: right;}.%cssClass% .ace_gutter-layer .ace_gutter-cell { padding-right: 6px;}.%cssClass% .ace_print_margin { width: 1px; background: %printMargin%;}.%cssClass% .ace_scroller { background-color: %background%;}.%cssClass% .ace_text-layer { cursor: text; color: %foreground%;}.%cssClass% .ace_cursor { border-left: 2px solid %cursor%;}.%cssClass% .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid %overwrite%;} .%cssClass% .ace_marker-layer .ace_selection { background: %selection%;}.%cssClass% .ace_marker-layer .ace_step { background: %step%;}.%cssClass% .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid %bracket%;}.%cssClass% .ace_marker-layer .ace_active_line { background: %active_line%;} .%cssClass% .ace_invisible { %invisible%}.%cssClass% .ace_keyword { %keyword%}.%cssClass% .ace_keyword.ace_operator { %keyword.operator%}.%cssClass% .ace_constant { %constant%}.%cssClass% .ace_constant.ace_language { %constant.language%}.%cssClass% .ace_constant.ace_library { %constant.library%}.%cssClass% .ace_constant.ace_numeric { %constant.numeric%}.%cssClass% .ace_invalid { %invalid%}.%cssClass% .ace_invalid.ace_illegal { %invalid.illegal%}.%cssClass% .ace_invalid.ace_deprecated { %invalid.deprecated%}.%cssClass% .ace_support { %support%}.%cssClass% .ace_support.ace_function { %support.function%}.%cssClass% .ace_function.ace_buildin { %function.buildin%}.%cssClass% .ace_string { %string%}.%cssClass% .ace_string.ace_regexp { %string.regexp%}.%cssClass% .ace_comment { %comment%}.%cssClass% .ace_comment.ace_doc { %comment.doc%}.%cssClass% .ace_comment.ace_doc.ace_tag { %comment.doc.tag%}.%cssClass% .ace_variable { %variable%}.%cssClass% .ace_variable.ace_language { %variable.language%}.%cssClass% .ace_xml_pe { %xml_pe%}.%cssClass% .ace_collab.ace_user1 { %collab.user1% }"),define("text/styles.css",[],"html { height: 100%; width: 100%; overflow: hidden;}body { overflow: hidden; margin: 0; padding: 0; height: 100%; width: 100%; font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif; font-size: 12px; background: rgb(14, 98, 165); color: white;}#logo { padding: 15px; margin-left: 65px;}#editor { position: absolute; top: 0px; left: 280px; bottom: 0px; right: 0px; background: white;}#controls { padding: 5px;}#controls td { text-align: right;}#controls td + td { text-align: left;}#cockpitInput { position: absolute; left: 280px; right: 0px; bottom: 0; border: none; outline: none; font-family: consolas, courier, monospace; font-size: 120%;}#cockpitOutput { padding: 10px; margin: 0 15px; border: 1px solid #AAA; -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 10px; border-top-left-radius: 4px; border-top-right-radius: 4px; background: #DDD; color: #000;}"),require(["ace/ace"],function(a){window.ace=a}) \ No newline at end of file +(function(){function g(a){var e=function(a,b){return d("",a,b)};e.packaged=!0;var f=b;a&&(b[a]||(b[a]={}),f=b[a]),f.define&&(c.original=f.define),f.define=c,f.require&&(d.original=f.require),f.require=e}var a="",b=function(){return this}();if(typeof requirejs!="undefined")return;var c=function(a,b,d){if(typeof a!="string"){c.original?c.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(d=b),c.modules||(c.modules={}),c.modules[a]=d},d=function(a,b,c){if(Object.prototype.toString.call(b)==="[object Array]"){var e=[];for(var g=0,h=b.length;g1&&h(b,"")>-1&&(i=RegExp(this.source,d.replace.call(g(this),"g","")),d.replace.call(a.slice(b.index),i,function(){for(var a=1;ab.index&&this.lastIndex--}return b},f||(RegExp.prototype.test=function(a){var b=d.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b})}),define("ace/lib/es5-shim",["require","exports","module"],function(a,b,c){function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if(typeof b!="function")throw new TypeError;var c=g.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,h=b.apply(f,c.concat(g.call(arguments)));return h!==null&&Object(h)===h?h:f}return b.apply(a,c.concat(g.call(arguments)))};return d});var d=Function.prototype.call,e=Array.prototype,f=Object.prototype,g=e.slice,h=d.bind(f.toString),i=d.bind(f.hasOwnProperty),j,k,l,m,n;if(n=i(f,"__defineGetter__"))j=d.bind(f.__defineGetter__),k=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),m=d.bind(f.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return h(a)=="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=G(this),c=arguments[1],d=0,e=b.length>>>0;if(h(a)!="[object Function]")throw new TypeError;while(d>>0,d=Array(c),e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=[],e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d=0,e;if(arguments.length>=2)e=arguments[1];else do{if(d in b){e=b[d++];break}if(++d>=c)throw new TypeError}while(!0);for(;d>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d,e=c-1;if(arguments.length>=2)d=arguments[1];else do{if(e in b){d=b[e--];break}if(--e<0)throw new TypeError}while(!0);do e in this&&(d=a.call(void 0,d,b[e],e,b));while(e--);return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=G(this),c=b.length>>>0;if(!c)return-1;var d=0;arguments.length>1&&(d=E(arguments[1])),d=d>=0?d:Math.max(0,c+d);for(;d>>0;if(!c)return-1;var d=c-1;arguments.length>1&&(d=Math.min(d,E(arguments[1]))),d=d>=0?d:c-Math.abs(d);for(;d>=0;d--)if(d in b&&a===b[d])return d;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||(a.constructor?a.constructor.prototype:f)});if(!Object.getOwnPropertyDescriptor){var o="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(o+a);if(!i(a,b))return;var c,d,e;c={enumerable:!0,configurable:!0};if(n){var g=a.__proto__;a.__proto__=f;var d=l(a,b),e=m(a,b);a.__proto__=g;if(d||e)return d&&(c.get=d),e&&(c.set=e),c}return c.value=a[b],c}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}return b!==void 0&&Object.defineProperties(c,b),c});if(Object.defineProperty){var q=p({}),r=typeof document=="undefined"||p(document.createElement("div"));if(!q||!r)var s=Object.defineProperty}if(!Object.defineProperty||s){var t="Property description must be an object: ",u="Object.defineProperty called on non-object: ",v="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(u+a);if(typeof c!="object"&&typeof c!="function"||c===null)throw new TypeError(t+c);if(s)try{return s.call(Object,a,b,c)}catch(d){}if(i(c,"value"))if(n&&(l(a,b)||m(a,b))){var e=a.__proto__;a.__proto__=f,delete a[b],a[b]=c.value,a.__proto__=e}else a[b]=c.value;else{if(!n)throw new TypeError(v);i(c,"get")&&j(a,b,c.get),i(c,"set")&&k(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)i(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(w){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)===a)throw new TypeError;var b="";while(i(a,b))b+="?";a[b]=!0;var c=i(a,b);return delete a[b],c});if(!Object.keys){var x=!0,y=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],z=y.length;for(var A in{toString:null})x=!1;Object.keys=function bd(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var bd=[];for(var b in a)i(a,b)&&bd.push(b);if(x)for(var c=0,d=z;c9999?"+":"")+("00000"+Math.abs(d)).slice(0<=d&&d<=9999?-4:-6),b=a.length;while(b--)c=a[b],c<10&&(a[b]="0"+c);return d+"-"+a.slice(0,2).join("-")+"T"+a.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"};Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toJSON||(Date.prototype.toJSON=function(a){if(typeof this.toISOString!="function")throw new TypeError;return this.toISOString()}),Date.parse("+275760-09-13T00:00:00.000Z")!==864e13&&(Date=function(a){var b=function e(b,c,d,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=j==1&&String(b)===b?new a(e.parse(b)):j>=7?new a(b,c,d,f,g,h,i):j>=6?new a(b,c,d,f,g,h):j>=5?new a(b,c,d,f,g):j>=4?new a(b,c,d,f):j>=3?new a(b,c,d):j>=2?new a(b,c):j>=1?new a(b):new a;return k.constructor=e,k}return a.apply(this,arguments)},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$");for(var d in a)b[d]=a[d];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function f(b){var d=c.exec(b);if(d){d.shift();for(var e=1;e<7;e++)d[e]=+(d[e]||(e<3?1:0)),e==1&&d[e]--;var f=+d.pop(),g=+d.pop(),h=d.pop(),i=0;if(h){if(g>23||f>59)return NaN;i=(g*60+f)*6e4*(h=="+"?-1:1)}var j=+d[0];return 0<=j&&j<=99?(d[0]=j+400,a.UTC.apply(this,d)+i-126227808e5):a.UTC.apply(this,d)+i}return a.parse.apply(this,arguments)},b}(Date));var B="\t\n \f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029";if(!String.prototype.trim||B.trim()){B="["+B+"]";var C=new RegExp("^"+B+B+"*"),D=new RegExp(B+B+"*$");String.prototype.trim=function(){return String(this).replace(C,"").replace(D,"")}}var E=function(a){return a=+a,a!==a?a=0:a!==0&&a!==1/0&&a!==-Infinity&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a},F="a"[0]!="a",G=function(a){if(a==null)throw new TypeError;return F&&typeof a=="string"&&a?a.split(""):Object(a)}}),define("ace/lib/dom",["require","exports","module"],function(a,b,c){"use strict";var d="http://www.w3.org/1999/xhtml";b.createElement=function(a,b){return document.createElementNS?document.createElementNS(b||d,a):document.createElement(a)},b.setText=function(a,b){a.innerText!==undefined&&(a.innerText=b),a.textContent!==undefined&&(a.textContent=b)},b.hasCssClass=function(a,b){var c=a.className.split(/\s+/g);return c.indexOf(b)!==-1},b.addCssClass=function(a,c){b.hasCssClass(a,c)||(a.className+=" "+c)},b.removeCssClass=function(a,b){var c=a.className.split(/\s+/g);for(;;){var d=c.indexOf(b);if(d==-1)break;c.splice(d,1)}a.className=c.join(" ")},b.toggleCssClass=function(a,b){var c=a.className.split(/\s+/g),d=!0;for(;;){var e=c.indexOf(b);if(e==-1)break;d=!1,c.splice(e,1)}return d&&c.push(b),a.className=c.join(" "),d},b.setCssClass=function(a,c,d){d?b.addCssClass(a,c):b.removeCssClass(a,c)},b.hasCssString=function(a,b){var c=0,d;b=b||document;if(b.createStyleSheet&&(d=b.styleSheets)){while(cd&&(d=Math.abs(a.wheelDeltaY));if(d>5e3)var b=400;else var b=8;a.wheelDeltaX!==undefined?(a.wheelX=-a.wheelDeltaX/b,a.wheelY=-a.wheelDeltaY/b):(a.wheelX=0,a.wheelY=-a.wheelDelta/b)}else a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=(a.detail||0)*5,a.wheelY=0):(a.wheelX=0,a.wheelY=(a.detail||0)*5);c(a)};b.addListener(a,"DOMMouseScroll",e),b.addListener(a,"mousewheel",e)},b.addMultiMouseDownListener=function(a,c,d,f,g){var h=0,i,j,k=function(a){h+=1,h==1&&(i=a.clientX,j=a.clientY,setTimeout(function(){h=0},f||600));var e=b.getButton(a)==c;if(!e||Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5)h=0;h==d&&(h=0,g(a));if(e)return b.preventDefault(a)};b.addListener(a,"mousedown",k),e.isOldIE&&b.addListener(a,"dblclick",k)},b.addCommandKeyListener=function(a,c){var d=b.addListener;if(e.isOldGecko){var f=null;d(a,"keydown",function(a){f=a.keyCode}),d(a,"keypress",function(a){return g(c,a,f)})}else{var h=null;d(a,"keydown",function(a){return h=a.keyIdentifier||a.keyCode,g(c,a,a.keyCode)}),e.isMac&&e.isOpera&&d(a,"keypress",function(a){var b=a.keyIdentifier||a.keyCode;if(h!==b)return g(c,a,h);h=null})}};if(window.postMessage){var h=1;b.nextTick=function(a,c){c=c||window;var d="zero-timeout-message-"+h;b.addListener(c,"message",function e(f){f.data==d&&(b.stopPropagation(f),b.removeListener(c,"message",e),a())}),c.postMessage(d,"*")}}else b.nextTick=function(a,b){b=b||window,window.setTimeout(a,0)}}),define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./oop"),e=function(){var a={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:'"'}};for(var b in a.FUNCTION_KEYS){var c=a.FUNCTION_KEYS[b].toUpperCase();a[c]=parseInt(b,10)}return d.mixin(a,a.MODIFIER_KEYS),d.mixin(a,a.PRINTABLE_KEYS),d.mixin(a,a.FUNCTION_KEYS),a}();d.mixin(b,e),b.keyCodeToString=function(a){return(e[a]||String.fromCharCode(a)).toLowerCase()}}),define("ace/lib/oop",["require","exports","module"],function(a,b,c){"use strict",b.inherits=function(){var a=function(){};return function(b,c){a.prototype=c.prototype,b.super_=c.prototype,b.prototype=new a,b.prototype.constructor=b}}(),b.mixin=function(a,b){for(var c in b)a[c]=b[c]},b.implement=function(a,c){b.mixin(a,c)}}),define("ace/lib/useragent",["require","exports","module"],function(a,b,c){"use strict";var d=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),e=navigator.userAgent;b.isWin=d=="win",b.isMac=d=="mac",b.isLinux=d=="linux",b.isIE=navigator.appName=="Microsoft Internet Explorer"&&parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),b.isOldIE=b.isIE&&b.isIE<9,b.isGecko=b.isMozilla=window.controllers&&window.navigator.product==="Gecko",b.isOldGecko=b.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4,b.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",b.isWebKit=parseFloat(e.split("WebKit/")[1])||undefined,b.isChrome=parseFloat(e.split(" Chrome/")[1])||undefined,b.isAIR=e.indexOf("AdobeAIR")>=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0,b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS}}),define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands"],function(a,b,c){"use strict",a("./lib/fixoldbrowsers");var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/useragent"),g=a("./keyboard/textinput").TextInput,h=a("./mouse/mouse_handler").MouseHandler,i=a("./mouse/fold_handler").FoldHandler,j=a("./keyboard/keybinding").KeyBinding,k=a("./edit_session").EditSession,l=a("./search").Search,m=a("./range").Range,n=a("./lib/event_emitter").EventEmitter,o=a("./commands/command_manager").CommandManager,p=a("./commands/default_commands").commands,q=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.textInput=new g(a.getTextAreaContainer(),this),this.keyBinding=new j(this),f.isIPad||(this.$mouseHandler=new h(this),new i(this)),this.$blockScrolling=0,this.$search=(new l).set({wrap:!0}),this.commands=new o(f.isMac?"mac":"win",p),this.setSession(b||new k(""))};((function(){d.implement(this,n),this.setKeyboardHandler=function(a){this.keyBinding.setKeyboardHandler(a)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session==a)return;if(this.session){var b=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeLeftTop",this.$onScrollLeftChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=a,this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.updateText.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull(),this._emit("changeSession",{session:a,oldSession:b})},this.getSession=function(){return this.session},this.getSelection=function(){return this.selection},this.resize=function(){this.renderer.onResize()},this.setTheme=function(a){this.renderer.setTheme(a)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.setFontSize=function(a){this.container.style.fontSize=a},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b){var c=new m(b.row,b.column,b.row,b.column+1);a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text")}},10)},this.focus=function(){var a=this;setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus")},this.onBlur=function(){this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur")},this.onDocumentChange=function(a){var b=a.data,c=b.range,d;c.start.row==c.end.row&&b.action!="insertLines"&&b.action!="removeLines"?d=c.end.row:d=Infinity,this.renderer.updateLines(c.start.row,d),this._emit("change",a),this.onCursorChange()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.renderer.updateCursor(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.renderer.moveTextAreaToCursor(this.textInput.getElement()),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.$updateHighlightActiveLine=function(){var a=this.getSession();a.$highlightLineMarker&&a.removeMarker(a.$highlightLineMarker),a.$highlightLineMarker=null;if(this.getHighlightActiveLine()&&(this.getSelectionStyle()!="line"||!this.selection.isMultiLine())){var b=this.getCursorPosition(),c=this.session.getFoldLine(b.row),d;c?d=new m(c.start.row,0,c.end.row+1,0):d=new m(b.row,0,b.row+1,0),a.$highlightLineMarker=a.addMarker(d,"ace_active_line","background")}},this.onSelectionChange=function(a){var b=this.getSession();b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null;if(!this.selection.isEmpty()){var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}else this.$updateHighlightActiveLine();this.$highlightSelectedWord&&this.session.getMode().highlightSelection(this)},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.setBreakpoints(this.session.getBreakpoints())},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(){this.renderer.updateText()},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var a="";return this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",a),a},this.onCut=function(){if(this.$readOnly)return;var a=this.getSelectionRange();this._emit("cut",a),this.selection.isEmpty()||(this.session.remove(a),this.clearSelection())},this.insert=function(a){var b=this.session,c=b.getMode(),d=this.getCursorPosition();if(this.getBehavioursEnabled()){var e=c.transformAction(b.getState(d.row),"insertion",this,b,a);e&&(a=e.text)}a=a.replace("\t",this.session.getTabString());if(!this.selection.isEmpty())d=this.session.remove(this.getSelectionRange()),this.clearSelection();else if(this.session.getOverwrite()){var f=new m.fromPoints(d,d);f.end.column+=a.length,this.session.remove(f)}this.clearSelection();var g=d.column,h=b.getState(d.row),i=c.checkOutdent(h,b.getLine(d.row),a),j=b.getLine(d.row),k=c.getNextLineIndent(h,j.slice(0,d.column),b.getTabString()),l=b.insert(d,a);e&&e.selection&&(e.selection.length==2?this.selection.setSelectionRange(new m(d.row,g+e.selection[0],d.row,g+e.selection[1])):this.selection.setSelectionRange(new m(d.row+e.selection[0],e.selection[1],d.row+e.selection[2],e.selection[3])));var h=b.getState(d.row);if(b.getDocument().isNewLine(a)){this.moveCursorTo(d.row+1,0);var n=b.getTabSize(),o=Number.MAX_VALUE;for(var p=d.row+1;p<=l.row;++p){var q=0;j=b.getLine(p);for(var r=0;r0;++r)j.charAt(r)=="\t"?s-=n:j.charAt(r)==" "&&(s-=1);b.remove(new m(p,0,p,r))}b.indentRows(d.row+1,l.row,k)}i&&c.autoOutdent(h,b,d.row)},this.onTextInput=function(a,b){b&&this._emit("paste",a),this.keyBinding.onTextInput(a,b)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.$mouseHandler.setScrollSpeed(a)},this.getScrollSpeed=function(){return this.$mouseHandler.getScrollSpeed()},this.setDragDelay=function(a){this.$mouseHandler.setDragDelay(a)},this.getDragDelay=function(){return this.$mouseHandler.getDragDelay()},this.$selectionStyle="line",this.setSelectionStyle=function(a){if(this.$selectionStyle==a)return;this.$selectionStyle=a,this.onSelectionChange(),this._emit("changeSelectionStyle",{data:a})},this.getSelectionStyle=function(){return this.$selectionStyle},this.$highlightActiveLine=!0,this.setHighlightActiveLine=function(a){if(this.$highlightActiveLine==a)return;this.$highlightActiveLine=a,this.$updateHighlightActiveLine()},this.getHighlightActiveLine=function(){return this.$highlightActiveLine},this.$highlightSelectedWord=!0,this.setHighlightSelectedWord=function(a){if(this.$highlightSelectedWord==a)return;this.$highlightSelectedWord=a,a?this.session.getMode().highlightSelection(this):this.session.getMode().clearSelectionHighlight(this)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setShowInvisibles=function(a){if(this.getShowInvisibles()==a)return;this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.$readOnly=!1,this.setReadOnly=function(a){this.$readOnly=a},this.getReadOnly=function(){return this.$readOnly},this.$modeBehaviours=!0,this.setBehavioursEnabled=function(a){this.$modeBehaviours=a},this.getBehavioursEnabled=function(){return this.$modeBehaviours},this.setShowFoldWidgets=function(a){var b=this.renderer.$gutterLayer;if(b.getShowFoldWidgets()==a)return;this.renderer.$gutterLayer.setShowFoldWidgets(a),this.$showFoldWidgets=a,this.renderer.updateFull()},this.getShowFoldWidgets=function(){return this.renderer.$gutterLayer.getShowFoldWidgets()},this.remove=function(a){this.selection.isEmpty()&&(a=="left"?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var a=this.getCursorPosition(),b=a.column;if(b===0)return;var c=this.session.getLine(a.row),d,e;b=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.isRowFullyVisible=function(a){return a>=this.renderer.getFirstFullyVisibleRow()&&a<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$getPageDownRow=function(){return this.renderer.getScrollBottomRow()},this.$getPageUpRow=function(){var a=this.renderer.getScrollTopRow(),b=this.renderer.getScrollBottomRow();return a-(b-a)},this.selectPageDown=function(){var a=this.$getPageDownRow()+Math.floor(this.$getVisibleRowCount()/2);this.scrollPageDown();var b=this.getSelection(),c=this.session.documentToScreenPosition(b.getSelectionLead()),d=this.session.screenToDocumentPosition(a,c.column);b.selectTo(d.row,d.column)},this.selectPageUp=function(){var a=this.renderer.getScrollTopRow()-this.renderer.getScrollBottomRow(),b=this.$getPageUpRow()+Math.round(a/2);this.scrollPageUp();var c=this.getSelection(),d=this.session.documentToScreenPosition(c.getSelectionLead()),e=this.session.screenToDocumentPosition(b,d.column);c.selectTo(e.row,e.column)},this.gotoPageDown=function(){var a=this.$getPageDownRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.gotoPageUp=function(){var a=this.$getPageUpRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.scrollPageDown=function(){this.scrollToRow(this.$getPageDownRow())},this.scrollPageUp=function(){this.renderer.scrollToRow(this.$getPageUpRow())},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b){this.renderer.scrollToLine(a,b)},this.centerSelection=function(){var a=this.getSelectionRange(),b=Math.floor(a.start.row+(a.end.row-a.start.row)/2);this.renderer.scrollToLine(b,!0)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.jumpToMatching=function(){var a=this.getCursorPosition(),b=this.session.findMatchingBracket(a);b||(a.column+=1,b=this.session.findMatchingBracket(a)),b||(a.column-=2,b=this.session.findMatchingBracket(a)),b&&(this.clearSelection(),this.moveCursorTo(b.row,b.column))},this.gotoLine=function(a,b){this.selection.clearSelection(),this.session.unfold({row:a-1,column:b||0}),this.$blockScrolling+=1,this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowFullyVisible(this.getCursorPosition().row)||this.scrollToLine(a,!0)},this.navigateTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.navigateUp=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(-a,0)},this.navigateDown=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(a,0)},this.navigateLeft=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session);if(!c)return;this.$tryReplace(c,a),c!==null&&this.selection.setSelectionRange(c)},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session);if(!c.length)return;var d=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0),this.$blockScrolling+=1;for(var e=c.length-1;e>=0;--e)this.$tryReplace(c[e],a);this.selection.setSelectionRange(d),this.$blockScrolling-=1},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),b!==null?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b){this.clearSelection(),b=b||{},b.needle=a,this.$search.set(b),this.$find()},this.findNext=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!1),this.$search.set(a),this.$find()},this.findPrevious=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!0),this.$search.set(a),this.$find()},this.$find=function(a){this.selection.isEmpty()||this.$search.set({needle:this.session.getTextRange(this.getSelectionRange())}),typeof a!="undefined"&&this.$search.set({backwards:a});var b=this.$search.find(this.session);b&&(this.session.unfold(b),this.gotoLine(b.end.row+1,b.end.column),this.selection.setSelectionRange(b))},this.undo=function(){this.session.getUndoManager().undo()},this.redo=function(){this.session.getUndoManager().redo()},this.destroy=function(){this.renderer.destroy()}})).call(q.prototype),b.Editor=q}),define("ace/lib/lang",["require","exports","module"],function(a,b,c){"use strict",b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return(new Array(b+1)).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(var c=0,d=a.length;c128)return;setTimeout(function(){h||m()},0)},p=function(a){h=!0,b.onCompositionStart(),e.isGecko||setTimeout(q,0)},q=function(){if(!h)return;b.onCompositionUpdate(c.value)},r=function(a){h=!1,b.onCompositionEnd()},s=function(a){i=!0;var d=b.getCopyText();d?c.value=d:a.preventDefault(),l(),setTimeout(function(){m()},0)},t=function(a){i=!0;var d=b.getCopyText();d?(c.value=d,b.onCut()):a.preventDefault(),l(),setTimeout(function(){m()},0)};d.addCommandKeyListener(c,b.onCommandKey.bind(b));if(e.isOldIE){var u={13:1,27:1};d.addListener(c,"keyup",function(a){h&&(!c.value||u[a.keyCode])&&setTimeout(r,0);if((c.value.charCodeAt(0)|0)<129)return;h?q():p()})}"onpropertychange"in c&&!("oninput"in c)?d.addListener(c,"propertychange",o):d.addListener(c,"input",n),d.addListener(c,"paste",function(a){j=!0,a.clipboardData&&a.clipboardData.getData?(m(a.clipboardData.getData("text/plain")),a.preventDefault()):o()}),"onbeforecopy"in c&&typeof clipboardData!="undefined"?(d.addListener(c,"beforecopy",function(a){var c=b.getCopyText();c?clipboardData.setData("Text",c):a.preventDefault()}),d.addListener(a,"keydown",function(a){if(a.ctrlKey&&a.keyCode==88){var c=b.getCopyText();c&&(clipboardData.setData("Text",c),b.onCut()),d.preventDefault(a)}})):(d.addListener(c,"copy",s),d.addListener(c,"cut",t)),d.addListener(c,"compositionstart",p),e.isGecko&&d.addListener(c,"text",q),e.isWebKit&&d.addListener(c,"keyup",q),d.addListener(c,"compositionend",r),d.addListener(c,"blur",function(){b.onBlur()}),d.addListener(c,"focus",function(){b.onFocus(),l()}),this.focus=function(){b.onFocus(),l(),c.focus()},this.blur=function(){c.blur()},this.isFocused=v,this.getElement=function(){return c},this.onContextMenu=function(a,b){a&&(k||(k=c.style.cssText),c.style.cssText="position:fixed; z-index:1000;left:"+(a.x-2)+"px; top:"+(a.y-2)+"px;"),b&&(c.value="")},this.onContextMenuClose=function(){setTimeout(function(){k&&(c.style.cssText=k,k=""),m()},0)}};b.TextInput=g}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("./default_handlers").DefaultHandlers,f=a("./default_gutter_handler").GutterHandler,g=a("./mouse_event").MouseEvent,h=function(a){this.editor=a,new e(a),new f(a),d.addListener(a.container,"mousedown",function(b){return a.focus(),d.preventDefault(b)}),d.addListener(a.container,"selectstart",function(a){return d.preventDefault(a)});var b=a.renderer.getMouseEventTarget();d.addListener(b,"mousedown",this.onMouseEvent.bind(this,"mousedown")),d.addListener(b,"click",this.onMouseEvent.bind(this,"click")),d.addListener(b,"mousemove",this.onMouseMove.bind(this,"mousemove")),d.addMultiMouseDownListener(b,0,2,500,this.onMouseEvent.bind(this,"dblclick")),d.addMultiMouseDownListener(b,0,3,600,this.onMouseEvent.bind(this,"tripleclick")),d.addMultiMouseDownListener(b,0,4,600,this.onMouseEvent.bind(this,"quadclick")),d.addMouseWheelListener(a.container,this.onMouseWheel.bind(this,"mousewheel"));var c=a.renderer.$gutter;d.addListener(c,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),d.addListener(c,"click",this.onMouseEvent.bind(this,"gutterclick")),d.addListener(c,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),d.addListener(c,"mousemove",this.onMouseMove.bind(this,"gutter"))};((function(){this.$scrollSpeed=1,this.setScrollSpeed=function(a){this.$scrollSpeed=a},this.getScrollSpeed=function(){return this.$scrollSpeed},this.onMouseEvent=function(a,b){this.editor._emit(a,new g(b,this.editor))},this.$dragDelay=250,this.setDragDelay=function(a){this.$dragDelay=a},this.getDragDelay=function(){return this.$dragDelay},this.onMouseMove=function(a,b){var c=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!c||!c.length)return;this.editor._emit(a,new g(b,this.editor))},this.onMouseWheel=function(a,b){var c=new g(b,this.editor);c.speed=this.$scrollSpeed*2,c.wheelX=b.wheelX,c.wheelY=b.wheelY,this.editor._emit(a,c)}})).call(h.prototype),b.MouseHandler=h}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/event","ace/lib/dom","ace/lib/browser_focus"],function(a,b,c){function k(a){this.editor=a,this.$clickSelection=null,this.browserFocus=new f,a.setDefaultHandler("mousedown",this.onMouseDown.bind(this)),a.setDefaultHandler("dblclick",this.onDoubleClick.bind(this)),a.setDefaultHandler("tripleclick",this.onTripleClick.bind(this)),a.setDefaultHandler("quadclick",this.onQuadClick.bind(this)),a.setDefaultHandler("mousewheel",this.onScroll.bind(this))}function l(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}"use strict";var d=a("../lib/event"),e=a("../lib/dom"),f=a("../lib/browser_focus").BrowserFocus,g=0,h=1,i=2,j=5;((function(){this.onMouseDown=function(a){function C(b){a.getShiftKey()?m.selection.selectToPosition(b):n.$clickSelection||(m.moveCursorToPosition(b),m.selection.clearSelection(b.row,b.column)),q=h}var b=a.inSelection(),c=a.pageX,f=a.pageY,k=a.getDocumentPosition(),m=this.editor,n=this,o=m.getSelectionRange(),p=o.isEmpty(),q=g;if(b&&(!this.browserFocus.isFocused()||(new Date).getTime()-this.browserFocus.lastFocus<20||!m.isFocused())){m.focus();return}var r=a.getButton();if(r!==0){p&&m.moveCursorToPosition(k),r==2&&(m.textInput.onContextMenu({x:a.clientX,y:a.clientY},p),d.capture(m.container,function(){},m.textInput.onContextMenuClose));return}b||C(k);var s=c,t=f,u=(new Date).getTime(),v,w,x,y=function(a){s=d.getDocumentX(a),t=d.getDocumentY(a)},z=function(a){clearInterval(F),q==g?C(k):q==i&&A(a),n.$clickSelection=null,q=g},A=function(a){e.removeCssClass(m.container,"ace_dragging"),m.session.removeMarker(x),m.$mouseHandler.$clickSelection||v||(m.moveCursorToPosition(k),m.selection.clearSelection(k.row,k.column));if(!v)return;if(w.contains(v.row,v.column)){v=null;return}m.clearSelection();if(a&&(a.ctrlKey||a.altKey))var b=m.session,c=b.insert(v,b.getTextRange(w));else var c=m.moveText(w,v);if(!c){v=null;return}m.selection.setSelectionRange(c)},B=function(){if(q==g){var a=l(c,f,s,t),b=(new Date).getTime();if(a>j){q=h;var d=m.renderer.screenToTextCoordinates(s,t);d.row=Math.max(0,Math.min(d.row,m.session.getLength()-1)),C(d)}else if(b-u>m.getDragDelay()){q=i,w=m.getSelectionRange();var k=m.getSelectionStyle();x=m.session.addMarker(w,"ace_selection",k),m.clearSelection(),e.addCssClass(m.container,"ace_dragging")}}q==i?E():q==h&&D()},D=function(){var a,b=m.renderer.screenToTextCoordinates(s,t);b.row=Math.max(0,Math.min(b.row,m.session.getLength()-1)),n.$clickSelection?n.$clickSelection.contains(b.row,b.column)?m.selection.setSelectionRange(n.$clickSelection):(n.$clickSelection.compare(b.row,b.column)==-1?a=n.$clickSelection.end:a=n.$clickSelection.start,m.selection.setSelectionAnchor(a.row,a.column),m.selection.selectToPosition(b)):m.selection.selectToPosition(b),m.renderer.scrollCursorIntoView()},E=function(){v=m.renderer.screenToTextCoordinates(s,t),v.row=Math.max(0,Math.min(v.row,m.session.getLength()-1)),m.moveCursorToPosition(v)};d.capture(m.container,y,z);var F=setInterval(B,20);return a.preventDefault()},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectWord(),this.$clickSelection=c.getSelectionRange()},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectLine(),this.$clickSelection=c.getSelectionRange()},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange()},this.onScroll=function(a){var b=this.editor;b.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed);if(b.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed))return a.preventDefault()}})).call(k.prototype),b.DefaultHandlers=k}),define("ace/lib/browser_focus",["require","exports","module","ace/lib/oop","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./oop"),e=a("./event"),f=a("./event_emitter").EventEmitter,g=function(a){a=a||window,this.lastFocus=(new Date).getTime(),this._isFocused=!0;var b=this;"onfocusin"in a.document?(e.addListener(a.document,"focusin",function(a){b._setFocused(!0)}),e.addListener(a.document,"focusout",function(a){b._setFocused(!!a.toElement)})):(e.addListener(a,"blur",function(a){b._setFocused(!1)}),e.addListener(a,"focus",function(a){b._setFocused(!0)}))};((function(){d.implement(this,f),this.isFocused=function(){return this._isFocused},this._setFocused=function(a){if(this._isFocused==a)return;a&&(this.lastFocus=(new Date).getTime()),this._isFocused=a,this._emit("changeFocus")}})).call(g.prototype),b.BrowserFocus=g}),define("ace/lib/event_emitter",["require","exports","module"],function(a,b,c){"use strict";var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{},this._defaultHandlers=this._defaultHandlers||{};var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(!c.length&&!d)return;b=b||{},b.type=a,b.stopPropagation||(b.stopPropagation=function(){this.propagationStopped=!0}),b.preventDefault||(b.preventDefault=function(){this.defaultPrevented=!0});for(var e=0;e=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510}d.implement(this,f),this.setDocument=function(a){if(this.doc)throw new Error("Document is already set");this.doc=a,a.on("change",this.onChange.bind(this)),this.on("changeFold",this.onChangeFold.bind(this)),this.bgTokenizer&&(this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0))},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(a==0){this.$rowCache=[];return}var b=this.$rowCache;for(var c=0;c=a){b.splice(c,b.length);return}},this.onChangeFold=function(a){var b=a.data;this.$resetRowCache(b.start.row)},this.onChange=function(a){var b=a.data;this.$modified=!0,this.$resetRowCache(b.range.start.row);var c=this.$updateInternalDataOnChange(a);!this.$fromUndo&&this.$undoManager&&!b.ignore&&(this.$deltasDoc.push(b),c&&c.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:c}),this.$informUndoManager.schedule()),this.bgTokenizer.start(b.range.start.row),this._emit("change",a)},this.setValue=function(a){this.doc.setValue(a),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(a){return this.bgTokenizer.getState(a)},this.getTokens=function(a,b){return this.bgTokenizer.getTokens(a,b)},this.getTokenAt=function(a,b){var c=this.bgTokenizer.getTokens(a,a)[0].tokens,d,e=0;if(b==null)f=c.length-1,e=this.getLine(a).length;else for(var f=0;f=b)break}return d=c[f],d?(d.index=f,d.start=e-d.value.length,d):null},this.setUndoManager=function(a){this.$undoManager=a,this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b]}),b.$deltas=[]},this.$informUndoManager=e.deferredCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?e.stringRepeat(" ",this.getTabSize()):"\t"},this.$useSoftTabs=!0,this.setUseSoftTabs=function(a){if(this.$useSoftTabs===a)return;this.$useSoftTabs=a},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.$tabSize=4,this.setTabSize=function(a){if(isNaN(a)||this.$tabSize===a)return;this.$modified=!0,this.$tabSize=a,this._emit("changeTabSize")},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(a){if(this.$overwrite==a)return;this.$overwrite=a,this._emit("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe));var e=d?this.tokenRe:this.nonTokenRe,f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}var g=b;while(g=this.doc.getLength()-1)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a+1,c),1},this.duplicateLines=function(a,b){var a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b),c=this.getLines(a,b);this.doc.insertLines(a,c);var d=b-a+1;return d},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipColumnToRow=function(a,b){return b<0?0:Math.min(this.doc.getLine(a).length,b)},this.$clipPositionToDocument=function(a,b){b=Math.max(0,b);if(a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$clipRangeToDocument=function(a){a.start.row<0?(a.start.row=0,a.start.column=0):a.start.column=this.$clipColumnToRow(a.start.row,a.start.column);var b=this.doc.getLength()-1;return a.end.row>b?(a.end.row=b,a.end.column=this.doc.getLine(b).length):a.end.column=this.$clipColumnToRow(a.end.row,a.end.column),a},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0);if(a){var b=this.getLength();this.$wrapData=[];for(var c=0;c0?(this.$wrapLimit=b,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._emit("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(a){var b=this.$wrapLimitRange.min;b&&(a=Math.max(b,a));var c=this.$wrapLimitRange.max;return c&&(a=Math.min(c,a)),Math.max(1,a)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;d.indexOf("Lines")!=-1?(d=="insertLines"?f=e+a.data.lines.length:f=e,c=a.data.lines?a.data.lines.length:f-e):c=f-e;if(c!=0)if(d.indexOf("remove")!=-1){b&&this.$wrapData.splice(e,c);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-c);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l=h.row&&k.shiftRow(-c)}f=e}else{var n;if(b){n=[e,0];for(var o=0;o=e&&k.shiftRow(c)}}else{c=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),c=-c);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,c)}return b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),b&&this.$updateWrapData(e,f),i},this.$updateWrapData=function(a,b){var c=this.doc.getAllLines(),d=this.getTabSize(),f=this.$wrapData,i=this.$wrapLimit,j,k,m=a;b=Math.min(b,c.length-1);while(m<=b){k=this.getFoldLine(m,k);if(!k)j=this.$getDisplayTokens(e.stringTrimRight(c[m])),f[m]=this.$computeWrapSplits(j,i,d),m++;else{j=[],k.walk(function(a,b,d,e){var f;if(a){f=this.$getDisplayTokens(a,j.length),f[0]=g;for(var i=1;i=l)j.pop();f[k.start.row]=this.$computeWrapSplits(j,i,d),m=k.end.row+1}}};var b=1,c=2,g=3,h=4,j=9,l=10,m=11,n=12;this.$computeWrapSplits=function(a,b){function i(b){var d=a.slice(e,b),g=d.length;d.join("").replace(/12/g,function(){g-=1}).replace(/2/g,function(){g-=1}),f+=g,c.push(f),e=b}if(a.length==0)return[];var c=[],d=a.length,e=0,f=0;while(d-e>b){var k=e+b;if(a[k]>=l){while(a[k]>=l)k++;i(k);continue}if(a[k]==g||a[k]==h){for(k;k!=e-1;k--)if(a[k]==g)break;if(k>e){i(k);continue}k=e+b;for(k;km&&a[k]m&&a[k]==j)k--;if(k>m){i(++k);continue}k=e+b,i(k)}return c},this.$getDisplayTokens=function(a,d){var e=[],f;d=d||0;for(var g=0;g39&&h<48||h>57&&h<64?e.push(j):h>=4352&&o(h)?e.push(b,c):e.push(b)}return e},this.$getStringScreenWidth=function(a,b,c){if(b==0)return[0,0];b==null&&(b=c+a.length*Math.max(this.getTabSize(),2)),c=c||0;var d,e;for(e=0;e=4352&&o(d)?c+=2:c+=1;if(c>b)break}return[c,e]},this.getRowLength=function(a){return!this.$useWrapMode||!this.$wrapData[a]?1:this.$wrapData[a].length+1},this.getRowHeight=function(a,b){return this.getRowLength(b)*a.lineHeight},this.getScreenLastRowColumn=function(a){return this.documentToScreenColumn(a,this.doc.getLine(a).length)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:undefined},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d=0,e=0,f,g=0,h=0,i=this.$rowCache;for(var j=0;j=a||d>=l)break;g+=h,d++,d>n&&(d=m.end.row+1,m=this.getNextFoldLine(d,m),n=m?m.start.row:Infinity),k&&i.push({docRow:d,screenRow:g})}if(m&&m.start.row<=d)c=this.getFoldDisplayLine(m),d=m.start.row;else{if(g+h<=a||d>l)return{row:l,column:this.getLine(l).length};c=this.getLine(d),m=null}if(this.$useWrapMode){var o=this.$wrapData[d];o&&(f=o[a-g],a>g&&o.length&&(e=o[a-g-1]||o[o.length-1],c=c.substring(e)))}return e+=this.$getStringScreenWidth(c,b)[1],this.$useWrapMode?e>=f&&(e=f-1):e=Math.min(e,c.length),m?m.idxToPosition(e):{row:d,column:e}},this.documentToScreenPosition=function(a,b){if(typeof b=="undefined")var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d;if(this.$useWrapMode){d=this.$wrapData;if(a>d.length-1)return{row:this.getScreenLength(),column:d.length==0?0:d[d.length-1].length-1}}var e=0,f=null,g=null;g=this.getFoldAt(a,b,1),g&&(a=g.start.row,b=g.start.column);var h,i=0,j=this.$rowCache;for(var k=0;k=n){h=m.end.row+1;if(h>a)break;m=this.getNextFoldLine(h,m),n=m?m.start.row:Infinity}else h=i+1;e+=this.getRowLength(i),i=h,l&&j.push({docRow:i,screenRow:e})}var o="";m&&i>=n?(o=this.getFoldDisplayLine(m,a,b),f=m.start.row):(o=this.getLine(a).substring(0,b),f=a);if(this.$useWrapMode){var p=d[f],q=0;while(o.length>=p[q])e++,q++;o=o.substring(p[q-1]||0,o.length)}return{row:e,column:this.$getStringScreenWidth(o)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null;if(!this.$useWrapMode){a=this.getLength();var c=this.$foldData;for(var d=0;dg&&(f=b.end.row+1,b=this.$foldData[d++],g=b?b.start.row:Infinity)}return a}})).call(l.prototype),a("./edit_session/folding").Folding.call(l.prototype),a("./edit_session/bracket_match").BracketMatch.call(l.prototype),b.EditSession=l}),define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/event_emitter").EventEmitter,g=a("./range").Range,h=function(a){this.session=a,this.doc=a.getDocument(),this.clearSelection(),this.selectionLead=this.doc.createAnchor(0,0),this.selectionAnchor=this.doc.createAnchor(0,0);var b=this;this.selectionLead.on("change",function(a){b._emit("changeCursor"),b.$isEmpty||b._emit("changeSelection"),!b.$preventUpdateDesiredColumnOnChange&&a.old.column!=a.value.column&&b.$updateDesiredColumn()}),this.selectionAnchor.on("change",function(){b.$isEmpty||b._emit("changeSelection")})};((function(){d.implement(this,f),this.isEmpty=function(){return this.$isEmpty||this.selectionAnchor.row==this.selectionLead.row&&this.selectionAnchor.column==this.selectionLead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.selectionLead.getPosition()},this.setSelectionAnchor=function(a,b){this.selectionAnchor.setPosition(a,b),this.$isEmpty&&(this.$isEmpty=!1,this._emit("changeSelection"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.selectionAnchor.getPosition()},this.getSelectionLead=function(){return this.selectionLead.getPosition()},this.shiftSelection=function(a){if(this.$isEmpty){this.moveCursorTo(this.selectionLead.row,this.selectionLead.column+a);return}var b=this.getSelectionAnchor(),c=this.getSelectionLead(),d=this.isBackwards();(!d||b.column!==0)&&this.setSelectionAnchor(b.row,b.column+a),(d||c.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(c.row,c.column+a)})},this.isBackwards=function(){var a=this.selectionAnchor,b=this.selectionLead;return a.row>b.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.selectionAnchor,b=this.selectionLead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(a,this.doc.getLine(a).length),this.moveCursorTo(0,0)},this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.$updateDesiredColumn()},this.$updateDesiredColumn=function(){var a=this.getCursor();this.$desiredColumn=this.session.documentToScreenColumn(a.row,a.column)},this.$moveSelection=function(a){var b=this.selectionLead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.selectWord=function(){var a=this.getCursor(),b=this.session.getWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectAWord=function(){var a=this.getCursor(),b=this.session.getAWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectLine=function(){var a=this.selectionLead.row,b,c=this.session.getFoldLine(a);c?(a=c.start.row,b=c.end.row):b=a,this.setSelectionAnchor(a,0),this.$moveSelection(function(){this.moveCursorTo(b+1,0)})},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,-1))this.moveCursorTo(b.start.row,b.start.column);else if(a.column==0)a.row>0&&this.moveCursorTo(a.row-1,this.doc.getLine(a.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column-c,a.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,1))this.moveCursorTo(b.end.row,b.end.column);else if(this.selectionLead.column==this.doc.getLine(this.selectionLead.row).length)this.selectionLead.row=c.length){this.moveCursorTo(a,c.length),this.moveCursorRight(),a0&&this.moveCursorWordLeft();return}if(g=this.session.tokenRe.exec(f))b-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(a,b)},this.moveCursorBy=function(a,b){var c=this.session.documentToScreenPosition(this.selectionLead.row,this.selectionLead.column),d=b===0&&this.$desiredColumn||c.column,e=this.session.screenToDocumentPosition(c.row+a,d);this.moveCursorTo(e.row,e.column+b,b===0)},this.moveCursorToPosition=function(a){this.moveCursorTo(a.row,a.column)},this.moveCursorTo=function(a,b,c){var d=this.session.getFoldAt(a,b,1);d&&(a=d.start.row,b=d.start.column),this.$preventUpdateDesiredColumnOnChange=!0,this.selectionLead.setPosition(a,b),this.$preventUpdateDesiredColumnOnChange=!1,c||this.$updateDesiredColumn(this.selectionLead.column)},this.moveCursorToScreen=function(a,b,c){var d=this.session.screenToDocumentPosition(a,b);a=d.row,b=d.column,this.moveCursorTo(a,b,c)}})).call(h.prototype),b.Selection=h}),define("ace/range",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};((function(){this.isEequal=function(a){return this.start.row==a.start.row&&this.end.row==a.end.row&&this.start.column==a.start.column&&this.end.column==a.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),b==1?(b=this.compare(d.row,d.column),b==1?2:b==0?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:b==1?42:0)},this.comparePoint=function(a){return this.compare(a.row,a.column)},this.containsRange=function(a){return this.comparePoint(a.start)==0&&this.comparePoint(a.end)==0},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)||this.isStart(a,b)?!1:!0:!1},this.insideStart=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)?!1:!0:!1},this.insideEnd=function(a,b){return this.compare(a,b)==0?this.isStart(a,b)?!1:!0:!1},this.compare=function(a,b){return!this.isMultiLine()&&a===this.start.row?bthis.end.column?1:0:athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.row=0&&/^[\w\d]/.test(h)||e<=g&&/[\w\d]$/.test(h))return;h=f.substring(c.start.column,c.end.column);if(!/^[\w\d]+$/.test(h))return;var i=a.getCursorPosition(),j={wrap:!0,wholeWord:!0,caseSensitive:!0,needle:h},k=a.$search.getOptions();a.$search.set(j);var l=a.$search.findAll(b);l.forEach(function(a){if(!a.contains(i.row,i.column)){var c=b.addMarker(a,"ace_selected_word","text");b.$selectionOccurrences.push(c)}}),a.$search.set(k)},this.clearSelectionHighlight=function(a){if(!a.session.$selectionOccurrences)return;a.session.$selectionOccurrences.forEach(function(b){a.session.removeMarker(b)}),a.session.$selectionOccurrences=[]},this.createModeDelegates=function(a){if(!this.$embeds)return;this.$modes={};for(var b=0;b1&&(m=g.slice(n+2,n+1+e[n].len)),typeof l.token=="function"?k=l.token.apply(this,m):k=l.token;var o=l.next;o&&o!==c&&(c=o,d=this.rules[c],e=this.matchMappings[c],i=f.lastIndex,f=this.regExps[c],f.lastIndex=i);break}if(m[0]){typeof k=="string"&&(m=[m.join("")],k=[k]);for(var n=0;n=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length),a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};return this._emit("change",{data:e}),d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._emit("change",{data:d}),c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._emit("change",{data:e}),d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b==c)return;var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._emit("change",{data:i}),d.start},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._emit("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._emit("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}})).call(h.prototype),b.Document=h}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=b.Anchor=function(a,b,c){this.document=a,typeof c=="undefined"?this.setPosition(b.row,b.column):this.setPosition(b,c),this.$onChange=this.onChange.bind(this),a.on("change",this.$onChange)};((function(){d.implement(this,e),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&c.start.row!=this.row)return;if(c.start.row>this.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}})).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(!c.running)return;var a=new Date,b=c.currentLine,d=c.doc,e=0,f=d.getLength();while(c.currentLine20){c.fireUpdateEvent(b,c.currentLine-1),c.running=setTimeout(c.$worker,20);return}}c.running=!1,c.fireUpdateEvent(b,f-1)}};((function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._emit("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a,b){return this.$tokenizeRows(a,b)},this.getState=function(a){return this.$tokenizeRows(a,a)[0].state},this.$tokenizeRows=function(a,b){if(!this.doc||isNaN(a)||isNaN(b))return[{state:"start",tokens:[]}];var c=[],d="start",e=!1;a>0&&this.lines[a-1]?(d=this.lines[a-1].state,e=!0):a==0?(d="start",e=!0):this.lines.length>0&&(d=this.lines[this.lines.length-1].state);var f=this.doc.getLines(a,b);for(var g=a;g<=b;g++)if(!this.lines[g]){var h=this.tokenizer.getLineTokens(f[g-a]||"",d),d=h.state;c.push(h),e&&(this.lines[g]=h)}else{var h=this.lines[g];d=h.state,c.push(h)}return c}})).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(a,b,c){function h(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;var e=d.folds;for(var f=0;f=a)return e;if(e.end.row>a)return null}return null},this.getNextFoldLine=function(a,b){var c=this.$foldData,d=0;b&&(d=c.indexOf(b)),d==-1&&(d=0);for(d;d=a)return e}return null},this.getFoldedRowCount=function(a,b){var c=this.$foldData,d=b-a+1;for(var e=0;e=b){h=a?d-=b-h:d=0);break}g>=a&&(h>=a?d-=g-h:d-=g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c=this.$foldData,d=!1,g;a instanceof f?g=a:g=new f(b,a),this.$clipRangeToDocument(g.range);var h=g.start.row,i=g.start.column,j=g.end.row,k=g.end.column;if(g.placeholder.length<2)throw"Placeholder has to be at least 2 characters";if(h==j&&k-i<2)throw"The range has to be at least 2 characters width";var l=this.getFoldAt(h,i,1),m=this.getFoldAt(j,k,-1);if(l&&m==l)return l.addSubFold(g);if(l&&!l.range.isStart(h,i)||m&&!m.range.isEnd(j,k))throw"A fold can't intersect already existing fold"+g.range+l.range;var n=this.getFoldsInRange(g.range);n.length>0&&(this.removeFolds(n),g.subFolds=n);for(var o=0;othis.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else if(a.end.row==this.start.row)this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column;else throw"Trying to add fold to FoldRow that doesn't have a matching row";a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d=0,e=this.folds,f,g,h,i=!0;b==null&&(b=this.end.row,c=this.end.column);for(var j=0;j=this.$rowTokens.length){this.$row+=1;if(this.$row>=a)return this.$row=a-1,null;this.$rowTokens=this.$session.getTokens(this.$row,this.$row)[0].tokens,this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var a=this.$rowTokens,b=this.$tokenIndex,c=a[b].start;if(c!==undefined)return c;c=0;while(b>0)b-=1,c+=a[b].value.length;return c}})).call(d.prototype),b.TokenIterator=d}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator"],function(a,b,c){function e(){this.findMatchingBracket=function(a){if(a.column==0)return null;var b=this.getLine(a.row).charAt(a.column-1);if(b=="")return null;var c=b.match(/([\(\[\{])|([\)\]\}])/);return c?c[1]?this.$findClosingBracket(c[1],a):this.$findOpeningBracket(c[2],a):null},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("rparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn()-2,j=g.value;for(;;){while(i>=0){var k=j.charAt(i);if(k==c){e-=1;if(e==0)return{row:f.getCurrentTokenRow(),column:i+f.getCurrentTokenColumn()}}else k==a&&(e+=1);i-=1}do g=f.stepBackward();while(g&&!h.test(g.type));if(g==null)break;j=g.value,i=j.length-1}return null},this.$findClosingBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("lparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn();for(;;){var j=g.value,k=j.length;while(i=0;h--){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$rangeFromMatch=function(a,b,c){return new f(a,b,a,b+c)},this.$assembleRegExp=function(){if(this.$options.regExp)var a=this.$options.needle;else a=d.escapeRegExp(this.$options.needle);this.$options.wholeWord&&(a="\\b"+a+"\\b");var b="g";this.$options.caseSensitive||(b+="i");var c=new RegExp(a,b);return c},this.$forwardLineIterator=function(a){function k(e){var f=a.getLine(e);return b&&e==c.end.row&&(f=f.substring(0,c.end.column)),j&&e==d.row&&(f=f.substring(0,d.column)),f}var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"start":"end"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap,j=!1;return{forEach:function(a){var b=d.row,c=k(b),g=d.column,l=!1;j=!1;while(!a(c,g,b)){if(l)return;b++,g=0;if(b>h)if(i)b=e,g=f,j=!0;else return;b==d.row&&(l=!0),c=k(b)}}}},this.$backwardLineIterator=function(a){var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"end":"start"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap;return{forEach:function(g){var j=d.row,k=a.getLine(j).substring(0,d.column),l=0,m=!1,n=!1;while(!g(k,l,j)){if(m)return;j--,l=0;if(j0},this.hasRedo=function(){return this.$redoStack.length>0}})).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/lib/event_emitter","text!ace/css/editor.css"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/useragent"),h=a("./layer/gutter").Gutter,i=a("./layer/marker").Marker,j=a("./layer/text").Text,k=a("./layer/cursor").Cursor,l=a("./scrollbar").ScrollBar,m=a("./renderloop").RenderLoop,n=a("./lib/event_emitter").EventEmitter,o=a("text!./css/editor.css");e.importCssString(o,"ace_editor");var p=function(a,b){var c=this;this.container=a,e.addCssClass(a,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new h(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onResize.bind(this,!0)),this.$markerBack=new i(this.content);var d=this.$textLayer=new j(this.content);this.canvas=d.element,this.$markerFront=new i(this.content),this.characterWidth=d.getCharacterWidth(),this.lineHeight=d.getLineHeight(),this.$cursorLayer=new k(this.content),this.$cursorPadding=8,this.$horizScroll=!0,this.$horizScrollAlwaysVisible=!0,this.scrollBar=new l(a),this.scrollBar.addEventListener("scroll",function(a){c.session.setScrollTop(a.data)}),this.scrollTop=0,this.scrollLeft=0,f.addListener(this.scroller,"scroll",function(){c.session.setScrollLeft(c.scroller.scrollLeft)}),this.cursorPos={row:0,column:0},this.$textLayer.addEventListener("changeCharaterSize",function(){c.characterWidth=d.getCharacterWidth(),c.lineHeight=d.getLineHeight(),c.$updatePrintMargin(),c.onResize(!0),c.$loop.schedule(c.CHANGE_FULL)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new m(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.setPadding(4),this.$updatePrintMargin()};((function(){this.showGutter=!0,this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,d.implement(this,n),this.setSession=function(a){this.session=a,this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(a,b){b===undefined&&(b=Infinity),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRowc.lastRow+1)return;if(bc&&this.session.setScrollTop(c),this.scrollTop+this.$size.scrollerHeightb&&(bthis.layerConfig.width+2*this.$padding?this.$desiredScrollLeft=b:this.scrollToX(Math.round(b+this.characterWidth-this.$size.scrollerWidth)))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollTop()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(a){this.session.setScrollTop(a*this.lineHeight)},this.scrollToLine=function(a,b){var c={lineHeight:this.lineHeight},d=0;for(var e=1;e0)return!0;if(b>0&&this.session.getScrollTop()+this.$size.scrollerHeighth&&(e=g.end.row+1,g=this.session.getNextFoldLine(e,g),h=g?g.start.row:Infinity);if(e>f)break;var j=this.$annotations[e]||b;c.push("
    ",e+1);if(i){var k=i[e];k==null&&(k=i[e]=this.session.getFoldWidget(e)),k&&c.push("")}var l=this.session.getRowLength(e)-1;while(l--)c.push("
    ¦");c.push("
    "),e++}this.element=d.setInnerHtml(this.element,c.join("")),this.element.style.height=a.minHeight+"px";var m=this.element.offsetWidth;m!==this.gutterWidth&&(this.gutterWidth=m,this._emit("changeGutterWidth",m))},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(a){a?d.addCssClass(this.element,"ace_folding-enabled"):d.removeCssClass(this.element,"ace_folding-enabled"),this.$showFoldWidgets=a},this.getShowFoldWidgets=function(){return this.$showFoldWidgets}})).call(g.prototype),b.Gutter=g}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../range").Range,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};((function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(!a)return;this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c],f=d.range.clipRows(a.firstRow,a.lastRow);if(f.isEmpty())continue;f=f.toScreenRange(this.session);if(d.renderer){var g=this.$getTop(f.start.row,a),h=Math.round(this.$padding+f.start.column*a.characterWidth);d.renderer(b,f,h,g,a)}else f.isMultiLine()?d.type=="text"?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a,d.type):this.drawSingleLineMarker(b,f,d.clazz,a,null,d.type)}this.element=e.setInnerHtml(this.element,b.join(""))},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e){var f=b.start.row,g=new d(f,b.start.column,f,this.session.getScreenLastRowColumn(f));this.drawSingleLineMarker(a,g,c,e,1,"text"),f=b.end.row,g=new d(f,0,f,b.end.column),this.drawSingleLineMarker(a,g,c,e,0,"text");for(f=b.start.row+1;f"),j=this.$getTop(b.end.row,d),i=Math.round(b.end.column*d.characterWidth),a.push("
    "),h=(b.end.row-b.start.row-1)*d.lineHeight;if(h<0)return;j=this.$getTop(b.start.row+1,d),a.push("
    ")},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=f==="background"?0:this.$padding,h=d.lineHeight;if(f==="background")var i=d.width;else i=Math.round((b.end.column+(e||0)-b.start.column)*d.characterWidth);var j=this.$getTop(b.start.row,d),k=Math.round(g+b.start.column*d.characterWidth);a.push("
    ")}})).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=a("../lib/useragent"),h=a("../lib/event_emitter").EventEmitter,i=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",a.appendChild(this.element),this.$characterSize=this.$measureSizes()||{width:0,height:0},this.$pollSizeChanges()};((function(){d.implement(this,h),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var a=this.$measureSizes();a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)&&(this.$characterSize=a,this._emit("changeCharaterSize",{data:a}))},this.$pollSizeChanges=function(){var a=this;this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=function(){var a=1e3;if(!this.$measureNode){var b=this.$measureNode=e.createElement("div"),c=b.style;c.width=c.height="auto",c.left=c.top=-a*40+"px",c.visibility="hidden",c.position="absolute",c.overflow="visible",c.whiteSpace="nowrap",b.innerHTML=f.stringRepeat("Xy",a);if(this.element.ownerDocument.body)this.element.ownerDocument.body.appendChild(b);else{var d=this.element.parentNode;while(!e.hasCssClass(d,"ace_editor"))d=d.parentNode;d.appendChild(b)}}var c=this.$measureNode.style,g=e.computedStyle(this.element);for(var h in this.$fontStyles)c[h]=g[h];var i={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(a*2)};return i.width==0&&i.height==0?null:i},this.setSession=function(a){this.session=a},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles==a?!1:(this.showInvisibles=a,!0)},this.$tabStrings=[],this.$computeTabString=function(){var a=this.session.getTabSize(),b=this.$tabStrings=[0];for(var c=1;c"+this.TAB_CHAR+(new Array(c)).join(" ")+""):b.push((new Array(c+1)).join(" "))},this.updateLines=function(a,b,c){this.$computeTabString(),(this.config.lastRow!=a.lastRow||this.config.firstRow!=a.firstRow)&&this.scrollLines(a),this.config=a;var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0;for(var i=a.firstRow;i0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRowb.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){var d=this.element.ownerDocument.createDocumentFragment(),f=b,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>c)break;var i=e.createElement("div"),j=[],k=this.session.getTokens(f,f);k.length==1&&this.$renderLine(j,f,k[0].tokens,!1),i.innerHTML=j.join("");if(this.$useLineGroups())i.className="ace_line_group",d.appendChild(i);else{var l=i.childNodes;while(l.length)d.appendChild(l[0])}f++}return d},this.update=function(a){this.$computeTabString(),this.config=a;var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>d)break;this.$useLineGroups()&&b.push("
    ");var i=this.session.getTokens(f,f);i.length==1&&this.$renderLine(b,f,i[0].tokens,!1),this.$useLineGroups()&&b.push("
    "),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,f=/\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])|[\u1100-\u115F]|[\u11A3-\u11A7]|[\u11FA-\u11FF]|[\u2329-\u232A]|[\u2E80-\u2E99]|[\u2E9B-\u2EF3]|[\u2F00-\u2FD5]|[\u2FF0-\u2FFB]|[\u3000-\u303E]|[\u3041-\u3096]|[\u3099-\u30FF]|[\u3105-\u312D]|[\u3131-\u318E]|[\u3190-\u31BA]|[\u31C0-\u31E3]|[\u31F0-\u321E]|[\u3220-\u3247]|[\u3250-\u32FE]|[\u3300-\u4DBF]|[\u4E00-\uA48C]|[\uA490-\uA4C6]|[\uA960-\uA97C]|[\uAC00-\uD7A3]|[\uD7B0-\uD7C6]|[\uD7CB-\uD7FB]|[\uF900-\uFAFF]|[\uFE10-\uFE19]|[\uFE30-\uFE52]|[\uFE54-\uFE66]|[\uFE68-\uFE6B]|[\uFF01-\uFF60]|[\uFFE0-\uFFE6]/g,h=function(a,c,d,f,h){if(a.charCodeAt(0)==32)return(new Array(a.length+1)).join(" ");if(a=="\t"){var i=e.session.getScreenTabSize(b+f);return b+=i-1,e.$tabStrings[i]}if(a=="&")return g.isOldGecko?"&":"&";if(a=="<")return"<";if(a==" "){var j=e.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1,""+k+""}if(a.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)){if(e.showInvisibles){var k=(new Array(a.length+1)).join(e.SPACE_CHAR);return""+k+""}return" "}return b+=1,""+a+""},i=d.replace(f,h);if(!this.$textToken[c.type]){var j="ace_"+c.type.replace(/\./g," ace_"),k="";c.type=="fold"&&(k=" style='width:"+c.value.length*this.config.characterWidth+"px;' "),a.push("",i,"")}else a.push(i);return b+d.length},this.$renderLineCore=function(a,b,c,d,e){var f=0,g=0,h,i=0,j=this;!d||d.length==0?h=Number.MAX_VALUE:h=d[0],e||a.push("
    ");for(var k=0;k=h)i=j.$renderToken(a,i,l,m.substring(0,h-f)),m=m.substring(h-f),f=h,e||a.push("
    ","
    "),g++,i=0,h=d[g]||Number.MAX_VALUE;m.length!=0&&(f+=m.length,i=j.$renderToken(a,i,l,m))}}this.showInvisibles&&(b!==this.session.getLength()-1?a.push(""+this.EOL_CHAR+""):a.push(""+this.EOF_CHAR+"")),e||a.push("
    ")},this.$renderLine=function(a,b,c,d){if(!this.session.isRowFolded(b)){var e=this.session.getRowSplitData(b);this.$renderLineCore(a,b,c,e,d)}else this.$renderFoldLine(a,b,c,d)},this.$renderFoldLine=function(a,b,c,d){function h(a,b,c){var d=0,e=0;while(e+a[d].value.lengthc-b&&(f=f.substring(0,c-b)),g.push({type:a[d].type,value:f}),e=b+f.length,d+=1}while(ec&&(f=f.substring(0,c-e)),g.push({type:a[d].type,value:f}),e+=f.length,d+=1}}var e=this.session,f=e.getFoldLine(b),g=[];f.walk(function(a,b,d,e,f){a?g.push({type:"fold",value:a}):(f&&(c=this.session.getTokens(b,b)[0].tokens),c.length!=0&&h(c,e,d))}.bind(this),f.end.row,this.session.getLine(f.end.row).length);var i=this.session.$useWrapMode?this.session.$wrapData[b]:null;this.$renderLineCore(a,b,g,i,d)},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}})).call(i.prototype),b.Text=i}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),this.cursor=d.createElement("div"),this.cursor.className="ace_cursor ace_hidden",this.element.appendChild(this.cursor),this.isVisible=!1};((function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.hideCursor=function(){this.isVisible=!1,d.addCssClass(this.cursor,"ace_hidden"),clearInterval(this.blinkId)},this.showCursor=function(){this.isVisible=!0,d.removeCssClass(this.cursor,"ace_hidden"),this.cursor.style.visibility="visible",this.restartTimer()},this.restartTimer=function(){clearInterval(this.blinkId);if(!this.isVisible)return;var a=this.cursor;this.blinkId=setInterval(function(){a.style.visibility="hidden",setTimeout(function(){a.style.visibility="visible"},400)},1e3)},this.getPixelPosition=function(a){if(!this.config||!this.session)return{left:0,top:0};var b=this.session.selection.getCursor(),c=this.session.documentToScreenPosition(b),d=Math.round(this.$padding+c.column*this.config.characterWidth),e=(c.row-(a?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a,this.pixelPos=this.getPixelPosition(!0),this.cursor.style.left=this.pixelPos.left+"px",this.cursor.style.top=this.pixelPos.top+"px",this.cursor.style.width=a.characterWidth+"px",this.cursor.style.height=a.lineHeight+"px";var b=this.session.getOverwrite();b!=this.overwrite&&(this.overwrite=b,b?d.addCssClass(this.cursor,"ace_overwrite"):d.removeCssClass(this.cursor,"ace_overwrite")),this.restartTimer()},this.destroy=function(){clearInterval(this.blinkId)}})).call(e.prototype),b.Cursor=e}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_sb",this.inner=e.createElement("div"),this.element.appendChild(this.inner),a.appendChild(this.element),this.width=e.scrollbarWidth(a.ownerDocument),this.element.style.width=(this.width||15)+5+"px",f.addListener(this.element,"scroll",this.onScroll.bind(this))};((function(){d.implement(this,g),this.onScroll=function(){this._emit("scroll",{data:this.element.scrollTop})},this.getWidth=function(){return this.width},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.element.scrollTop=a}})).call(h.prototype),b.ScrollBar=h}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("./lib/event"),e=function(a,b){this.onRender=a,this.pending=!1,this.changes=0,this.window=b||window};((function(){this.schedule=function(a){this.changes=this.changes|a;if(!this.pending){this.pending=!0;var b=this;d.nextTick(function(){b.pending=!1;var a;while(a=b.changes)b.changes=0,b.onRender(a)},this.window)}}})).call(e.prototype),b.RenderLoop=e}),define("text!ace/css/editor.css",[],"@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);\n\n\n.ace_editor {\n position: absolute;\n overflow: hidden;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Courier New', monospace;\n font-size: 12px;\n}\n\n.ace_scroller {\n position: absolute;\n overflow-x: scroll;\n overflow-y: hidden;\n}\n\n.ace_content {\n position: absolute;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n cursor: text;\n}\n\n/* setting pointer-events: auto; on node under the mouse, which changes during scroll,\n will break mouse wheel scrolling in Safari */\n.ace_content * {\n pointer-events: none;\n}\n\n.ace_composition {\n position: absolute;\n background: #555;\n color: #DDD;\n z-index: 4;\n}\n\n.ace_gutter .ace_layer {\n position: relative;\n min-width: 54px;\n text-align: right;\n}\n\n.ace_gutter {\n position: absolute;\n overflow : hidden;\n height: 100%;\n width: auto;\n cursor: default;\n}\n\n.ace_gutter-cell {\n padding-left: 19px;\n padding-right: 6px;\n}\n\n.ace_gutter-cell.ace_error {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B\");\n background-repeat: no-repeat;\n background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_warning {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B\");\n background-repeat: no-repeat;\n background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_info {\n background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");\n background-repeat: no-repeat;\n background-position: 2px center;\n}\n\n.ace_editor .ace_sb {\n position: absolute;\n overflow-x: hidden;\n overflow-y: scroll;\n right: 0;\n}\n\n.ace_editor .ace_sb div {\n position: absolute;\n width: 1px;\n left: 0;\n}\n\n.ace_editor .ace_print_margin_layer {\n z-index: 0;\n position: absolute;\n overflow: hidden;\n margin: 0;\n left: 0;\n height: 100%;\n width: 100%;\n}\n\n.ace_editor .ace_print_margin {\n position: absolute;\n height: 100%;\n}\n\n.ace_editor textarea {\n position: fixed;\n z-index: 0;\n width: 10px;\n height: 30px;\n opacity: 0;\n background: transparent;\n appearance: none;\n -moz-appearance: none;\n border: none;\n resize: none;\n outline: none;\n overflow: hidden;\n}\n\n.ace_layer {\n z-index: 1;\n position: absolute;\n overflow: hidden;\n white-space: nowrap;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n}\n\n.ace_text-layer {\n color: black;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n}\n\n.ace_cursor.ace_hidden {\n opacity: 0.2;\n}\n\n.ace_line {\n white-space: nowrap;\n}\n\n.ace_marker-layer .ace_step {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 4;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_active_line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected_word {\n position: absolute;\n z-index: 6;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n \n display: inline-block;\n height: 11px;\n margin-top: -2px;\n vertical-align: middle;\n\n background-image: \n url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n color: transparent;\n\n border: 1px solid black;\n -moz-border-radius: 2px;\n -webkit-border-radius: 2px;\n border-radius: 2px;\n \n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n background-image: \n url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n}\n\n.ace_dragging .ace_content {\n cursor: move;\n}\n\n.ace_folding-enabled .ace_gutter-cell {\n padding-right: 13px;\n}\n\n.ace_fold-widget {\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n\n margin: 0 -12px 1px 1px;\n display: inline-block;\n height: 14px;\n width: 11px;\n vertical-align: text-bottom;\n \n background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");\n background-repeat: no-repeat;\n background-position: center 5px;\n\n border-radius: 3px;\n}\n\n.ace_fold-widget.end {\n background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget.closed {\n background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget:hover {\n border: 1px solid rgba(0, 0, 0, 0.3);\n background-color: rgba(255, 255, 255, 0.2);\n -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n background-position: center 4px;\n}\n\n.ace_fold-widget:active {\n border: 1px solid rgba(0, 0, 0, 0.4);\n background-color: rgba(0, 0, 0, 0.05);\n -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n\n.ace_fold-widget.invalid {\n background-color: #FFB4B4;\n border-color: #DE5555;\n}\n"),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict",b.isDark=!1,b.cssClass="ace-tm",b.cssText=".ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus { border: 2px solid #327fbd;}.ace-tm .ace_gutter { background: #e8e8e8; color: #333;}.ace-tm .ace_print_margin { width: 1px; background: #e8e8e8;}.ace-tm .ace_fold { background-color: #0000A2;}.ace-tm .ace_text-layer { cursor: text;}.ace-tm .ace_cursor { border-left: 2px solid black;}.ace-tm .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid black;} .ace-tm .ace_line .ace_invisible { color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_keyword { color: blue;}.ace-tm .ace_line .ace_constant.ace_buildin { color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language { color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid { background-color: rgb(153, 0, 0); color: white;}.ace-tm .ace_line .ace_support.ace_function { color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class { color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator { color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string { color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment { color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc { color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag { color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric { color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable { color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe { color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function { color: #0000A2;}.ace-tm .ace_markup.ace_markupine { text-decoration:underline;}.ace-tm .ace_markup.ace_heading { color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list { color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection { background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step { background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack { background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line { background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word { background: rgb(250, 250, 255); border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag { color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0)}";var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/keybinding-emacs.js b/apps/files_texteditor/js/aceeditor/keybinding-emacs.js old mode 100644 new mode 100755 index 5c99b14f086..7ddcd7623bd --- a/apps/files_texteditor/js/aceeditor/keybinding-emacs.js +++ b/apps/files_texteditor/js/aceeditor/keybinding-emacs.js @@ -1 +1 @@ -define("ace/keyboard/keybinding/emacs",["require","exports","module","ace/keyboard/state_handler"],function(a,b,c){var d=a("ace/keyboard/state_handler").StateHandler,e=a("ace/keyboard/state_handler").matchCharacterOnly,f={start:[{key:"ctrl-x",then:"c-x"},{regex:["(?:command-([0-9]*))*","(down|ctrl-n)"],exec:"golinedown",params:[{name:"times",match:1,type:"number",defaultValue:1}]},{regex:["(?:command-([0-9]*))*","(right|ctrl-f)"],exec:"gotoright",params:[{name:"times",match:1,type:"number",defaultValue:1}]},{regex:["(?:command-([0-9]*))*","(up|ctrl-p)"],exec:"golineup",params:[{name:"times",match:1,type:"number",defaultValue:1}]},{regex:["(?:command-([0-9]*))*","(left|ctrl-b)"],exec:"gotoleft",params:[{name:"times",match:1,type:"number",defaultValue:1}]},{comment:"This binding matches all printable characters except numbers as long as they are no numbers and print them n times.",regex:["(?:command-([0-9]*))","([^0-9]+)*"],match:e,exec:"inserttext",params:[{name:"times",match:1,type:"number",defaultValue:"1"},{name:"text",match:2}]},{comment:"This binding matches numbers as long as there is no meta_number in the buffer.",regex:["(command-[0-9]*)*","([0-9]+)"],match:e,disallowMatches:[1],exec:"inserttext",params:[{name:"text",match:2,type:"text"}]},{regex:["command-([0-9]*)","(command-[0-9]|[0-9])"],comment:"Stops execution if the regex /meta_[0-9]+/ matches to avoid resetting the buffer."}],"c-x":[{key:"ctrl-g",then:"start"},{key:"ctrl-s",exec:"save",then:"start"}]};b.Emacs=new d(f)}),define("ace/keyboard/state_handler",["require","exports","module"],function(a,b,c){function e(a){this.keymapping=this.$buildKeymappingRegex(a)}var d=!1;e.prototype={$buildKeymappingRegex:function(a){for(state in a)this.$buildBindingsRegex(a[state]);return a},$buildBindingsRegex:function(a){a.forEach(function(a){a.key?a.key=new RegExp("^"+a.key+"$"):Array.isArray(a.regex)?(a.key=new RegExp("^"+a.regex[1]+"$"),a.regex=new RegExp(a.regex.join("")+"$")):a.regex&&(a.regex=new RegExp(a.regex+"$"))})},$composeBuffer:function(a,b,c){if(a.state==null||a.buffer==null)a.state="start",a.buffer="";var d=[];b&1&&d.push("ctrl"),b&8&&d.push("command"),b&2&&d.push("option"),b&4&&d.push("shift"),c&&d.push(c);var e=d.join("-"),f=a.buffer+e;b!=2&&(a.buffer=f);return{bufferToUse:f,symbolicName:e}},$find:function(a,b,c,e,f){var g={};this.keymapping[a.state].some(function(h){var i;if(h.key&&!h.key.test(c))return!1;if(h.regex&&!(i=h.regex.exec(b)))return!1;if(h.match&&!h.match(b,e,f,c))return!1;if(h.disallowMatches)for(var j=0;j"},{token:"keyword",regex:"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.c_cppHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return!1;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}return!1}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}"){e.end.column++;return e}}return!1}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}return!1}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")"){e.end.column++;return e}}return!1}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return!1;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./c_cpp_highlight_rules").c_cppHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("./behaviour/cstyle").CstyleBehaviour,k=a("./folding/cstyle").FoldMode,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j,this.foldingRules=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(l.prototype),b.Mode=l}),define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("and|double|not_eq|throw|and_eq|dynamic_cast|operator|true|asm|else|or|try|auto|enum|or_eq|typedef|bitand|explicit|private|typeid|bitor|extern|protected|typename|bool|false|public|union|break|float|register|unsigned|case|fro|reinterpret-cast|using|catch|friend|return|virtual|char|goto|short|void|class|if|signed|volatile|compl|inline|sizeof|wchar_t|const|int|static|while|const-cast|long|static_cast|xor|continue|mutable|struct|xor_eq|default|namespace|switch|delete|new|template|do|not|this|for".split("|")),b=e.arrayToMap("NULL".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",merge:!0,regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",merge:!0,regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant",regex:"<[a-zA-Z0-9.]+>"},{token:"keyword",regex:"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.c_cppHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-clojure.js b/apps/files_texteditor/js/aceeditor/mode-clojure.js index 726de0c2be0..74e69fb0086 100644 --- a/apps/files_texteditor/js/aceeditor/mode-clojure.js +++ b/apps/files_texteditor/js/aceeditor/mode-clojure.js @@ -1 +1 @@ -define("ace/mode/clojure",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/clojure_highlight_rules","ace/mode/matching_parens_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/clojure_highlight_rules").ClojureHighlightRules,h=a("ace/mode/matching_parens_outdent").MatchingParensOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,";")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=d,f=this.$tokenizer.getLineTokens(b,a),g=f.tokens,h=f.state;if(g.length&&g[g.length-1].type=="comment")return d;if(a=="start"){var i=b.match(/[\(\[]/);i&&(d+=" "),i=b.match(/[\)]/),i&&(d="")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/clojure_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *e *err* *file* *flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *use-context-classloader* *warn-on-reflection* + - -> -> ->> ->> .. / < < <= <= = == > > >= >= accessor aclone add-classpath add-watch agent agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* butlast byte byte-array bytes cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec decimal? declare definline defmacro defmethod defmulti defn defn- defonce defstruct delay delay? deliver deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall doc dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq eval even? every? false? ffirst file-seq filter find find-doc find-ns find-var first float float-array float? floats flush fn fn? fnext for force format future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator hash hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map? mapcat max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod name namespace neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? or parents partial partition pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-doc print-dup print-method print-namespace-doc print-simple print-special-doc print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string reduce ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure release-pending-sends rem remove remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq rsubseq second select-keys send send-off seq seq? seque sequence sequential? set set-validator! set? short short-array shorts shutdown-agents slurp some sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-form-anchor special-symbol? split-at split-with str stream? string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync syntax-symbol-anchor take take-last take-nth take-while test the-ns time to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-dec unchecked-divide unchecked-inc unchecked-multiply unchecked-negate unchecked-remainder unchecked-subtract underive unquote unquote-splicing update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector? when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision xml-seq zero? zipmap ".split(" ")),b=e.arrayToMap("def do fn if let loop monitor-enter monitor-exit new quote recur set! throw try var".split(" ")),c=e.arrayToMap("true false nil".split(" "));this.$rules={start:[{token:"comment",regex:";.*$"},{token:"comment",regex:"^=begin$",next:"comment"},{token:"keyword",regex:"[\\(|\\)]"},{token:"keyword",regex:"[\\'\\(]"},{token:"keyword",regex:"[\\[|\\]]"},{token:"keyword",regex:"[\\{|\\}|\\#\\{|\\#\\}]"},{token:"keyword",regex:"[\\&]"},{token:"keyword",regex:"[\\#\\^\\{]"},{token:"keyword",regex:"[\\%]"},{token:"keyword",regex:"[@]"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]"},{token:function(d){return b.hasOwnProperty(d)?"keyword":c.hasOwnProperty(d)?"constant.language":a.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"[:](?:[a-zA-Z]|d)+"},{token:"string.regexp",regex:'/#"(?:.|(\\")|[^""\n])*"/g'}],comment:[{token:"comment",regex:"^=end$",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.ClojureHighlightRules=g}),define("ace/mode/matching_parens_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\)/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\))/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingParensOutdent=e}) \ No newline at end of file +define("ace/mode/clojure",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/clojure_highlight_rules","ace/mode/matching_parens_outdent","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./clojure_highlight_rules").ClojureHighlightRules,h=a("./matching_parens_outdent").MatchingParensOutdent,i=a("../range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)#/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,";")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/[\(\[]/);g&&(d+=" "),g=b.match(/[\)]/),g&&(d="")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/clojure_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *e *err* *file* *flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *use-context-classloader* *warn-on-reflection* + - -> -> ->> ->> .. / < < <= <= = == > > >= >= accessor aclone add-classpath add-watch agent agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* butlast byte byte-array bytes cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec decimal? declare definline defmacro defmethod defmulti defn defn- defonce defstruct delay delay? deliver deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall doc dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq eval even? every? false? ffirst file-seq filter find find-doc find-ns find-var first float float-array float? floats flush fn fn? fnext for force format future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator hash hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map? mapcat max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod name namespace neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? or parents partial partition pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-doc print-dup print-method print-namespace-doc print-simple print-special-doc print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string reduce ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure release-pending-sends rem remove remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq rsubseq second select-keys send send-off seq seq? seque sequence sequential? set set-validator! set? short short-array shorts shutdown-agents slurp some sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-form-anchor special-symbol? split-at split-with str stream? string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync syntax-symbol-anchor take take-last take-nth take-while test the-ns time to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-dec unchecked-divide unchecked-inc unchecked-multiply unchecked-negate unchecked-remainder unchecked-subtract underive unquote unquote-splicing update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector? when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision xml-seq zero? zipmap ".split(" ")),b=e.arrayToMap("def do fn if let loop monitor-enter monitor-exit new quote recur set! throw try var".split(" ")),c=e.arrayToMap("true false nil".split(" "));this.$rules={start:[{token:"comment",regex:";.*$"},{token:"comment",regex:"^=begin$",next:"comment"},{token:"keyword",regex:"[\\(|\\)]"},{token:"keyword",regex:"[\\'\\(]"},{token:"keyword",regex:"[\\[|\\]]"},{token:"keyword",regex:"[\\{|\\}|\\#\\{|\\#\\}]"},{token:"keyword",regex:"[\\&]"},{token:"keyword",regex:"[\\#\\^\\{]"},{token:"keyword",regex:"[\\%]"},{token:"keyword",regex:"[@]"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]"},{token:function(d){return b.hasOwnProperty(d)?"keyword":c.hasOwnProperty(d)?"constant.language":a.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"[:](?:[a-zA-Z]|d)+"},{token:"string.regexp",regex:'/#"(?:.|(\\")|[^""\n])*"/g'}],comment:[{token:"comment",regex:"^=end$",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.ClojureHighlightRules=g}),define("ace/mode/matching_parens_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\)/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\))/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingParensOutdent=e}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-coffee.js b/apps/files_texteditor/js/aceeditor/mode-coffee.js index 14e25f2ca25..c42e1f801c0 100644 --- a/apps/files_texteditor/js/aceeditor/mode-coffee.js +++ b/apps/files_texteditor/js/aceeditor/mode-coffee.js @@ -1 +1 @@ -define("ace/mode/coffee",["require","exports","module","ace/tokenizer","ace/mode/coffee_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/text","ace/worker/worker_client","pilot/oop"],function(a,b,c){function k(){this.$tokenizer=new d((new e).getRules()),this.$outdent=new f}var d=a("ace/tokenizer").Tokenizer,e=a("ace/mode/coffee_highlight_rules").CoffeeHighlightRules,f=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,g=a("ace/range").Range,h=a("ace/mode/text").Mode,i=a("ace/worker/worker_client").WorkerClient,j=a("pilot/oop");j.inherits(k,h),function(){var a=/(?:[({[=:]|[-=]>|\b(?:else|switch|try|catch(?:\s*[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$/,b=/^(\s*)#/,c=/^\s*###(?!#)/,d=/^\s*/;this.getNextLineIndent=function(b,c,d){var e=this.$getIndent(c),f=this.$tokenizer.getLineTokens(c,b).tokens;(!f.length||f[f.length-1].type!=="comment")&&b==="start"&&a.test(c)&&(e+=d);return e},this.toggleCommentLines=function(a,e,f,h){console.log("toggle");var i=new g(0,0,0,0);for(var j=f;j<=h;++j){var k=e.getLine(j);if(c.test(k))continue;b.test(k)?k=k.replace(b,"$1"):k=k.replace(d,"$&#"),i.end.row=i.start.row=j,i.end.column=k.length+1,e.replace(i,k)}},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new i(["ace","pilot"],"worker-coffee.js","ace/mode/coffee_worker","Worker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("error",function(b){a.setAnnotations([b.data])}),c.on("ok",function(b){a.clearAnnotations()})}}.call(k.prototype),b.Mode=k}),define("ace/mode/coffee_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){function d(){var a="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",b="(?![$\\w]|\\s*:)",c={token:"string",merge:!0,regex:".+"};this.$rules={start:[{token:"identifier",regex:"(?:@|(?:\\.|::)\\s*)"+a},{token:"keyword",regex:"(?:t(?:h(?:is|row|en)|ry|ypeof)|s(?:uper|witch)|return|b(?:reak|y)|c(?:ontinue|atch|lass)|i(?:n(?:stanceof)?|s(?:nt)?|f)|e(?:lse|xtends)|f(?:or (?:own)?|inally|unction)|wh(?:ile|en)|n(?:ew|ot?)|d(?:e(?:lete|bugger)|o)|loop|o(?:ff?|[rn])|un(?:less|til)|and|yes)"+b},{token:"constant.language",regex:"(?:true|false|null|undefined)"+b},{token:"invalid.illegal",regex:"(?:c(?:ase|onst)|default|function|v(?:ar|oid)|with|e(?:num|xport)|i(?:mplements|nterface)|let|p(?:ackage|r(?:ivate|otected)|ublic)|static|yield|__(?:hasProp|extends|slice|bind|indexOf))"+b},{token:"language.support.class",regex:"(?:Array|Boolean|Date|Function|Number|Object|R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|TypeError|URIError)"+b},{token:"language.support.function",regex:"(?:Math|JSON|is(?:NaN|Finite)|parse(?:Int|Float)|encodeURI(?:Component)?|decodeURI(?:Component)?)"+b},{token:"identifier",regex:a},{token:"constant.numeric",regex:"(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"},{token:"string",merge:!0,regex:"'''",next:"qdoc"},{token:"string",merge:!0,regex:'"""',next:"qqdoc"},{token:"string",merge:!0,regex:"'",next:"qstring"},{token:"string",merge:!0,regex:'"',next:"qqstring"},{token:"string",merge:!0,regex:"`",next:"js"},{token:"string.regex",merge:!0,regex:"///",next:"heregex"},{token:"string.regex",regex:"/(?!\\s)[^[/\\n\\\\]*(?: (?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[/\\n\\\\]*)*/[imgy]{0,4}(?!\\w)"},{token:"comment",merge:!0,regex:"###(?!#)",next:"comment"},{token:"comment",regex:"#.*"},{token:"lparen",regex:"[({[]"},{token:"rparen",regex:"[\\]})]"},{token:"keyword.operator",regex:"\\S+"},{token:"text",regex:"\\s+"}],qdoc:[{token:"string",regex:".*?'''",next:"start"},c],qqdoc:[{token:"string",regex:'.*?"""',next:"start"},c],qstring:[{token:"string",regex:"[^\\\\']*(?:\\\\.[^\\\\']*)*'",next:"start"},c],qqstring:[{token:"string",regex:'[^\\\\"]*(?:\\\\.[^\\\\"]*)*"',next:"start"},c],js:[{token:"string",merge:!0,regex:"[^\\\\`]*(?:\\\\.[^\\\\`]*)*`",next:"start"},c],heregex:[{token:"string.regex",regex:".*?///[imgy]{0,4}",next:"start"},{token:"comment.regex",regex:"\\s+(?:#.*)?"},{token:"string.regex",merge:!0,regex:"\\S+"}],comment:[{token:"comment",regex:".*?###",next:"start"},{token:"comment",merge:!0,regex:".+"}]}}a("pilot/oop").inherits(d,a("ace/mode/text_highlight_rules").TextHighlightRules),b.CoffeeHighlightRules=d}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;j|->|\\s*class [^#]*")}"use strict";var d=a("../tokenizer").Tokenizer,e=a("./coffee_highlight_rules").CoffeeHighlightRules,f=a("./matching_brace_outdent").MatchingBraceOutdent,g=a("./folding/pythonic").FoldMode,h=a("../range").Range,i=a("./text").Mode,j=a("../worker/worker_client").WorkerClient,k=a("../lib/oop");k.inherits(l,i),function(){var a=/(?:[({[=:]|[-=]>|\b(?:else|switch|try|catch(?:\s*[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$/,b=/^(\s*)#/,c=/^\s*###(?!#)/,d=/^\s*/;this.getNextLineIndent=function(b,c,d){var e=this.$getIndent(c),f=this.$tokenizer.getLineTokens(c,b).tokens;return(!f.length||f[f.length-1].type!=="comment")&&b==="start"&&a.test(c)&&(e+=d),e},this.toggleCommentLines=function(a,e,f,g){console.log("toggle");var i=new h(0,0,0,0);for(var j=f;j<=g;++j){var k=e.getLine(j);if(c.test(k))continue;b.test(k)?k=k.replace(b,"$1"):k=k.replace(d,"$&#"),i.end.row=i.start.row=j,i.end.column=k.length+1,e.replace(i,k)}},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-coffee.js","ace/mode/coffee_worker","Worker");return b.attachToDocument(a.getDocument()),b.on("error",function(b){a.setAnnotations([b.data])}),b.on("ok",function(b){a.clearAnnotations()}),b}}.call(l.prototype),b.Mode=l}),define("ace/mode/coffee_highlight_rules",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){function g(){var a="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",b={token:"string",merge:!0,regex:".+"},c=d.arrayToMap("this|throw|then|try|typeof|super|switch|return|break|by)|continue|catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|or|on|unless|until|and|yes".split("|")),e=d.arrayToMap("true|false|null|undefined".split("|")),f=d.arrayToMap("case|const|default|function|var|void|with|enum|export|implements|interface|let|package|private|protected|public|static|yield|__hasProp|extends|slice|bind|indexOf".split("|")),g=d.arrayToMap("Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|RangeError|String|SyntaxError|Error|EvalError|TypeError|URIError".split("|")),h=d.arrayToMap("Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|encodeURIComponent|decodeURI|decodeURIComponent|RangeError|String|SyntaxError|Error|EvalError|TypeError|URIError".split("|"));this.$rules={start:[{token:"identifier",regex:"(?:(?:\\.|::)\\s*)"+a},{token:"variable",regex:"@(?:"+a+")?"},{token:function(a){return c.hasOwnProperty(a)?"keyword":e.hasOwnProperty(a)?"constant.language":f.hasOwnProperty(a)?"invalid.illegal":g.hasOwnProperty(a)?"language.support.class":h.hasOwnProperty(a)?"language.support.function":"identifier"},regex:a},{token:"constant.numeric",regex:"(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"},{token:"string",merge:!0,regex:"'''",next:"qdoc"},{token:"string",merge:!0,regex:'"""',next:"qqdoc"},{token:"string",merge:!0,regex:"'",next:"qstring"},{token:"string",merge:!0,regex:'"',next:"qqstring"},{token:"string",merge:!0,regex:"`",next:"js"},{token:"string.regex",merge:!0,regex:"///",next:"heregex"},{token:"string.regex",regex:"/(?!\\s)[^[/\\n\\\\]*(?: (?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[/\\n\\\\]*)*/[imgy]{0,4}(?!\\w)"},{token:"comment",merge:!0,regex:"###(?!#)",next:"comment"},{token:"comment",regex:"#.*"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\."},{token:"keyword.operator",regex:"(?:[\\-=]>|[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|\\!)"},{token:"paren.lparen",regex:"[({[]"},{token:"paren.rparen",regex:"[\\]})]"},{token:"text",regex:"\\s+"}],qdoc:[{token:"string",regex:".*?'''",next:"start"},b],qqdoc:[{token:"string",regex:'.*?"""',next:"start"},b],qstring:[{token:"string",regex:"[^\\\\']*(?:\\\\.[^\\\\']*)*'",merge:!0,next:"start"},b],qqstring:[{token:"string",regex:'[^\\\\"]*(?:\\\\.[^\\\\"]*)*"',merge:!0,next:"start"},b],js:[{token:"string",merge:!0,regex:"[^\\\\`]*(?:\\\\.[^\\\\`]*)*`",next:"start"},b],heregex:[{token:"string.regex",regex:".*?///[imgy]{0,4}",next:"start"},{token:"comment.regex",regex:"\\s+(?:#.*)?"},{token:"string.regex",merge:!0,regex:"\\S+"}],comment:[{token:"comment",regex:".*?###",next:"start"},{token:"comment",merge:!0,regex:".+"}]}}"use strict";var d=a("../lib/lang"),e=a("../lib/oop"),f=a("./text_highlight_rules").TextHighlightRules;e.inherits(g,f),b.CoffeeHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("./fold_mode").FoldMode,f=b.FoldMode=function(a){this.foldingStartMarker=new RegExp("(?:([\\[{])|("+a+"))(?:\\s*)(?:#.*)?$")};d.inherits(f,e),function(){this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),e=d.match(this.foldingStartMarker);if(e)return e[1]?this.openingBracketBlock(a,e[1],c,e.index):e[2]?this.indentationBlock(a,c,e.index+e[2].length):this.indentationBlock(a,c)}}.call(f.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;j"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},e.tag(this.$rules,"tag","start")};d.inherits(g,f),b.XmlHighlightRules=g}),define("ace/mode/xml_util",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return[{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*',next:a+"-qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*",next:a+"-qstring"}]}function h(a,b){return[{token:"string",merge:!0,regex:".*?"+a,next:b},{token:"string",merge:!0,regex:".+"}]}"use strict";var d=a("../lib/lang"),e=d.arrayToMap("button|form|input|label|select|textarea".split("|")),f=d.arrayToMap("table|tbody|td|tfoot|th|tr".split("|"));b.tag=function(a,b,c){a[b]=[{token:"text",regex:"\\s+"},{token:function(a){return a==="a"?"meta.tag.anchor":a==="img"?"meta.tag.image":a==="script"?"meta.tag.script":a==="style"?"meta.tag.style":e.hasOwnProperty(a.toLowerCase())?"meta.tag.form":f.hasOwnProperty(a.toLowerCase())?"meta.tag.table":"meta.tag"},merge:!0,regex:"[-_a-zA-Z0-9:!]+",next:b+"embed-attribute-list"},{token:"empty",regex:"",next:b+"embed-attribute-list"}],a[b+"-qstring"]=h("'",b+"embed-attribute-list"),a[b+"-qqstring"]=h('"',b+"embed-attribute-list"),a[b+"embed-attribute-list"]=[{token:"meta.tag",merge:!0,regex:"/?>",next:c},{token:"keyword.operator",regex:"="},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(g(b))}}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=a("./cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="f.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../lib/lang"),f=a("../../range").Range,g=a("./fold_mode").FoldMode,h=a("../../token_iterator").TokenIterator,i=b.FoldMode=function(a){g.call(this),this.voidElements=a||{}};d.inherits(i,g),function(){this.getFoldWidget=function(a,b,c){var d=this._getFirstTagInLine(a,c);return d.closing?b=="markbeginend"?"end":"":!d.tagName||this.voidElements[d.tagName.toLowerCase()]?"":d.selfClosing?"":d.value.indexOf("/"+d.tagName)!==-1?"":"start"},this._getFirstTagInLine=function(a,b){var c=a.getTokens(b,b)[0].tokens,d="";for(var f=0;f?)/,this._parseTag=function(a){var b=this.tagRe.exec(a),c=this.tagRe.lastIndex||0;return this.tagRe.lastIndex=0,{value:a,match:b?b[2]:"",closing:b?!!b[3]:!1,selfClosing:b?!!b[5]||b[2]=="/>":!1,tagName:b?b[4]:"",column:b[1]?c+b[1].length:c}},this._readTagForward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){if(!d)var d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()};c+=b.value;if(c.indexOf(">")!==-1){var e=this._parseTag(c);return e.start=d,e.end={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length},a.stepForward(),e}}while(b=a.stepForward());return null},this._readTagBackward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){d||(d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length}),c=b.value+c;if(c.indexOf("<")!==-1){var e=this._parseTag(c);return e.end=d,e.start={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()},a.stepBackward(),e}}while(b=a.stepBackward());return null},this._pop=function(a,b){while(a.length){var c=a[a.length-1];if(!b||c.tagName==b.tagName)return a.pop();if(this.voidElements[b.tagName])return;if(this.voidElements[c.tagName]){a.pop();continue}return null}},this.getFoldWidgetRange=function(a,b,c){var d=this._getFirstTagInLine(a,c);if(!d.match)return null;var e=d.closing||d.selfClosing,g=[],i;if(!e){var j=new h(a,c,d.column),k={row:c,column:d.column+d.tagName.length+2};while(i=this._readTagForward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(i.closing){this._pop(g,i);if(g.length==0)return f.fromPoints(k,i.start)}else g.push(i)}}else{var j=new h(a,c,d.column+d.match.length),l={row:c,column:d.column};while(i=this._readTagBackward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(!i.closing){this._pop(g,i);if(g.length==0)return i.start.column+=i.tagName.length+2,f.fromPoints(i.start,l)}else g.push(i)}}}}.call(i.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;j"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<(?=s*script)",next:"script"},{token:"meta.tag",regex:"<(?=s*style)",next:"css"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",merge:!0,regex:"\\s+"},{token:"text",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},h.tag(this.$rules,"tag","start"),h.tag(this.$rules,"css","css-start"),h.tag(this.$rules,"script","js-start"),this.embedRules(f,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"meta.tag",regex:"<\\/(?=script)",next:"tag"}]),this.embedRules(e,"css-",[{token:"meta.tag",regex:"<\\/(?=style)",next:"tag"}])};d.inherits(i,g),b.ColdfusionHighlightRules=i}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-csharp.js b/apps/files_texteditor/js/aceeditor/mode-csharp.js index 18082e40dac..b4c06059661 100644 --- a/apps/files_texteditor/js/aceeditor/mode-csharp.js +++ b/apps/files_texteditor/js/aceeditor/mode-csharp.js @@ -1 +1 @@ -define("ace/mode/csharp",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/csharp_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/csharp_highlight_rules").CSharpHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/mode/behaviour/cstyle").CstyleBehaviour,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){return null}}.call(j.prototype),b.Mode=j}),define("ace/mode/csharp_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic".split("|")),b=e.arrayToMap("null|true|false".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",merge:!0,next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.CSharpHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return!1;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}return!1}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}"){e.end.column++;return e}}return!1}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}return!1}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")"){e.end.column++;return e}}return!1}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return!1;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/csharp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/csharp_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./csharp_highlight_rules").CSharpHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("./behaviour/cstyle").CstyleBehaviour,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i,this.foldingRules=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){return null}}.call(k.prototype),b.Mode=k}),define("ace/mode/csharp_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic".split("|")),b=e.arrayToMap("null|true|false".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",merge:!0,next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.CSharpHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-css.js b/apps/files_texteditor/js/aceeditor/mode-css.js index e7cbfde635d..0a6f1bde58d 100644 --- a/apps/files_texteditor/js/aceeditor/mode-css.js +++ b/apps/files_texteditor/js/aceeditor/mode-css.js @@ -1 +1 @@ -define("ace/mode/css",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/css_highlight_rules").CssHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/worker/worker_client").WorkerClient,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);f&&(d+=c);return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new i(["ace","pilot"],"worker-css.js","ace/mode/css_worker","Worker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)})}}.call(j.prototype),b.Mode=j}),define("ace/mode/css_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){function g(a){var b=[],c=a.split("");for(var d=0;df){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-groovy.js b/apps/files_texteditor/js/aceeditor/mode-groovy.js index 29559419293..c71ada2bf84 100644 --- a/apps/files_texteditor/js/aceeditor/mode-groovy.js +++ b/apps/files_texteditor/js/aceeditor/mode-groovy.js @@ -1 +1 @@ -define("ace/mode/groovy",["require","exports","module","pilot/oop","ace/mode/javascript","ace/tokenizer","ace/mode/groovy_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/javascript").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/groovy_highlight_rules").GroovyHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/mode/behaviour/cstyle").CstyleBehaviour,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i};d.inherits(j,e),function(){this.createWorker=function(a){return null}}.call(j.prototype),b.Mode=j}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/groovy_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("assert|with|abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|def|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\?:|\\?\\.|\\*\\.|<=>|=~|==~|\\.@|\\*\\.@|\\.&|as|in|is|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.GroovyHighlightRules=h}) \ No newline at end of file +define("ace/mode/groovy",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/tokenizer","ace/mode/groovy_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./javascript").Mode,f=a("../tokenizer").Tokenizer,g=a("./groovy_highlight_rules").GroovyHighlightRules,h=function(){e.call(this),this.$tokenizer=new f((new g).getRules())};d.inherits(h,e),function(){this.createWorker=function(a){return null}}.call(h.prototype),b.Mode=h}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/groovy_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("assert|with|abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|def|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\?:|\\?\\.|\\*\\.|<=>|=~|==~|\\.@|\\*\\.@|\\.&|as|in|is|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.GroovyHighlightRules=h}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-haxe.js b/apps/files_texteditor/js/aceeditor/mode-haxe.js new file mode 100755 index 00000000000..88818b1371a --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-haxe.js @@ -0,0 +1 @@ +define("ace/mode/haxe",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/haxe_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./haxe_highlight_rules").HaxeHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("./behaviour/cstyle").CstyleBehaviour,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i,this.foldingRules=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){return null}}.call(k.prototype),b.Mode=k}),define("ace/mode/haxe_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std".split("|")),b=e.arrayToMap("null|true|false".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",merge:!0,next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({<]"},{token:"paren.rparen",regex:"[\\])}>]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.HaxeHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-html.js b/apps/files_texteditor/js/aceeditor/mode-html.js index 518767d3fb6..f4f806059e4 100644 --- a/apps/files_texteditor/js/aceeditor/mode-html.js +++ b/apps/files_texteditor/js/aceeditor/mode-html.js @@ -1 +1 @@ -define("ace/mode/html",["require","exports","module","pilot/oop","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/tokenizer","ace/mode/html_highlight_rules","ace/mode/behaviour/xml"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/mode/javascript").Mode,g=a("ace/mode/css").Mode,h=a("ace/tokenizer").Tokenizer,i=a("ace/mode/html_highlight_rules").HtmlHighlightRules,j=a("ace/mode/behaviour/xml").XmlBehaviour,k=function(){var a=new i;this.$tokenizer=new h(a.getRules()),this.$behaviour=new j,this.$embeds=a.getEmbeds(),this.createModeDelegates({"js-":f,"css-":g})};d.inherits(k,e),function(){this.toggleCommentLines=function(a,b,c,d){return 0},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1}}.call(k.prototype),b.Mode=k}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/css",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/css_highlight_rules").CssHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/worker/worker_client").WorkerClient,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);f&&(d+=c);return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new i(["ace","pilot"],"worker-css.js","ace/mode/css_worker","Worker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)})}}.call(j.prototype),b.Mode=j}),define("ace/mode/css_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){function g(a){var b=[],c=a.split("");for(var d=0;d"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"text",regex:"<(?=s*script)",next:"script"},{token:"text",regex:"<(?=s*style)",next:"css"},{token:"text",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],script:[{token:"text",regex:">",next:"js-start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"}].concat(a("script")),css:[{token:"text",regex:">",next:"css-start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"}].concat(a("style")),tag:[{token:"text",regex:">",next:"start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"}].concat(a("tag")),"style-qstring":b("'","style"),"style-qqstring":b('"',"style"),"script-qstring":b("'","script"),"script-qqstring":b('"',"script"),"tag-qstring":b("'","tag"),"tag-qqstring":b('"',"tag"),cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",merge:!0,regex:"\\s+"},{token:"text",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"text",regex:"<\\/(?=script)",next:"tag"}]),this.embedRules(e,"css-",[{token:"text",regex:"<\\/(?=style)",next:"tag"}])};d.inherits(h,g),b.HtmlHighlightRules=h}),define("ace/mode/behaviour/xml",["require","exports","module","pilot/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=a("ace/mode/behaviour/cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./css_highlight_rules").CssHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../worker/worker_client").WorkerClient,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules(),"i"),this.$outdent=new h,this.foldingRules=new j};d.inherits(k,e),function(){this.foldingRules="cStyle",this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);return f&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new i(["ace"],"worker-css.js","ace/mode/css_worker","Worker");return b.attachToDocument(a.getDocument()),b.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)}),b}}.call(k.prototype),b.Mode=k}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("-moz-appearance|-moz-box-sizing|-webkit-box-sizing|-moz-outline-radius|-moz-transform|-webkit-transform|appearance|azimuth|background-attachment|background-color|background-image|background-origin|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|-moz-border-radius|opacity|orphans|outline-color|outline-offset|outline-radius|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|pointer-events|position|quotes|resize|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|transform|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index".split("|")),b=e.arrayToMap("rgb|rgba|url|attr|counter|counters".split("|")),c=e.arrayToMap("absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero".split("|")),d=e.arrayToMap("aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow".split("|")),f="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",g=[{token:"comment",merge:!0,regex:"\\/\\*",next:"ruleset_comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:f+"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)"},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:function(e){return a.hasOwnProperty(e.toLowerCase())?"support.type":b.hasOwnProperty(e.toLowerCase())?"support.function":c.hasOwnProperty(e.toLowerCase())?"support.constant":d.hasOwnProperty(e.toLowerCase())?"support.constant.color":"text"},regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"}],h=e.copyArray(g);h.unshift({token:"paren.rparen",regex:"\\}",next:"start"});var i=e.copyArray(g);i.unshift({token:"paren.rparen",regex:"\\}",next:"media"});var j=[{token:"comment",merge:!0,regex:".+"}],k=e.copyArray(j);k.unshift({token:"comment",regex:".*?\\*\\/",next:"start"});var l=e.copyArray(j);l.unshift({token:"comment",regex:".*?\\*\\/",next:"media"});var m=e.copyArray(j);m.unshift({token:"comment",regex:".*?\\*\\/",next:"ruleset"}),this.$rules={start:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"paren.lparen",regex:"\\{",next:"ruleset"},{token:"string",regex:"@.*?{",next:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"}],media:[{token:"comment",merge:!0,regex:"\\/\\*",next:"media_comment"},{token:"paren.lparen",regex:"\\{",next:"media_ruleset"},{token:"string",regex:"\\}",next:"start"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"}],comment:k,ruleset:h,ruleset_comment:m,media_ruleset:i,media_comment:l}};d.inherits(g,f),b.CssHighlightRules=g}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_util","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./css_highlight_rules").CssHighlightRules,f=a("./javascript_highlight_rules").JavaScriptHighlightRules,g=a("./xml_util"),h=a("./text_highlight_rules").TextHighlightRules,i=function(){this.$rules={start:[{token:"text",merge:!0,regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<(?=s*script\\b)",next:"script"},{token:"meta.tag",regex:"<(?=s*style\\b)",next:"css"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",merge:!0,regex:"\\s+"},{token:"text",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},g.tag(this.$rules,"tag","start"),g.tag(this.$rules,"css","css-start"),g.tag(this.$rules,"script","js-start"),this.embedRules(f,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"meta.tag",regex:"<\\/(?=script)",next:"tag"}]),this.embedRules(e,"css-",[{token:"meta.tag",regex:"<\\/(?=style)",next:"tag"}])};d.inherits(i,h),b.HtmlHighlightRules=i}),define("ace/mode/xml_util",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return[{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*',next:a+"-qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*",next:a+"-qstring"}]}function h(a,b){return[{token:"string",merge:!0,regex:".*?"+a,next:b},{token:"string",merge:!0,regex:".+"}]}"use strict";var d=a("../lib/lang"),e=d.arrayToMap("button|form|input|label|select|textarea".split("|")),f=d.arrayToMap("table|tbody|td|tfoot|th|tr".split("|"));b.tag=function(a,b,c){a[b]=[{token:"text",regex:"\\s+"},{token:function(a){return a==="a"?"meta.tag.anchor":a==="img"?"meta.tag.image":a==="script"?"meta.tag.script":a==="style"?"meta.tag.style":e.hasOwnProperty(a.toLowerCase())?"meta.tag.form":f.hasOwnProperty(a.toLowerCase())?"meta.tag.table":"meta.tag"},merge:!0,regex:"[-_a-zA-Z0-9:!]+",next:b+"embed-attribute-list"},{token:"empty",regex:"",next:b+"embed-attribute-list"}],a[b+"-qstring"]=h("'",b+"embed-attribute-list"),a[b+"-qqstring"]=h('"',b+"embed-attribute-list"),a[b+"embed-attribute-list"]=[{token:"meta.tag",merge:!0,regex:"/?>",next:c},{token:"keyword.operator",regex:"="},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(g(b))}}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=a("./cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="?)/,this._parseTag=function(a){var b=this.tagRe.exec(a),c=this.tagRe.lastIndex||0;return this.tagRe.lastIndex=0,{value:a,match:b?b[2]:"",closing:b?!!b[3]:!1,selfClosing:b?!!b[5]||b[2]=="/>":!1,tagName:b?b[4]:"",column:b[1]?c+b[1].length:c}},this._readTagForward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){if(!d)var d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()};c+=b.value;if(c.indexOf(">")!==-1){var e=this._parseTag(c);return e.start=d,e.end={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length},a.stepForward(),e}}while(b=a.stepForward());return null},this._readTagBackward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){d||(d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length}),c=b.value+c;if(c.indexOf("<")!==-1){var e=this._parseTag(c);return e.end=d,e.start={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()},a.stepBackward(),e}}while(b=a.stepBackward());return null},this._pop=function(a,b){while(a.length){var c=a[a.length-1];if(!b||c.tagName==b.tagName)return a.pop();if(this.voidElements[b.tagName])return;if(this.voidElements[c.tagName]){a.pop();continue}return null}},this.getFoldWidgetRange=function(a,b,c){var d=this._getFirstTagInLine(a,c);if(!d.match)return null;var e=d.closing||d.selfClosing,g=[],i;if(!e){var j=new h(a,c,d.column),k={row:c,column:d.column+d.tagName.length+2};while(i=this._readTagForward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(i.closing){this._pop(g,i);if(g.length==0)return f.fromPoints(k,i.start)}else g.push(i)}}else{var j=new h(a,c,d.column+d.match.length),l={row:c,column:d.column};while(i=this._readTagBackward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(!i.closing){this._pop(g,i);if(g.length==0)return i.start.column+=i.tagName.length+2,f.fromPoints(i.start,l)}else g.push(i)}}}}.call(i.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-java.js b/apps/files_texteditor/js/aceeditor/mode-java.js index 56460e36b28..84c21daba22 100644 --- a/apps/files_texteditor/js/aceeditor/mode-java.js +++ b/apps/files_texteditor/js/aceeditor/mode-java.js @@ -1 +1 @@ -define("ace/mode/java",["require","exports","module","pilot/oop","ace/mode/javascript","ace/tokenizer","ace/mode/java_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/javascript").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/java_highlight_rules").JavaHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/mode/behaviour/cstyle").CstyleBehaviour,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i};d.inherits(j,e),function(){this.createWorker=function(a){return null}}.call(j.prototype),b.Mode=j}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/java_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.JavaHighlightRules=h}) \ No newline at end of file +define("ace/mode/java",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/tokenizer","ace/mode/java_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./javascript").Mode,f=a("../tokenizer").Tokenizer,g=a("./java_highlight_rules").JavaHighlightRules,h=function(){e.call(this),this.$tokenizer=new f((new g).getRules())};d.inherits(h,e),function(){this.createWorker=function(a){return null}}.call(h.prototype),b.Mode=h}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.JavaHighlightRules=h}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-javascript.js b/apps/files_texteditor/js/aceeditor/mode-javascript.js index 40628310cdb..2f242387fff 100644 --- a/apps/files_texteditor/js/aceeditor/mode-javascript.js +++ b/apps/files_texteditor/js/aceeditor/mode-javascript.js @@ -1 +1 @@ -define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-json.js b/apps/files_texteditor/js/aceeditor/mode-json.js index 66df13b26d5..d0dd59fec3e 100644 --- a/apps/files_texteditor/js/aceeditor/mode-json.js +++ b/apps/files_texteditor/js/aceeditor/mode-json.js @@ -1 +1 @@ -define("ace/mode/json",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/json_highlight_rules").JsonHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/mode/behaviour/cstyle").CstyleBehaviour,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/json_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){this.$rules={start:[{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}]}};d.inherits(g,f),b.JsonHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return!1;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}return!1}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}"){e.end.column++;return e}}return!1}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}return!1}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")"){e.end.column++;return e}}return!1}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return!1;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./json_highlight_rules").JsonHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("./behaviour/cstyle").CstyleBehaviour,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i,this.foldingRules=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b);if(a=="start"){var e=b.match(/^.*[\{\(\[]\s*$/);e&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}]}};d.inherits(f,e),b.JsonHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-latex.js b/apps/files_texteditor/js/aceeditor/mode-latex.js new file mode 100755 index 00000000000..3498213a644 --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-latex.js @@ -0,0 +1 @@ +define("ace/mode/latex",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/latex_highlight_rules","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./latex_highlight_rules").LatexHighlightRules,h=a("../range").Range,i=function(){this.$tokenizer=new f((new g).getRules())};d.inherits(i,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\%/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var i=new h(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);i.start.row=g,i.end.row=g,i.end.column=k[0].length,b.replace(i,k[1])}}else b.indentRows(c,d,"%")},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)}}.call(i.prototype),b.Mode=i}),define("ace/mode/latex_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"keyword",regex:"\\\\(?:[^a-zA-Z]|[a-zA-Z]+)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"string",regex:"\\$(?:(?:\\\\.)|(?:[^\\$\\\\]))*?\\$"},{token:"comment",regex:"%.*$"}]}};d.inherits(f,e),b.LatexHighlightRules=f}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-lua.js b/apps/files_texteditor/js/aceeditor/mode-lua.js new file mode 100755 index 00000000000..63b812c6bd7 --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-lua.js @@ -0,0 +1 @@ +define("ace/mode/lua",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/lua_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./lua_highlight_rules").LuaHighlightRules,h=function(){this.$tokenizer=new f((new g).getRules())};d.inherits(h,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=["function","then","do","repeat"];if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);if(h)d+=c;else for(var i in f){var j=f[i];if(j.type!="keyword")continue;var k=g.indexOf(j.value);if(k!=-1){d+=c;break}}}return d}}.call(h.prototype),b.Mode=h}),define("ace/mode/lua_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("break|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while|or|and|not".split("|")),b=e.arrayToMap("true|false|nil|_G|_VERSION".split("|")),c=e.arrayToMap("string|xpcall|package|tostring|print|os|unpack|require|getfenv|setmetatable|next|assert|tonumber|io|rawequal|collectgarbage|getmetatable|module|rawset|math|debug|pcall|table|newproxy|type|coroutine|_G|select|gcinfo|pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|load|error|loadfile|sub|upper|len|gfind|rep|find|match|char|dump|gmatch|reverse|byte|format|gsub|lower|preload|loadlib|loaded|loaders|cpath|config|path|seeall|exit|setlocale|date|getenv|difftime|remove|time|clock|tmpname|rename|execute|lines|write|close|flush|open|output|type|read|stderr|stdin|input|stdout|popen|tmpfile|log|max|acos|huge|ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|gethook|setmetatable|setlocal|traceback|setfenv|getinfo|setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|foreachi|maxn|foreach|concat|sort|remove|resume|yield|status|wrap|create|running".split("|")),d=e.arrayToMap("string|package|os|io|math|debug|table|coroutine".split("|")),f=e.arrayToMap("__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber".split("|")),g=e.arrayToMap("".split("|")),h=e.arrayToMap("setn|foreach|foreachi|gcinfo|log10|maxn".split("|")),i="",j="(?:(?:[1-9]\\d*)|(?:0))",k="(?:0[xX][\\dA-Fa-f]+)",l="(?:"+j+"|"+k+")",m="(?:\\.\\d+)",n="(?:\\d+)",o="(?:(?:"+n+"?"+m+")|(?:"+n+"\\.))",p="(?:"+o+")",q=[];this.$rules={start:[{token:"comment",regex:i+"\\-\\-\\[\\[.*\\]\\]"},{token:"comment",regex:i+"\\-\\-\\[\\=\\[.*\\]\\=\\]"},{token:"comment",regex:i+"\\-\\-\\[\\={2}\\[.*\\]\\={2}\\]"},{token:"comment",regex:i+"\\-\\-\\[\\={3}\\[.*\\]\\={3}\\]"},{token:"comment",regex:i+"\\-\\-\\[\\={4}\\[.*\\]\\={4}\\]"},{token:"comment",regex:i+"\\-\\-\\[\\={5}\\=*\\[.*\\]\\={5}\\=*\\]"},{token:"comment",regex:i+"\\-\\-\\[\\[.*$",merge:!0,next:"qcomment"},{token:"comment",regex:i+"\\-\\-\\[\\=\\[.*$",merge:!0,next:"qcomment1"},{token:"comment",regex:i+"\\-\\-\\[\\={2}\\[.*$",merge:!0,next:"qcomment2"},{token:"comment",regex:i+"\\-\\-\\[\\={3}\\[.*$",merge:!0,next:"qcomment3"},{token:"comment",regex:i+"\\-\\-\\[\\={4}\\[.*$",merge:!0,next:"qcomment4"},{token:function(a){var b=/\-\-\[(\=+)\[/,c;return(c=b.exec(a))!=null&&(c=c[1])!=undefined&&q.push(c.length),"comment"},regex:i+"\\-\\-\\[\\={5}\\=*\\[.*$",merge:!0,next:"qcomment5"},{token:"comment",regex:"\\-\\-.*$"},{token:"string",regex:i+"\\[\\[.*\\]\\]"},{token:"string",regex:i+"\\[\\=\\[.*\\]\\=\\]"},{token:"string",regex:i+"\\[\\={2}\\[.*\\]\\={2}\\]"},{token:"string",regex:i+"\\[\\={3}\\[.*\\]\\={3}\\]"},{token:"string",regex:i+"\\[\\={4}\\[.*\\]\\={4}\\]"},{token:"string",regex:i+"\\[\\={5}\\=*\\[.*\\]\\={5}\\=*\\]"},{token:"string",regex:i+"\\[\\[.*$",merge:!0,next:"qstring"},{token:"string",regex:i+"\\[\\=\\[.*$",merge:!0,next:"qstring1"},{token:"string",regex:i+"\\[\\={2}\\[.*$",merge:!0,next:"qstring2"},{token:"string",regex:i+"\\[\\={3}\\[.*$",merge:!0,next:"qstring3"},{token:"string",regex:i+"\\[\\={4}\\[.*$",merge:!0,next:"qstring4"},{token:function(a){var b=/\[(\=+)\[/,c;return(c=b.exec(a))!=null&&(c=c[1])!=undefined&&q.push(c.length),"string"},regex:i+"\\[\\={5}\\=*\\[.*$",merge:!0,next:"qstring5"},{token:"string",regex:i+'"(?:[^\\\\]|\\\\.)*?"'},{token:"string",regex:i+"'(?:[^\\\\]|\\\\.)*?'"},{token:"constant.numeric",regex:p},{token:"constant.numeric",regex:l+"\\b"},{token:function(e){return a.hasOwnProperty(e)?"keyword":b.hasOwnProperty(e)?"constant.language":g.hasOwnProperty(e)?"invalid.illegal":d.hasOwnProperty(e)?"constant.library":h.hasOwnProperty(e)?"invalid.deprecated":c.hasOwnProperty(e)?"support.function":f.hasOwnProperty(e)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\."},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],qcomment:[{token:"comment",regex:"(?:[^\\\\]|\\\\.)*?\\]\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qcomment1:[{token:"comment",regex:"(?:[^\\\\]|\\\\.)*?\\]\\=\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qcomment2:[{token:"comment",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={2}\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qcomment3:[{token:"comment",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={3}\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qcomment4:[{token:"comment",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={4}\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qcomment5:[{token:function(a){var b=/\](\=+)\]/,c=this.rules.qcomment5[0],d;c.next="start";if((d=b.exec(a))!=null&&(d=d[1])!=undefined){var e=d.length,f;(f=q.pop())!=e&&(q.push(f),c.next="qcomment5")}return"comment"},regex:"(?:[^\\\\]|\\\\.)*?\\]\\={5}\\=*\\]",next:"start"},{token:"comment",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?\\]\\]",next:"start"},{token:"string",merge:!0,regex:".+"}],qstring1:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?\\]\\=\\]",next:"start"},{token:"string",merge:!0,regex:".+"}],qstring2:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={2}\\]",next:"start"},{token:"string",merge:!0,regex:".+"}],qstring3:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={3}\\]",next:"start"},{token:"string",merge:!0,regex:".+"}],qstring4:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?\\]\\={4}\\]",next:"start"},{token:"string",merge:!0,regex:".+"}],qstring5:[{token:function(a){var b=/\](\=+)\]/,c=this.rules.qstring5[0],d;c.next="start";if((d=b.exec(a))!=null&&(d=d[1])!=undefined){var e=d.length,f;(f=q.pop())!=e&&(q.push(f),c.next="qstring5")}return"string"},regex:"(?:[^\\\\]|\\\\.)*?\\]\\={5}\\=*\\]",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.LuaHighlightRules=g}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-markdown.js b/apps/files_texteditor/js/aceeditor/mode-markdown.js new file mode 100755 index 00000000000..4cf7a4a82b4 --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-markdown.js @@ -0,0 +1 @@ +define("ace/mode/markdown",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript","ace/mode/xml","ace/mode/html","ace/tokenizer","ace/mode/markdown_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("./javascript").Mode,g=a("./xml").Mode,h=a("./html").Mode,i=a("../tokenizer").Tokenizer,j=a("./markdown_highlight_rules").MarkdownHighlightRules,k=function(){var a=new j;this.$tokenizer=new i(a.getRules()),this.$embeds=a.getEmbeds(),this.createModeDelegates({"js-":f,"xml-":g,"html-":h})};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){if(a=="listblock"){var d=/^((?:.+)?)([-+*][ ]+)/.exec(b);return d?(new Array(d[1].length+1)).join(" ")+d[2]:""}return this.$getIndent(b)}}.call(k.prototype),b.Mode=k}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./xml_highlight_rules").XmlHighlightRules,h=a("./behaviour/xml").XmlBehaviour,i=a("./folding/xml").FoldMode,j=function(){this.$tokenizer=new f((new g).getRules()),this.$behaviour=new h,this.foldingRules=new i};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)}}.call(j.prototype),b.Mode=j}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/xml_util","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./xml_util"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){this.$rules={start:[{token:"text",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},e.tag(this.$rules,"tag","start")};d.inherits(g,f),b.XmlHighlightRules=g}),define("ace/mode/xml_util",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return[{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*',next:a+"-qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*",next:a+"-qstring"}]}function h(a,b){return[{token:"string",merge:!0,regex:".*?"+a,next:b},{token:"string",merge:!0,regex:".+"}]}"use strict";var d=a("../lib/lang"),e=d.arrayToMap("button|form|input|label|select|textarea".split("|")),f=d.arrayToMap("table|tbody|td|tfoot|th|tr".split("|"));b.tag=function(a,b,c){a[b]=[{token:"text",regex:"\\s+"},{token:function(a){return a==="a"?"meta.tag.anchor":a==="img"?"meta.tag.image":a==="script"?"meta.tag.script":a==="style"?"meta.tag.style":e.hasOwnProperty(a.toLowerCase())?"meta.tag.form":f.hasOwnProperty(a.toLowerCase())?"meta.tag.table":"meta.tag"},merge:!0,regex:"[-_a-zA-Z0-9:!]+",next:b+"embed-attribute-list"},{token:"empty",regex:"",next:b+"embed-attribute-list"}],a[b+"-qstring"]=h("'",b+"embed-attribute-list"),a[b+"-qqstring"]=h('"',b+"embed-attribute-list"),a[b+"embed-attribute-list"]=[{token:"meta.tag",merge:!0,regex:"/?>",next:c},{token:"keyword.operator",regex:"="},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(g(b))}}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=a("./cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="?)/,this._parseTag=function(a){var b=this.tagRe.exec(a),c=this.tagRe.lastIndex||0;return this.tagRe.lastIndex=0,{value:a,match:b?b[2]:"",closing:b?!!b[3]:!1,selfClosing:b?!!b[5]||b[2]=="/>":!1,tagName:b?b[4]:"",column:b[1]?c+b[1].length:c}},this._readTagForward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){if(!d)var d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()};c+=b.value;if(c.indexOf(">")!==-1){var e=this._parseTag(c);return e.start=d,e.end={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length},a.stepForward(),e}}while(b=a.stepForward());return null},this._readTagBackward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){d||(d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length}),c=b.value+c;if(c.indexOf("<")!==-1){var e=this._parseTag(c);return e.end=d,e.start={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()},a.stepBackward(),e}}while(b=a.stepBackward());return null},this._pop=function(a,b){while(a.length){var c=a[a.length-1];if(!b||c.tagName==b.tagName)return a.pop();if(this.voidElements[b.tagName])return;if(this.voidElements[c.tagName]){a.pop();continue}return null}},this.getFoldWidgetRange=function(a,b,c){var d=this._getFirstTagInLine(a,c);if(!d.match)return null;var e=d.closing||d.selfClosing,g=[],i;if(!e){var j=new h(a,c,d.column),k={row:c,column:d.column+d.tagName.length+2};while(i=this._readTagForward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(i.closing){this._pop(g,i);if(g.length==0)return f.fromPoints(k,i.start)}else g.push(i)}}else{var j=new h(a,c,d.column+d.match.length),l={row:c,column:d.column};while(i=this._readTagBackward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(!i.closing){this._pop(g,i);if(g.length==0)return i.start.column+=i.tagName.length+2,f.fromPoints(i.start,l)}else g.push(i)}}}}.call(i.prototype)}),define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/tokenizer","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("./javascript").Mode,g=a("./css").Mode,h=a("../tokenizer").Tokenizer,i=a("./html_highlight_rules").HtmlHighlightRules,j=a("./behaviour/xml").XmlBehaviour,k=a("./folding/html").FoldMode,l=function(){var a=new i;this.$tokenizer=new h(a.getRules()),this.$behaviour=new j,this.$embeds=a.getEmbeds(),this.createModeDelegates({"js-":f,"css-":g}),this.foldingRules=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){return 0},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1}}.call(l.prototype),b.Mode=l}),define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./css_highlight_rules").CssHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../worker/worker_client").WorkerClient,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules(),"i"),this.$outdent=new h,this.foldingRules=new j};d.inherits(k,e),function(){this.foldingRules="cStyle",this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);return f&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new i(["ace"],"worker-css.js","ace/mode/css_worker","Worker");return b.attachToDocument(a.getDocument()),b.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)}),b}}.call(k.prototype),b.Mode=k}),define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("-moz-appearance|-moz-box-sizing|-webkit-box-sizing|-moz-outline-radius|-moz-transform|-webkit-transform|appearance|azimuth|background-attachment|background-color|background-image|background-origin|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|-moz-border-radius|opacity|orphans|outline-color|outline-offset|outline-radius|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|pointer-events|position|quotes|resize|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|transform|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index".split("|")),b=e.arrayToMap("rgb|rgba|url|attr|counter|counters".split("|")),c=e.arrayToMap("absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|zero".split("|")),d=e.arrayToMap("aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow".split("|")),f="\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))",g=[{token:"comment",merge:!0,regex:"\\/\\*",next:"ruleset_comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:f+"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)"},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:function(e){return a.hasOwnProperty(e.toLowerCase())?"support.type":b.hasOwnProperty(e.toLowerCase())?"support.function":c.hasOwnProperty(e.toLowerCase())?"support.constant":d.hasOwnProperty(e.toLowerCase())?"support.constant.color":"text"},regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"}],h=e.copyArray(g);h.unshift({token:"paren.rparen",regex:"\\}",next:"start"});var i=e.copyArray(g);i.unshift({token:"paren.rparen",regex:"\\}",next:"media"});var j=[{token:"comment",merge:!0,regex:".+"}],k=e.copyArray(j);k.unshift({token:"comment",regex:".*?\\*\\/",next:"start"});var l=e.copyArray(j);l.unshift({token:"comment",regex:".*?\\*\\/",next:"media"});var m=e.copyArray(j);m.unshift({token:"comment",regex:".*?\\*\\/",next:"ruleset"}),this.$rules={start:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"paren.lparen",regex:"\\{",next:"ruleset"},{token:"string",regex:"@.*?{",next:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"}],media:[{token:"comment",merge:!0,regex:"\\/\\*",next:"media_comment"},{token:"paren.lparen",regex:"\\{",next:"media_ruleset"},{token:"string",regex:"\\}",next:"start"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant",regex:"[a-z0-9-_]+"}],comment:k,ruleset:h,ruleset_comment:m,media_ruleset:i,media_comment:l}};d.inherits(g,f),b.CssHighlightRules=g}),define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_util","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./css_highlight_rules").CssHighlightRules,f=a("./javascript_highlight_rules").JavaScriptHighlightRules,g=a("./xml_util"),h=a("./text_highlight_rules").TextHighlightRules,i=function(){this.$rules={start:[{token:"text",merge:!0,regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<(?=s*script\\b)",next:"script"},{token:"meta.tag",regex:"<(?=s*style\\b)",next:"css"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",merge:!0,regex:"\\s+"},{token:"text",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},g.tag(this.$rules,"tag","start"),g.tag(this.$rules,"css","css-start"),g.tag(this.$rules,"script","js-start"),this.embedRules(f,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"meta.tag",regex:"<\\/(?=script)",next:"tag"}]),this.embedRules(e,"css-",[{token:"meta.tag",regex:"<\\/(?=style)",next:"tag"}])};d.inherits(i,h),b.HtmlHighlightRules=i}),define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("./mixed").FoldMode,f=a("./xml").FoldMode,g=a("./cstyle").FoldMode,h=b.FoldMode=function(){e.call(this,new f({area:1,base:1,br:1,col:1,command:1,embed:1,hr:1,img:1,input:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1,li:1,dt:1,dd:1,p:1,rt:1,rp:1,optgroup:1,option:1,colgroup:1,td:1,th:1}),{"js-":new g,"css-":new g})};d.inherits(h,e)}),define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("./fold_mode").FoldMode,f=b.FoldMode=function(a,b){this.defaultMode=a,this.subModes=b};d.inherits(f,e),function(){this.$getMode=function(a){for(var b in this.subModes)if(a.indexOf(b)===0)return this.subModes[b];return null},this.$tryMode=function(a,b,c,d){var e=this.$getMode(a);return e?e.getFoldWidget(b,c,d):""},this.getFoldWidget=function(a,b,c){return this.$tryMode(a.getState(c-1),a,b,c)||this.$tryMode(a.getState(c),a,b,c)||this.defaultMode.getFoldWidget(a,b,c)},this.getFoldWidgetRange=function(a,b,c){var d=this.$getMode(a.getState(c-1));if(!d||!d.getFoldWidget(a,b,c))d=this.$getMode(a.getState(c));if(!d||!d.getFoldWidget(a,b,c))d=this.defaultMode;return d.getFoldWidgetRange(a,b,c)}}.call(f.prototype)}),define("ace/mode/markdown_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules","ace/mode/html_highlight_rules","ace/mode/css_highlight_rules"],function(a,b,c){function j(a,b){return{token:"support.function",regex:"^```"+a+"\\s*$",next:b+"start"}}"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=a("./javascript_highlight_rules").JavaScriptHighlightRules,g=a("./xml_highlight_rules").XmlHighlightRules,h=a("./html_highlight_rules").HtmlHighlightRules,i=a("./css_highlight_rules").CssHighlightRules,k=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{token:"support.function",regex:"(`+)([^\\r]*?[^`])(\\1)"},{token:"support.function",regex:"^[ ]{4}.+"},{token:"markup.heading.1",regex:"^=+(?=\\s*$)"},{token:"markup.heading.1",regex:"^\\-+(?=\\s*$)"},{token:function(a){return"markup.heading."+a.length},regex:"^#{1,6}"},j("javascript","js-"),j("xml","xml-"),j("html","html-"),j("css","css-"),{token:"support.function",regex:"^```[a-zA-Z]+\\s*$",next:"githubblock"},{token:"string",regex:"^>[ ].+$",next:"blockquote"},{token:["text","constant","text","url","string","text"],regex:'^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:["][^"]+["])?\\s*)$'},{token:["text","string","text","constant","text"],regex:"(\\[)((?:[[^\\]]*\\]|[^\\[\\]])*)(\\][ ]?(?:\\n[ ]*)?\\[)(.*?)(\\])"},{token:["text","string","text","markup.underline","string","text"],regex:'(\\[)(\\[[^\\]]*\\]|[^\\[\\]]*)(\\]\\([ \\t]*)(?)((?:[ \t]*"(?:.*?)"[ \\t]*)?)(\\))'},{token:"constant",regex:"^[ ]{0,2}(?:[ ]?\\*[ ]?){3,}\\s*$"},{token:"constant",regex:"^[ ]{0,2}(?:[ ]?\\-[ ]?){3,}\\s*$"},{token:"constant",regex:"^[ ]{0,2}(?:[ ]?\\_[ ]?){3,}\\s*$"},{token:"markup.list",regex:"^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+",next:"listblock"},{token:"string",regex:"([*]{2}|[_]{2}(?=\\S))([^\\r]*?\\S[*_]*)(\\1)"},{token:"string",regex:"([*]|[_](?=\\S))([^\\r]*?\\S[*_]*)(\\1)"},{token:["text","url","text"],regex:"(<)((?:https?|ftp|dict):[^'\">\\s]+|(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+)(>)"},{token:"text",regex:"[^\\*_%$`\\[#<>]+"}],listblock:[{token:"empty_line",regex:"^$",next:"start"},{token:"markup.list",regex:".+"}],blockquote:[{token:"empty_line",regex:"^\\s*$",next:"start"},{token:"string",regex:".+"}],githubblock:[{token:"support.function",regex:"^```",next:"start"},{token:"support.function",regex:".+"}]},this.embedRules(f,"js-",[{token:"support.function",regex:"^```",next:"start"}]),this.embedRules(h,"html-",[{token:"support.function",regex:"^```",next:"start"}]),this.embedRules(i,"css-",[{token:"support.function",regex:"^```",next:"start"}]),this.embedRules(g,"xml-",[{token:"support.function",regex:"^```",next:"start"}])};d.inherits(k,e),b.MarkdownHighlightRules=k}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-ocaml.js b/apps/files_texteditor/js/aceeditor/mode-ocaml.js index 56585c0ee61..0e3e15f225c 100644 --- a/apps/files_texteditor/js/aceeditor/mode-ocaml.js +++ b/apps/files_texteditor/js/aceeditor/mode-ocaml.js @@ -1 +1 @@ -define("ace/mode/ocaml",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/ocaml_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/ocaml_highlight_rules").OcamlHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e);var k=/(?:[({[=:]|[-=]>|\b(?:else|try|with))\s*$/;(function(){this.toggleCommentLines=function(a,b,c,d){var e,f,g=!0,h=/^\s*\(\*(.*)\*\)/;for(e=c;e<=d;e++)if(!h.test(b.getLine(e))){g=!1;break}var j=new i(0,0,0,0);for(e=c;e<=d;e++)f=b.getLine(e),j.start.row=e,j.end.row=e,j.end.column=f.length,b.replace(j,g?f.match(h)[1]:"(*"+f+"*)")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;(!e.length||e[e.length-1].type!=="comment")&&a==="start"&&k.test(b)&&(d+=c);return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}).call(j.prototype),b.Mode=j}),define("ace/mode/ocaml_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|or|private|rec|sig|struct|then|to|try|type|val|virtual|when|while|with".split("|")),b=e.arrayToMap("true|false".split("|")),c=e.arrayToMap("abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|add_available_units|add_big_int|add_buffer|add_channel|add_char|add_initializer|add_int_big_int|add_interfaces|add_num|add_string|add_substitute|add_substring|alarm|allocated_bytes|allow_only|allow_unsafe_modules|always|append|appname_get|appname_set|approx_num_exp|approx_num_fix|arg|argv|arith_status|array|array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|chown|chr|chroot|classify_float|clear|clear_available_units|clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|close_out|close_out_noerr|close_process|close_process|close_process_full|close_process_in|close_process_out|close_subwindow|close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|combine|combine|command|compact|compare|compare_big_int|compare_num|complex32|complex64|concat|conj|connect|contains|contains_from|contents|copy|cos|cosh|count|count|counters|create|create_alarm|create_image|create_matrix|create_matrix|create_matrix|create_object|create_object_and_run_initializers|create_object_opt|create_process|create_process|create_process_env|create_process_env|create_table|current|current_dir_name|current_point|current_x|current_y|curveto|custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|error_message|escaped|establish_server|executable_name|execv|execve|execvp|execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|float|float32|float64|float_of_big_int|float_of_bits|float_of_int|float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|for_all|for_all2|force|force_newline|force_val|foreground|fork|format_of_string|formatter_of_buffer|formatter_of_out_channel|fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|genarray_of_array1|genarray_of_array2|genarray_of_array3|get|get_all_formatter_output_functions|get_approx_printing|get_copy|get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|get_formatter_output_functions|get_formatter_tag_functions|get_image|get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|global_replace|global_substitute|gmtime|green|grid|group_beginning|group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|marshal|match_beginning|match_end|matched_group|matched_string|max|max_array_length|max_big_int|max_elt|max_float|max_int|max_num|max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|output_char|output_string|output_value|over_max_boxes|pack|params|parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|power_big_int_positive_big_int|power_big_int_positive_int|power_int_positive_big_int|power_int_positive_int|power_num|pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|pp_get_all_formatter_output_functions|pp_get_ellipsis_text|pp_get_formatter_output_functions|pp_get_formatter_tag_functions|pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|pp_set_all_formatter_output_functions|pp_set_ellipsis_text|pp_set_formatter_out_channel|pp_set_formatter_output_functions|pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|print_bool|print_break|print_char|print_cut|print_endline|print_float|print_flush|print_if_newline|print_int|print_newline|print_space|print_stat|print_string|print_tab|print_tbreak|printf|prohibit|public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|regexp_string_case_fold|register|register_exception|rem|remember_mode|remove|remove_assoc|remove_assq|rename|replace|replace_first|replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|run_initializers|run_initializers_opt|scanf|search_backward|search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|set_all_formatter_output_functions|set_approx_printing|set_binary_mode_in|set_binary_mode_out|set_close_on_exec|set_close_on_exec|set_color|set_ellipsis_text|set_error_when_null_denominator|set_field|set_floating_precision|set_font|set_formatter_out_channel|set_formatter_output_functions|set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|str_formatter|string|string_after|string_before|string_match|string_of_big_int|string_of_bool|string_of_float|string_of_format|string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|sub_right|subset|subset|substitute_first|substring|succ|succ|succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|temp_file|text_size|time|time|time|timed_read|timed_write|times|times|tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|wait_timed_read|wait_timed_write|wait_write|waitpid|white|widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak".split("|")),d="(?:(?:[1-9]\\d*)|(?:0))",f="(?:0[oO]?[0-7]+)",g="(?:0[xX][\\dA-Fa-f]+)",h="(?:0[bB][01]+)",i="(?:"+d+"|"+f+"|"+g+"|"+h+")",j="(?:[eE][+-]?\\d+)",k="(?:\\.\\d+)",l="(?:\\d+)",m="(?:(?:"+l+"?"+k+")|(?:"+l+"\\.))",n="(?:(?:"+m+"|"+l+")"+j+")",o="(?:"+n+"|"+m+")";this.$rules={start:[{token:"comment",regex:"\\(\\*.*?\\*\\)\\s*?$"},{token:"comment",merge:!0,regex:"\\(\\*.*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"'.'"},{token:"string",merge:!0,regex:'"',next:"qstring"},{token:"constant.numeric",regex:"(?:"+o+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:o},{token:"constant.numeric",regex:i+"\\b"},{token:function(d){return a.hasOwnProperty(d)?"keyword":b.hasOwnProperty(d)?"constant.language":c.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+\\.|\\-\\.|\\*\\.|\\/\\.|#|;;|\\+|\\-|\\*|\\*\\*\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|<-|="},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\)",next:"start"},{token:"comment",merge:!0,regex:".+"}],qstring:[{token:"string",regex:'"',next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.OcamlHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/ocaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/ocaml_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./ocaml_highlight_rules").OcamlHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e);var k=/(?:[({[=:]|[-=]>|\b(?:else|try|with))\s*$/;((function(){this.toggleCommentLines=function(a,b,c,d){var e,f,g=!0,h=/^\s*\(\*(.*)\*\)/;for(e=c;e<=d;e++)if(!h.test(b.getLine(e))){g=!1;break}var j=new i(0,0,0,0);for(e=c;e<=d;e++)f=b.getLine(e),j.start.row=e,j.end.row=e,j.end.column=f.length,b.replace(j,g?f.match(h)[1]:"(*"+f+"*)")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;return(!e.length||e[e.length-1].type!=="comment")&&a==="start"&&k.test(b)&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}})).call(j.prototype),b.Mode=j}),define("ace/mode/ocaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|or|private|rec|sig|struct|then|to|try|type|val|virtual|when|while|with".split("|")),b=e.arrayToMap("true|false".split("|")),c=e.arrayToMap("abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|add_available_units|add_big_int|add_buffer|add_channel|add_char|add_initializer|add_int_big_int|add_interfaces|add_num|add_string|add_substitute|add_substring|alarm|allocated_bytes|allow_only|allow_unsafe_modules|always|append|appname_get|appname_set|approx_num_exp|approx_num_fix|arg|argv|arith_status|array|array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|chown|chr|chroot|classify_float|clear|clear_available_units|clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|close_out|close_out_noerr|close_process|close_process|close_process_full|close_process_in|close_process_out|close_subwindow|close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|combine|combine|command|compact|compare|compare_big_int|compare_num|complex32|complex64|concat|conj|connect|contains|contains_from|contents|copy|cos|cosh|count|count|counters|create|create_alarm|create_image|create_matrix|create_matrix|create_matrix|create_object|create_object_and_run_initializers|create_object_opt|create_process|create_process|create_process_env|create_process_env|create_table|current|current_dir_name|current_point|current_x|current_y|curveto|custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|error_message|escaped|establish_server|executable_name|execv|execve|execvp|execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|float|float32|float64|float_of_big_int|float_of_bits|float_of_int|float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|for_all|for_all2|force|force_newline|force_val|foreground|fork|format_of_string|formatter_of_buffer|formatter_of_out_channel|fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|genarray_of_array1|genarray_of_array2|genarray_of_array3|get|get_all_formatter_output_functions|get_approx_printing|get_copy|get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|get_formatter_output_functions|get_formatter_tag_functions|get_image|get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|global_replace|global_substitute|gmtime|green|grid|group_beginning|group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|marshal|match_beginning|match_end|matched_group|matched_string|max|max_array_length|max_big_int|max_elt|max_float|max_int|max_num|max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|output_char|output_string|output_value|over_max_boxes|pack|params|parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|power_big_int_positive_big_int|power_big_int_positive_int|power_int_positive_big_int|power_int_positive_int|power_num|pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|pp_get_all_formatter_output_functions|pp_get_ellipsis_text|pp_get_formatter_output_functions|pp_get_formatter_tag_functions|pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|pp_set_all_formatter_output_functions|pp_set_ellipsis_text|pp_set_formatter_out_channel|pp_set_formatter_output_functions|pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|print_bool|print_break|print_char|print_cut|print_endline|print_float|print_flush|print_if_newline|print_int|print_newline|print_space|print_stat|print_string|print_tab|print_tbreak|printf|prohibit|public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|regexp_string_case_fold|register|register_exception|rem|remember_mode|remove|remove_assoc|remove_assq|rename|replace|replace_first|replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|run_initializers|run_initializers_opt|scanf|search_backward|search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|set_all_formatter_output_functions|set_approx_printing|set_binary_mode_in|set_binary_mode_out|set_close_on_exec|set_close_on_exec|set_color|set_ellipsis_text|set_error_when_null_denominator|set_field|set_floating_precision|set_font|set_formatter_out_channel|set_formatter_output_functions|set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|str_formatter|string|string_after|string_before|string_match|string_of_big_int|string_of_bool|string_of_float|string_of_format|string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|sub_right|subset|subset|substitute_first|substring|succ|succ|succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|temp_file|text_size|time|time|time|timed_read|timed_write|times|times|tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|wait_timed_read|wait_timed_write|wait_write|waitpid|white|widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak".split("|")),d="(?:(?:[1-9]\\d*)|(?:0))",f="(?:0[oO]?[0-7]+)",g="(?:0[xX][\\dA-Fa-f]+)",h="(?:0[bB][01]+)",i="(?:"+d+"|"+f+"|"+g+"|"+h+")",j="(?:[eE][+-]?\\d+)",k="(?:\\.\\d+)",l="(?:\\d+)",m="(?:(?:"+l+"?"+k+")|(?:"+l+"\\.))",n="(?:(?:"+m+"|"+l+")"+j+")",o="(?:"+n+"|"+m+")";this.$rules={start:[{token:"comment",regex:"\\(\\*.*?\\*\\)\\s*?$"},{token:"comment",merge:!0,regex:"\\(\\*.*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"'.'"},{token:"string",merge:!0,regex:'"',next:"qstring"},{token:"constant.numeric",regex:"(?:"+o+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:o},{token:"constant.numeric",regex:i+"\\b"},{token:function(d){return a.hasOwnProperty(d)?"keyword":b.hasOwnProperty(d)?"constant.language":c.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+\\.|\\-\\.|\\*\\.|\\/\\.|#|;;|\\+|\\-|\\*|\\*\\*\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|<-|="},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\)",next:"start"},{token:"comment",merge:!0,regex:".+"}],qstring:[{token:"string",regex:'"',next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.OcamlHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-perl.js b/apps/files_texteditor/js/aceeditor/mode-perl.js index 521280f402c..706bb9362c3 100644 --- a/apps/files_texteditor/js/aceeditor/mode-perl.js +++ b/apps/files_texteditor/js/aceeditor/mode-perl.js @@ -1 +1 @@ -define("ace/mode/perl",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/perl_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/perl_highlight_rules").PerlHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/perl_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars".split("|")),b=e.arrayToMap("ARGV|ENV|INC|SIG".split("|")),c=e.arrayToMap("getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|getpeername|setpriority|getprotoent|setprotoent|getpriority|endprotoent|getservent|setservent|endservent|sethostent|socketpair|getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|map|die|uc|lc|do".split("|"));this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",merge:!0,regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",merge:!0,regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0x[0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:function(d){return a.hasOwnProperty(d)?"keyword":b.hasOwnProperty(d)?"constant.language":c.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.PerlHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/perl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/perl_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./perl_highlight_rules").PerlHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.foldingRules=new j};d.inherits(k,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)#/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[\:]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/perl_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars".split("|")),b=e.arrayToMap("ARGV|ENV|INC|SIG".split("|")),c=e.arrayToMap("getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|getpeername|setpriority|getprotoent|setprotoent|getpriority|endprotoent|getservent|setservent|endservent|sethostent|socketpair|getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|map|die|uc|lc|do".split("|"));this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",merge:!0,regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",merge:!0,regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0x[0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:function(d){return a.hasOwnProperty(d)?"keyword":b.hasOwnProperty(d)?"constant.language":c.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.PerlHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-php.js b/apps/files_texteditor/js/aceeditor/mode-php.js index 20b056b16db..a60c8df7269 100644 --- a/apps/files_texteditor/js/aceeditor/mode-php.js +++ b/apps/files_texteditor/js/aceeditor/mode-php.js @@ -1 +1 @@ -define("ace/mode/php",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/php_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/php_highlight_rules").PhpHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/mode/behaviour/cstyle").CstyleBehaviour,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j};d.inherits(k,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/php_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|class_parents|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|get_declared_interfaces|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|m_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|m_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|m_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|m_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|transliterator|traversable|trigger_error|trim|uasort|ucfirst|ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type".split("|")),b=e.arrayToMap("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|try|use|var|while|xor".split("|")),c=e.arrayToMap("die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset".split("|")),d=e.arrayToMap("true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__".split("|")),g=e.arrayToMap("$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|$http_response_header|$argc|$argv".split("|")),h=e.arrayToMap("key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregisterset_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|sql_regcase".split("|")),i=e.arrayToMap("cfunction|old_function".split("|")),j=e.arrayToMap([]);this.$rules={start:[{token:"support",regex:"<\\?(?:php|\\=)"},{token:"support",regex:"\\?>"},{token:"comment",regex:"\\/\\/.*$"},{token:"comment",regex:"#.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/][gimy]*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",merge:!0,regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",merge:!0,regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|VERSION))|__COMPILER_HALT_OFFSET__)\\b"},{token:"constant.language",regex:"\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\b"},{token:function(e){if(i.hasOwnProperty(e))return"invalid.deprecated";if(b.hasOwnProperty(e))return"keyword";if(c.hasOwnProperty(e))return"keyword";if(d.hasOwnProperty(e))return"constant.language";if(g.hasOwnProperty(e))return"variable.language";if(j.hasOwnProperty(e))return"invalid.illegal";if(h.hasOwnProperty(e))return"invalid.deprecated";if(a.hasOwnProperty(e))return"support.function";if(e.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|self|parent)$/))return"variable";return"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.PhpHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return!1;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}return!1}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}"){e.end.column++;return e}}return!1}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}return!1}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")"){e.end.column++;return e}}return!1}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return!1;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/php",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/php_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./php_highlight_rules").PhpHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("./behaviour/cstyle").CstyleBehaviour,k=a("./folding/cstyle").FoldMode,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j,this.foldingRules=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)#/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[\:]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(l.prototype),b.Mode=l}),define("ace/mode/php_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=new f,b=e.arrayToMap("abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|class_parents|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|get_declared_interfaces|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|m_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|m_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|m_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|m_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|transliterator|traversable|trigger_error|trim|uasort|ucfirst|ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type".split("|")),c=e.arrayToMap("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|try|use|var|while|xor".split("|")),d=e.arrayToMap("die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset".split("|")),g=e.arrayToMap("true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__".split("|")),h=e.arrayToMap("$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|$http_response_header|$argc|$argv".split("|")),i=e.arrayToMap("key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregisterset_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|sql_regcase".split("|")),j=e.arrayToMap("cfunction|old_function".split("|")),k=e.arrayToMap([]);this.$rules={start:[{token:"support.php_tag",regex:"<\\?(?:php|\\=)"},{token:"support.php_tag",regex:"\\?>"},{token:"comment",regex:"<\\!--",next:"htmlcomment"},{token:"meta.tag",regex:""},{token:"comment",regex:"\\/\\/.*$"},{token:"comment",regex:"#.*$"},a.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/][gimy]*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|VERSION))|__COMPILER_HALT_OFFSET__)\\b"},{token:"constant.language",regex:"\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\b"},{token:function(a){return c.hasOwnProperty(a)?"keyword":g.hasOwnProperty(a)?"constant.language":h.hasOwnProperty(a)?"variable.language":k.hasOwnProperty(a)?"invalid.illegal":b.hasOwnProperty(a)?"support.function":a=="debugger"?"invalid.deprecated":a.match(/^(\$[a-zA-Z][a-zA-Z0-9_]*|self|parent)$/)?"variable":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",regex:".+"}],htmlcomment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",regex:".+"}],htmltag:[{token:"meta.tag",regex:">",next:"start"},{token:"text",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"}],css:[{token:"meta.tag",regex:"",next:"htmltag"},{token:"meta.tag",regex:">"},{token:"text",regex:"(?:media|type|href)"},{token:"string",regex:'=".*?"'},{token:"paren.lparen",regex:"{",next:"cssdeclaration"},{token:"keyword",regex:"#[A-Za-z0-9-_.]+"},{token:"variable",regex:"\\.[A-Za-z0-9-_.]+"},{token:"constant",regex:"[A-Za-z0-9]+"}],cssdeclaration:[{token:"support.type",regex:"[-a-zA-Z]+",next:"cssvalue"},{token:"paren.rparen",regex:"}",next:"css"}],cssvalue:[{token:"text",regex:":"},{token:"constant",regex:"#[0-9a-zA-Z]+"},{token:"text",regex:"[-_0-9a-zA-Z\"' ,%]+"},{token:"text",regex:";",next:"cssdeclaration"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.PhpHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-powershell.js b/apps/files_texteditor/js/aceeditor/mode-powershell.js new file mode 100755 index 00000000000..9bbdef6989b --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-powershell.js @@ -0,0 +1 @@ +define("ace/mode/powershell",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/powershell_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./powershell_highlight_rules").PowershellHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("./behaviour/cstyle").CstyleBehaviour,j=a("./folding/cstyle").FoldMode,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i,this.foldingRules=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){return null}}.call(k.prototype),b.Mode=k}),define("ace/mode/powershell_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("function|if|else|elseif|switch|while|default|for|do|until|break|continue|foreach|return|filter|in|trap|throw|param|begin|process|end".split("|")),b=e.arrayToMap("Get-Alias|Import-Alias|New-Alias|Set-Alias|Get-AuthenticodeSignature|Set-AuthenticodeSignature|Set-Location|Get-ChildItem|Clear-Item|Get-Command|Measure-Command|Trace-Command|Add-Computer|Checkpoint-Computer|Remove-Computer|Restart-Computer|Restore-Computer|Stop-Computer|Reset-ComputerMachinePassword|Test-ComputerSecureChannel|Add-Content|Get-Content|Set-Content|Clear-Content|Get-Command|Invoke-Command|Enable-ComputerRestore|Disable-ComputerRestore|Get-ComputerRestorePoint|Test-Connection|ConvertFrom-CSV|ConvertTo-CSV|ConvertTo-Html|ConvertTo-Xml|ConvertFrom-SecureString|ConvertTo-SecureString|Copy-Item|Export-Counter|Get-Counter|Import-Counter|Get-Credential|Get-Culture|Get-ChildItem|Get-Date|Set-Date|Remove-Item|Compare-Object|Get-Event|Get-WinEvent|New-Event|Remove-Event|Unregister-Event|Wait-Event|Clear-EventLog|Get-Eventlog|Limit-EventLog|New-Eventlog|Remove-EventLog|Show-EventLog|Write-EventLog|Get-EventSubscriber|Register-EngineEvent|Register-ObjectEvent|Register-WmiEvent|Get-ExecutionPolicy|Set-ExecutionPolicy|Export-Alias|Export-Clixml|Export-Console|Export-Csv|ForEach-Object|Format-Custom|Format-List|Format-Table|Format-Wide|Export-FormatData|Get-FormatData|Get-Item|Get-ChildItem|Get-Help|Add-History|Clear-History|Get-History|Invoke-History|Get-Host|Read-Host|Write-Host|Get-HotFix|Import-Clixml|Import-Csv|Invoke-Command|Invoke-Expression|Get-Item|Invoke-Item|New-Item|Remove-Item|Set-Item|Clear-ItemProperty|Copy-ItemProperty|Get-ItemProperty|Move-ItemProperty|New-ItemProperty|Remove-ItemProperty|Rename-ItemProperty|Set-ItemProperty|Get-Job|Receive-Job|Remove-Job|Start-Job|Stop-Job|Wait-Job|Stop-Process|Update-List|Get-Location|Pop-Location|Push-Location|Set-Location|Send-MailMessage|Add-Member|Get-Member|Move-Item|Compare-Object|Group-Object|Measure-Object|New-Object|Select-Object|Sort-Object|Where-Object|Out-Default|Out-File|Out-GridView|Out-Host|Out-Null|Out-Printer|Out-String|Convert-Path|Join-Path|Resolve-Path|Split-Path|Test-Path|Get-Pfxcertificate|Pop-Location|Push-Location|Get-Process|Start-Process|Stop-Process|Wait-Process|Enable-PSBreakpoint|Disable-PSBreakpoint|Get-PSBreakpoint|Set-PSBreakpoint|Remove-PSBreakpoint|Get-PSDrive|New-PSDrive|Remove-PSDrive|Get-PSProvider|Set-PSdebug|Enter-PSSession|Exit-PSSession|Export-PSSession|Get-PSSession|Import-PSSession|New-PSSession|Remove-PSSession|Disable-PSSessionConfiguration|Enable-PSSessionConfiguration|Get-PSSessionConfiguration|Register-PSSessionConfiguration|Set-PSSessionConfiguration|Unregister-PSSessionConfiguration|New-PSSessionOption|Add-PsSnapIn|Get-PsSnapin|Remove-PSSnapin|Get-Random|Read-Host|Remove-Item|Rename-Item|Rename-ItemProperty|Select-Object|Select-XML|Send-MailMessage|Get-Service|New-Service|Restart-Service|Resume-Service|Set-Service|Start-Service|Stop-Service|Suspend-Service|Sort-Object|Start-Sleep|ConvertFrom-StringData|Select-String|Tee-Object|New-Timespan|Trace-Command|Get-Tracesource|Set-Tracesource|Start-Transaction|Complete-Transaction|Get-Transaction|Use-Transaction|Undo-Transaction|Start-Transcript|Stop-Transcript|Add-Type|Update-TypeData|Get-Uiculture|Get-Unique|Update-Formatdata|Update-Typedata|Clear-Variable|Get-Variable|New-Variable|Remove-Variable|Set-Variable|New-WebServiceProxy|Where-Object|Write-Debug|Write-Error|Write-Host|Write-Output|Write-Progress|Write-Verbose|Write-Warning|Set-WmiInstance|Invoke-WmiMethod|Get-WmiObject|Remove-WmiObject|Connect-WSMan|Disconnect-WSMan|Test-WSMan|Invoke-WSManAction|Disable-WSManCredSSP|Enable-WSManCredSSP|Get-WSManCredSSP|New-WSManInstance|Get-WSManInstance|Set-WSManInstance|Remove-WSManInstance|Set-WSManQuickConfig|New-WSManSessionOption".split("|")),c="eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains|ieq|ine|ige|igt|ile|ilt|ilike|inotlike|imatch|inotmatch|ireplace|icontains|inotcontains|is|isnot|as|and|or|band|bor|not";this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"[$](?:[Tt]rue|[Ff]alse)\\b"},{token:"constant.language",regex:"[$][Nn]ull\\b"},{token:"variable.instance",regex:"[$][a-zA-Z][a-zA-Z0-9_]*\\b"},{token:function(c){return a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b"},{token:"keyword.operator",regex:"\\-(?:"+c+")"},{token:"keyword.operator",regex:"&|\\*|\\+|\\-|\\=|\\+=|\\-="},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.PowershellHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-python.js b/apps/files_texteditor/js/aceeditor/mode-python.js index e0632e253ea..116f838b1d9 100644 --- a/apps/files_texteditor/js/aceeditor/mode-python.js +++ b/apps/files_texteditor/js/aceeditor/mode-python.js @@ -1 +1 @@ -define("ace/mode/python",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/python_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/python_highlight_rules").PythonHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/python_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield".split("|")),b=e.arrayToMap("True|False|None|NotImplemented|Ellipsis|__debug__".split("|")),c=e.arrayToMap("abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern".split("|")),d=e.arrayToMap("".split("|")),f="(?:r|u|ur|R|U|UR|Ur|uR)?",g="(?:(?:[1-9]\\d*)|(?:0))",h="(?:0[oO]?[0-7]+)",i="(?:0[xX][\\dA-Fa-f]+)",j="(?:0[bB][01]+)",k="(?:"+g+"|"+h+"|"+i+"|"+j+")",l="(?:[eE][+-]?\\d+)",m="(?:\\.\\d+)",n="(?:\\d+)",o="(?:(?:"+n+"?"+m+")|(?:"+n+"\\.))",p="(?:(?:"+o+"|"+n+")"+l+")",q="(?:"+p+"|"+o+")";this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:f+'"{3}(?:[^\\\\]|\\\\.)*?"{3}'},{token:"string",merge:!0,regex:f+'"{3}.*$',next:"qqstring"},{token:"string",regex:f+'"(?:[^\\\\]|\\\\.)*?"'},{token:"string",regex:f+"'{3}(?:[^\\\\]|\\\\.)*?'{3}"},{token:"string",merge:!0,regex:f+"'{3}.*$",next:"qstring"},{token:"string",regex:f+"'(?:[^\\\\]|\\\\.)*?'"},{token:"constant.numeric",regex:"(?:"+q+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:q},{token:"constant.numeric",regex:k+"[lL]\\b"},{token:"constant.numeric",regex:k+"\\b"},{token:function(e){return a.hasOwnProperty(e)?"keyword":b.hasOwnProperty(e)?"constant.language":d.hasOwnProperty(e)?"invalid.illegal":c.hasOwnProperty(e)?"support.function":e=="debugger"?"invalid.deprecated":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"lparen",regex:"[\\[\\(\\{]"},{token:"rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],qqstring:[{token:"string",regex:'(?:[^\\\\]|\\\\.)*?"{3}',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?'{3}",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.PythonHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/python",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/python_highlight_rules","ace/mode/folding/pythonic","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./python_highlight_rules").PythonHighlightRules,h=a("./folding/pythonic").FoldMode,i=a("../range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.foldingRules=new h("\\:")};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)#/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[\:]\s*$/);g&&(d+=c)}return d};var a={pass:1,"return":1,raise:1,"break":1,"continue":1};this.checkOutdent=function(b,c,d){if(d!=="\r\n"&&d!=="\r"&&d!=="\n")return!1;var e=this.$tokenizer.getLineTokens(c.trim(),b).tokens;if(!e)return!1;do var f=e.pop();while(f&&(f.type=="comment"||f.type=="text"&&f.value.match(/^\s+$/)));return f?f.type=="keyword"&&a[f.value]:!1},this.autoOutdent=function(a,b,c){c+=1;var d=this.$getIndent(b.getLine(c)),e=b.getTabString();d.slice(-e.length)==e&&b.remove(new i(c,d.length-e.length,c,d.length))}}.call(j.prototype),b.Mode=j}),define("ace/mode/python_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield".split("|")),b=e.arrayToMap("True|False|None|NotImplemented|Ellipsis|__debug__".split("|")),c=e.arrayToMap("abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern".split("|")),d=e.arrayToMap("".split("|")),f="(?:r|u|ur|R|U|UR|Ur|uR)?",g="(?:(?:[1-9]\\d*)|(?:0))",h="(?:0[oO]?[0-7]+)",i="(?:0[xX][\\dA-Fa-f]+)",j="(?:0[bB][01]+)",k="(?:"+g+"|"+h+"|"+i+"|"+j+")",l="(?:[eE][+-]?\\d+)",m="(?:\\.\\d+)",n="(?:\\d+)",o="(?:(?:"+n+"?"+m+")|(?:"+n+"\\.))",p="(?:(?:"+o+"|"+n+")"+l+")",q="(?:"+p+"|"+o+")";this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:f+'"{3}(?:[^\\\\]|\\\\.)*?"{3}'},{token:"string",merge:!0,regex:f+'"{3}.*$',next:"qqstring"},{token:"string",regex:f+'"(?:[^\\\\]|\\\\.)*?"'},{token:"string",regex:f+"'{3}(?:[^\\\\]|\\\\.)*?'{3}"},{token:"string",merge:!0,regex:f+"'{3}.*$",next:"qstring"},{token:"string",regex:f+"'(?:[^\\\\]|\\\\.)*?'"},{token:"constant.numeric",regex:"(?:"+q+"|\\d+)[jJ]\\b"},{token:"constant.numeric",regex:q},{token:"constant.numeric",regex:k+"[lL]\\b"},{token:"constant.numeric",regex:k+"\\b"},{token:function(e){return a.hasOwnProperty(e)?"keyword":b.hasOwnProperty(e)?"constant.language":d.hasOwnProperty(e)?"invalid.illegal":c.hasOwnProperty(e)?"support.function":e=="debugger"?"invalid.deprecated":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"lparen.paren",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],qqstring:[{token:"string",regex:'(?:[^\\\\]|\\\\.)*?"{3}',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:[^\\\\]|\\\\.)*?'{3}",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.PythonHighlightRules=g}),define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("./fold_mode").FoldMode,f=b.FoldMode=function(a){this.foldingStartMarker=new RegExp("(?:([\\[{])|("+a+"))(?:\\s*)(?:#.*)?$")};d.inherits(f,e),function(){this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),e=d.match(this.foldingStartMarker);if(e)return e[1]?this.openingBracketBlock(a,e[1],c,e.index):e[2]?this.indentationBlock(a,c,e.index+e[2].length):this.indentationBlock(a,c)}}.call(f.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-ruby.js b/apps/files_texteditor/js/aceeditor/mode-ruby.js index 43bfa2a5d8a..2eeb69f5d5a 100644 --- a/apps/files_texteditor/js/aceeditor/mode-ruby.js +++ b/apps/files_texteditor/js/aceeditor/mode-ruby.js @@ -1 +1 @@ -define("ace/mode/ruby",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/ruby_highlight_rules").RubyHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/ruby_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|h|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|t|l|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many".split("|")),b=e.arrayToMap("alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield".split("|")),c=e.arrayToMap("true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING".split("|")),d=e.arrayToMap("$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger".split("|"));this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment",merge:!0,regex:"^=begin$",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},{token:"text",regex:"::"},{token:"variable.instancce",regex:"@{1,2}(?:[a-zA-Z_]|d)+"},{token:"variable.class",regex:"[A-Z](?:[a-zA-Z_]|d)+"},{token:"string",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"},{token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="self"?"variable.language":b.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"constant.language":d.hasOwnProperty(e)?"variable.language":a.hasOwnProperty(e)?"support.function":e=="debugger"?"invalid.deprecated":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"^=end$",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.RubyHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./ruby_highlight_rules").RubyHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)#/;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"#")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var g=b.match(/^.*[\{\(\[]\s*$/);g&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|h|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|t|l|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many".split("|")),b=e.arrayToMap("alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield".split("|")),c=e.arrayToMap("true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING".split("|")),d=e.arrayToMap("$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger".split("|"));this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment",merge:!0,regex:"^=begin$",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},{token:"text",regex:"::"},{token:"variable.instancce",regex:"@{1,2}(?:[a-zA-Z_]|d)+"},{token:"variable.class",regex:"[A-Z](?:[a-zA-Z_]|d)+"},{token:"string",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"},{token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="self"?"variable.language":b.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"constant.language":d.hasOwnProperty(e)?"variable.language":a.hasOwnProperty(e)?"support.function":e=="debugger"?"invalid.deprecated":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"^=end$",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.RubyHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-scad.js b/apps/files_texteditor/js/aceeditor/mode-scad.js index 32054602fa4..1deeef11524 100644 --- a/apps/files_texteditor/js/aceeditor/mode-scad.js +++ b/apps/files_texteditor/js/aceeditor/mode-scad.js @@ -1 +1 @@ -define("ace/mode/scad",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/scad_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/scad_highlight_rules").scadHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/mode/behaviour/cstyle").CstyleBehaviour,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j};d.inherits(k,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/scad_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("module|if|else|for".split("|")),b=e.arrayToMap("NULL".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant",regex:"<[a-zA-Z0-9.]+>"},{token:"keyword",regex:"(?:use|include)"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.scadHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return!1;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}return!1}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}"){e.end.column++;return e}}return!1}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}return!1}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")"){e.end.column++;return e}}return!1}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return!1;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/scad",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/scad_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./scad_highlight_rules").scadHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("./behaviour/cstyle").CstyleBehaviour,k=a("./folding/cstyle").FoldMode,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j,this.foldingRules=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(l.prototype),b.Mode=l}),define("ace/mode/scad_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("module|if|else|for".split("|")),b=e.arrayToMap("NULL".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:'["].*\\\\$',next:"qqstring"},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"string",regex:"['].*\\\\$",next:"qstring"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant",regex:"<[a-zA-Z0-9.]+>"},{token:"keyword",regex:"(?:use|include)"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.scadHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-scala.js b/apps/files_texteditor/js/aceeditor/mode-scala.js index aab530c11aa..c697fe1781a 100644 --- a/apps/files_texteditor/js/aceeditor/mode-scala.js +++ b/apps/files_texteditor/js/aceeditor/mode-scala.js @@ -1 +1 @@ -define("ace/mode/scala",["require","exports","module","pilot/oop","ace/mode/javascript","ace/tokenizer","ace/mode/scala_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/javascript").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/scala_highlight_rules").ScalaHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/mode/behaviour/cstyle").CstyleBehaviour,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new i};d.inherits(j,e),function(){this.createWorker=function(a){return null}}.call(j.prototype),b.Mode=j}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/scala_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("case|default|do|else|for|if|match|while|throw|return|try|catch|finally|yield|abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|override|package|private|protected|sealed|super|this|trait|type|val|var|with".split("|")),b=e.arrayToMap("true|false".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object|Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|Option|Array|Char|Byte|Short|Int|Long|Nothing".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.ScalaHighlightRules=h}) \ No newline at end of file +define("ace/mode/scala",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/tokenizer","ace/mode/scala_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./javascript").Mode,f=a("../tokenizer").Tokenizer,g=a("./scala_highlight_rules").ScalaHighlightRules,h=function(){e.call(this),this.$tokenizer=new f((new g).getRules())};d.inherits(h,e),function(){this.createWorker=function(a){return null}}.call(h.prototype),b.Mode=h}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/scala_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./doc_comment_highlight_rules").DocCommentHighlightRules,g=a("./text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("case|default|do|else|for|if|match|while|throw|return|try|catch|finally|yield|abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|override|package|private|protected|sealed|super|this|trait|type|val|var|with".split("|")),b=e.arrayToMap("true|false".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object|Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|Option|Array|Char|Byte|Short|Int|Long|Nothing".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.ScalaHighlightRules=h}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-scss.js b/apps/files_texteditor/js/aceeditor/mode-scss.js index 9b4e118427a..3f63dc4305d 100644 --- a/apps/files_texteditor/js/aceeditor/mode-scss.js +++ b/apps/files_texteditor/js/aceeditor/mode-scss.js @@ -1 +1 @@ -define("ace/mode/scss",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/scss_highlight_rules","ace/mode/matching_brace_outdent"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/scss_highlight_rules").ScssHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(i,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);f&&(d+=c);return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(i.prototype),b.Mode=i}),define("ace/mode/scss_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){function i(a){var b=[],c=a.split("");for(var d=0;d|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.ScssHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/scss",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/scss_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./scss_highlight_rules").ScssHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("./folding/cstyle").FoldMode,j=function(){this.$tokenizer=new f((new g).getRules(),"i"),this.$outdent=new h,this.foldingRules=new i};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);return f&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/scss_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap(function(){var a="-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-".split("|"),b="appearance|background-clip|background-inline-policy|background-origin|background-size|binding|border-bottom-colors|border-left-colors|border-right-colors|border-top-colors|border-end|border-end-color|border-end-style|border-end-width|border-image|border-start|border-start-color|border-start-style|border-start-width|box-align|box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|box-pack|box-sizing|column-count|column-gap|column-width|column-rule|column-rule-width|column-rule-style|column-rule-color|float-edge|font-feature-settings|font-language-override|force-broken-image-icon|image-region|margin-end|margin-start|opacity|outline|outline-color|outline-offset|outline-radius|outline-radius-bottomleft|outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|outline-style|outline-width|padding-end|padding-start|stack-sizing|tab-size|text-blink|text-decoration-color|text-decoration-line|text-decoration-style|transform|transform-origin|transition|transition-delay|transition-duration|transition-property|transition-timing-function|user-focus|user-input|user-modify|user-select|window-shadow|border-radius".split("|"),c="azimuth|background-attachment|background-color|background-image|background-position|background-repeat|background|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border|bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|z-index".split("|"),d=[];for(var e=0,f=a.length;e|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]}};d.inherits(g,f),b.ScssHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../range").Range,f=a("./fold_mode").FoldMode,g=b.FoldMode=function(){};d.inherits(g,f),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(a,b,c){var d=a.getLine(c),f=d.match(this.foldingStartMarker);if(f){var g=f.index;if(f[1])return this.openingBracketBlock(a,f[1],c,g);var h=a.getCommentFoldRange(c,g+f[0].length);return h.end.column-=2,h}if(b!=="markbeginend")return;var f=d.match(this.foldingStopMarker);if(f){var g=f.index+f[0].length;if(f[2]){var h=a.getCommentFoldRange(c,g);return h.end.column-=2,h}var i={row:c,column:g},j=a.$findOpeningBracket(f[1],i);if(!j)return;return j.column++,i.column--,e.fromPoints(j,i)}}}.call(g.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-sql.js b/apps/files_texteditor/js/aceeditor/mode-sql.js new file mode 100755 index 00000000000..3ca95359086 --- /dev/null +++ b/apps/files_texteditor/js/aceeditor/mode-sql.js @@ -0,0 +1 @@ +define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/sql_highlight_rules","ace/range"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./sql_highlight_rules").SqlHighlightRules,h=a("../range").Range,i=function(){this.$tokenizer=new f((new g).getRules())};d.inherits(i,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)--/;for(var i=c;i<=d;i++)if(!g.test(b.getLine(i))){e=!1;break}if(e){var j=new h(0,0,0,0);for(var i=c;i<=d;i++){var k=b.getLine(i),l=k.match(g);j.start.row=i,j.end.row=i,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"--")}}.call(i.prototype),b.Mode=i}),define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/lang"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("select|from|where|and|or|group|by|order|limit|offset|having|as|case|when|else|end|type|left|right|join|on|outer|desc|asc".split("|")),b=e.arrayToMap("true|false|null".split("|")),c=e.arrayToMap("count|min|max|avg|sum|rank|now|coalesce".split("|"));this.$rules={start:[{token:"comment",regex:"--.*$"},{token:"string",regex:'".*"'},{token:"string",regex:"'.*'"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:function(d){return d=d.toLowerCase(),a.hasOwnProperty(d)?"keyword":b.hasOwnProperty(d)?"constant.language":c.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"lparen.paren",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"text",regex:"\\s+"}]}};d.inherits(g,f),b.SqlHighlightRules=g}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-svg.js b/apps/files_texteditor/js/aceeditor/mode-svg.js index d8b49f8971e..e3865a788d3 100644 --- a/apps/files_texteditor/js/aceeditor/mode-svg.js +++ b/apps/files_texteditor/js/aceeditor/mode-svg.js @@ -1 +1 @@ -define("ace/mode/svg",["require","exports","module","pilot/oop","ace/mode/text","ace/mode/javascript","ace/tokenizer","ace/mode/svg_highlight_rules","ace/mode/behaviour/xml"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/mode/javascript").Mode,g=a("ace/tokenizer").Tokenizer,h=a("ace/mode/svg_highlight_rules").SvgHighlightRules,i=a("ace/mode/behaviour/xml").XmlBehaviour,j=function(){this.highlighter=new h,this.$tokenizer=new g(this.highlighter.getRules()),this.$behaviour=new i,this.$embeds=this.highlighter.getEmbeds(),this.createModeDelegates({"js-":f})};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){return 0},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1}}.call(j.prototype),b.Mode=j}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=a.getDocument(),c=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");c.call("setValue",[b.getValue()]),b.on("change",function(a){a.range={start:a.data.range.start,end:a.data.range.end},c.emit("change",a)}),c.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"lparen",regex:"[[({]",next:"regex_allowed"},{token:"rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.callbacks=[];if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/svg_highlight_rules",["require","exports","module","pilot/oop","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,f=a("ace/mode/xml_highlight_rules").XmlHighlightRules,g=function(){f.call(this),this.$rules.start.splice(3,0,{token:"text",regex:"<(?=s*script)",next:"script"}),this.$rules.script=[{token:"text",regex:">",next:"js-start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"}],this.embedRules(e,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"text",regex:"<\\/(?=script)",next:"tag"}])};d.inherits(g,f),b.SvgHighlightRules=g}),define("ace/mode/xml_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"text",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"text",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],tag:[{token:"text",regex:">",next:"start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"},{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*$',next:"qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*$",next:"qstring"}],qstring:[{token:"string",regex:".*'",next:"tag"},{token:"string",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'.*"',next:"tag"},{token:"string",merge:!0,regex:".+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(f,e),b.XmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","pilot/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=a("ace/mode/behaviour/cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k==""},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},e.tag(this.$rules,"tag","start")};d.inherits(g,f),b.XmlHighlightRules=g}),define("ace/mode/xml_util",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return[{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*',next:a+"-qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*",next:a+"-qstring"}]}function h(a,b){return[{token:"string",merge:!0,regex:".*?"+a,next:b},{token:"string",merge:!0,regex:".+"}]}"use strict";var d=a("../lib/lang"),e=d.arrayToMap("button|form|input|label|select|textarea".split("|")),f=d.arrayToMap("table|tbody|td|tfoot|th|tr".split("|"));b.tag=function(a,b,c){a[b]=[{token:"text",regex:"\\s+"},{token:function(a){return a==="a"?"meta.tag.anchor":a==="img"?"meta.tag.image":a==="script"?"meta.tag.script":a==="style"?"meta.tag.style":e.hasOwnProperty(a.toLowerCase())?"meta.tag.form":f.hasOwnProperty(a.toLowerCase())?"meta.tag.table":"meta.tag"},merge:!0,regex:"[-_a-zA-Z0-9:!]+",next:b+"embed-attribute-list"},{token:"empty",regex:"",next:b+"embed-attribute-list"}],a[b+"-qstring"]=h("'",b+"embed-attribute-list"),a[b+"-qqstring"]=h('"',b+"embed-attribute-list"),a[b+"embed-attribute-list"]=[{token:"meta.tag",merge:!0,regex:"/?>",next:c},{token:"keyword.operator",regex:"="},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(g(b))}}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=a("./cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="f.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../lib/lang"),f=a("../../range").Range,g=a("./fold_mode").FoldMode,h=a("../../token_iterator").TokenIterator,i=b.FoldMode=function(a){g.call(this),this.voidElements=a||{}};d.inherits(i,g),function(){this.getFoldWidget=function(a,b,c){var d=this._getFirstTagInLine(a,c);return d.closing?b=="markbeginend"?"end":"":!d.tagName||this.voidElements[d.tagName.toLowerCase()]?"":d.selfClosing?"":d.value.indexOf("/"+d.tagName)!==-1?"":"start"},this._getFirstTagInLine=function(a,b){var c=a.getTokens(b,b)[0].tokens,d="";for(var f=0;f?)/,this._parseTag=function(a){var b=this.tagRe.exec(a),c=this.tagRe.lastIndex||0;return this.tagRe.lastIndex=0,{value:a,match:b?b[2]:"",closing:b?!!b[3]:!1,selfClosing:b?!!b[5]||b[2]=="/>":!1,tagName:b?b[4]:"",column:b[1]?c+b[1].length:c}},this._readTagForward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){if(!d)var d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()};c+=b.value;if(c.indexOf(">")!==-1){var e=this._parseTag(c);return e.start=d,e.end={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length},a.stepForward(),e}}while(b=a.stepForward());return null},this._readTagBackward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){d||(d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length}),c=b.value+c;if(c.indexOf("<")!==-1){var e=this._parseTag(c);return e.end=d,e.start={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()},a.stepBackward(),e}}while(b=a.stepBackward());return null},this._pop=function(a,b){while(a.length){var c=a[a.length-1];if(!b||c.tagName==b.tagName)return a.pop();if(this.voidElements[b.tagName])return;if(this.voidElements[c.tagName]){a.pop();continue}return null}},this.getFoldWidgetRange=function(a,b,c){var d=this._getFirstTagInLine(a,c);if(!d.match)return null;var e=d.closing||d.selfClosing,g=[],i;if(!e){var j=new h(a,c,d.column),k={row:c,column:d.column+d.tagName.length+2};while(i=this._readTagForward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(i.closing){this._pop(g,i);if(g.length==0)return f.fromPoints(k,i.start)}else g.push(i)}}else{var j=new h(a,c,d.column+d.match.length),l={row:c,column:d.column};while(i=this._readTagBackward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(!i.closing){this._pop(g,i);if(g.length==0)return i.start.column+=i.tagName.length+2,f.fromPoints(i.start,l)}else g.push(i)}}}}.call(i.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./javascript_highlight_rules").JavaScriptHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=a("../range").Range,j=a("../worker/worker_client").WorkerClient,k=a("./behaviour/cstyle").CstyleBehaviour,l=a("./folding/cstyle").FoldMode,m=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k,this.foldingRules=new l};d.inherits(m,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=/^(\s*)\/\//;for(var g=c;g<=d;g++)if(!f.test(b.getLine(g))){e=!1;break}if(e){var h=new i(0,0,0,0);for(var g=c;g<=d;g++){var j=b.getLine(g),k=j.match(f);h.start.row=g,h.end.row=g,h.end.column=k[0].length,b.replace(h,k[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/",next:"regex",merge:!0},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex"},{token:"string.regexp",regex:"/\\w*",next:"start",merge:!0},{token:"string.regexp",regex:"[^\\\\/\\[]+",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"\\[",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],regex_character_class:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)",next:"regex_character_class"},{token:"string.regexp.charachterclass",regex:"]",next:"regex",merge:!0},{token:"string.regexp.charachterclass",regex:"[^\\\\\\]]+",next:"regex_character_class",merge:!0},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=function(b,d,e,f){this.changeListener=this.changeListener.bind(this);if(c.packaged){var g=this.$guessBasePath();this.$worker=new Worker(g+d)}else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(h);var i={};for(var j=0;j)",next:"tag"},{token:"meta.tag",regex:"<\\/(?=script)",next:"tag"}])};d.inherits(h,f),b.SvgHighlightRules=h}),define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("./fold_mode").FoldMode,f=b.FoldMode=function(a,b){this.defaultMode=a,this.subModes=b};d.inherits(f,e),function(){this.$getMode=function(a){for(var b in this.subModes)if(a.indexOf(b)===0)return this.subModes[b];return null},this.$tryMode=function(a,b,c,d){var e=this.$getMode(a);return e?e.getFoldWidget(b,c,d):""},this.getFoldWidget=function(a,b,c){return this.$tryMode(a.getState(c-1),a,b,c)||this.$tryMode(a.getState(c),a,b,c)||this.defaultMode.getFoldWidget(a,b,c)},this.getFoldWidgetRange=function(a,b,c){var d=this.$getMode(a.getState(c-1));if(!d||!d.getFoldWidget(a,b,c))d=this.$getMode(a.getState(c));if(!d||!d.getFoldWidget(a,b,c))d=this.defaultMode;return d.getFoldWidgetRange(a,b,c)}}.call(f.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-textile.js b/apps/files_texteditor/js/aceeditor/mode-textile.js index 6767f638716..ad30c2d579e 100644 --- a/apps/files_texteditor/js/aceeditor/mode-textile.js +++ b/apps/files_texteditor/js/aceeditor/mode-textile.js @@ -1 +1 @@ -define("ace/mode/textile",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/textile_highlight_rules","ace/mode/matching_brace_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/textile_highlight_rules").TextileHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){return a=="intag"?c:""},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/textile_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"keyword",regex:"h1|h2|h3|h4|h5|h6|bq|p|bc|pre",next:"blocktag"},{token:"keyword",regex:"[\\*]+|[#]+"},{token:"text",regex:".+"}],blocktag:[{token:"keyword",regex:"\\. ",next:"start"},{token:"keyword",regex:"\\(",next:"blocktagproperties"}],blocktagproperties:[{token:"keyword",regex:"\\)",next:"blocktag"},{token:"string",regex:"[a-zA-Z0-9\\-_]+"},{token:"keyword",regex:"#"}]}};d.inherits(f,e),b.TextileHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}) \ No newline at end of file +define("ace/mode/textile",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/textile_highlight_rules","ace/mode/matching_brace_outdent"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./textile_highlight_rules").TextileHighlightRules,h=a("./matching_brace_outdent").MatchingBraceOutdent,i=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(i,e),function(){this.getNextLineIndent=function(a,b,c){return a=="intag"?c:""},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(i.prototype),b.Mode=i}),define("ace/mode/textile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:function(a){return a.match(/^h\d$/)?"markup.heading."+a.charAt(1):"markup.heading"},regex:"h1|h2|h3|h4|h5|h6|bq|p|bc|pre",next:"blocktag"},{token:"keyword",regex:"[\\*]+|[#]+"},{token:"text",regex:".+"}],blocktag:[{token:"keyword",regex:"\\. ",next:"start"},{token:"keyword",regex:"\\(",next:"blocktagproperties"}],blocktagproperties:[{token:"keyword",regex:"\\)",next:"blocktag"},{token:"string",regex:"[a-zA-Z0-9\\-_]+"},{token:"keyword",regex:"#"}]}};d.inherits(f,e),b.TextileHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../range").Range,e=function(){};((function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}})).call(e.prototype),b.MatchingBraceOutdent=e}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/mode-xml.js b/apps/files_texteditor/js/aceeditor/mode-xml.js index d000462f33b..236ab2430eb 100644 --- a/apps/files_texteditor/js/aceeditor/mode-xml.js +++ b/apps/files_texteditor/js/aceeditor/mode-xml.js @@ -1 +1 @@ -define("ace/mode/xml",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/xml_highlight_rules").XmlHighlightRules,h=a("ace/mode/behaviour/xml").XmlBehaviour,i=function(){this.$tokenizer=new f((new g).getRules()),this.$behaviour=new h};d.inherits(i,e),function(){this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)}}.call(i.prototype),b.Mode=i}),define("ace/mode/xml_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"text",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"text",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],tag:[{token:"text",regex:">",next:"start"},{token:"keyword",regex:"[-_a-zA-Z0-9:]+"},{token:"text",regex:"\\s+"},{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*$',next:"qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*$",next:"qstring"}],qstring:[{token:"string",regex:".*'",next:"tag"},{token:"string",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'.*"',next:"tag"},{token:"string",merge:!0,regex:".+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(f,e),b.XmlHighlightRules=f}),define("ace/mode/behaviour/xml",["require","exports","module","pilot/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=a("ace/mode/behaviour/cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="f.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}return!1}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"'){e.end.column++;return e}}return!1})};d.inherits(f,e),b.CstyleBehaviour=f}) \ No newline at end of file +define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./text").Mode,f=a("../tokenizer").Tokenizer,g=a("./xml_highlight_rules").XmlHighlightRules,h=a("./behaviour/xml").XmlBehaviour,i=a("./folding/xml").FoldMode,j=function(){this.$tokenizer=new f((new g).getRules()),this.$behaviour=new h,this.foldingRules=new i};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)}}.call(j.prototype),b.Mode=j}),define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/xml_util","ace/mode/text_highlight_rules"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("./xml_util"),f=a("./text_highlight_rules").TextHighlightRules,g=function(){this.$rules={start:[{token:"text",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"meta.tag",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",regex:"\\s+"},{token:"text",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},e.tag(this.$rules,"tag","start")};d.inherits(g,f),b.XmlHighlightRules=g}),define("ace/mode/xml_util",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return[{token:"string",regex:'".*?"'},{token:"string",merge:!0,regex:'["].*',next:a+"-qqstring"},{token:"string",regex:"'.*?'"},{token:"string",merge:!0,regex:"['].*",next:a+"-qstring"}]}function h(a,b){return[{token:"string",merge:!0,regex:".*?"+a,next:b},{token:"string",merge:!0,regex:".+"}]}"use strict";var d=a("../lib/lang"),e=d.arrayToMap("button|form|input|label|select|textarea".split("|")),f=d.arrayToMap("table|tbody|td|tfoot|th|tr".split("|"));b.tag=function(a,b,c){a[b]=[{token:"text",regex:"\\s+"},{token:function(a){return a==="a"?"meta.tag.anchor":a==="img"?"meta.tag.image":a==="script"?"meta.tag.script":a==="style"?"meta.tag.style":e.hasOwnProperty(a.toLowerCase())?"meta.tag.form":f.hasOwnProperty(a.toLowerCase())?"meta.tag.table":"meta.tag"},merge:!0,regex:"[-_a-zA-Z0-9:!]+",next:b+"embed-attribute-list"},{token:"empty",regex:"",next:b+"embed-attribute-list"}],a[b+"-qstring"]=h("'",b+"embed-attribute-list"),a[b+"-qqstring"]=h('"',b+"embed-attribute-list"),a[b+"embed-attribute-list"]=[{token:"meta.tag",merge:!0,regex:"/?>",next:c},{token:"keyword.operator",regex:"="},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(g(b))}}),define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../behaviour").Behaviour,f=a("./cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="f.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"],function(a,b,c){"use strict";var d=a("../../lib/oop"),e=a("../../lib/lang"),f=a("../../range").Range,g=a("./fold_mode").FoldMode,h=a("../../token_iterator").TokenIterator,i=b.FoldMode=function(a){g.call(this),this.voidElements=a||{}};d.inherits(i,g),function(){this.getFoldWidget=function(a,b,c){var d=this._getFirstTagInLine(a,c);return d.closing?b=="markbeginend"?"end":"":!d.tagName||this.voidElements[d.tagName.toLowerCase()]?"":d.selfClosing?"":d.value.indexOf("/"+d.tagName)!==-1?"":"start"},this._getFirstTagInLine=function(a,b){var c=a.getTokens(b,b)[0].tokens,d="";for(var f=0;f?)/,this._parseTag=function(a){var b=this.tagRe.exec(a),c=this.tagRe.lastIndex||0;return this.tagRe.lastIndex=0,{value:a,match:b?b[2]:"",closing:b?!!b[3]:!1,selfClosing:b?!!b[5]||b[2]=="/>":!1,tagName:b?b[4]:"",column:b[1]?c+b[1].length:c}},this._readTagForward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){if(!d)var d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()};c+=b.value;if(c.indexOf(">")!==-1){var e=this._parseTag(c);return e.start=d,e.end={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length},a.stepForward(),e}}while(b=a.stepForward());return null},this._readTagBackward=function(a){var b=a.getCurrentToken();if(!b)return null;var c="",d;do if(b.type.indexOf("meta.tag")===0){d||(d={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()+b.value.length}),c=b.value+c;if(c.indexOf("<")!==-1){var e=this._parseTag(c);return e.end=d,e.start={row:a.getCurrentTokenRow(),column:a.getCurrentTokenColumn()},a.stepBackward(),e}}while(b=a.stepBackward());return null},this._pop=function(a,b){while(a.length){var c=a[a.length-1];if(!b||c.tagName==b.tagName)return a.pop();if(this.voidElements[b.tagName])return;if(this.voidElements[c.tagName]){a.pop();continue}return null}},this.getFoldWidgetRange=function(a,b,c){var d=this._getFirstTagInLine(a,c);if(!d.match)return null;var e=d.closing||d.selfClosing,g=[],i;if(!e){var j=new h(a,c,d.column),k={row:c,column:d.column+d.tagName.length+2};while(i=this._readTagForward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(i.closing){this._pop(g,i);if(g.length==0)return f.fromPoints(k,i.start)}else g.push(i)}}else{var j=new h(a,c,d.column+d.match.length),l={row:c,column:d.column};while(i=this._readTagBackward(j)){if(i.selfClosing){if(!g.length)return i.start.column+=i.tagName.length+2,i.end.column-=2,f.fromPoints(i.start,i.end);continue}if(!i.closing){this._pop(g,i);if(g.length==0)return i.start.column+=i.tagName.length+2,f.fromPoints(i.start,l)}else g.push(i)}}}}.call(i.prototype)}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};((function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":b=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/^\s*/,f=b,g=b,h=a.getLine(b),i=c||h.length,j=h.match(e)[0].length,k=a.getLength();while(++bf){var m=a.getLine(g).length;return new d(f,i,g,m)}},this.openingBracketBlock=function(a,b,c,e){var f={row:c,column:e+1},g=a.$findClosingBracket(b,f);if(!g)return;var h=a.foldWidgets[g.row];return h==null&&(h=this.getFoldWidget(a,g.row)),h=="start"&&(g.row--,g.column=a.getLine(g.row).length),d.fromPoints(f,g)}})).call(e.prototype)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/theme-clouds.js b/apps/files_texteditor/js/aceeditor/theme-clouds.js index c14d3cbcff6..78a1d5b5e5c 100644 --- a/apps/files_texteditor/js/aceeditor/theme-clouds.js +++ b/apps/files_texteditor/js/aceeditor/theme-clouds.js @@ -1 +1 @@ -define("ace/theme/clouds",["require","exports","module"],function(a,b,c){var d=a("pilot/dom"),e=".ace-clouds .ace_editor {\n border: 2px solid rgb(159, 159, 159);\n}\n\n.ace-clouds .ace_editor.ace_focus {\n border: 2px solid #327fbd;\n}\n\n.ace-clouds .ace_gutter {\n width: 50px;\n background: #e8e8e8;\n color: #333;\n overflow : hidden;\n}\n\n.ace-clouds .ace_gutter-layer {\n width: 100%;\n text-align: right;\n}\n\n.ace-clouds .ace_gutter-layer .ace_gutter-cell {\n padding-right: 6px;\n}\n\n.ace-clouds .ace_print_margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-clouds .ace_scroller {\n background-color: #FFFFFF;\n}\n\n.ace-clouds .ace_text-layer {\n cursor: text;\n color: #000000;\n}\n\n.ace-clouds .ace_cursor {\n border-left: 2px solid #000000;\n}\n\n.ace-clouds .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid #000000;\n}\n \n.ace-clouds .ace_marker-layer .ace_selection {\n background: #BDD5FC;\n}\n\n.ace-clouds .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-clouds .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF;\n}\n\n.ace-clouds .ace_marker-layer .ace_active_line {\n background: #FFFBD1;\n}\n\n \n.ace-clouds .ace_invisible {\n color: #BFBFBF;\n}\n\n.ace-clouds .ace_keyword {\n color:#AF956F;\n}\n\n.ace-clouds .ace_keyword.ace_operator {\n color:#484848;\n}\n\n.ace-clouds .ace_constant {\n \n}\n\n.ace-clouds .ace_constant.ace_language {\n color:#39946A;\n}\n\n.ace-clouds .ace_constant.ace_library {\n \n}\n\n.ace-clouds .ace_constant.ace_numeric {\n color:#46A609;\n}\n\n.ace-clouds .ace_invalid {\n background-color:#FF002A;\n}\n\n.ace-clouds .ace_invalid.ace_illegal {\n \n}\n\n.ace-clouds .ace_invalid.ace_deprecated {\n \n}\n\n.ace-clouds .ace_support {\n \n}\n\n.ace-clouds .ace_support.ace_function {\n color:#C52727;\n}\n\n.ace-clouds .ace_function.ace_buildin {\n \n}\n\n.ace-clouds .ace_string {\n color:#5D90CD;\n}\n\n.ace-clouds .ace_string.ace_regexp {\n \n}\n\n.ace-clouds .ace_comment {\n color:#BCC8BA;\n}\n\n.ace-clouds .ace_comment.ace_doc {\n \n}\n\n.ace-clouds .ace_comment.ace_doc.ace_tag {\n \n}\n\n.ace-clouds .ace_variable {\n \n}\n\n.ace-clouds .ace_variable.ace_language {\n \n}\n\n.ace-clouds .ace_xml_pe {\n \n}";d.importCssString(e),b.cssClass="ace-clouds"}) \ No newline at end of file +define("ace/theme/clouds",["require","exports","module"],function(a,b,c){b.isDark=!1,b.cssClass="ace-clouds",b.cssText=".ace-clouds .ace_editor { border: 2px solid rgb(159, 159, 159);}.ace-clouds .ace_editor.ace_focus { border: 2px solid #327fbd;}.ace-clouds .ace_gutter { background: #e8e8e8; color: #333;}.ace-clouds .ace_print_margin { width: 1px; background: #e8e8e8;}.ace-clouds .ace_scroller { background-color: #FFFFFF;}.ace-clouds .ace_text-layer { cursor: text; color: #000000;}.ace-clouds .ace_cursor { border-left: 2px solid #000000;}.ace-clouds .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid #000000;} .ace-clouds .ace_marker-layer .ace_selection { background: #BDD5FC;}.ace-clouds .ace_marker-layer .ace_step { background: rgb(198, 219, 174);}.ace-clouds .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid #BFBFBF;}.ace-clouds .ace_marker-layer .ace_active_line { background: #FFFBD1;}.ace-clouds .ace_marker-layer .ace_selected_word { border: 1px solid #BDD5FC;} .ace-clouds .ace_invisible { color: #BFBFBF;}.ace-clouds .ace_keyword { color:#AF956F;}.ace-clouds .ace_keyword.ace_operator { color:#484848;}.ace-clouds .ace_constant.ace_language { color:#39946A;}.ace-clouds .ace_constant.ace_numeric { color:#46A609;}.ace-clouds .ace_invalid { background-color:#FF002A;}.ace-clouds .ace_fold { background-color: #AF956F; border-color: #000000;}.ace-clouds .ace_support.ace_function { color:#C52727;}.ace-clouds .ace_string { color:#5D90CD;}.ace-clouds .ace_comment { color:#BCC8BA;}.ace-clouds .ace_entity.ace_other.ace_attribute-name { color:#606060;}.ace-clouds .ace_markup.ace_underline { text-decoration:underline;}";var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)}),function(){window.require(["ace/ace"],function(a){window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}() \ No newline at end of file diff --git a/apps/files_texteditor/js/aceeditor/worker-coffee.js b/apps/files_texteditor/js/aceeditor/worker-coffee.js index a4cbf589440..d47238ceb7d 100644 --- a/apps/files_texteditor/js/aceeditor/worker-coffee.js +++ b/apps/files_texteditor/js/aceeditor/worker-coffee.js @@ -1 +1,7054 @@ -function initSender(){var a=require("pilot/event_emitter").EventEmitter,b=require("pilot/oop"),c=function(){};(function(){b.implement(this,a),this.callback=function(a,b){postMessage({type:"call",id:b,data:a})},this.emit=function(a,b){postMessage({type:"event",name:a,data:b})}}).call(c.prototype);return new c}function initBaseUrls(a){require.tlns=a}var console={log:function(a){postMessage({type:"log",data:a})}},window={console:console},require=function(a){var b=require.modules[a];if(b){b.initialized||(b.exports=b.factory().exports,b.initialized=!0);return b.exports}var c=a.split("/");c[0]=require.tlns[c[0]]||c[0],path=c.join("/")+".js",require.id=a,importScripts(path);return require(a)};require.modules={},require.tlns={};var define=function(a,b,c){arguments.length==2?c=b:arguments.length==1&&(c=a,a=require.id);a.indexOf("text/")!==0&&(require.modules[a]={factory:function(){var a={exports:{}},b=c(require,a.exports,a);b&&(a.exports=b);return a}})},main,sender;onmessage=function(a){var b=a.data;if(b.command)main[b.command].apply(main,b.args);else if(b.init){initBaseUrls(b.tlns),require("pilot/fixoldbrowsers"),sender=initSender();var c=require(b.module)[b.classname];main=new c(sender)}else b.event&&sender&&sender._dispatchEvent(b.event,b.data)},define("pilot/fixoldbrowsers",["require","exports","module"],function(a,b,c){if(!Function.prototype.bind){var d=Array.prototype.slice;Function.prototype.bind=function(a){var b=this;if(typeof b.apply!="function"||typeof b.call!="function")return new TypeError;var c=d.call(arguments),e=function f(){if(this instanceof f){var a=Object.create(b.prototype);b.apply(a,c.concat(d.call(arguments)));return a}return b.call.apply(b,c.concat(d.call(arguments)))};e.length=typeof b=="function"?Math.max(b.length-c.length,0):0;return e}}var e=Function.prototype.call,f=Array.prototype,g=Object.prototype,h=e.bind(g.hasOwnProperty),i,j,k,l,m;if(m=h(g,"__defineGetter__"))i=e.bind(g.__defineGetter__),j=e.bind(g.__defineSetter__),k=e.bind(g.__lookupGetter__),l=e.bind(g.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=+this.length;for(var d=0;d=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c=2)var d=arguments[1];else do{if(c in this){d=this[c--];break}if(--c<0)throw new TypeError}while(!0);for(;c>=0;c--)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length;if(!b)return-1;var c=arguments[1]||0;if(c>=b)return-1;c<0&&(c+=b);for(;c=0;c--){if(!h(this,c))continue;if(a===this[c])return c}return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||a.constructor.prototype});if(!Object.getOwnPropertyDescriptor){var n="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(n+a);if(!h(a,b))return undefined;var c,d,e;c={enumerable:!0,configurable:!0};if(m){var f=a.__proto__;a.__proto__=g;var d=k(a,b),e=l(a,b);a.__proto__=f;if(d||e){d&&(descriptor.get=d),e&&(descriptor.set=e);return descriptor}}descriptor.value=a[b];return descriptor}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}typeof b!="undefined"&&Object.defineProperties(c,b);return c});if(!Object.defineProperty){var o="Property description must be an object: ",p="Object.defineProperty called on non-object: ",q="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function")throw new TypeError(p+a);if(typeof a!="object"||a===null)throw new TypeError(o+c);if(h(c,"value"))if(m&&(k(a,b)||l(a,b))){var d=a.__proto__;a.__proto__=g,delete a[b],a[b]=c.value,a.prototype}else a[b]=c.value;else{if(!m)throw new TypeError(q);h(c,"get")&&i(a,b,c.get),h(c,"set")&&j(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)h(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(r){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){return!0});if(!Object.keys){var s=!0,t=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=t.length;for(var v in{toString:null})s=!1;Object.keys=function W(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var W=[];for(var b in a)h(a,b)&&W.push(b);if(s)for(var c=0,d=u;c=7?new a(c,d,e,f,g,h,i):j>=6?new a(c,d,e,f,g,h):j>=5?new a(c,d,e,f,g):j>=4?new a(c,d,e,f):j>=3?new a(c,d,e):j>=2?new a(c,d):j>=1?new a(c):new a;k.constructor=b;return k}return a.apply(this,arguments)},c=new RegExp("^(?:((?:[+-]\\d\\d)?\\d\\d\\d\\d)(?:-(\\d\\d)(?:-(\\d\\d))?)?)?(?:T(\\d\\d):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?)?(?:Z|([+-])(\\d\\d):(\\d\\d))?$");for(var d in a)b[d]=a[d];b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function e(b){var d=c.exec(b);if(d){d.shift();var e=d[0]===undefined;for(var f=0;f<10;f++){if(f===7)continue;d[f]=+(d[f]||(f<3?1:0)),f===1&&d[f]--}if(e)return((d[3]*60+d[4])*60+d[5])*1e3+d[6];var g=(d[8]*60+d[9])*60*1e3;d[6]==="-"&&(g=-g);return a.UTC.apply(this,d.slice(0,7))+g}return a.parse.apply(this,arguments)};return b}(Date));if(!String.prototype.trim){var w=/^\s\s*/,x=/\s\s*$/;String.prototype.trim=function(){return String(this).replace(w,"").replace(x,"")}}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!!c&&!!c.length){var b=b||{};b.type=a;for(var d=0;d=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length);return a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||""));return a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};this._dispatchEvent("change",{data:e});return d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:d});return c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};this._dispatchEvent("change",{data:e});return d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b!=c){var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};this._dispatchEvent("change",{data:i});return d.start}},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};this._dispatchEvent("change",{data:e});return d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/range",["require","exports","module"],function(a,b,c){var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;b=this.compare(c.row,c.column);if(b==1){b=this.compare(d.row,d.column);return b==1?2:b==0?1:0}if(b==-1)return-2;b=this.compare(d.row,d.column);return b==-1?-1:b==1?42:0},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)||this.isStart(a,b)?!1:!0;return!1},this.insideStart=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)?!1:!0;return!1},this.insideEnd=function(a,b){if(this.compare(a,b)==0)return this.isStart(a,b)?!1:!0;return!1},this.compare=function(a,b){if(!this.isMultiLine()&&a===this.start.row)return bthis.end.column?1:0;return athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.rowthis.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0);return c}}).call(f.prototype)}),define("pilot/lang",["require","exports","module"],function(a,b,c){b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return Array(b+1).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(i=0,l=a.length;i=0||!b&&Y.call(j,c)>=0)g=c.toUpperCase(),g==="WHEN"&&(l=this.tag(),Y.call(x,l)>=0)?g="LEADING_WHEN":g==="FOR"?this.seenFor=!0:g==="UNLESS"?g="IF":Y.call(Q,g)>=0?g="UNARY":Y.call(K,g)>=0&&(g!=="INSTANCEOF"&&this.seenFor?(g="FOR"+g,this.seenFor=!1):(g="RELATION",this.value()==="!"&&(this.tokens.pop(),c="!"+c)));Y.call(v,c)>=0&&(b?(g="IDENTIFIER",c=new String(c),c.reserved=!0):Y.call(L,c)>=0&&this.identifierError(c)),b||(Y.call(h,c)>=0&&(c=i[c]),g=function(){switch(c){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"&&":case"||":return"LOGIC";case"true":case"false":case"null":case"undefined":return"BOOL";case"break":case"continue":case"debugger":return"STATEMENT";default:return g}}()),this.token(g,c),a&&this.token(":",":");return d.length},a.prototype.numberToken=function(){var a,b;if(!(a=H.exec(this.chunk)))return 0;b=a[0],this.token("NUMBER",b);return b.length},a.prototype.stringToken=function(){var a,b;switch(this.chunk.charAt(0)){case"'":if(!(a=O.exec(this.chunk)))return 0;this.token("STRING",(b=a[0]).replace(C,"\\\n"));break;case'"':if(!(b=this.balancedString(this.chunk,'"')))return 0;0=0))return 0;if(!(a=J.exec(this.chunk)))return 0;c=a[0],this.token("REGEX",c==="//"?"/(?:)/":c);return c.length},a.prototype.heregexToken=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;d=a[0],b=a[1],c=a[2];if(0>b.indexOf("#{")){e=b.replace(r,"").replace(/\//g,"\\/"),this.token("REGEX","/"+(e||"(?:)")+"/"+c);return d.length}this.token("IDENTIFIER","RegExp"),this.tokens.push(["CALL_START","("]),g=[],k=this.interpolateString(b,{regex:!0});for(i=0,j=k.length;ithis.indent){if(d){this.indebt=f-this.indent,this.suppressNewlines();return b.length}a=f-this.indent+this.outdebt,this.token("INDENT",a),this.indents.push(a),this.outdebt=this.indebt=0}else this.indebt=0,this.outdentToken(this.indent-f,d);this.indent=f;return b.length},a.prototype.outdentToken=function(a,b,c){var d,e;while(a>0)e=this.indents.length-1,this.indents[e]===void 0?a=0:this.indents[e]===this.outdebt?(a-=this.outdebt,this.outdebt=0):this.indents[e]=0)&&this.assignmentError();if((h=b[1])==="||"||h==="&&"){b[0]="COMPOUND_ASSIGN",b[1]+="=";return d.length}}if(d===";")c="TERMINATOR";else if(Y.call(B,d)>=0)c="MATH";else if(Y.call(l,d)>=0)c="COMPARE";else if(Y.call(m,d)>=0)c="COMPOUND_ASSIGN";else if(Y.call(Q,d)>=0)c="UNARY";else if(Y.call(N,d)>=0)c="SHIFT";else if(Y.call(z,d)>=0||d==="?"&&(b!=null?b.spaced:void 0))c="LOGIC";else if(b&&!b.spaced)if(d==="("&&(i=b[0],Y.call(f,i)>=0))b[0]==="?"&&(b[0]="FUNC_EXIST"),c="CALL_START";else if(d==="["&&(j=b[0],Y.call(t,j)>=0)){c="INDEX_START";switch(b[0]){case"?":b[0]="INDEX_SOAK";break;case"::":b[0]="INDEX_PROTO"}}this.token(c,d);return d.length},a.prototype.sanitizeHeredoc=function(a,b){var c,d,e,f,g;e=b.indent,d=b.herecomment;if(d){if(o.test(a))throw new Error('block comment cannot contain "*/", starting on line '+(this.line+1));if(a.indexOf("\n")<=0)return a}else while(f=p.exec(a)){c=f[1];if(e===null||0<(g=c.length)&&gg;1<=g?c++:c--){switch(d=a.charAt(c)){case"\\":c++;continue;case b:f.pop();if(!f.length)return a.slice(0,c+1);b=f[f.length-1];continue}b!=="}"||d!=='"'&&d!=="'"?b==="}"&&d==="{"?f.push(b="}"):b==='"'&&e==="#"&&d==="{"&&f.push(b="}"):f.push(b=d),e=d}throw new Error("missing "+f.pop()+", starting on line "+(this.line+1))},a.prototype.interpolateString=function(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;c==null&&(c={}),e=c.heredoc,m=c.regex,o=[],l=0,f=-1;while(j=b.charAt(f+=1)){if(j==="\\"){f+=1;continue}if(j!=="#"||b.charAt(f+1)!=="{"||!(d=this.balancedString(b.slice(f+1),"}")))continue;l1&&(k.unshift(["(","("]),k.push([")",")"])),o.push(["TOKENS",k])}f+=d.length,l=f+1}f>l&&l1)&&this.token("(","(");for(f=0,q=o.length;f|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/,R=/^[^\n\S]+/,k=/^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/,g=/^[-=]>/,D=/^(?:\n[^\n\S]*)+/,O=/^'[^\\']*(?:\\.[^\\']*)*'/,u=/^`[^\\`]*(?:\\.[^\\`]*)*`/,J=/^\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/[imgy]{0,4}(?!\w)/,q=/^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/,r=/\s+(?:#.*)?/g,C=/\n/g,p=/\n+([^\n\S]*)/g,o=/\*\//,d=/^\s*@?([$A-Za-z_][$\w\x7f-\uffff]*|['"].*['"])[^\n\S]*?[:=][^:=>]/,y=/^\s*(?:,|\??\.(?![.\d])|::)/,P=/\s+$/,G=/^(?:[-+*&|\/%=<>!.\\][<>=&|]*|and|or|is(?:nt)?|n(?:ot|ew)|delete|typeof|instanceof)$/,m=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="],Q=["!","~","NEW","TYPEOF","DELETE","DO"],z=["&&","||","&","|","^"],N=["<<",">>",">>>"],l=["==","!=","<",">","<=",">="],B=["*","/","%"],K=["IN","OF","INSTANCEOF"],e=["TRUE","FALSE","NULL","UNDEFINED"],E=["NUMBER","REGEX","BOOL","++","--","]"],F=E.concat(")","}","THIS","IDENTIFIER","STRING"),f=["IDENTIFIER","STRING","REGEX",")","]","}","?","::","@","THIS","SUPER"],t=f.concat("NUMBER","BOOL"),x=["INDENT","OUTDENT","TERMINATOR"]}),define("ace/mode/coffee/rewriter",["require","exports","module"],function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;b=0)d+=1;else if(j=e[0],v.call(f,j)>=0)d-=1;a+=1}return a-1},a.prototype.removeLeadingNewlines=function(){var a,b,c,d;d=this.tokens;for(a=0,c=d.length;a=0)){c.splice(b,1);return 0}return 1})},a.prototype.closeOpenCalls=function(){var a,b;b=function(a,b){var c;return(c=a[0])===")"||c==="CALL_END"||a[0]==="OUTDENT"&&this.tag(b-1)===")"},a=function(a,b){return this.tokens[a[0]==="OUTDENT"?b-1:b][0]="CALL_END"};return this.scanTokens(function(c,d){c[0]==="CALL_START"&&this.detectEnd(d+1,b,a);return 1})},a.prototype.closeOpenIndexes=function(){var a,b;b=function(a,b){var c;return(c=a[0])==="]"||c==="INDEX_END"},a=function(a,b){return a[0]="INDEX_END"};return this.scanTokens(function(c,d){c[0]==="INDEX_START"&&this.detectEnd(d+1,b,a);return 1})},a.prototype.addImplicitBraces=function(){var a,b,c,d,e;c=[],d=null,e=0,b=function(a,b){var c,d,e,f,g,h;g=this.tokens.slice(b+1,b+3+1||9e9),c=g[0],f=g[1],e=g[2];if("HERECOMMENT"===(c!=null?c[0]:void 0))return!1;d=a[0];return(d==="TERMINATOR"||d==="OUTDENT")&&(f!=null?f[0]:void 0)!==":"&&((c!=null?c[0]:void 0)!=="@"||(e!=null?e[0]:void 0)!==":")||d===","&&c&&(h=c[0])!=="IDENTIFIER"&&h!=="NUMBER"&&h!=="STRING"&&h!=="@"&&h!=="TERMINATOR"&&h!=="OUTDENT"},a=function(a,b){var c;c=["}","}",a[2]],c.generated=!0;return this.tokens.splice(b,0,c)};return this.scanTokens(function(e,h,i){var j,k,l,m,n,o,p;if(o=l=e[0],v.call(g,o)>=0){c.push([l==="INDENT"&&this.tag(h-1)==="{"?"{":l,h]);return 1}if(v.call(f,l)>=0){d=c.pop();return 1}if(l!==":"||(j=this.tag(h-2))!==":"&&((p=c[c.length-1])!=null?p[0]:void 0)==="{")return 1;c.push(["{"]),k=j==="@"?h-2:h-1;while(this.tag(k-2)==="HERECOMMENT")k-=2;n=new String("{"),n.generated=!0,m=["{",n,e[2]],m.generated=!0,i.splice(k,0,m),this.detectEnd(h+2,b,a);return 2})},a.prototype.addImplicitParentheses=function(){var a,b;b=!1,a=function(a,b){var c;c=a[0]==="OUTDENT"?b+1:b;return this.tokens.splice(c,0,["CALL_END",")",a[2]])};return this.scanTokens(function(c,d,e){var f,g,m,o,p,q,r,s,t,u;r=c[0];if(r==="CLASS"||r==="IF")b=!0;s=e.slice(d-1,d+1+1||9e9),o=s[0],g=s[1],m=s[2],f=!b&&r==="INDENT"&&m&&m.generated&&m[0]==="{"&&o&&(t=o[0],v.call(k,t)>=0),q=!1,p=!1,v.call(n,r)>=0&&(b=!1),o&&!o.spaced&&r==="?"&&(c.call=!0);if(c.fromThen)return 1;if(!(f||(o!=null?o.spaced:void 0)&&(o.call||(u=o[0],v.call(k,u)>=0))&&(v.call(i,r)>=0||!c.spaced&&!c.newLine&&v.call(l,r)>=0)))return 1;e.splice(d,0,["CALL_START","(",c[2]]),this.detectEnd(d+1,function(a,b){var c,d;r=a[0];if(!q&&a.fromThen)return!0;if(r==="IF"||r==="ELSE"||r==="CATCH"||r==="->"||r==="=>")q=!0;if(r==="IF"||r==="ELSE"||r==="SWITCH"||r==="TRY")p=!0;return r!=="."&&r!=="?."&&r!=="::"||this.tag(b-1)!=="OUTDENT"?!a.generated&&this.tag(b-1)!==","&&(v.call(j,r)>=0||r==="INDENT"&&!p)&&(r!=="INDENT"||this.tag(b-2)!=="CLASS"&&(d=this.tag(b-1),v.call(h,d)<0)&&(!(c=this.tokens[b+1])||!c.generated||c[0]!=="{")):!0},a),o[0]==="?"&&(o[0]="FUNC_EXIST");return 2})},a.prototype.addImplicitIndentation=function(){return this.scanTokens(function(a,b,c){var d,e,f,g,h,i,j,k;i=a[0];if(i==="TERMINATOR"&&this.tag(b+1)==="THEN"){c.splice(b,1);return 0}if(i==="ELSE"&&this.tag(b-1)!=="OUTDENT"){c.splice.apply(c,[b,0].concat(w.call(this.indentation(a))));return 2}if(i!=="CATCH"||(j=this.tag(b+2))!=="OUTDENT"&&j!=="TERMINATOR"&&j!=="FINALLY"){if(v.call(p,i)>=0&&this.tag(b+1)!=="INDENT"&&(i!=="ELSE"||this.tag(b+1)!=="IF")){h=i,k=this.indentation(a),f=k[0],g=k[1],h==="THEN"&&(f.fromThen=!0),f.generated=g.generated=!0,c.splice(b+1,0,f),e=function(a,b){var c;return a[1]!==";"&&(c=a[0],v.call(o,c)>=0)&&(a[0]!=="ELSE"||h==="IF"||h==="THEN")},d=function(a,b){return this.tokens.splice(this.tag(b-1)===","?b-1:b,0,g)},this.detectEnd(b+2,e,d),i==="THEN"&&c.splice(b,1);return 1}return 1}c.splice.apply(c,[b+2,0].concat(w.call(this.indentation(a))));return 4})},a.prototype.tagPostfixConditionals=function(){var a;a=function(a,b){var c;return(c=a[0])==="TERMINATOR"||c==="INDENT"};return this.scanTokens(function(b,c){var d;if(b[0]!=="IF")return 1;d=b,this.detectEnd(c+1,a,function(a,b){if(a[0]!=="INDENT")return d[0]="POST_"+d[0]});return 1})},a.prototype.ensureBalance=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;d={},f={},m=this.tokens;for(i=0,k=m.length;i0)throw Error("unclosed "+e+" on line "+(f[e]+1))}return this},a.prototype.rewriteClosingParens=function(){var a,b,c;c=[],a={};for(b in m)a[b]=0;return this.scanTokens(function(b,d,e){var h,i,j,k,l,n,o;if(o=l=b[0],v.call(g,o)>=0){c.push(b);return 1}if(v.call(f,l)<0)return 1;if(a[h=m[l]]>0){a[h]-=1,e.splice(d,1);return 0}i=c.pop(),j=i[0],k=m[j];if(l===k)return 1;a[j]+=1,n=[k,j==="INDENT"?i[1]:k],this.tag(d+2)===j?(e.splice(d+3,0,n),c.push(i)):e.splice(d,0,n);return 1})},a.prototype.indentation=function(a){return[["INDENT",2,a[2]],["OUTDENT",2,a[2]]]},a.prototype.tag=function(a){var b;return(b=this.tokens[a])!=null?b[0]:void 0};return a}(),d=[["(",")"],["[","]"],["{","}"],["INDENT","OUTDENT"],["CALL_START","CALL_END"],["PARAM_START","PARAM_END"],["INDEX_START","INDEX_END"]],m={},g=[],f=[];for(s=0,t=d.length;s","=>","[","(","{","--","++"],l=["+","-"],h=["->","=>","{","[",","],j=["POST_IF","FOR","WHILE","UNTIL","WHEN","BY","LOOP","TERMINATOR"],p=["ELSE","->","=>","TRY","FINALLY","THEN"],o=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"],n=["TERMINATOR","INDENT","OUTDENT"]}),define("ace/mode/coffee/helpers",["require","exports","module"],function(a,b,c){var d,e;b.starts=function(a,b,c){return b===a.substr(c,b.length)},b.ends=function(a,b,c){var d;d=b.length;return b===a.substr(a.length-d-(c||0),d)},b.compact=function(a){var b,c,d,e;e=[];for(c=0,d=a.length;c":48,"=>":49,OptComma:50,",":51,Param:52,ParamVar:53,"...":54,Array:55,Object:56,Splat:57,SimpleAssignable:58,Accessor:59,Parenthetical:60,Range:61,This:62,".":63,"?.":64,"::":65,Index:66,INDEX_START:67,IndexValue:68,INDEX_END:69,INDEX_SOAK:70,INDEX_PROTO:71,Slice:72,"{":73,AssignList:74,"}":75,CLASS:76,EXTENDS:77,OptFuncExist:78,Arguments:79,SUPER:80,FUNC_EXIST:81,CALL_START:82,CALL_END:83,ArgList:84,THIS:85,"@":86,"[":87,"]":88,RangeDots:89,"..":90,Arg:91,SimpleArgs:92,TRY:93,Catch:94,FINALLY:95,CATCH:96,THROW:97,"(":98,")":99,WhileSource:100,WHILE:101,WHEN:102,UNTIL:103,Loop:104,LOOP:105,ForBody:106,FOR:107,ForStart:108,ForSource:109,ForVariables:110,OWN:111,ForValue:112,FORIN:113,FOROF:114,BY:115,SWITCH:116,Whens:117,ELSE:118,When:119,LEADING_WHEN:120,IfBlock:121,IF:122,POST_IF:123,UNARY:124,"-":125,"+":126,"--":127,"++":128,"?":129,MATH:130,SHIFT:131,COMPARE:132,LOGIC:133,RELATION:134,COMPOUND_ASSIGN:135,$accept:0,$end:1},terminals_:{2:"error",6:"TERMINATOR",13:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"BOOL",37:"=",40:":",42:"RETURN",43:"HERECOMMENT",44:"PARAM_START",46:"PARAM_END",48:"->",49:"=>",51:",",54:"...",63:".",64:"?.",65:"::",67:"INDEX_START",69:"INDEX_END",70:"INDEX_SOAK",71:"INDEX_PROTO",73:"{",75:"}",76:"CLASS",77:"EXTENDS",80:"SUPER",81:"FUNC_EXIST",82:"CALL_START",83:"CALL_END",85:"THIS",86:"@",87:"[",88:"]",90:"..",93:"TRY",95:"FINALLY",96:"CATCH",97:"THROW",98:"(",99:")",101:"WHILE",102:"WHEN",103:"UNTIL",105:"LOOP",107:"FOR",111:"OWN",113:"FORIN",114:"FOROF",115:"BY",116:"SWITCH",118:"ELSE",120:"LEADING_WHEN",122:"IF",123:"POST_IF",124:"UNARY",125:"-",126:"+",127:"--",128:"++",129:"?",130:"MATH",131:"SHIFT",132:"COMPARE",133:"LOGIC",134:"RELATION",135:"COMPOUND_ASSIGN"},productions_:[0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[18,3],[18,5],[38,1],[38,3],[38,5],[38,1],[39,1],[39,1],[39,1],[10,2],[10,1],[12,1],[16,5],[16,2],[47,1],[47,1],[50,0],[50,1],[45,0],[45,1],[45,3],[52,1],[52,2],[52,3],[53,1],[53,1],[53,1],[53,1],[57,2],[58,1],[58,2],[58,2],[58,1],[36,1],[36,1],[36,1],[14,1],[14,1],[14,1],[14,1],[14,1],[59,2],[59,2],[59,2],[59,1],[59,1],[66,3],[66,2],[66,2],[68,1],[68,1],[56,4],[74,0],[74,1],[74,3],[74,4],[74,6],[24,1],[24,2],[24,3],[24,4],[24,2],[24,3],[24,4],[24,5],[15,3],[15,3],[15,1],[15,2],[78,0],[78,1],[79,2],[79,4],[62,1],[62,1],[41,2],[55,2],[55,4],[89,1],[89,1],[61,5],[72,3],[72,2],[72,2],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[20,2],[20,3],[20,4],[20,5],[94,3],[11,2],[60,3],[60,5],[100,2],[100,4],[100,2],[100,4],[21,2],[21,2],[21,2],[21,1],[104,2],[104,2],[22,2],[22,2],[22,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[23,5],[23,7],[23,4],[23,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[19,1],[19,3],[19,3],[19,3],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,5],[17,3]],performAction:function f(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return this.$=new d.Block;case 2:return this.$=f[h];case 3:return this.$=f[h-1];case 4:this.$=d.Block.wrap([f[h]]);break;case 5:this.$=f[h-2].push(f[h]);break;case 6:this.$=f[h-1];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$=f[h];break;case 10:this.$=f[h];break;case 11:this.$=f[h];break;case 12:this.$=new d.Literal(f[h]);break;case 13:this.$=f[h];break;case 14:this.$=f[h];break;case 15:this.$=f[h];break;case 16:this.$=f[h];break;case 17:this.$=f[h];break;case 18:this.$=f[h];break;case 19:this.$=f[h];break;case 20:this.$=f[h];break;case 21:this.$=f[h];break;case 22:this.$=f[h];break;case 23:this.$=f[h];break;case 24:this.$=new d.Block;break;case 25:this.$=f[h-1];break;case 26:this.$=new d.Literal(f[h]);break;case 27:this.$=new d.Literal(f[h]);break;case 28:this.$=new d.Literal(f[h]);break;case 29:this.$=f[h];break;case 30:this.$=new d.Literal(f[h]);break;case 31:this.$=new d.Literal(f[h]);break;case 32:this.$=function(){var a;a=new d.Literal(f[h]),f[h]==="undefined"&&(a.isUndefined=!0);return a}();break;case 33:this.$=new d.Assign(f[h-2],f[h]);break;case 34:this.$=new d.Assign(f[h-4],f[h-1]);break;case 35:this.$=new d.Value(f[h]);break;case 36:this.$=new d.Assign(new d.Value(f[h-2]),f[h],"object");break;case 37:this.$=new d.Assign(new d.Value(f[h-4]),f[h-1],"object");break;case 38:this.$=f[h];break;case 39:this.$=f[h];break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=new d.Return(f[h]);break;case 43:this.$=new d.Return;break;case 44:this.$=new d.Comment(f[h]);break;case 45:this.$=new d.Code(f[h-3],f[h],f[h-1]);break;case 46:this.$=new d.Code([],f[h],f[h-1]);break;case 47:this.$="func";break;case 48:this.$="boundfunc";break;case 49:this.$=f[h];break;case 50:this.$=f[h];break;case 51:this.$=[];break;case 52:this.$=[f[h]];break;case 53:this.$=f[h-2].concat(f[h]);break;case 54:this.$=new d.Param(f[h]);break;case 55:this.$=new d.Param(f[h-1],null,!0);break;case 56:this.$=new d.Param(f[h-2],f[h]);break;case 57:this.$=f[h];break;case 58:this.$=f[h];break;case 59:this.$=f[h];break;case 60:this.$=f[h];break;case 61:this.$=new d.Splat(f[h-1]);break;case 62:this.$=new d.Value(f[h]);break;case 63:this.$=f[h-1].push(f[h]);break;case 64:this.$=new d.Value(f[h-1],[f[h]]);break;case 65:this.$=f[h];break;case 66:this.$=f[h];break;case 67:this.$=new d.Value(f[h]);break;case 68:this.$=new d.Value(f[h]);break;case 69:this.$=f[h];break;case 70:this.$=new d.Value(f[h]);break;case 71:this.$=new d.Value(f[h]);break;case 72:this.$=new d.Value(f[h]);break;case 73:this.$=f[h];break;case 74:this.$=new d.Access(f[h]);break;case 75:this.$=new d.Access(f[h],"soak");break;case 76:this.$=new d.Access(f[h],"proto");break;case 77:this.$=new d.Access(new d.Literal("prototype"));break;case 78:this.$=f[h];break;case 79:this.$=f[h-1];break;case 80:this.$=d.extend(f[h],{soak:!0});break;case 81:this.$=d.extend(f[h],{proto:!0});break;case 82:this.$=new d.Index(f[h]);break;case 83:this.$=new d.Slice(f[h]);break;case 84:this.$=new d.Obj(f[h-2],f[h-3].generated);break;case 85:this.$=[];break;case 86:this.$=[f[h]];break;case 87:this.$=f[h-2].concat(f[h]);break;case 88:this.$=f[h-3].concat(f[h]);break;case 89:this.$=f[h-5].concat(f[h-2]);break;case 90:this.$=new d.Class;break;case 91:this.$=new d.Class(null,null,f[h]);break;case 92:this.$=new d.Class(null,f[h]);break;case 93:this.$=new d.Class(null,f[h-1],f[h]);break;case 94:this.$=new d.Class(f[h]);break;case 95:this.$=new d.Class(f[h-1],null,f[h]);break;case 96:this.$=new d.Class(f[h-2],f[h]);break;case 97:this.$=new d.Class(f[h-3],f[h-1],f[h]);break;case 98:this.$=new d.Call(f[h-2],f[h],f[h-1]);break;case 99:this.$=new d.Call(f[h-2],f[h],f[h-1]);break;case 100:this.$=new d.Call("super",[new d.Splat(new d.Literal("arguments"))]);break;case 101:this.$=new d.Call("super",f[h]);break;case 102:this.$=!1;break;case 103:this.$=!0;break;case 104:this.$=[];break;case 105:this.$=f[h-2];break;case 106:this.$=new d.Value(new d.Literal("this"));break;case 107:this.$=new d.Value(new d.Literal("this"));break;case 108:this.$=new d.Value(new d.Literal("this"),[new d.Access(f[h])],"this");break;case 109:this.$=new d.Arr([]);break;case 110:this.$=new d.Arr(f[h-2]);break;case 111:this.$="inclusive";break;case 112:this.$="exclusive";break;case 113:this.$=new d.Range(f[h-3],f[h-1],f[h-2]);break;case 114:this.$=new d.Range(f[h-2],f[h],f[h-1]);break;case 115:this.$=new d.Range(f[h-1],null,f[h]);break;case 116:this.$=new d.Range(null,f[h],f[h-1]);break;case 117:this.$=[f[h]];break;case 118:this.$=f[h-2].concat(f[h]);break;case 119:this.$=f[h-3].concat(f[h]);break;case 120:this.$=f[h-2];break;case 121:this.$=f[h-5].concat(f[h-2]);break;case 122:this.$=f[h];break;case 123:this.$=f[h];break;case 124:this.$=f[h];break;case 125:this.$=[].concat(f[h-2],f[h]);break;case 126:this.$=new d.Try(f[h]);break;case 127:this.$=new d.Try(f[h-1],f[h][0],f[h][1]);break;case 128:this.$=new d.Try(f[h-2],null,null,f[h]);break;case 129:this.$=new d.Try(f[h-3],f[h-2][0],f[h-2][1],f[h]);break;case 130:this.$=[f[h-1],f[h]];break;case 131:this.$=new d.Throw(f[h]);break;case 132:this.$=new d.Parens(f[h-1]);break;case 133:this.$=new d.Parens(f[h-2]);break;case 134:this.$=new d.While(f[h]);break;case 135:this.$=new d.While(f[h-2],{guard:f[h]});break;case 136:this.$=new d.While(f[h],{invert:!0});break;case 137:this.$=new d.While(f[h-2],{invert:!0,guard:f[h]});break;case 138:this.$=f[h-1].addBody(f[h]);break;case 139:this.$=f[h].addBody(d.Block.wrap([f[h-1]]));break;case 140:this.$=f[h].addBody(d.Block.wrap([f[h-1]]));break;case 141:this.$=f[h];break;case 142:this.$=(new d.While(new d.Literal("true"))).addBody(f[h]);break;case 143:this.$=(new d.While(new d.Literal("true"))).addBody(d.Block.wrap([f[h]]));break;case 144:this.$=new d.For(f[h-1],f[h]);break;case 145:this.$=new d.For(f[h-1],f[h]);break;case 146:this.$=new d.For(f[h],f[h-1]);break;case 147:this.$={source:new d.Value(f[h])};break;case 148:this.$=function(){f[h].own=f[h-1].own,f[h].name=f[h-1][0],f[h].index=f[h-1][1];return f[h]}();break;case 149:this.$=f[h];break;case 150:this.$=function(){f[h].own=!0;return f[h]}();break;case 151:this.$=f[h];break;case 152:this.$=new d.Value(f[h]);break;case 153:this.$=new d.Value(f[h]);break;case 154:this.$=[f[h]];break;case 155:this.$=[f[h-2],f[h]];break;case 156:this.$={source:f[h]};break;case 157:this.$={source:f[h],object:!0};break;case 158:this.$={source:f[h-2],guard:f[h]};break;case 159:this.$={source:f[h-2],guard:f[h],object:!0};break;case 160:this.$={source:f[h-2],step:f[h]};break;case 161:this.$={source:f[h-4],guard:f[h-2],step:f[h]};break;case 162:this.$={source:f[h-4],step:f[h-2],guard:f[h]};break;case 163:this.$=new d.Switch(f[h-3],f[h-1]);break;case 164:this.$=new d.Switch(f[h-5],f[h-3],f[h-1]);break;case 165:this.$=new d.Switch(null,f[h-1]);break;case 166:this.$=new d.Switch(null,f[h-3],f[h-1]);break;case 167:this.$=f[h];break;case 168:this.$=f[h-1].concat(f[h]);break;case 169:this.$=[[f[h-1],f[h]]];break;case 170:this.$=[[f[h-2],f[h-1]]];break;case 171:this.$=new d.If(f[h-1],f[h],{type:f[h-2]});break;case 172:this.$=f[h-4].addElse(new d.If(f[h-1],f[h],{type:f[h-2]}));break;case 173:this.$=f[h];break;case 174:this.$=f[h-2].addElse(f[h]);break;case 175:this.$=new d.If(f[h],d.Block.wrap([f[h-2]]),{type:f[h-1],statement:!0});break;case 176:this.$=new d.If(f[h],d.Block.wrap([f[h-2]]),{type:f[h-1],statement:!0});break;case 177:this.$=new d.Op(f[h-1],f[h]);break;case 178:this.$=new d.Op("-",f[h]);break;case 179:this.$=new d.Op("+",f[h]);break;case 180:this.$=new d.Op("--",f[h]);break;case 181:this.$=new d.Op("++",f[h]);break;case 182:this.$=new d.Op("--",f[h-1],null,!0);break;case 183:this.$=new d.Op("++",f[h-1],null,!0);break;case 184:this.$=new d.Existence(f[h-1]);break;case 185:this.$=new d.Op("+",f[h-2],f[h]);break;case 186:this.$=new d.Op("-",f[h-2],f[h]);break;case 187:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 188:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 189:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 190:this.$=new d.Op(f[h-1],f[h-2],f[h]);break;case 191:this.$=function(){return f[h-1].charAt(0)==="!"?(new d.Op(f[h-1].slice(1),f[h-2],f[h])).invert():new d.Op(f[h-1],f[h-2],f[h])}();break;case 192:this.$=new d.Assign(f[h-2],f[h],f[h-1]);break;case 193:this.$=new d.Assign(f[h-4],f[h-1],f[h-3]);break;case 194:this.$=new d.Extends(f[h-2],f[h])}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,5],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,71]},{6:[1,72]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:74,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[1,73],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:87,101:[1,62],103:[1,63],106:88,107:[1,65],108:66,123:[1,86]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],46:[2,13],51:[2,13],54:[2,13],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,13],70:[1,97],71:[1,98],75:[2,13],78:89,81:[1,91],82:[2,102],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],46:[2,14],51:[2,14],54:[2,14],59:100,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,14],70:[1,97],71:[1,98],75:[2,14],78:99,81:[1,91],82:[2,102],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],46:[2,15],51:[2,15],54:[2,15],69:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],46:[2,16],51:[2,16],54:[2,16],69:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],46:[2,17],51:[2,17],54:[2,17],69:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],46:[2,18],51:[2,18],54:[2,18],69:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],46:[2,19],51:[2,19],54:[2,19],69:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],46:[2,20],51:[2,20],54:[2,20],69:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],46:[2,21],51:[2,21],54:[2,21],69:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],46:[2,22],51:[2,22],54:[2,22],69:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],46:[2,23],51:[2,23],54:[2,23],69:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,12],6:[2,12],26:[2,12],99:[2,12],101:[2,12],103:[2,12],107:[2,12],123:[2,12]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],37:[1,101],46:[2,69],51:[2,69],54:[2,69],63:[2,69],64:[2,69],65:[2,69],67:[2,69],69:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],46:[2,70],51:[2,70],54:[2,70],63:[2,70],64:[2,70],65:[2,70],67:[2,70],69:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],46:[2,71],51:[2,71],54:[2,71],63:[2,71],64:[2,71],65:[2,71],67:[2,71],69:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],46:[2,72],51:[2,72],54:[2,72],63:[2,72],64:[2,72],65:[2,72],67:[2,72],69:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],46:[2,73],51:[2,73],54:[2,73],63:[2,73],64:[2,73],65:[2,73],67:[2,73],69:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],46:[2,100],51:[2,100],54:[2,100],63:[2,100],64:[2,100],65:[2,100],67:[2,100],69:[2,100],70:[2,100],71:[2,100],75:[2,100],79:102,81:[2,100],82:[1,103],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{27:107,28:[1,70],41:108,45:104,46:[2,51],51:[2,51],52:105,53:106,55:109,56:110,73:[1,67],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{14:119,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:118,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{14:119,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:122,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],37:[2,66],46:[2,66],51:[2,66],54:[2,66],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[1,126],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[1,123],128:[1,124],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[1,125]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],46:[2,173],51:[2,173],54:[2,173],69:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[1,127],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],46:[2,141],51:[2,141],54:[2,141],69:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{5:130,25:[1,5]},{8:131,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,132],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,90],5:133,6:[2,90],14:119,15:120,25:[1,5],26:[2,90],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,46:[2,90],51:[2,90],54:[2,90],55:47,56:48,58:135,60:25,61:26,62:27,69:[2,90],73:[1,67],75:[2,90],77:[1,134],80:[1,28],83:[2,90],85:[1,55],86:[1,56],87:[1,54],88:[2,90],90:[2,90],98:[1,53],99:[2,90],101:[2,90],102:[2,90],103:[2,90],107:[2,90],115:[2,90],123:[2,90],125:[2,90],126:[2,90],129:[2,90],130:[2,90],131:[2,90],132:[2,90],133:[2,90],134:[2,90]},{1:[2,43],6:[2,43],8:136,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[2,43],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],99:[2,43],100:39,101:[2,43],103:[2,43],104:40,105:[1,64],106:41,107:[2,43],108:66,116:[1,42],121:37,122:[1,61],123:[2,43],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:137,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,44],6:[2,44],25:[2,44],26:[2,44],51:[2,44],75:[2,44],99:[2,44],101:[2,44],103:[2,44],107:[2,44],123:[2,44]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],37:[2,67],46:[2,67],51:[2,67],54:[2,67],63:[2,67],64:[2,67],65:[2,67],67:[2,67],69:[2,67],70:[2,67],71:[2,67],75:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],37:[2,68],46:[2,68],51:[2,68],54:[2,68],63:[2,68],64:[2,68],65:[2,68],67:[2,68],69:[2,68],70:[2,68],71:[2,68],75:[2,68],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],46:[2,29],51:[2,29],54:[2,29],63:[2,29],64:[2,29],65:[2,29],67:[2,29],69:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],46:[2,30],51:[2,30],54:[2,30],63:[2,30],64:[2,30],65:[2,30],67:[2,30],69:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],46:[2,31],51:[2,31],54:[2,31],63:[2,31],64:[2,31],65:[2,31],67:[2,31],69:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],46:[2,32],51:[2,32],54:[2,32],63:[2,32],64:[2,32],65:[2,32],67:[2,32],69:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{4:138,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,139],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:142,85:[1,55],86:[1,56],87:[1,54],88:[1,141],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],46:[2,106],51:[2,106],54:[2,106],63:[2,106],64:[2,106],65:[2,106],67:[2,106],69:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],27:146,28:[1,70],46:[2,107],51:[2,107],54:[2,107],63:[2,107],64:[2,107],65:[2,107],67:[2,107],69:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{25:[2,47]},{25:[2,48]},{1:[2,62],6:[2,62],25:[2,62],26:[2,62],37:[2,62],46:[2,62],51:[2,62],54:[2,62],63:[2,62],64:[2,62],65:[2,62],67:[2,62],69:[2,62],70:[2,62],71:[2,62],75:[2,62],77:[2,62],81:[2,62],82:[2,62],83:[2,62],88:[2,62],90:[2,62],99:[2,62],101:[2,62],102:[2,62],103:[2,62],107:[2,62],115:[2,62],123:[2,62],125:[2,62],126:[2,62],127:[2,62],128:[2,62],129:[2,62],130:[2,62],131:[2,62],132:[2,62],133:[2,62],134:[2,62],135:[2,62]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],37:[2,65],46:[2,65],51:[2,65],54:[2,65],63:[2,65],64:[2,65],65:[2,65],67:[2,65],69:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{8:147,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,5],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,70],55:157,56:158,61:152,73:[1,67],87:[1,54],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,85],12:165,25:[2,85],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:163,39:164,41:168,43:[1,46],51:[2,85],74:162,75:[2,85],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],40:[2,27],46:[2,27],51:[2,27],54:[2,27],63:[2,27],64:[2,27],65:[2,27],67:[2,27],69:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],40:[2,28],46:[2,28],51:[2,28],54:[2,28],63:[2,28],64:[2,28],65:[2,28],67:[2,28],69:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],37:[2,26],40:[2,26],46:[2,26],51:[2,26],54:[2,26],63:[2,26],64:[2,26],65:[2,26],67:[2,26],69:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[2,6],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],99:[2,6],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],46:[2,24],51:[2,24],54:[2,24],69:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,71],26:[1,170]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],46:[2,184],51:[2,184],54:[2,184],69:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{8:171,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],46:[2,140],51:[2,140],54:[2,140],69:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],46:[2,145],51:[2,145],54:[2,145],69:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],101:[2,145],102:[2,145],103:[2,145],107:[2,145],115:[2,145],123:[2,145],125:[2,145],126:[2,145],129:[2,145],130:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145]},{8:179,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],46:[2,139],51:[2,139],54:[2,139],69:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],101:[2,139],102:[2,139],103:[2,139],107:[2,139],115:[2,139],123:[2,139],125:[2,139],126:[2,139],129:[2,139],130:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],46:[2,144],51:[2,144],54:[2,144],69:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],101:[2,144],102:[2,144],103:[2,144],107:[2,144],115:[2,144],123:[2,144],125:[2,144],126:[2,144],129:[2,144],130:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144]},{79:180,82:[1,103]},{1:[2,63],6:[2,63],25:[2,63],26:[2,63],37:[2,63],46:[2,63],51:[2,63],54:[2,63],63:[2,63],64:[2,63],65:[2,63],67:[2,63],69:[2,63],70:[2,63],71:[2,63],75:[2,63],77:[2,63],81:[2,63],82:[2,63],83:[2,63],88:[2,63],90:[2,63],99:[2,63],101:[2,63],102:[2,63],103:[2,63],107:[2,63],115:[2,63],123:[2,63],125:[2,63],126:[2,63],127:[2,63],128:[2,63],129:[2,63],130:[2,63],131:[2,63],132:[2,63],133:[2,63],134:[2,63],135:[2,63]},{82:[2,103]},{27:181,28:[1,70]},{27:182,28:[1,70]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],27:183,28:[1,70],37:[2,77],46:[2,77],51:[2,77],54:[2,77],63:[2,77],64:[2,77],65:[2,77],67:[2,77],69:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],37:[2,78],46:[2,78],51:[2,78],54:[2,78],63:[2,78],64:[2,78],65:[2,78],67:[2,78],69:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{8:185,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],54:[1,189],55:47,56:48,58:36,60:25,61:26,62:27,68:184,72:186,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],89:187,90:[1,188],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{66:190,67:[1,96],70:[1,97],71:[1,98]},{66:191,67:[1,96],70:[1,97],71:[1,98]},{79:192,82:[1,103]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],37:[2,64],46:[2,64],51:[2,64],54:[2,64],63:[2,64],64:[2,64],65:[2,64],67:[2,64],69:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{8:193,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,194],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],46:[2,101],51:[2,101],54:[2,101],63:[2,101],64:[2,101],65:[2,101],67:[2,101],69:[2,101],70:[2,101],71:[2,101],75:[2,101],81:[2,101],82:[2,101],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{46:[1,198],51:[1,199]},{46:[2,52],51:[2,52]},{37:[1,201],46:[2,54],51:[2,54],54:[1,200]},{37:[2,57],46:[2,57],51:[2,57],54:[2,57]},{37:[2,58],46:[2,58],51:[2,58],54:[2,58]},{37:[2,59],46:[2,59],51:[2,59],54:[2,59]},{37:[2,60],46:[2,60],51:[2,60],54:[2,60]},{27:146,28:[1,70]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:142,85:[1,55],86:[1,56],87:[1,54],88:[1,141],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],46:[2,46],51:[2,46],54:[2,46],69:[2,46],75:[2,46],83:[2,46],88:[2,46],90:[2,46],99:[2,46],101:[2,46],102:[2,46],103:[2,46],107:[2,46],115:[2,46],123:[2,46],125:[2,46],126:[2,46],129:[2,46],130:[2,46],131:[2,46],132:[2,46],133:[2,46],134:[2,46]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],46:[2,177],51:[2,177],54:[2,177],69:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:84,101:[2,177],102:[2,177],103:[2,177],106:85,107:[2,177],108:66,115:[2,177],123:[2,177],125:[2,177],126:[2,177],129:[1,75],130:[2,177],131:[2,177],132:[2,177],133:[2,177],134:[2,177]},{100:87,101:[1,62],103:[1,63],106:88,107:[1,65],108:66,123:[1,86]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],46:[2,178],51:[2,178],54:[2,178],69:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:84,101:[2,178],102:[2,178],103:[2,178],106:85,107:[2,178],108:66,115:[2,178],123:[2,178],125:[2,178],126:[2,178],129:[1,75],130:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],46:[2,179],51:[2,179],54:[2,179],69:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:84,101:[2,179],102:[2,179],103:[2,179],106:85,107:[2,179],108:66,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,75],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],46:[2,180],51:[2,180],54:[2,180],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,180],70:[2,66],71:[2,66],75:[2,180],81:[2,66],82:[2,66],83:[2,180],88:[2,180],90:[2,180],99:[2,180],101:[2,180],102:[2,180],103:[2,180],107:[2,180],115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[2,180],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],70:[1,97],71:[1,98],78:89,81:[1,91],82:[2,102]},{59:100,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],70:[1,97],71:[1,98],78:99,81:[1,91],82:[2,102]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],46:[2,69],51:[2,69],54:[2,69],63:[2,69],64:[2,69],65:[2,69],67:[2,69],69:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],46:[2,181],51:[2,181],54:[2,181],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,181],70:[2,66],71:[2,66],75:[2,181],81:[2,66],82:[2,66],83:[2,181],88:[2,181],90:[2,181],99:[2,181],101:[2,181],102:[2,181],103:[2,181],107:[2,181],115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[2,181],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],46:[2,182],51:[2,182],54:[2,182],69:[2,182],75:[2,182],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],46:[2,183],51:[2,183],54:[2,183],69:[2,183],75:[2,183],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{8:202,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,203],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,126],6:[2,126],25:[2,126],26:[2,126],46:[2,126],51:[2,126],54:[2,126],69:[2,126],75:[2,126],83:[2,126],88:[2,126],90:[2,126],94:207,95:[1,208],96:[1,209],99:[2,126],101:[2,126],102:[2,126],103:[2,126],107:[2,126],115:[2,126],123:[2,126],125:[2,126],126:[2,126],129:[2,126],130:[2,126],131:[2,126],132:[2,126],133:[2,126],134:[2,126]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],46:[2,138],51:[2,138],54:[2,138],69:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],101:[2,138],102:[2,138],103:[2,138],107:[2,138],115:[2,138],123:[2,138],125:[2,138],126:[2,138],129:[2,138],130:[2,138],131:[2,138],132:[2,138],133:[2,138],134:[2,138]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],46:[2,146],51:[2,146],54:[2,146],69:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{25:[1,210],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{117:211,119:212,120:[1,213]},{1:[2,91],6:[2,91],25:[2,91],26:[2,91],46:[2,91],51:[2,91],54:[2,91],69:[2,91],75:[2,91],83:[2,91],88:[2,91],90:[2,91],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{14:214,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:215,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,94],5:216,6:[2,94],25:[1,5],26:[2,94],46:[2,94],51:[2,94],54:[2,94],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,94],70:[2,66],71:[2,66],75:[2,94],77:[1,217],81:[2,66],82:[2,66],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,42],6:[2,42],26:[2,42],99:[2,42],100:84,101:[2,42],103:[2,42],106:85,107:[2,42],108:66,123:[2,42],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,131],6:[2,131],26:[2,131],99:[2,131],100:84,101:[2,131],103:[2,131],106:85,107:[2,131],108:66,123:[2,131],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,71],99:[1,218]},{4:219,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,122],25:[2,122],51:[2,122],54:[1,221],88:[2,122],89:220,90:[1,188],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],37:[2,109],46:[2,109],51:[2,109],54:[2,109],63:[2,109],64:[2,109],65:[2,109],67:[2,109],69:[2,109],70:[2,109],71:[2,109],75:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],113:[2,109],114:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109]},{6:[2,49],25:[2,49],50:222,51:[1,223],88:[2,49]},{6:[2,117],25:[2,117],26:[2,117],51:[2,117],83:[2,117],88:[2,117]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:224,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,123],25:[2,123],26:[2,123],51:[2,123],83:[2,123],88:[2,123]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],37:[2,108],40:[2,108],46:[2,108],51:[2,108],54:[2,108],63:[2,108],64:[2,108],65:[2,108],67:[2,108],69:[2,108],70:[2,108],71:[2,108],75:[2,108],77:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],127:[2,108],128:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108],135:[2,108]},{5:225,25:[1,5],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],46:[2,134],51:[2,134],54:[2,134],69:[2,134],75:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],100:84,101:[1,62],102:[1,226],103:[1,63],106:85,107:[1,65],108:66,115:[2,134],123:[2,134],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],46:[2,136],51:[2,136],54:[2,136],69:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:84,101:[1,62],102:[1,227],103:[1,63],106:85,107:[1,65],108:66,115:[2,136],123:[2,136],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],46:[2,142],51:[2,142],54:[2,142],69:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],46:[2,143],51:[2,143],54:[2,143],69:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],100:84,101:[1,62],102:[2,143],103:[1,63],106:85,107:[1,65],108:66,115:[2,143],123:[2,143],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],46:[2,147],51:[2,147],54:[2,147],69:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{113:[2,149],114:[2,149]},{27:156,28:[1,70],55:157,56:158,73:[1,67],87:[1,112],110:228,112:155},{51:[1,229],113:[2,154],114:[2,154]},{51:[2,151],113:[2,151],114:[2,151]},{51:[2,152],113:[2,152],114:[2,152]},{51:[2,153],113:[2,153],114:[2,153]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],46:[2,148],51:[2,148],54:[2,148],69:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{8:230,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:231,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,49],25:[2,49],50:232,51:[1,233],75:[2,49]},{6:[2,86],25:[2,86],26:[2,86],51:[2,86],75:[2,86]},{6:[2,35],25:[2,35],26:[2,35],40:[1,234],51:[2,35],75:[2,35]},{6:[2,38],25:[2,38],26:[2,38],51:[2,38],75:[2,38]},{6:[2,39],25:[2,39],26:[2,39],40:[2,39],51:[2,39],75:[2,39]},{6:[2,40],25:[2,40],26:[2,40],40:[2,40],51:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],40:[2,41],51:[2,41],75:[2,41]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],46:[2,25],51:[2,25],54:[2,25],69:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],46:[2,185],51:[2,185],54:[2,185],69:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],100:84,101:[2,185],102:[2,185],103:[2,185],106:85,107:[2,185],108:66,115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[1,75],130:[1,78],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],46:[2,186],51:[2,186],54:[2,186],69:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],100:84,101:[2,186],102:[2,186],103:[2,186],106:85,107:[2,186],108:66,115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[1,75],130:[1,78],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],46:[2,187],51:[2,187],54:[2,187],69:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:84,101:[2,187],102:[2,187],103:[2,187],106:85,107:[2,187],108:66,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,75],130:[2,187],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],46:[2,188],51:[2,188],54:[2,188],69:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:84,101:[2,188],102:[2,188],103:[2,188],106:85,107:[2,188],108:66,115:[2,188],123:[2,188],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],46:[2,189],51:[2,189],54:[2,189],69:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:84,101:[2,189],102:[2,189],103:[2,189],106:85,107:[2,189],108:66,115:[2,189],123:[2,189],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[2,189],133:[2,189],134:[1,82]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],46:[2,190],51:[2,190],54:[2,190],69:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:84,101:[2,190],102:[2,190],103:[2,190],106:85,107:[2,190],108:66,115:[2,190],123:[2,190],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[2,190],134:[1,82]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],46:[2,191],51:[2,191],54:[2,191],69:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:84,101:[2,191],102:[2,191],103:[2,191],106:85,107:[2,191],108:66,115:[2,191],123:[2,191],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[2,191],133:[2,191],134:[2,191]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],46:[2,176],51:[2,176],54:[2,176],69:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],100:84,101:[1,62],102:[2,176],103:[1,63],106:85,107:[1,65],108:66,115:[2,176],123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],46:[2,175],51:[2,175],54:[2,175],69:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],100:84,101:[1,62],102:[2,175],103:[1,63],106:85,107:[1,65],108:66,115:[2,175],123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],46:[2,98],51:[2,98],54:[2,98],63:[2,98],64:[2,98],65:[2,98],67:[2,98],69:[2,98],70:[2,98],71:[2,98],75:[2,98],81:[2,98],82:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],37:[2,74],46:[2,74],51:[2,74],54:[2,74],63:[2,74],64:[2,74],65:[2,74],67:[2,74],69:[2,74],70:[2,74],71:[2,74],75:[2,74],77:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],127:[2,74],128:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],37:[2,75],46:[2,75],51:[2,75],54:[2,75],63:[2,75],64:[2,75],65:[2,75],67:[2,75],69:[2,75],70:[2,75],71:[2,75],75:[2,75],77:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],127:[2,75],128:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],37:[2,76],46:[2,76],51:[2,76],54:[2,76],63:[2,76],64:[2,76],65:[2,76],67:[2,76],69:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{69:[1,235]},{54:[1,189],69:[2,82],89:236,90:[1,188],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{69:[2,83]},{8:237,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:[2,111],28:[2,111],30:[2,111],31:[2,111],33:[2,111],34:[2,111],35:[2,111],42:[2,111],43:[2,111],44:[2,111],48:[2,111],49:[2,111],69:[2,111],73:[2,111],76:[2,111],80:[2,111],85:[2,111],86:[2,111],87:[2,111],93:[2,111],97:[2,111],98:[2,111],101:[2,111],103:[2,111],105:[2,111],107:[2,111],116:[2,111],122:[2,111],124:[2,111],125:[2,111],126:[2,111],127:[2,111],128:[2,111]},{13:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],42:[2,112],43:[2,112],44:[2,112],48:[2,112],49:[2,112],69:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],37:[2,80],46:[2,80],51:[2,80],54:[2,80],63:[2,80],64:[2,80],65:[2,80],67:[2,80],69:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],37:[2,81],46:[2,81],51:[2,81],54:[2,81],63:[2,81],64:[2,81],65:[2,81],67:[2,81],69:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],46:[2,99],51:[2,99],54:[2,99],63:[2,99],64:[2,99],65:[2,99],67:[2,99],69:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],46:[2,33],51:[2,33],54:[2,33],69:[2,33],75:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],100:84,101:[2,33],102:[2,33],103:[2,33],106:85,107:[2,33],108:66,115:[2,33],123:[2,33],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:238,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],46:[2,104],51:[2,104],54:[2,104],63:[2,104],64:[2,104],65:[2,104],67:[2,104],69:[2,104],70:[2,104],71:[2,104],75:[2,104],81:[2,104],82:[2,104],83:[2,104],88:[2,104],90:[2,104],99:[2,104],101:[2,104],102:[2,104],103:[2,104],107:[2,104],115:[2,104],123:[2,104],125:[2,104],126:[2,104],129:[2,104],130:[2,104],131:[2,104],132:[2,104],133:[2,104],134:[2,104]},{6:[2,49],25:[2,49],50:239,51:[1,223],83:[2,49]},{6:[2,122],25:[2,122],26:[2,122],51:[2,122],54:[1,240],83:[2,122],88:[2,122],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{47:241,48:[1,57],49:[1,58]},{27:107,28:[1,70],41:108,52:242,53:106,55:109,56:110,73:[1,67],86:[1,111],87:[1,112]},{46:[2,55],51:[2,55]},{8:243,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],46:[2,192],51:[2,192],54:[2,192],69:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:84,101:[2,192],102:[2,192],103:[2,192],106:85,107:[2,192],108:66,115:[2,192],123:[2,192],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:244,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],46:[2,194],51:[2,194],54:[2,194],69:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],100:84,101:[2,194],102:[2,194],103:[2,194],106:85,107:[2,194],108:66,115:[2,194],123:[2,194],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],46:[2,174],51:[2,174],54:[2,174],69:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{8:245,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,127],6:[2,127],25:[2,127],26:[2,127],46:[2,127],51:[2,127],54:[2,127],69:[2,127],75:[2,127],83:[2,127],88:[2,127],90:[2,127],95:[1,246],99:[2,127],101:[2,127],102:[2,127],103:[2,127],107:[2,127],115:[2,127],123:[2,127],125:[2,127],126:[2,127],129:[2,127],130:[2,127],131:[2,127],132:[2,127],133:[2,127],134:[2,127]},{5:247,25:[1,5]},{27:248,28:[1,70]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,167],118:[2,167],120:[2,167]},{8:254,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],92:253,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,92],5:255,6:[2,92],25:[1,5],26:[2,92],46:[2,92],51:[2,92],54:[2,92],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,92],70:[1,97],71:[1,98],75:[2,92],78:89,81:[1,91],82:[2,102],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],46:[2,66],51:[2,66],54:[2,66],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,66],70:[2,66],71:[2,66],75:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66]},{1:[2,95],6:[2,95],25:[2,95],26:[2,95],46:[2,95],51:[2,95],54:[2,95],69:[2,95],75:[2,95],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{14:256,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:215,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],46:[2,132],51:[2,132],54:[2,132],63:[2,132],64:[2,132],65:[2,132],67:[2,132],69:[2,132],70:[2,132],71:[2,132],75:[2,132],81:[2,132],82:[2,132],83:[2,132],88:[2,132],90:[2,132],99:[2,132],101:[2,132],102:[2,132],103:[2,132],107:[2,132],115:[2,132],123:[2,132],125:[2,132],126:[2,132],129:[2,132],130:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132]},{6:[1,71],26:[1,257]},{8:258,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,61],13:[2,112],25:[2,61],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],42:[2,112],43:[2,112],44:[2,112],48:[2,112],49:[2,112],51:[2,61],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],88:[2,61],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,50],8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[2,50],26:[2,50],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],83:[2,50],85:[1,55],86:[1,56],87:[1,54],88:[2,50],91:262,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,49],25:[2,49],26:[2,49],50:263,51:[1,223]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],46:[2,171],51:[2,171],54:[2,171],69:[2,171],75:[2,171],83:[2,171],88:[2,171],90:[2,171],99:[2,171],101:[2,171],102:[2,171],103:[2,171],107:[2,171],115:[2,171],118:[2,171],123:[2,171],125:[2,171],126:[2,171],129:[2,171],130:[2,171],131:[2,171],132:[2,171],133:[2,171],134:[2,171]},{8:264,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,150],114:[2,150]},{27:156,28:[1,70],55:157,56:158,73:[1,67],87:[1,112],112:266},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],46:[2,156],51:[2,156],54:[2,156],69:[2,156],75:[2,156],83:[2,156],88:[2,156],90:[2,156],99:[2,156],100:84,101:[2,156],102:[1,267],103:[2,156],106:85,107:[2,156],108:66,115:[1,268],123:[2,156],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],46:[2,157],51:[2,157],54:[2,157],69:[2,157],75:[2,157],83:[2,157],88:[2,157],90:[2,157],99:[2,157],100:84,101:[2,157],102:[1,269],103:[2,157],106:85,107:[2,157],108:66,115:[2,157],123:[2,157],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,50],12:165,25:[2,50],26:[2,50],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:273,39:164,41:168,43:[1,46],75:[2,50],86:[1,111]},{8:274,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,275],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],37:[2,79],46:[2,79],51:[2,79],54:[2,79],63:[2,79],64:[2,79],65:[2,79],67:[2,79],69:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{8:276,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,69:[2,115],73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{69:[2,116],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,277],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,61],25:[2,61],26:[2,61],51:[2,61],83:[2,61],88:[2,61]},{5:279,25:[1,5]},{46:[2,53],51:[2,53]},{46:[2,56],51:[2,56],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,280],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{5:281,25:[1,5],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{5:282,25:[1,5]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],46:[2,128],51:[2,128],54:[2,128],69:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],46:[2,165],51:[2,165],54:[2,165],69:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{5:286,25:[1,5]},{26:[2,168],118:[2,168],120:[2,168]},{5:287,25:[1,5],51:[1,288]},{25:[2,124],51:[2,124],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,93],6:[2,93],25:[2,93],26:[2,93],46:[2,93],51:[2,93],54:[2,93],69:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],101:[2,93],102:[2,93],103:[2,93],107:[2,93],115:[2,93],123:[2,93],125:[2,93],126:[2,93],129:[2,93],130:[2,93],131:[2,93],132:[2,93],133:[2,93],134:[2,93]},{1:[2,96],5:289,6:[2,96],25:[1,5],26:[2,96],46:[2,96],51:[2,96],54:[2,96],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,96],70:[1,97],71:[1,98],75:[2,96],78:89,81:[1,91],82:[2,102],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{99:[1,290]},{88:[1,291],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],37:[2,110],46:[2,110],51:[2,110],54:[2,110],63:[2,110],64:[2,110],65:[2,110],67:[2,110],69:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],91:292,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:293,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,118],25:[2,118],26:[2,118],51:[2,118],83:[2,118],88:[2,118]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],46:[2,135],51:[2,135],54:[2,135],69:[2,135],75:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],100:84,101:[1,62],102:[2,135],103:[1,63],106:85,107:[1,65],108:66,115:[2,135],123:[2,135],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],46:[2,137],51:[2,137],54:[2,137],69:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:84,101:[1,62],102:[2,137],103:[1,63],106:85,107:[1,65],108:66,115:[2,137],123:[2,137],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{113:[2,155],114:[2,155]},{8:295,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],37:[2,84],46:[2,84],51:[2,84],54:[2,84],63:[2,84],64:[2,84],65:[2,84],67:[2,84],69:[2,84],70:[2,84],71:[2,84],75:[2,84],81:[2,84],82:[2,84],83:[2,84],88:[2,84],90:[2,84],99:[2,84],101:[2,84],102:[2,84],103:[2,84],107:[2,84],113:[2,84],114:[2,84],115:[2,84],123:[2,84],125:[2,84],126:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84]},{12:165,27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:298,39:164,41:168,43:[1,46],86:[1,111]},{6:[2,85],12:165,25:[2,85],26:[2,85],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:163,39:164,41:168,43:[1,46],51:[2,85],74:299,86:[1,111]},{6:[2,87],25:[2,87],26:[2,87],51:[2,87],75:[2,87]},{6:[2,36],25:[2,36],26:[2,36],51:[2,36],75:[2,36],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:300,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{69:[2,114],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],46:[2,34],51:[2,34],54:[2,34],69:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],101:[2,34],102:[2,34],103:[2,34],107:[2,34],115:[2,34],123:[2,34],125:[2,34],126:[2,34],129:[2,34],130:[2,34],131:[2,34],132:[2,34],133:[2,34],134:[2,34]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],46:[2,105],51:[2,105],54:[2,105],63:[2,105],64:[2,105],65:[2,105],67:[2,105],69:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{1:[2,45],6:[2,45],25:[2,45],26:[2,45],46:[2,45],51:[2,45],54:[2,45],69:[2,45],75:[2,45],83:[2,45],88:[2,45],90:[2,45],99:[2,45],101:[2,45],102:[2,45],103:[2,45],107:[2,45],115:[2,45],123:[2,45],125:[2,45],126:[2,45],129:[2,45],130:[2,45],131:[2,45],132:[2,45],133:[2,45],134:[2,45]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],46:[2,193],51:[2,193],54:[2,193],69:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],101:[2,193],102:[2,193],103:[2,193],107:[2,193],115:[2,193],123:[2,193],125:[2,193],126:[2,193],129:[2,193],130:[2,193],131:[2,193],132:[2,193],133:[2,193],134:[2,193]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],46:[2,172],51:[2,172],54:[2,172],69:[2,172],75:[2,172],83:[2,172],88:[2,172],90:[2,172],99:[2,172],101:[2,172],102:[2,172],103:[2,172],107:[2,172],115:[2,172],118:[2,172],123:[2,172],125:[2,172],126:[2,172],129:[2,172],130:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],46:[2,129],51:[2,129],54:[2,129],69:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],46:[2,130],51:[2,130],54:[2,130],69:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],95:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],46:[2,163],51:[2,163],54:[2,163],69:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],101:[2,163],102:[2,163],103:[2,163],107:[2,163],115:[2,163],123:[2,163],125:[2,163],126:[2,163],129:[2,163],130:[2,163],131:[2,163],132:[2,163],133:[2,163],134:[2,163]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,169],118:[2,169],120:[2,169]},{8:304,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,97],6:[2,97],25:[2,97],26:[2,97],46:[2,97],51:[2,97],54:[2,97],69:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],101:[2,97],102:[2,97],103:[2,97],107:[2,97],115:[2,97],123:[2,97],125:[2,97],126:[2,97],129:[2,97],130:[2,97],131:[2,97],132:[2,97],133:[2,97],134:[2,97]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],46:[2,133],51:[2,133],54:[2,133],63:[2,133],64:[2,133],65:[2,133],67:[2,133],69:[2,133],70:[2,133],71:[2,133],75:[2,133],81:[2,133],82:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],101:[2,133],102:[2,133],103:[2,133],107:[2,133],115:[2,133],123:[2,133],125:[2,133],126:[2,133],129:[2,133],130:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],46:[2,113],51:[2,113],54:[2,113],63:[2,113],64:[2,113],65:[2,113],67:[2,113],69:[2,113],70:[2,113],71:[2,113],75:[2,113],81:[2,113],82:[2,113],83:[2,113],88:[2,113],90:[2,113],99:[2,113],101:[2,113],102:[2,113],103:[2,113],107:[2,113],115:[2,113],123:[2,113],125:[2,113],126:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113]},{6:[2,119],25:[2,119],26:[2,119],51:[2,119],83:[2,119],88:[2,119]},{6:[2,49],25:[2,49],26:[2,49],50:305,51:[1,223]},{6:[2,120],25:[2,120],26:[2,120],51:[2,120],83:[2,120],88:[2,120]},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],46:[2,158],51:[2,158],54:[2,158],69:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:84,101:[2,158],102:[2,158],103:[2,158],106:85,107:[2,158],108:66,115:[1,306],123:[2,158],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],46:[2,160],51:[2,160],54:[2,160],69:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:84,101:[2,160],102:[1,307],103:[2,160],106:85,107:[2,160],108:66,115:[2,160],123:[2,160],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],46:[2,159],51:[2,159],54:[2,159],69:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:84,101:[2,159],102:[2,159],103:[2,159],106:85,107:[2,159],108:66,115:[2,159],123:[2,159],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[2,88],25:[2,88],26:[2,88],51:[2,88],75:[2,88]},{6:[2,49],25:[2,49],26:[2,49],50:308,51:[1,233]},{26:[1,309],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,310]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],46:[2,166],51:[2,166],54:[2,166],69:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{26:[2,170],118:[2,170],120:[2,170]},{25:[2,125],51:[2,125],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,37],25:[2,37],26:[2,37],51:[2,37],75:[2,37]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],46:[2,164],51:[2,164],54:[2,164],69:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],101:[2,164],102:[2,164],103:[2,164],107:[2,164],115:[2,164],123:[2,164],125:[2,164],126:[2,164],129:[2,164],130:[2,164],131:[2,164],132:[2,164],133:[2,164],134:[2,164]},{6:[2,121],25:[2,121],26:[2,121],51:[2,121],83:[2,121],88:[2,121]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],46:[2,161],51:[2,161],54:[2,161],69:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:84,101:[2,161],102:[2,161],103:[2,161],106:85,107:[2,161],108:66,115:[2,161],123:[2,161],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],46:[2,162],51:[2,162],54:[2,162],69:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:84,101:[2,162],102:[2,162],103:[2,162],106:85,107:[2,162],108:66,115:[2,162],123:[2,162],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[2,89],25:[2,89],26:[2,89],51:[2,89],75:[2,89]}],defaultActions:{57:[2,47],58:[2,48],72:[2,3],91:[2,103],186:[2,83]},parseError:function(a,b){throw new Error(a)},parse:function h(a){function o(){var a;a=b.lexer.lex()||1,typeof a!="number"&&(a=b.symbols_[a]||a);return a}function n(a){c.length=c.length-2*a,d.length=d.length-a,e.length=e.length-a}var b=this,c=[0],d=[null],e=[],f=this.table,g="",h=0,i=0,j=0,k=2,l=1;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var m=this.lexer.yylloc;e.push(m),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var p,q,r,s,t,u,v={},w,x,y,z;for(;;){r=c[c.length-1],this.defaultActions[r]?s=this.defaultActions[r]:(p==null&&(p=o()),s=f[r]&&f[r][p]);if(typeof s=="undefined"||!s.length||!s[0]){if(!j){z=[];for(w in f[r])this.terminals_[w]&&w>2&&z.push("'"+this.terminals_[w]+"'");var A="";this.lexer.showPosition?A="Parse error on line "+(h+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+z.join(", "):A="Parse error on line "+(h+1)+": Unexpected "+(p==1?"end of input":"'"+(this.terminals_[p]||p)+"'"),this.parseError(A,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:m,expected:z})}if(j==3){if(p==l)throw new Error(A||"Parsing halted.");i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,p=o()}for(;;){if(k.toString()in f[r])break;if(r==0)throw new Error(A||"Parsing halted.");n(1),r=c[c.length-1]}q=p,p=k,r=c[c.length-1],s=f[r]&&f[r][k],j=3}if(s[0]instanceof Array&&s.length>1)throw new Error("Parse Error: multiple actions possible at state: "+r+", token: "+p);switch(s[0]){case 1:c.push(p),d.push(this.lexer.yytext),e.push(this.lexer.yylloc),c.push(s[1]),p=null,q?(p=q,q=null):(i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,j>0&&j--);break;case 2:x=this.productions_[s[1]][1],v.$=d[d.length-x],v._$={first_line:e[e.length-(x||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(x||1)].first_column,last_column:e[e.length-1].last_column},u=this.performAction.call(v,g,i,h,this.yy,s[1],d,e);if(typeof u!="undefined")return u;x&&(c=c.slice(0,-1*x*2),d=d.slice(0,-1*x),e=e.slice(0,-1*x)),c.push(this.productions_[s[1]][0]),d.push(v.$),e.push(v._$),y=f[c[c.length-2]][c[c.length-1]],c.push(y);break;case 3:return!0}}return!0}};c.exports=d}),define("ace/mode/coffee/nodes",["require","exports","module","ace/mode/coffee/scope","ace/mode/coffee/helpers"],function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,ba,bb,bc,bd,be,bf,bg,bh,bi,bj=Object.prototype.hasOwnProperty,bk=function(a,b){function d(){this.constructor=a}for(var c in b)bj.call(b,c)&&(a[c]=b[c]);d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype;return a},bl=function(a,b){return function(){return a.apply(b,arguments)}},bm=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;b1&&a.level>=x?"("+b+")":b},a.prototype.compileRoot=function(a){var b;a.indent=this.tab=a.bare?"":R,a.scope=new N(null,this,null),a.level=A,b=this.compileWithDeclarations(a);return a.bare?b:"(function() {\n"+b+"\n}).call(this);\n"},a.prototype.compileWithDeclarations=function(a){var b,c,d,e,f,g,h,i,j,k;c=g="",k=this.expressions;for(f=0,j=k.length;f=v?"(void 0)":"void 0":this.value.reserved?'"'+this.value+'"':this.value;return this.isStatement()?""+this.tab+b+";":b},a.prototype.toString=function(){return' "'+this.value+'"'};return a}(),b.Return=L=function(){function a(a){a&&!a.unwrap().isUndefined&&(this.expression=a)}bk(a,g),a.prototype.children=["expression"],a.prototype.isStatement=Y,a.prototype.makeReturn=S,a.prototype.jumps=S,a.prototype.compile=function(b,c){var d,e;d=(e=this.expression)!=null?e.makeReturn():void 0;return!d||d instanceof a?a.__super__.compile.call(this,b,c):d.compile(b,c)},a.prototype.compileNode=function(a){return this.tab+("return"+(this.expression?" "+this.expression.compile(a,z):"")+";")};return a}(),b.Value=W=function(){function a(b,c,d){if(!c&&b instanceof a)return b;this.base=b,this.properties=c||[],d&&(this[d]=!0);return this}bk(a,g),a.prototype.children=["base","properties"],a.prototype.push=function(a){this.properties.push(a);return this},a.prototype.hasProperties=function(){return!!this.properties.length},a.prototype.isArray=function(){return!this.properties.length&&this.base instanceof e},a.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()},a.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()},a.prototype.isSimpleNumber=function(){return this.base instanceof B&&M.test(this.base.value)},a.prototype.isAtomic=function(){var a,b,c,d;d=this.properties.concat(this.base);for(b=0,c=d.length;b"+this.equals],h=l[0],e=l[1],c=this.stepNum?c=+this.stepNum>0?""+h+" "+this.toVar:""+e+" "+this.toVar:g?(m=[+this.fromNum,+this.toNum],d=m[0],j=m[1],m,c=d<=j?""+h+" "+j:""+e+" "+j):(b=""+this.fromVar+" <= "+this.toVar,c=""+b+" ? "+h+" "+this.toVar+" : "+e+" "+this.toVar),i=this.stepVar?""+f+" += "+this.stepVar:g?d<=j?""+f+"++":""+f+"--":""+b+" ? "+f+"++ : "+f+"--";return""+k+"; "+c+"; "+i},a.prototype.compileArray=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;if(this.fromNum&&this.toNum&&Math.abs(this.fromNum-this.toNum)<=20){h=function(){n=[];for(var a=l=+this.fromNum,b=+this.toNum;l<=b?a<=b:a>=b;l<=b?a++:a--)n.push(a);return n}.apply(this,arguments),this.exclusive&&h.pop();return"["+h.join(", ")+"]"}e=this.tab+R,d=a.scope.freeVariable("i"),i=a.scope.freeVariable("results"),g="\n"+e+i+" = [];",this.fromNum&&this.toNum?(a.index=d,b=this.compileNode(a)):(j=""+d+" = "+this.from+(this.to!==this.toVar?", "+this.to:""),c=""+this.fromVar+" <= "+this.toVar,b="var "+j+"; "+c+" ? "+d+" <"+this.equals+" "+this.toVar+" : "+d+" >"+this.equals+" "+this.toVar+"; "+c+" ? "+d+"++ : "+d+"--"),f="{ "+i+".push("+d+"); }\n"+e+"return "+i+";\n"+a.indent;return"(function() {"+g+"\n"+e+"for ("+b+")"+f+"}).apply(this, arguments)"};return a}(),b.Slice=O=function(){function a(b){this.range=b,a.__super__.constructor.call(this)}bk(a,g),a.prototype.children=["range"],a.prototype.compileNode=function(a){var b,c,d,e,f,g;g=this.range,e=g.to,c=g.from,d=c&&c.compile(a,z)||"0",b=e&&e.compile(a,z),e&&(!!this.range.exclusive||+b!==-1)&&(f=", "+(this.range.exclusive?b:M.test(b)?(+b+1).toString():"("+b+" + 1) || 9e9"));return".slice("+d+(f||"")+")"};return a}(),b.Obj=F=function(){function a(a,b){this.generated=b!=null?b:!1,this.objects=this.properties=a||[]}bk(a,g),a.prototype.children=["properties"],a.prototype.compileNode=function(a){var b,c,d,e,g,h,i,j,k,l,n;k=this.properties;if(!k.length)return this.front?"({})":"{}";if(this.generated)for(l=0,n=k.length;l=0?"[\n"+a.indent+b+"\n"+this.tab+"]":"["+b+"]"},a.prototype.assigns=function(a){var b,c,d,e;e=this.objects;for(c=0,d=e.length;c=y?"("+f+")":f}i=this.variable.isObject();if(!r||m!==1||(k=l[0])instanceof P){v=t.compile(b,x),e=[],p=!1;if(!q.test(v)||this.variable.assigns(v))e.push(""+(n=b.scope.freeVariable("ref"))+" = "+v),v=n;for(g=0,w=l.length;g=0&&(b.isExistentialEquals=!0);return(new G(this.context.slice(0,-1),c,new a(d,this.value,"="))).compile(b)},a.prototype.compileSplice=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;k=this.variable.properties.pop().range,d=k.from,h=k.to,c=k.exclusive,g=this.variable.compile(a),l=(d!=null?d.cache(a,y):void 0)||["0","0"],e=l[0],f=l[1],h?(d!=null?d.isSimpleNumber():void 0)&&h.isSimpleNumber()?(h=+h.compile(a)- +f,c||(h+=1)):(h=h.compile(a)+" - "+f,c||(h+=" + 1")):h="9e9",m=this.value.cache(a,x),i=m[0],j=m[1],b="[].splice.apply("+g+", ["+e+", "+h+"].concat("+i+")), "+j;return a.level>A?"("+b+")":b};return a}(),b.Code=l=function(){function a(a,b,c){this.params=a||[],this.body=b||new h,this.bound=c==="boundfunc",this.bound&&(this.context="this")}bk(a,g),a.prototype.children=["params","body"],a.prototype.isStatement=function(){return!!this.ctor},a.prototype.jumps=E,a.prototype.compileNode=function(a){var b,c,d,g,h,i,j,k,l,m,n,o,p,q,r,t,u,w,x,y,z,A,C,D;a.scope=new N(a.scope,this.body,this),a.scope.shared=$(a,"sharedScope"),a.indent+=R,delete a.bare,o=[],c=[],z=this.params;for(q=0,u=z.length;q=v?"("+b+")":b},a.prototype.traverseChildren=function(b,c){if(b)return a.__super__.traverseChildren.call(this,b,c)};return a}(),b.Param=H=function(){function a(a,b,c){this.name=a,this.value=b,this.splat=c}bk(a,g),a.prototype.children=["name","value"],a.prototype.compile=function(a){return this.name.compile(a,x)},a.prototype.asReference=function(a){var b;if(this.reference)return this.reference;b=this.name,b["this"]?(b=b.properties[0].name,b.value.reserved&&(b=new B("_"+b.value))):b.isComplex()&&(b=new B(a.scope.freeVariable("arg"))),b=new W(b),this.splat&&(b=new P(b));return this.reference=b},a.prototype.isComplex=function(){return this.name.isComplex()};return a}(),b.Splat=P=function(){function a(a){this.name=a.compile?a:new B(a)}bk(a,g),a.prototype.children=["name"],a.prototype.isAssignable=Y,a.prototype.assigns=function(a){return this.name.assigns(a)},a.prototype.compile=function(a){return this.index!=null?this.compileParam(a):this.name.compile(a)},a.compileSplattedArray=function(b,c,d){var e,f,g,h,i,j,k;i=-1;while((j=c[++i])&&!(j instanceof a))continue;if(i>=c.length)return"";if(c.length===1){g=c[0].compile(b,x);return d?g:""+bh("slice")+".call("+g+")"}e=c.slice(i);for(h=0,k=e.length;hA||this.returns)d=a.scope.freeVariable("results"),e=""+this.tab+d+" = [];\n",b&&(b=J.wrap(d,b));this.guard&&(b=h.wrap([new s(this.guard,b)])),b="\n"+b.compile(a,A)+"\n"+this.tab}c=e+this.tab+("while ("+this.condition.compile(a,z)+") {"+b+"}"),this.returns&&(c+="\n"+this.tab+"return "+d+";");return c};return a}(),b.Op=G=function(){function c(b,c,d,e){var f;if(b==="in")return new t(c,d);if(b==="do"){f=new i(c,c.params||[]),f["do"]=!0;return f}if(b==="new"){if(c instanceof i&&!c["do"])return c.newInstance();if(c instanceof l&&c.bound||c["do"])c=new I(c)}this.operator=a[b]||b,this.first=c,this.second=d,this.flip=!!e;return this}var a,b;bk(c,g),a={"==":"===","!=":"!==",of:"in"},b={"!==":"===","===":"!=="},c.prototype.children=["first","second"],c.prototype.isSimpleNumber=E,c.prototype.isUnary=function(){return!this.second},c.prototype.isComplex=function(){var a;return!this.isUnary()||(a=this.operator)!=="+"&&a!=="-"||this.first.isComplex()},c.prototype.isChainable=function(){var a;return(a=this.operator)==="<"||a===">"||a===">="||a==="<="||a==="==="||a==="!=="},c.prototype.invert=function(){var a,d,e,f,g;if(this.isChainable()&&this.first.isChainable()){a=!0,d=this;while(d&&d.operator)a&&(a=d.operator in b),d=d.first;if(!a)return(new I(this)).invert();d=this;while(d&&d.operator)d.invert=!d.invert,d.operator=b[d.operator],d=d.first;return this}if(f=b[this.operator]){this.operator=f,this.first.unwrap()instanceof c&&this.first.invert();return this}return this.second?(new I(this)).invert():this.operator==="!"&&(e=this.first.unwrap())instanceof c&&((g=e.operator)==="!"||g==="in"||g==="instanceof")?e:new c("!",this)},c.prototype.unfoldSoak=function(a){var b;return((b=this.operator)==="++"||b==="--"||b==="delete")&&bg(a,this,"first")},c.prototype.compileNode=function(a){var b;if(this.isUnary())return this.compileUnary(a);if(this.isChainable()&&this.first.isChainable())return this.compileChain(a);if(this.operator==="?")return this.compileExistence(a);this.first.front=this.front,b=this.first.compile(a,y)+" "+this.operator+" "+this.second.compile(a,y);return a.level<=y?b:"("+b+")"},c.prototype.compileChain=function(a){var b,c,d,e;e=this.first.second.cache(a),this.first.second=e[0],d=e[1],c=this.first.compile(a,y),b=""+c+" "+(this.invert?"&&":"||")+" "+d.compile(a)+" "+this.operator+" "+this.second.compile(a,y);return"("+b+")"},c.prototype.compileExistence=function(a){var b,c;this.first.isComplex()?(c=new B(a.scope.freeVariable("ref")),b=new I(new f(c,this.first))):(b=this.first,c=b);return(new s(new n(b),c,{type:"if"})).addElse(this.second).compile(a)},c.prototype.compileUnary=function(a){var b,d;d=[b=this.operator],(b==="new"||b==="typeof"||b==="delete"||(b==="+"||b==="-")&&this.first instanceof c&&this.first.operator===b)&&d.push(" "),b==="new"&&this.first.isStatement(a)&&(this.first=new I(this.first)),d.push(this.first.compile(a,y)),this.flip&&d.reverse();return d.join("")},c.prototype.toString=function(a){return c.__super__.toString.call(this,a,this.constructor.name+" "+this.operator)};return c}(),b.In=t=function(){function a(a,b){this.object=a,this.array=b}bk(a,g),a.prototype.children=["object","array"],a.prototype.invert=D,a.prototype.compileNode=function(a){var b,c,d,e,f;if(this.array instanceof W&&this.array.isArray()){f=this.array.base.objects;for(d=0,e=f.length;d= 0");if(d===c)return b;b=d+", "+b;return a.level=w?"("+d+")":d},a.prototype.unfoldSoak=function(){return this.soak&&this};return a}(),J={wrap:function(a,b){return b.isEmpty()||bc(b.expressions).jumps()?b:b.push(new i(new W(new B(a),[new d(new B("push"))]),[b.pop()]))}},k={wrap:function(a,b,c){var e,f,g,j,k;if(a.jumps())return a;g=new l([],h.wrap([a])),e=[];if((j=a.contains(this.literalArgs))||a.contains(this.literalThis))k=new B(j?"apply":"call"),e=[new B("this")],j&&e.push(new B("arguments")),g=new W(g,[new d(k)]);g.noReturn=c,f=new i(g,e);return b?h.wrap([f]):f},literalArgs:function(a){return a instanceof B&&a.value==="arguments"&&!a.asKey},literalThis:function(a){return a instanceof B&&a.value==="this"&&!a.asKey||a instanceof l&&a.bound}},bg=function(a,b,c){var d;if(!!(d=b[c].unfoldSoak(a))){b[c]=d.body,d.body=new W(b);return d}},V={"extends":"function(child, parent) {\n for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor;\n child.__super__ = parent.prototype;\n return child;\n}",bind:"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }",indexOf:"Array.prototype.indexOf || function(item) {\n for (var i = 0, l = this.length; i < l; i++) {\n if (this[i] === item) return i;\n }\n return -1;\n}",hasProp:"Object.prototype.hasOwnProperty",slice:"Array.prototype.slice"},A=1,z=2,x=3,w=4,y=5,v=6,R=" ",q=/^[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*$/,M=/^[+-]?\d+$/,C=/^(?:([$A-Za-z_][$\w\x7f-\uffff]*)\.prototype\.)?([$A-Za-z_][$\w\x7f-\uffff]*)$/,r=/^['"]/,bh=function(a){var b;b="__"+a,N.root.assign(b,V[a]);return b},be=function(a,b){return a.replace(/\n/g,"$&"+b)}}),define("ace/mode/coffee/scope",["require","exports","module","ace/mode/coffee/helpers"],function(a,b,c){var d,e,f,g;g=a("ace/mode/coffee/helpers"),e=g.extend,f=g.last,b.Scope=d=function(){function a(b,c,d){this.parent=b,this.expressions=c,this.method=d,this.variables=[{name:"arguments",type:"arguments"}],this.positions={},this.parent||(a.root=this)}a.root=null,a.prototype.add=function(a,b,c){var d;return this.shared&&!c?this.parent.add(a,b,c):typeof (d=this.positions[a])=="number"?this.variables[d].type=b:this.positions[a]=this.variables.push({name:a,type:b})-1},a.prototype.find=function(a,b){if(this.check(a,b))return!0;this.add(a,"var");return!1},a.prototype.parameter=function(a){if(!this.shared||!this.parent.check(a,!0))return this.add(a,"param")},a.prototype.check=function(a,b){var c,d;c=!!this.type(a);return c||b?c:(d=this.parent)!=null?!!d.check(a):!!void 0},a.prototype.temporary=function(a,b){return a.length>1?"_"+a+(b>1?b:""):"_"+(b+parseInt(a,36)).toString(36).replace(/\d/g,"a")},a.prototype.type=function(a){var b,c,d,e;e=this.variables;for(c=0,d=e.length;c + * Provides an augmented, extensible, cross-browser implementation of regular expressions, + * including support for additional syntax, flags, and methods + */ + +define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + + //--------------------------------- + // Private variables + //--------------------------------- + + var real = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + real.test.call(x, ""); + return !x.lastIndex; + }(); + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match = real.exec.apply(this, arguments), + name, r2; + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + + // Don't override `test` if it won't change anything + if (!compliantLastIndexIncrement) { + // Fix browser bug in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the overriden + // `exec` would take care of the `lastIndex` fix + var match = real.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + //--------------------------------- + // Private helper functions + //--------------------------------- + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + }; + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + }; + +});// vim: ts=4 sts=4 sw=4 expandtab +// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License +// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project) +// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA +// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License +// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License +// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License +// -- kossnocorp Sasha Koss XXX TODO License or CLA +// -- bryanforbes Bryan Forbes XXX TODO License or CLA +// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence +// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License +// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License +// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain) +// -- iwyg XXX TODO License or CLA +// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License +// -- xavierm02 Montillet Xavier XXX TODO License or CLA +// -- Raynos Raynos XXX TODO License or CLA +// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License +// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License +// -- lexer Alexey Zakharov XXX TODO License or CLA + +/*! + Copyright (c) 2009, 280 North Inc. http://280north.com/ + MIT License. http://github.com/280north/narwhal/blob/master/README.md +*/ + +define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { + +/** + * Brings an environment as close to ECMAScript 5 compliance + * as is possible with the facilities of erstwhile engines. + * + * Annotated ES5: http://es5.github.com/ (specific links below) + * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf + * + * @module + */ + +/*whatsupdoc*/ + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (typeof target != "function") + throw new TypeError(); // TODO message + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var bound = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var F = function(){}; + F.prototype = target.prototype; + var self = new F; + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (result !== null && Object(result) === result) + return result; + return self; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + // XXX bound.length is never writable, so don't even try + // + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + }; +} + +// Shortcut to an often accessed properties, in order to avoid multiple +// dereference that costs universally. +// _Please note: Shortcuts are defined after `Function.prototype.bind` as we +// us it in defining shortcuts. +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); + +// If JS engine supports accessors creating shortcuts. +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} + +// +// Array +// ===== +// + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return toString(obj) == "[object Array]"; + }; +} + +// The IsCallable() check in the Array functions +// has been replaced with a strict check on the +// internal class of the object to trap cases where +// the provided function was actually a regular +// expression literal, which in V8 and +// JavaScriptCore is a typeof "function". Only in +// V8 are regular expression literals permitted as +// reduce parameters, so it is desirable in the +// general case for the shim to match the more +// strict and common behavior of rejecting regular +// expressions. + +// ES5 15.4.4.18 +// http://es5.github.com/#x15.4.4.18 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var self = toObject(this), + thisp = arguments[1], + i = 0, + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object context + fun.call(thisp, self[i], i, self); + } + i++; + } + }; +} + +// ES5 15.4.4.19 +// http://es5.github.com/#x15.4.4.19 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var self = toObject(this), + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, self); + } + return result; + }; +} + +// ES5 15.4.4.20 +// http://es5.github.com/#x15.4.4.20 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + result = [], + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + result.push(self[i]); + } + return result; + }; +} + +// ES5 15.4.4.16 +// http://es5.github.com/#x15.4.4.16 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, self)) + return false; + } + return true; + }; +} + +// ES5 15.4.4.17 +// http://es5.github.com/#x15.4.4.17 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + return true; + } + return false; + }; +} + +// ES5 15.4.4.21 +// http://es5.github.com/#x15.4.4.21 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value and an empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + + // if array contains no values, no initial value to return + if (++i >= length) + throw new TypeError(); // TODO message + } while (true); + } + + for (; i < length; i++) { + if (i in self) + result = fun.call(void 0, result, self[i], i, self); + } + + return result; + }; +} + +// ES5 15.4.4.22 +// http://es5.github.com/#x15.4.4.22 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value, empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + + // if array contains no values, no initial value to return + if (--i < 0) + throw new TypeError(); // TODO message + } while (true); + } + + do { + if (i in this) + result = fun.call(void 0, result, self[i], i, self); + } while (i--); + + return result; + }; +} + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + + var i = 0; + if (arguments.length > 1) + i = toInteger(arguments[1]); + + // handle negative indices + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} + +// ES5 15.4.4.15 +// http://es5.github.com/#x15.4.4.15 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf +if (!Array.prototype.lastIndexOf) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + var i = length - 1; + if (arguments.length > 1) + i = Math.min(i, toInteger(arguments[1])); + // handle negative indices + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) + return i; + } + return -1; + }; +} + +// +// Object +// ====== +// + +// ES5 15.2.3.2 +// http://es5.github.com/#x15.2.3.2 +if (!Object.getPrototypeOf) { + // https://github.com/kriskowal/es5-shim/issues#issue/2 + // http://ejohn.org/blog/objectgetprototypeof/ + // recommended by fschaefer on github + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} + +// ES5 15.2.3.3 +// http://es5.github.com/#x15.2.3.3 +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + // If object does not owns property return undefined immediately. + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + + // If object has a property then it's for sure both `enumerable` and + // `configurable`. + descriptor = { enumerable: true, configurable: true }; + + // If JS engine supports accessor properties then property may be a + // getter or setter. + if (supportsAccessors) { + // Unfortunately `__lookupGetter__` will return a getter even + // if object has own non getter property along with a same named + // inherited getter. To avoid misbehavior we temporary remove + // `__proto__` so that `__lookupGetter__` will return getter only + // if it's owned by an object. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + + // Once we have getter and setter we can put values back. + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + + // If it was accessor property we're done and return here + // in order to avoid adding `value` to the descriptor. + return descriptor; + } + } + + // If we got this far we know that object has an own property that is + // not an accessor so we set it as a value and return descriptor. + descriptor.value = object[property]; + return descriptor; + }; +} + +// ES5 15.2.3.4 +// http://es5.github.com/#x15.2.3.4 +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} + +// ES5 15.2.3.5 +// http://es5.github.com/#x15.2.3.5 +if (!Object.create) { + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = { "__proto__": null }; + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + // IE has no built-in implementation of `Object.getPrototypeOf` + // neither `__proto__`, but this manually setting `__proto__` will + // guarantee that `Object.getPrototypeOf` will work as expected with + // objects created using `Object.create` + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +// ES5 15.2.3.6 +// http://es5.github.com/#x15.2.3.6 + +// Patch for WebKit and IE8 standard mode +// Designed by hax +// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5 +// IE8 Reference: +// http://msdn.microsoft.com/en-us/library/dd282900.aspx +// http://msdn.microsoft.com/en-us/library/dd229916.aspx +// WebKit Bugs: +// https://bugs.webkit.org/show_bug.cgi?id=36423 + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + // returns falsy + } +} + +// check whether defineProperty works if it's given. Otherwise, +// shim partially. +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + + // make a valiant attempt to use the real defineProperty + // for I8's DOM elements. + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + // try the shim if the real one doesn't work + } + } + + // If it's a data property. + if (owns(descriptor, "value")) { + // fail silently if "writable", "enumerable", or "configurable" + // are requested but not supported + /* + // alternate approach: + if ( // can't implement these features; allow false but not true + !(owns(descriptor, "writable") ? descriptor.writable : true) || + !(owns(descriptor, "enumerable") ? descriptor.enumerable : true) || + !(owns(descriptor, "configurable") ? descriptor.configurable : true) + ) + throw new RangeError( + "This implementation of Object.defineProperty does not " + + "support configurable, enumerable, or writable." + ); + */ + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + // As accessors are supported only on engines implementing + // `__proto__` we can safely override `__proto__` while defining + // a property to make sure that we don't hit an inherited + // accessor. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + // Deleting a property anyway since getter / setter may be + // defined on object itself. + delete object[property]; + object[property] = descriptor.value; + // Setting original `__proto__` back now. + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + // If we got that far then getters and setters can be defined !! + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} + +// ES5 15.2.3.7 +// http://es5.github.com/#x15.2.3.7 +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} + +// ES5 15.2.3.8 +// http://es5.github.com/#x15.2.3.8 +if (!Object.seal) { + Object.seal = function seal(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.9 +// http://es5.github.com/#x15.2.3.9 +if (!Object.freeze) { + Object.freeze = function freeze(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// detect a Rhino bug and patch it +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} + +// ES5 15.2.3.10 +// http://es5.github.com/#x15.2.3.10 +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.11 +// http://es5.github.com/#x15.2.3.11 +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} + +// ES5 15.2.3.12 +// http://es5.github.com/#x15.2.3.12 +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} + +// ES5 15.2.3.13 +// http://es5.github.com/#x15.2.3.13 +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + // 1. If Type(O) is not Object throw a TypeError exception. + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + // 2. Return the Boolean value of the [[Extensible]] internal property of O. + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} + +// ES5 15.2.3.14 +// http://es5.github.com/#x15.2.3.14 +if (!Object.keys) { + // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) + hasDontEnumBug = false; + + Object.keys = function keys(object) { + + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError("Object.keys called on a non-object"); + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + + return keys; + }; + +} + +// +// Date +// ==== +// + +// ES5 15.9.5.43 +// http://es5.github.com/#x15.9.5.43 +// This function returns a String value represent the instance in time +// represented by this Date object. The format of the String is the Date Time +// string format defined in 15.9.1.15. All fields are present in the String. +// The time zone is always UTC, denoted by the suffix Z. If the time value of +// this object is not a finite Number a RangeError exception is thrown. +if (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) { + Date.prototype.toISOString = function toISOString() { + var result, length, value, year; + if (!isFinite(this)) + throw new RangeError; + + // the date time string format is specified in 15.9.1.15. + result = [this.getUTCMonth() + 1, this.getUTCDate(), + this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; + year = this.getUTCFullYear(); + year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6); + + length = result.length; + while (length--) { + value = result[length]; + // pad months, days, hours, minutes, and seconds to have two digits. + if (value < 10) + result[length] = "0" + value; + } + // pad milliseconds to have three digits. + return year + "-" + result.slice(0, 2).join("-") + "T" + result.slice(2).join(":") + "." + + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"; + } +} + +// ES5 15.9.4.4 +// http://es5.github.com/#x15.9.4.4 +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} + +// ES5 15.9.5.44 +// http://es5.github.com/#x15.9.5.44 +// This function provides a String representation of a Date object for use by +// JSON.stringify (15.12.3). +if (!Date.prototype.toJSON) { + Date.prototype.toJSON = function toJSON(key) { + // When the toJSON method is called with argument key, the following + // steps are taken: + + // 1. Let O be the result of calling ToObject, giving it the this + // value as its argument. + // 2. Let tv be ToPrimitive(O, hint Number). + // 3. If tv is a Number and is not finite, return null. + // XXX + // 4. Let toISO be the result of calling the [[Get]] internal method of + // O with argument "toISOString". + // 5. If IsCallable(toISO) is false, throw a TypeError exception. + if (typeof this.toISOString != "function") + throw new TypeError(); // TODO message + // 6. Return the result of calling the [[Call]] internal method of + // toISO with O as the this value and an empty argument list. + return this.toISOString(); + + // NOTE 1 The argument is ignored. + + // NOTE 2 The toJSON function is intentionally generic; it does not + // require that its this value be a Date object. Therefore, it can be + // transferred to other kinds of objects for use as a method. However, + // it does require that any such object have a toISOString method. An + // object is free to use the argument key to filter its + // stringification. + }; +} + +// ES5 15.9.4.2 +// http://es5.github.com/#x15.9.4.2 +// based on work shared by Daniel Friesen (dantman) +// http://gist.github.com/303249 +if (Date.parse("+275760-09-13T00:00:00.000Z") !== 8.64e15) { + // XXX global assignment won't work in embeddings that use + // an alternate object for the context. + Date = (function(NativeDate) { + + // Date.length === 7 + var Date = function Date(Y, M, D, h, m, s, ms) { + var length = arguments.length; + if (this instanceof NativeDate) { + var date = length == 1 && String(Y) === Y ? // isString(Y) + // We explicitly pass it through parse: + new NativeDate(Date.parse(Y)) : + // We have to manually make calls depending on argument + // length here + length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) : + length >= 6 ? new NativeDate(Y, M, D, h, m, s) : + length >= 5 ? new NativeDate(Y, M, D, h, m) : + length >= 4 ? new NativeDate(Y, M, D, h) : + length >= 3 ? new NativeDate(Y, M, D) : + length >= 2 ? new NativeDate(Y, M) : + length >= 1 ? new NativeDate(Y) : + new NativeDate(); + // Prevent mixups with unfixed Date object + date.constructor = Date; + return date; + } + return NativeDate.apply(this, arguments); + }; + + // 15.9.1.15 Date Time String Format. + var isoDateExpression = new RegExp("^" + + "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + 6-digit extended year + "(?:-(\\d{2})" + // optional month capture + "(?:-(\\d{2})" + // optional day capture + "(?:" + // capture hours:minutes:seconds.milliseconds + "T(\\d{2})" + // hours capture + ":(\\d{2})" + // minutes capture + "(?:" + // optional :seconds.milliseconds + ":(\\d{2})" + // seconds capture + "(?:\\.(\\d{3}))?" + // milliseconds capture + ")?" + + "(?:" + // capture UTC offset component + "Z|" + // UTC capture + "(?:" + // offset specifier +/-hours:minutes + "([-+])" + // sign capture + "(\\d{2})" + // hours offset capture + ":(\\d{2})" + // minutes offset capture + ")" + + ")?)?)?)?" + + "$"); + + // Copy any custom methods a 3rd party library may have added + for (var key in NativeDate) + Date[key] = NativeDate[key]; + + // Copy "native" methods explicitly; they may be non-enumerable + Date.now = NativeDate.now; + Date.UTC = NativeDate.UTC; + Date.prototype = NativeDate.prototype; + Date.prototype.constructor = Date; + + // Upgrade Date.parse to handle simplified ISO 8601 strings + Date.parse = function parse(string) { + var match = isoDateExpression.exec(string); + if (match) { + match.shift(); // kill match[0], the full match + // parse months, days, hours, minutes, seconds, and milliseconds + for (var i = 1; i < 7; i++) { + // provide default values if necessary + match[i] = +(match[i] || (i < 3 ? 1 : 0)); + // match[1] is the month. Months are 0-11 in JavaScript + // `Date` objects, but 1-12 in ISO notation, so we + // decrement. + if (i == 1) + match[i]--; + } + + // parse the UTC offset component + var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop(); + + // compute the explicit time zone offset if specified + var offset = 0; + if (sign) { + // detect invalid offsets and return early + if (hourOffset > 23 || minuteOffset > 59) + return NaN; + + // express the provided time zone offset in minutes. The offset is + // negative for time zones west of UTC; positive otherwise. + offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == "+" ? -1 : 1); + } + + // Date.UTC for years between 0 and 99 converts year to 1900 + year + // The Gregorian calendar has a 400-year cycle, so + // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...), + // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years + var year = +match[0]; + if (0 <= year && year <= 99) { + match[0] = year + 400; + return NativeDate.UTC.apply(this, match) + offset - 12622780800000; + } + + // compute a new UTC date value, accounting for the optional offset + return NativeDate.UTC.apply(this, match) + offset; + } + return NativeDate.parse.apply(this, arguments); + }; + + return Date; + })(Date); +} + +// +// String +// ====== +// + +// ES5 15.5.4.20 +// http://es5.github.com/#x15.5.4.20 +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + // http://blog.stevenlevithan.com/archives/faster-trim-javascript + // http://perfectionkills.com/whitespace-deviations/ + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer +var toInteger = function (n) { + n = +n; + if (n !== n) // isNaN + n = 0; + else if (n !== 0 && n !== (1/0) && n !== -(1/0)) + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + return n; +}; + +var prepareString = "a"[0] != "a", + // ES5 9.9 + // http://es5.github.com/#x9.9 + toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError(); // TODO message + } + // If the implementation doesn't support by-index access of + // string characters (ex. IE < 7), split the string + if (prepareString && typeof o == "string" && o) { + return o.split(""); + } + return Object(o); + }; +});/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * Irakli Gozalishvili (http://jeditoolkit.com) + * Mike de Boer + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry = this._eventRegistry || {}; + this._defaultHandlers = this._defaultHandlers || {}; + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + e = e || {}; + e.type = eventName; + + if (!e.stopPropagation) { + e.stopPropagation = function() { + this.propagationStopped = true; + }; + } + + if (!e.preventDefault) { + e.preventDefault = function() { + this.defaultPrevented = true; + }; + } + + for (var i=0; i + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.inherits = (function() { + var tempCtor = function() {}; + return function(ctor, superCtor) { + tempCtor.prototype = superCtor.prototype; + ctor.super_ = superCtor.prototype; + ctor.prototype = new tempCtor(); + ctor.prototype.constructor = ctor; + }; +}()); + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/mode/coffee_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/coffee/coffee-script'], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var coffee = require("../mode/coffee/coffee-script"); + +window.addEventListener = function() {}; + + +var Worker = exports.Worker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(200); +}; + +oop.inherits(Worker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + + try { + coffee.parse(value); + } catch(e) { + var m = e.message.match(/Parse error on line (\d+): (.*)/); + if (m) { + this.sender.emit("error", { + row: parseInt(m[1]) - 1, + column: null, + text: m[2], + type: "error" + }); + return; + } + + if (e instanceof SyntaxError) { + var m = e.message.match(/ on line (\d+)/); + if (m) { + this.sender.emit("error", { + row: parseInt(m[1]) - 1, + column: null, + text: e.message.replace(m[0], ""), + type: "error" + }); + } + } + return; + } + this.sender.emit("ok"); + }; + +}).call(Worker.prototype); + +});define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) { +"use strict"; + +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + doc.applyDeltas([e.data]); + deferredUpdate.schedule(_self.$timeout); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + // abstract method + }; + +}).call(Mirror.prototype); + +});/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(text) { + this.$lines = []; + + if (Array.isArray(text)) { + this.insertLines(0, text); + } + // There has to be one line at least in the document. If you pass an empty + // string to the insert function, nothing will happen. Workaround. + else if (text.length == 0) { + this.$lines = [""]; + } else { + this.insert({row: 0, column:0}, text); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setValue = function(text) { + var len = this.getLength(); + this.remove(new Range(0, 0, len, this.getLine(len-1).length)); + this.insert({row: 0, column:0}, text); + }; + + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + + // check for IE split bug + if ("aaa".split(/a/).length == 0) + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + } + else + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + if (match) { + this.$autoNewLine = match[1]; + } else { + this.$autoNewLine = "\n"; + } + }; + + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + + case "unix": + return "\n"; + + case "auto": + return this.$autoNewLine; + } + }; + + this.$autoNewLine = "\n"; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + }; + + this.getNewLineMode = function() { + return this.$newLineMode; + }; + + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + + /** + * Get a verbatim copy of the given line as it is in the document + */ + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + + /** + * Returns all lines in the document as string array. Warning: The caller + * should not modify this array! + */ + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + + this.getLength = function() { + return this.$lines.length; + }; + + this.getTextRange = function(range) { + if (range.start.row == range.end.row) { + return this.$lines[range.start.row].substring(range.start.column, + range.end.column); + } + else { + var lines = []; + lines.push(this.$lines[range.start.row].substring(range.start.column)); + lines.push.apply(lines, this.getLines(range.start.row+1, range.end.row-1)); + lines.push(this.$lines[range.end.row].substring(0, range.end.column)); + return lines.join(this.getNewLineCharacter()); + } + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length-1).length; + } + return position; + }; + + this.insert = function(position, text) { + if (text.length == 0) + return position; + + position = this.$clipPosition(position); + + if (this.getLength() <= 1) + this.$detectNewLine(text); + + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; + + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this.insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); + } + return position; + }; + + this.insertLines = function(row, lines) { + if (lines.length == 0) + return {row: row, column: 0}; + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return range.end; + }; + + this.insertNewLine = function(position) { + position = this.$clipPosition(position); + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column); + this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); + + var end = { + row : position.row + 1, + column : 0 + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.insertInLine = function(position, text) { + if (text.length == 0) + return position; + + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column) + text + + line.substring(position.column); + + var end = { + row : position.row, + column : position.column + text.length + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: text + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.remove = function(range) { + // clip to document + range.start = this.$clipPosition(range.start); + range.end = this.$clipPosition(range.end); + + if (range.isEmpty()) + return range.start; + + var firstRow = range.start.row; + var lastRow = range.end.row; + + if (range.isMultiLine()) { + var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; + var lastFullRow = lastRow - 1; + + if (range.end.column > 0) + this.removeInLine(lastRow, 0, range.end.column); + + if (lastFullRow >= firstFullRow) + this.removeLines(firstFullRow, lastFullRow); + + if (firstFullRow != firstRow) { + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); + this.removeNewLine(range.start.row); + } + } + else { + this.removeInLine(firstRow, range.start.column, range.end.column); + } + return range.start; + }; + + this.removeInLine = function(row, startColumn, endColumn) { + if (startColumn == endColumn) + return; + + var range = new Range(row, startColumn, row, endColumn); + var line = this.getLine(row); + var removed = line.substring(startColumn, endColumn); + var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); + this.$lines.splice(row, 1, newLine); + + var delta = { + action: "removeText", + range: range, + text: removed + }; + this._emit("change", { data: delta }); + return range.start; + }; + + /** + * Removes a range of full lines + * + * @param firstRow {Integer} The first row to be removed + * @param lastRow {Integer} The last row to be removed + * @return {String[]} The removed lines + */ + this.removeLines = function(firstRow, lastRow) { + var range = new Range(firstRow, 0, lastRow + 1, 0); + var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); + + var delta = { + action: "removeLines", + range: range, + nl: this.getNewLineCharacter(), + lines: removed + }; + this._emit("change", { data: delta }); + return removed; + }; + + this.removeNewLine = function(row) { + var firstLine = this.getLine(row); + var secondLine = this.getLine(row+1); + + var range = new Range(row, firstLine.length, row+1, 0); + var line = firstLine + secondLine; + + this.$lines.splice(row, 2, line); + + var delta = { + action: "removeText", + range: range, + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + }; + + this.replace = function(range, text) { + if (text.length == 0 && range.isEmpty()) + return range.start; + + // Shortcut: If the text we want to insert is the same as it is already + // in the document, we don't have to replace anything. + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + if (text) { + var end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + var delta = deltas[i]; + + var range = Range.fromPoints(delta.range.start, delta.range.end); + + if (delta.action == "insertLines") + this.removeLines(range.start.row, range.end.row - 1); + else if (delta.action == "insertText") + this.remove(range); + else if (delta.action == "removeLines") + this.insertLines(range.start.row, delta.lines); + else if (delta.action == "removeText") + this.insert(range.start, delta.text); + } + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEequal = function(range) { + return this.start.row == range.start.row && + this.end.row == range.end.row && + this.start.column == range.start.column && + this.end.column == range.end.column + }; + + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + + /** + * Compares this range (A) with another range (B), where B is the passed in + * range. + * + * Return values: + * -2: (B) is infront of (A) and doesn't intersect with (A) + * -1: (B) begins before (A) but ends inside of (A) + * 0: (B) is completly inside of (A) OR (A) is complety inside of (B) + * +1: (B) begins inside of (A) but ends outside of (A) + * +2: (B) is after (A) and doesn't intersect with (A) + * + * 42: FTW state: (B) ends in (A) but starts outside of (A) + */ + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + } + + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + } + + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + } + + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + } + + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + } + + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + } + + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + } + + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + }; + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + + /** + * Like .compare(), but if isStart is true, return -1; + */ + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + /** + * Like .compare(), but if isEnd is true, return 1; + */ + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + } + + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) { + var end = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row > lastRow) { + var start = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row < firstRow) { + var start = { + row: firstRow, + column: 0 + }; + } + + if (this.end.row < firstRow) { + var end = { + row: firstRow, + column: 0 + }; + } + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row == this.end.row && this.start.column == this.end.column); + }; + + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + + this.toScreenRange = function(session) { + var screenPosStart = + session.documentToScreenPosition(this.start); + var screenPosEnd = + session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + +}).call(Range.prototype); + + +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; + +exports.Range = Range; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +/** + * An Anchor is a floating pointer in the document. Whenever text is inserted or + * deleted before the cursor, the position of the cursor is updated + */ +var Anchor = exports.Anchor = function(doc, row, column) { + this.document = doc; + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + + this.$onChange = this.onChange.bind(this); + doc.on("change", this.$onChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + + this.getDocument = function() { + return this.document; + }; + + this.onChange = function(e) { + var delta = e.data; + var range = delta.range; + + if (range.start.row == range.end.row && range.start.row != this.row) + return; + + if (range.start.row > this.row) + return; + + if (range.start.row == this.row && range.start.column > this.column) + return; + + var row = this.row; + var column = this.column; + + if (delta.action === "insertText") { + if (range.start.row === row && range.start.column <= column) { + if (range.start.row === range.end.row) { + column += range.end.column - range.start.column; + } + else { + column -= range.start.column; + row += range.end.row - range.start.row; + } + } + else if (range.start.row !== range.end.row && range.start.row < row) { + row += range.end.row - range.start.row; + } + } else if (delta.action === "insertLines") { + if (range.start.row <= row) { + row += range.end.row - range.start.row; + } + } + else if (delta.action == "removeText") { + if (range.start.row == row && range.start.column < column) { + if (range.end.column >= column) + column = range.start.column; + else + column = Math.max(0, column - (range.end.column - range.start.column)); + + } else if (range.start.row !== range.end.row && range.start.row < row) { + if (range.end.row == row) { + column = Math.max(0, column - range.end.column) + range.start.column; + } + row -= (range.end.row - range.start.row); + } + else if (range.end.row == row) { + row -= range.end.row - range.start.row; + column = Math.max(0, column - range.end.column) + range.start.column; + } + } else if (delta.action == "removeLines") { + if (range.start.row <= row) { + if (range.end.row <= row) + row -= range.end.row - range.start.row; + else { + row = range.start.row; + column = 0; + } + } + } + + this.setPosition(row, column, true); + }; + + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._emit("change", { + old: old, + value: pos + }); + }; + + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + return new Array(count + 1).join(string); +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/mode/coffee/coffee-script', ['require', 'exports', 'module' , 'ace/mode/coffee/lexer', 'ace/mode/coffee/parser', 'ace/mode/coffee/nodes'], function(require, exports, module) { + + var Lexer = require("./lexer").Lexer; + var parser = require("./parser"); + + var lexer = new Lexer(); + parser.lexer = { + lex: function() { + var tag, _ref2; + _ref2 = this.tokens[this.pos++] || [''], tag = _ref2[0], this.yytext = _ref2[1], this.yylineno = _ref2[2]; + return tag; + }, + setInput: function(tokens) { + this.tokens = tokens; + return this.pos = 0; + }, + upcomingInput: function() { + return ""; + } + }; + parser.yy = require('./nodes'); + + exports.parse = function(code) { + return parser.parse(lexer.tokenize(code)); + }; +});/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/lexer', ['require', 'exports', 'module' , 'ace/mode/coffee/rewriter', 'ace/mode/coffee/helpers'], function(require, exports, module) { + + var ASSIGNED, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref; + var __indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) { + if (this[i] === item) return i; + } + return -1; + }; + Rewriter = require('./rewriter').Rewriter; + _ref = require('./helpers'), count = _ref.count, starts = _ref.starts, compact = _ref.compact, last = _ref.last; + exports.Lexer = Lexer = (function() { + function Lexer() {} + Lexer.prototype.tokenize = function(code, opts) { + var i; + if (opts == null) { + opts = {}; + } + if (WHITESPACE.test(code)) { + code = "\n" + code; + } + code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); + this.code = code; + this.line = opts.line || 0; + this.indent = 0; + this.indebt = 0; + this.outdebt = 0; + this.indents = []; + this.tokens = []; + i = 0; + while (this.chunk = code.slice(i)) { + i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); + } + this.closeIndentation(); + if (opts.rewrite === false) { + return this.tokens; + } + return (new Rewriter).rewrite(this.tokens); + }; + Lexer.prototype.identifierToken = function() { + var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3; + if (!(match = IDENTIFIER.exec(this.chunk))) { + return 0; + } + input = match[0], id = match[1], colon = match[2]; + if (id === 'own' && this.tag() === 'FOR') { + this.token('OWN', id); + return id.length; + } + forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref2 = prev[0]) === '.' || _ref2 === '?.' || _ref2 === '::') || !prev.spaced && prev[0] === '@'); + tag = 'IDENTIFIER'; + if (__indexOf.call(JS_KEYWORDS, id) >= 0 || !forcedIdentifier && __indexOf.call(COFFEE_KEYWORDS, id) >= 0) { + tag = id.toUpperCase(); + if (tag === 'WHEN' && (_ref3 = this.tag(), __indexOf.call(LINE_BREAK, _ref3) >= 0)) { + tag = 'LEADING_WHEN'; + } else if (tag === 'FOR') { + this.seenFor = true; + } else if (tag === 'UNLESS') { + tag = 'IF'; + } else if (__indexOf.call(UNARY, tag) >= 0) { + tag = 'UNARY'; + } else if (__indexOf.call(RELATION, tag) >= 0) { + if (tag !== 'INSTANCEOF' && this.seenFor) { + tag = 'FOR' + tag; + this.seenFor = false; + } else { + tag = 'RELATION'; + if (this.value() === '!') { + this.tokens.pop(); + id = '!' + id; + } + } + } + } + if (__indexOf.call(JS_FORBIDDEN, id) >= 0) { + if (forcedIdentifier) { + tag = 'IDENTIFIER'; + id = new String(id); + id.reserved = true; + } else if (__indexOf.call(RESERVED, id) >= 0) { + this.identifierError(id); + } + } + if (!forcedIdentifier) { + if (__indexOf.call(COFFEE_ALIASES, id) >= 0) { + id = COFFEE_ALIAS_MAP[id]; + } + tag = (function() { + switch (id) { + case '!': + return 'UNARY'; + case '==': + case '!=': + return 'COMPARE'; + case '&&': + case '||': + return 'LOGIC'; + case 'true': + case 'false': + case 'null': + case 'undefined': + return 'BOOL'; + case 'break': + case 'continue': + case 'debugger': + return 'STATEMENT'; + default: + return tag; + } + })(); + } + this.token(tag, id); + if (colon) { + this.token(':', ':'); + } + return input.length; + }; + Lexer.prototype.numberToken = function() { + var match, number; + if (!(match = NUMBER.exec(this.chunk))) { + return 0; + } + number = match[0]; + this.token('NUMBER', number); + return number.length; + }; + Lexer.prototype.stringToken = function() { + var match, string; + switch (this.chunk.charAt(0)) { + case "'": + if (!(match = SIMPLESTR.exec(this.chunk))) { + return 0; + } + this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n')); + break; + case '"': + if (!(string = this.balancedString(this.chunk, '"'))) { + return 0; + } + if (0 < string.indexOf('#{', 1)) { + this.interpolateString(string.slice(1, -1)); + } else { + this.token('STRING', this.escapeLines(string)); + } + break; + default: + return 0; + } + this.line += count(string, '\n'); + return string.length; + }; + Lexer.prototype.heredocToken = function() { + var doc, heredoc, match, quote; + if (!(match = HEREDOC.exec(this.chunk))) { + return 0; + } + heredoc = match[0]; + quote = heredoc.charAt(0); + doc = this.sanitizeHeredoc(match[2], { + quote: quote, + indent: null + }); + if (quote === '"' && 0 <= doc.indexOf('#{')) { + this.interpolateString(doc, { + heredoc: true + }); + } else { + this.token('STRING', this.makeString(doc, quote, true)); + } + this.line += count(heredoc, '\n'); + return heredoc.length; + }; + Lexer.prototype.commentToken = function() { + var comment, here, match; + if (!(match = this.chunk.match(COMMENT))) { + return 0; + } + comment = match[0], here = match[1]; + if (here) { + this.token('HERECOMMENT', this.sanitizeHeredoc(here, { + herecomment: true, + indent: Array(this.indent + 1).join(' ') + })); + this.token('TERMINATOR', '\n'); + } + this.line += count(comment, '\n'); + return comment.length; + }; + Lexer.prototype.jsToken = function() { + var match, script; + if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) { + return 0; + } + this.token('JS', (script = match[0]).slice(1, -1)); + return script.length; + }; + Lexer.prototype.regexToken = function() { + var match, prev, regex, _ref2; + if (this.chunk.charAt(0) !== '/') { + return 0; + } + if (match = HEREGEX.exec(this.chunk)) { + this.line += count(match[0], '\n'); + return this.heregexToken(match); + } + prev = last(this.tokens); + if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) { + return 0; + } + if (!(match = REGEX.exec(this.chunk))) { + return 0; + } + regex = match[0]; + this.token('REGEX', regex === '//' ? '/(?:)/' : regex); + return regex.length; + }; + Lexer.prototype.heregexToken = function(match) { + var body, flags, heregex, re, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4, _ref5; + heregex = match[0], body = match[1], flags = match[2]; + if (0 > body.indexOf('#{')) { + re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/'); + this.token('REGEX', "/" + (re || '(?:)') + "/" + flags); + return heregex.length; + } + this.token('IDENTIFIER', 'RegExp'); + this.tokens.push(['CALL_START', '(']); + tokens = []; + _ref2 = this.interpolateString(body, { + regex: true + }); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + _ref3 = _ref2[_i], tag = _ref3[0], value = _ref3[1]; + if (tag === 'TOKENS') { + tokens.push.apply(tokens, value); + } else { + if (!(value = value.replace(HEREGEX_OMIT, ''))) { + continue; + } + value = value.replace(/\\/g, '\\\\'); + tokens.push(['STRING', this.makeString(value, '"', true)]); + } + tokens.push(['+', '+']); + } + tokens.pop(); + if (((_ref4 = tokens[0]) != null ? _ref4[0] : void 0) !== 'STRING') { + this.tokens.push(['STRING', '""'], ['+', '+']); + } + (_ref5 = this.tokens).push.apply(_ref5, tokens); + if (flags) { + this.tokens.push([',', ','], ['STRING', '"' + flags + '"']); + } + this.token(')', ')'); + return heregex.length; + }; + Lexer.prototype.lineToken = function() { + var diff, indent, match, noNewlines, prev, size; + if (!(match = MULTI_DENT.exec(this.chunk))) { + return 0; + } + indent = match[0]; + this.line += count(indent, '\n'); + prev = last(this.tokens, 1); + size = indent.length - 1 - indent.lastIndexOf('\n'); + noNewlines = this.unfinished(); + if (size - this.indebt === this.indent) { + if (noNewlines) { + this.suppressNewlines(); + } else { + this.newlineToken(); + } + return indent.length; + } + if (size > this.indent) { + if (noNewlines) { + this.indebt = size - this.indent; + this.suppressNewlines(); + return indent.length; + } + diff = size - this.indent + this.outdebt; + this.token('INDENT', diff); + this.indents.push(diff); + this.outdebt = this.indebt = 0; + } else { + this.indebt = 0; + this.outdentToken(this.indent - size, noNewlines); + } + this.indent = size; + return indent.length; + }; + Lexer.prototype.outdentToken = function(moveOut, noNewlines, close) { + var dent, len; + while (moveOut > 0) { + len = this.indents.length - 1; + if (this.indents[len] === void 0) { + moveOut = 0; + } else if (this.indents[len] === this.outdebt) { + moveOut -= this.outdebt; + this.outdebt = 0; + } else if (this.indents[len] < this.outdebt) { + this.outdebt -= this.indents[len]; + moveOut -= this.indents[len]; + } else { + dent = this.indents.pop() - this.outdebt; + moveOut -= dent; + this.outdebt = 0; + this.token('OUTDENT', dent); + } + } + if (dent) { + this.outdebt -= moveOut; + } + if (!(this.tag() === 'TERMINATOR' || noNewlines)) { + this.token('TERMINATOR', '\n'); + } + return this; + }; + Lexer.prototype.whitespaceToken = function() { + var match, nline, prev; + if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { + return 0; + } + prev = last(this.tokens); + if (prev) { + prev[match ? 'spaced' : 'newLine'] = true; + } + if (match) { + return match[0].length; + } else { + return 0; + } + }; + Lexer.prototype.newlineToken = function() { + if (this.tag() !== 'TERMINATOR') { + this.token('TERMINATOR', '\n'); + } + return this; + }; + Lexer.prototype.suppressNewlines = function() { + if (this.value() === '\\') { + this.tokens.pop(); + } + return this; + }; + Lexer.prototype.literalToken = function() { + var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5; + if (match = OPERATOR.exec(this.chunk)) { + value = match[0]; + if (CODE.test(value)) { + this.tagParameters(); + } + } else { + value = this.chunk.charAt(0); + } + tag = value; + prev = last(this.tokens); + if (value === '=' && prev) { + if (!prev[1].reserved && (_ref2 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref2) >= 0)) { + this.assignmentError(); + } + if ((_ref3 = prev[1]) === '||' || _ref3 === '&&') { + prev[0] = 'COMPOUND_ASSIGN'; + prev[1] += '='; + return value.length; + } + } + if (value === ';') { + tag = 'TERMINATOR'; + } else if (__indexOf.call(MATH, value) >= 0) { + tag = 'MATH'; + } else if (__indexOf.call(COMPARE, value) >= 0) { + tag = 'COMPARE'; + } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) { + tag = 'COMPOUND_ASSIGN'; + } else if (__indexOf.call(UNARY, value) >= 0) { + tag = 'UNARY'; + } else if (__indexOf.call(SHIFT, value) >= 0) { + tag = 'SHIFT'; + } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) { + tag = 'LOGIC'; + } else if (prev && !prev.spaced) { + if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) { + if (prev[0] === '?') { + prev[0] = 'FUNC_EXIST'; + } + tag = 'CALL_START'; + } else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) { + tag = 'INDEX_START'; + switch (prev[0]) { + case '?': + prev[0] = 'INDEX_SOAK'; + break; + case '::': + prev[0] = 'INDEX_PROTO'; + } + } + } + this.token(tag, value); + return value.length; + }; + Lexer.prototype.sanitizeHeredoc = function(doc, options) { + var attempt, herecomment, indent, match, _ref2; + indent = options.indent, herecomment = options.herecomment; + if (herecomment) { + if (HEREDOC_ILLEGAL.test(doc)) { + throw new Error("block comment cannot contain \"*/\", starting on line " + (this.line + 1)); + } + if (doc.indexOf('\n') <= 0) { + return doc; + } + } else { + while (match = HEREDOC_INDENT.exec(doc)) { + attempt = match[1]; + if (indent === null || (0 < (_ref2 = attempt.length) && _ref2 < indent.length)) { + indent = attempt; + } + } + } + if (indent) { + doc = doc.replace(RegExp("\\n" + indent, "g"), '\n'); + } + if (!herecomment) { + doc = doc.replace(/^\n/, ''); + } + return doc; + }; + Lexer.prototype.tagParameters = function() { + var i, stack, tok, tokens; + if (this.tag() !== ')') { + return this; + } + stack = []; + tokens = this.tokens; + i = tokens.length; + tokens[--i][0] = 'PARAM_END'; + while (tok = tokens[--i]) { + switch (tok[0]) { + case ')': + stack.push(tok); + break; + case '(': + case 'CALL_START': + if (stack.length) { + stack.pop(); + } else if (tok[0] === '(') { + tok[0] = 'PARAM_START'; + return this; + } + } + } + return this; + }; + Lexer.prototype.closeIndentation = function() { + return this.outdentToken(this.indent); + }; + Lexer.prototype.identifierError = function(word) { + throw SyntaxError("Reserved word \"" + word + "\" on line " + (this.line + 1)); + }; + Lexer.prototype.assignmentError = function() { + throw SyntaxError("Reserved word \"" + (this.value()) + "\" on line " + (this.line + 1) + " can't be assigned"); + }; + Lexer.prototype.balancedString = function(str, end) { + var i, letter, prev, stack, _ref2; + stack = [end]; + for (i = 1, _ref2 = str.length; 1 <= _ref2 ? i < _ref2 : i > _ref2; 1 <= _ref2 ? i++ : i--) { + switch (letter = str.charAt(i)) { + case '\\': + i++; + continue; + case end: + stack.pop(); + if (!stack.length) { + return str.slice(0, i + 1); + } + end = stack[stack.length - 1]; + continue; + } + if (end === '}' && (letter === '"' || letter === "'")) { + stack.push(end = letter); + } else if (end === '}' && letter === '{') { + stack.push(end = '}'); + } else if (end === '"' && prev === '#' && letter === '{') { + stack.push(end = '}'); + } + prev = letter; + } + throw new Error("missing " + (stack.pop()) + ", starting on line " + (this.line + 1)); + }; + Lexer.prototype.interpolateString = function(str, options) { + var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _len, _ref2, _ref3, _ref4; + if (options == null) { + options = {}; + } + heredoc = options.heredoc, regex = options.regex; + tokens = []; + pi = 0; + i = -1; + while (letter = str.charAt(i += 1)) { + if (letter === '\\') { + i += 1; + continue; + } + if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) { + continue; + } + if (pi < i) { + tokens.push(['NEOSTRING', str.slice(pi, i)]); + } + inner = expr.slice(1, -1); + if (inner.length) { + nested = new Lexer().tokenize(inner, { + line: this.line, + rewrite: false + }); + nested.pop(); + if (((_ref2 = nested[0]) != null ? _ref2[0] : void 0) === 'TERMINATOR') { + nested.shift(); + } + if (len = nested.length) { + if (len > 1) { + nested.unshift(['(', '(']); + nested.push([')', ')']); + } + tokens.push(['TOKENS', nested]); + } + } + i += expr.length; + pi = i + 1; + } + if ((i > pi && pi < str.length)) { + tokens.push(['NEOSTRING', str.slice(pi)]); + } + if (regex) { + return tokens; + } + if (!tokens.length) { + return this.token('STRING', '""'); + } + if (tokens[0][0] !== 'NEOSTRING') { + tokens.unshift(['', '']); + } + if (interpolated = tokens.length > 1) { + this.token('(', '('); + } + for (i = 0, _len = tokens.length; i < _len; i++) { + _ref3 = tokens[i], tag = _ref3[0], value = _ref3[1]; + if (i) { + this.token('+', '+'); + } + if (tag === 'TOKENS') { + (_ref4 = this.tokens).push.apply(_ref4, value); + } else { + this.token('STRING', this.makeString(value, '"', heredoc)); + } + } + if (interpolated) { + this.token(')', ')'); + } + return tokens; + }; + Lexer.prototype.token = function(tag, value) { + return this.tokens.push([tag, value, this.line]); + }; + Lexer.prototype.tag = function(index, tag) { + var tok; + return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]); + }; + Lexer.prototype.value = function(index, val) { + var tok; + return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]); + }; + Lexer.prototype.unfinished = function() { + var prev, value; + return LINE_CONTINUER.test(this.chunk) || (prev = last(this.tokens, 1)) && prev[0] !== '.' && (value = this.value()) && !value.reserved && NO_NEWLINE.test(value) && !CODE.test(value) && !ASSIGNED.test(this.chunk); + }; + Lexer.prototype.escapeLines = function(str, heredoc) { + return str.replace(MULTILINER, heredoc ? '\\n' : ''); + }; + Lexer.prototype.makeString = function(body, quote, heredoc) { + if (!body) { + return quote + quote; + } + body = body.replace(/\\([\s\S])/g, function(match, contents) { + if (contents === '\n' || contents === quote) { + return contents; + } else { + return match; + } + }); + body = body.replace(RegExp("" + quote, "g"), '\\$&'); + return quote + this.escapeLines(body, heredoc) + quote; + }; + return Lexer; + })(); + JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super']; + COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; + COFFEE_ALIAS_MAP = { + and: '&&', + or: '||', + is: '==', + isnt: '!=', + not: '!', + yes: 'true', + no: 'false', + on: 'true', + off: 'false' + }; + COFFEE_ALIASES = (function() { + var _results; + _results = []; + for (key in COFFEE_ALIAS_MAP) { + _results.push(key); + } + return _results; + })(); + COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); + RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf']; + JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED); + exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS); + IDENTIFIER = /^([$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)([^\n\S]*:(?!:))?/; + NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?/i; + HEREDOC = /^("""|''')([\s\S]*?)(?:\n[^\n\S]*)?\1/; + OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/; + WHITESPACE = /^[^\n\S]+/; + COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/; + CODE = /^[-=]>/; + MULTI_DENT = /^(?:\n[^\n\S]*)+/; + SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/; + JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/; + REGEX = /^\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/[imgy]{0,4}(?!\w)/; + HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/; + HEREGEX_OMIT = /\s+(?:#.*)?/g; + MULTILINER = /\n/g; + HEREDOC_INDENT = /\n+([^\n\S]*)/g; + HEREDOC_ILLEGAL = /\*\//; + ASSIGNED = /^\s*@?([$A-Za-z_][$\w\x7f-\uffff]*|['"].*['"])[^\n\S]*?[:=][^:=>]/; + LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; + TRAILING_SPACES = /\s+$/; + NO_NEWLINE = /^(?:[-+*&|\/%=<>!.\\][<>=&|]*|and|or|is(?:nt)?|n(?:ot|ew)|delete|typeof|instanceof)$/; + COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; + UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']; + LOGIC = ['&&', '||', '&', '|', '^']; + SHIFT = ['<<', '>>', '>>>']; + COMPARE = ['==', '!=', '<', '>', '<=', '>=']; + MATH = ['*', '/', '%']; + RELATION = ['IN', 'OF', 'INSTANCEOF']; + BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED']; + NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']']; + NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING'); + CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']; + INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL'); + LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; +}); +/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/rewriter', ['require', 'exports', 'module' ], function(require, exports, module) { + + var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref; + var __indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) { + if (this[i] === item) return i; + } + return -1; + }, __slice = Array.prototype.slice; + exports.Rewriter = (function() { + function Rewriter() {} + Rewriter.prototype.rewrite = function(tokens) { + this.tokens = tokens; + this.removeLeadingNewlines(); + this.removeMidExpressionNewlines(); + this.closeOpenCalls(); + this.closeOpenIndexes(); + this.addImplicitIndentation(); + this.tagPostfixConditionals(); + this.addImplicitBraces(); + this.addImplicitParentheses(); + this.ensureBalance(BALANCED_PAIRS); + this.rewriteClosingParens(); + return this.tokens; + }; + Rewriter.prototype.scanTokens = function(block) { + var i, token, tokens; + tokens = this.tokens; + i = 0; + while (token = tokens[i]) { + i += block.call(this, token, i, tokens); + } + return true; + }; + Rewriter.prototype.detectEnd = function(i, condition, action) { + var levels, token, tokens, _ref, _ref2; + tokens = this.tokens; + levels = 0; + while (token = tokens[i]) { + if (levels === 0 && condition.call(this, token, i)) { + return action.call(this, token, i); + } + if (!token || levels < 0) { + return action.call(this, token, i - 1); + } + if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) { + levels += 1; + } else if (_ref2 = token[0], __indexOf.call(EXPRESSION_END, _ref2) >= 0) { + levels -= 1; + } + i += 1; + } + return i - 1; + }; + Rewriter.prototype.removeLeadingNewlines = function() { + var i, tag, _len, _ref; + _ref = this.tokens; + for (i = 0, _len = _ref.length; i < _len; i++) { + tag = _ref[i][0]; + if (tag !== 'TERMINATOR') { + break; + } + } + if (i) { + return this.tokens.splice(0, i); + } + }; + Rewriter.prototype.removeMidExpressionNewlines = function() { + return this.scanTokens(function(token, i, tokens) { + var _ref; + if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) { + return 1; + } + tokens.splice(i, 1); + return 0; + }); + }; + Rewriter.prototype.closeOpenCalls = function() { + var action, condition; + condition = function(token, i) { + var _ref; + return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; + }; + action = function(token, i) { + return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'CALL_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + Rewriter.prototype.closeOpenIndexes = function() { + var action, condition; + condition = function(token, i) { + var _ref; + return (_ref = token[0]) === ']' || _ref === 'INDEX_END'; + }; + action = function(token, i) { + return token[0] = 'INDEX_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'INDEX_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + Rewriter.prototype.addImplicitBraces = function() { + var action, condition, stack, start, startIndent; + stack = []; + start = null; + startIndent = 0; + condition = function(token, i) { + var one, tag, three, two, _ref, _ref2; + _ref = this.tokens.slice(i + 1, (i + 3 + 1) || 9e9), one = _ref[0], two = _ref[1], three = _ref[2]; + if ('HERECOMMENT' === (one != null ? one[0] : void 0)) { + return false; + } + tag = token[0]; + return ((tag === 'TERMINATOR' || tag === 'OUTDENT') && !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':')) || (tag === ',' && one && ((_ref2 = one[0]) !== 'IDENTIFIER' && _ref2 !== 'NUMBER' && _ref2 !== 'STRING' && _ref2 !== '@' && _ref2 !== 'TERMINATOR' && _ref2 !== 'OUTDENT')); + }; + action = function(token, i) { + var tok; + tok = ['}', '}', token[2]]; + tok.generated = true; + return this.tokens.splice(i, 0, tok); + }; + return this.scanTokens(function(token, i, tokens) { + var ago, idx, tag, tok, value, _ref, _ref2; + if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) { + stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]); + return 1; + } + if (__indexOf.call(EXPRESSION_END, tag) >= 0) { + start = stack.pop(); + return 1; + } + if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref2 = stack[stack.length - 1]) != null ? _ref2[0] : void 0) !== '{'))) { + return 1; + } + stack.push(['{']); + idx = ago === '@' ? i - 2 : i - 1; + while (this.tag(idx - 2) === 'HERECOMMENT') { + idx -= 2; + } + value = new String('{'); + value.generated = true; + tok = ['{', value, token[2]]; + tok.generated = true; + tokens.splice(idx, 0, tok); + this.detectEnd(i + 2, condition, action); + return 2; + }); + }; + Rewriter.prototype.addImplicitParentheses = function() { + var action, noCall; + noCall = false; + action = function(token, i) { + var idx; + idx = token[0] === 'OUTDENT' ? i + 1 : i; + return this.tokens.splice(idx, 0, ['CALL_END', ')', token[2]]); + }; + return this.scanTokens(function(token, i, tokens) { + var callObject, current, next, prev, seenControl, seenSingle, tag, _ref, _ref2, _ref3; + tag = token[0]; + if (tag === 'CLASS' || tag === 'IF') { + noCall = true; + } + _ref = tokens.slice(i - 1, (i + 1 + 1) || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2]; + callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0); + seenSingle = false; + seenControl = false; + if (__indexOf.call(LINEBREAKS, tag) >= 0) { + noCall = false; + } + if (prev && !prev.spaced && tag === '?') { + token.call = true; + } + if (token.fromThen) { + return 1; + } + if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref3 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref3) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) { + return 1; + } + tokens.splice(i, 0, ['CALL_START', '(', token[2]]); + this.detectEnd(i + 1, function(token, i) { + var post, _ref4; + tag = token[0]; + if (!seenSingle && token.fromThen) { + return true; + } + if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>') { + seenSingle = true; + } + if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY') { + seenControl = true; + } + if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') { + return true; + } + return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (this.tag(i - 2) !== 'CLASS' && (_ref4 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref4) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{'))); + }, action); + if (prev[0] === '?') { + prev[0] = 'FUNC_EXIST'; + } + return 2; + }); + }; + Rewriter.prototype.addImplicitIndentation = function() { + return this.scanTokens(function(token, i, tokens) { + var action, condition, indent, outdent, starter, tag, _ref, _ref2; + tag = token[0]; + if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') { + tokens.splice(i, 1); + return 0; + } + if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { + tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token)))); + return 2; + } + if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) { + tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token)))); + return 4; + } + if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { + starter = tag; + _ref2 = this.indentation(token), indent = _ref2[0], outdent = _ref2[1]; + if (starter === 'THEN') { + indent.fromThen = true; + } + indent.generated = outdent.generated = true; + tokens.splice(i + 1, 0, indent); + condition = function(token, i) { + var _ref3; + return token[1] !== ';' && (_ref3 = token[0], __indexOf.call(SINGLE_CLOSERS, _ref3) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN')); + }; + action = function(token, i) { + return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); + }; + this.detectEnd(i + 2, condition, action); + if (tag === 'THEN') { + tokens.splice(i, 1); + } + return 1; + } + return 1; + }); + }; + Rewriter.prototype.tagPostfixConditionals = function() { + var condition; + condition = function(token, i) { + var _ref; + return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT'; + }; + return this.scanTokens(function(token, i) { + var original; + if (token[0] !== 'IF') { + return 1; + } + original = token; + this.detectEnd(i + 1, condition, function(token, i) { + if (token[0] !== 'INDENT') { + return original[0] = 'POST_' + original[0]; + } + }); + return 1; + }); + }; + Rewriter.prototype.ensureBalance = function(pairs) { + var close, level, levels, open, openLine, tag, token, _i, _j, _len, _len2, _ref, _ref2; + levels = {}; + openLine = {}; + _ref = this.tokens; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + token = _ref[_i]; + tag = token[0]; + for (_j = 0, _len2 = pairs.length; _j < _len2; _j++) { + _ref2 = pairs[_j], open = _ref2[0], close = _ref2[1]; + levels[open] |= 0; + if (tag === open) { + if (levels[open]++ === 0) { + openLine[open] = token[2]; + } + } else if (tag === close && --levels[open] < 0) { + throw Error("too many " + token[1] + " on line " + (token[2] + 1)); + } + } + } + for (open in levels) { + level = levels[open]; + if (level > 0) { + throw Error("unclosed " + open + " on line " + (openLine[open] + 1)); + } + } + return this; + }; + Rewriter.prototype.rewriteClosingParens = function() { + var debt, key, stack; + stack = []; + debt = {}; + for (key in INVERSES) { + debt[key] = 0; + } + return this.scanTokens(function(token, i, tokens) { + var inv, match, mtag, oppos, tag, val, _ref; + if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) { + stack.push(token); + return 1; + } + if (__indexOf.call(EXPRESSION_END, tag) < 0) { + return 1; + } + if (debt[inv = INVERSES[tag]] > 0) { + debt[inv] -= 1; + tokens.splice(i, 1); + return 0; + } + match = stack.pop(); + mtag = match[0]; + oppos = INVERSES[mtag]; + if (tag === oppos) { + return 1; + } + debt[mtag] += 1; + val = [oppos, mtag === 'INDENT' ? match[1] : oppos]; + if (this.tag(i + 2) === mtag) { + tokens.splice(i + 3, 0, val); + stack.push(match); + } else { + tokens.splice(i, 0, val); + } + return 1; + }); + }; + Rewriter.prototype.indentation = function(token) { + return [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]]; + }; + Rewriter.prototype.tag = function(i) { + var _ref; + return (_ref = this.tokens[i]) != null ? _ref[0] : void 0; + }; + return Rewriter; + })(); + BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']]; + INVERSES = {}; + EXPRESSION_START = []; + EXPRESSION_END = []; + for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) { + _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1]; + EXPRESSION_START.push(INVERSES[rite] = left); + EXPRESSION_END.push(INVERSES[left] = rite); + } + EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); + IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; + IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++']; + IMPLICIT_UNSPACED_CALL = ['+', '-']; + IMPLICIT_BLOCK = ['->', '=>', '{', '[', ',']; + IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; + SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; + SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; + LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; +}); +/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/helpers', ['require', 'exports', 'module' ], function(require, exports, module) { + + var extend, flatten; + exports.starts = function(string, literal, start) { + return literal === string.substr(start, literal.length); + }; + exports.ends = function(string, literal, back) { + var len; + len = literal.length; + return literal === string.substr(string.length - len - (back || 0), len); + }; + exports.compact = function(array) { + var item, _i, _len, _results; + _results = []; + for (_i = 0, _len = array.length; _i < _len; _i++) { + item = array[_i]; + if (item) { + _results.push(item); + } + } + return _results; + }; + exports.count = function(string, substr) { + var num, pos; + num = pos = 0; + if (!substr.length) { + return 1 / 0; + } + while (pos = 1 + string.indexOf(substr, pos)) { + num++; + } + return num; + }; + exports.merge = function(options, overrides) { + return extend(extend({}, options), overrides); + }; + extend = exports.extend = function(object, properties) { + var key, val; + for (key in properties) { + val = properties[key]; + object[key] = val; + } + return object; + }; + exports.flatten = flatten = function(array) { + var element, flattened, _i, _len; + flattened = []; + for (_i = 0, _len = array.length; _i < _len; _i++) { + element = array[_i]; + if (element instanceof Array) { + flattened = flattened.concat(flatten(element)); + } else { + flattened.push(element); + } + } + return flattened; + }; + exports.del = function(obj, key) { + var val; + val = obj[key]; + delete obj[key]; + return val; + }; + exports.last = function(array, back) { + return array[array.length - (back || 0) - 1]; + }; +}); +/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/parser', ['require', 'exports', 'module' ], function(require, exports, module) { + +/* Jison generated parser */ +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Throw":11,"Comment":12,"STATEMENT":13,"Value":14,"Invocation":15,"Code":16,"Operation":17,"Assign":18,"If":19,"Try":20,"While":21,"For":22,"Switch":23,"Class":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"BOOL":35,"Assignable":36,"=":37,"AssignObj":38,"ObjAssignable":39,":":40,"ThisProperty":41,"RETURN":42,"HERECOMMENT":43,"PARAM_START":44,"ParamList":45,"PARAM_END":46,"FuncGlyph":47,"->":48,"=>":49,"OptComma":50,",":51,"Param":52,"ParamVar":53,"...":54,"Array":55,"Object":56,"Splat":57,"SimpleAssignable":58,"Accessor":59,"Parenthetical":60,"Range":61,"This":62,".":63,"?.":64,"::":65,"Index":66,"INDEX_START":67,"IndexValue":68,"INDEX_END":69,"INDEX_SOAK":70,"INDEX_PROTO":71,"Slice":72,"{":73,"AssignList":74,"}":75,"CLASS":76,"EXTENDS":77,"OptFuncExist":78,"Arguments":79,"SUPER":80,"FUNC_EXIST":81,"CALL_START":82,"CALL_END":83,"ArgList":84,"THIS":85,"@":86,"[":87,"]":88,"RangeDots":89,"..":90,"Arg":91,"SimpleArgs":92,"TRY":93,"Catch":94,"FINALLY":95,"CATCH":96,"THROW":97,"(":98,")":99,"WhileSource":100,"WHILE":101,"WHEN":102,"UNTIL":103,"Loop":104,"LOOP":105,"ForBody":106,"FOR":107,"ForStart":108,"ForSource":109,"ForVariables":110,"OWN":111,"ForValue":112,"FORIN":113,"FOROF":114,"BY":115,"SWITCH":116,"Whens":117,"ELSE":118,"When":119,"LEADING_WHEN":120,"IfBlock":121,"IF":122,"POST_IF":123,"UNARY":124,"-":125,"+":126,"--":127,"++":128,"?":129,"MATH":130,"SHIFT":131,"COMPARE":132,"LOGIC":133,"RELATION":134,"COMPOUND_ASSIGN":135,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"TERMINATOR",13:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"BOOL",37:"=",40:":",42:"RETURN",43:"HERECOMMENT",44:"PARAM_START",46:"PARAM_END",48:"->",49:"=>",51:",",54:"...",63:".",64:"?.",65:"::",67:"INDEX_START",69:"INDEX_END",70:"INDEX_SOAK",71:"INDEX_PROTO",73:"{",75:"}",76:"CLASS",77:"EXTENDS",80:"SUPER",81:"FUNC_EXIST",82:"CALL_START",83:"CALL_END",85:"THIS",86:"@",87:"[",88:"]",90:"..",93:"TRY",95:"FINALLY",96:"CATCH",97:"THROW",98:"(",99:")",101:"WHILE",102:"WHEN",103:"UNTIL",105:"LOOP",107:"FOR",111:"OWN",113:"FORIN",114:"FOROF",115:"BY",116:"SWITCH",118:"ELSE",120:"LEADING_WHEN",122:"IF",123:"POST_IF",124:"UNARY",125:"-",126:"+",127:"--",128:"++",129:"?",130:"MATH",131:"SHIFT",132:"COMPARE",133:"LOGIC",134:"RELATION",135:"COMPOUND_ASSIGN"}, +productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[18,3],[18,5],[38,1],[38,3],[38,5],[38,1],[39,1],[39,1],[39,1],[10,2],[10,1],[12,1],[16,5],[16,2],[47,1],[47,1],[50,0],[50,1],[45,0],[45,1],[45,3],[52,1],[52,2],[52,3],[53,1],[53,1],[53,1],[53,1],[57,2],[58,1],[58,2],[58,2],[58,1],[36,1],[36,1],[36,1],[14,1],[14,1],[14,1],[14,1],[14,1],[59,2],[59,2],[59,2],[59,1],[59,1],[66,3],[66,2],[66,2],[68,1],[68,1],[56,4],[74,0],[74,1],[74,3],[74,4],[74,6],[24,1],[24,2],[24,3],[24,4],[24,2],[24,3],[24,4],[24,5],[15,3],[15,3],[15,1],[15,2],[78,0],[78,1],[79,2],[79,4],[62,1],[62,1],[41,2],[55,2],[55,4],[89,1],[89,1],[61,5],[72,3],[72,2],[72,2],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[20,2],[20,3],[20,4],[20,5],[94,3],[11,2],[60,3],[60,5],[100,2],[100,4],[100,2],[100,4],[21,2],[21,2],[21,2],[21,1],[104,2],[104,2],[22,2],[22,2],[22,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[23,5],[23,7],[23,4],[23,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[19,1],[19,3],[19,3],[19,3],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,2],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,3],[17,5],[17,3]], +performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { + +var $0 = $$.length - 1; +switch (yystate) { +case 1:return this.$ = new yy.Block; +break; +case 2:return this.$ = $$[$0]; +break; +case 3:return this.$ = $$[$0-1]; +break; +case 4:this.$ = yy.Block.wrap([$$[$0]]); +break; +case 5:this.$ = $$[$0-2].push($$[$0]); +break; +case 6:this.$ = $$[$0-1]; +break; +case 7:this.$ = $$[$0]; +break; +case 8:this.$ = $$[$0]; +break; +case 9:this.$ = $$[$0]; +break; +case 10:this.$ = $$[$0]; +break; +case 11:this.$ = $$[$0]; +break; +case 12:this.$ = new yy.Literal($$[$0]); +break; +case 13:this.$ = $$[$0]; +break; +case 14:this.$ = $$[$0]; +break; +case 15:this.$ = $$[$0]; +break; +case 16:this.$ = $$[$0]; +break; +case 17:this.$ = $$[$0]; +break; +case 18:this.$ = $$[$0]; +break; +case 19:this.$ = $$[$0]; +break; +case 20:this.$ = $$[$0]; +break; +case 21:this.$ = $$[$0]; +break; +case 22:this.$ = $$[$0]; +break; +case 23:this.$ = $$[$0]; +break; +case 24:this.$ = new yy.Block; +break; +case 25:this.$ = $$[$0-1]; +break; +case 26:this.$ = new yy.Literal($$[$0]); +break; +case 27:this.$ = new yy.Literal($$[$0]); +break; +case 28:this.$ = new yy.Literal($$[$0]); +break; +case 29:this.$ = $$[$0]; +break; +case 30:this.$ = new yy.Literal($$[$0]); +break; +case 31:this.$ = new yy.Literal($$[$0]); +break; +case 32:this.$ = (function () { + var val; + val = new yy.Literal($$[$0]); + if ($$[$0] === 'undefined') { + val.isUndefined = true; + } + return val; + }()); +break; +case 33:this.$ = new yy.Assign($$[$0-2], $$[$0]); +break; +case 34:this.$ = new yy.Assign($$[$0-4], $$[$0-1]); +break; +case 35:this.$ = new yy.Value($$[$0]); +break; +case 36:this.$ = new yy.Assign(new yy.Value($$[$0-2]), $$[$0], 'object'); +break; +case 37:this.$ = new yy.Assign(new yy.Value($$[$0-4]), $$[$0-1], 'object'); +break; +case 38:this.$ = $$[$0]; +break; +case 39:this.$ = $$[$0]; +break; +case 40:this.$ = $$[$0]; +break; +case 41:this.$ = $$[$0]; +break; +case 42:this.$ = new yy.Return($$[$0]); +break; +case 43:this.$ = new yy.Return; +break; +case 44:this.$ = new yy.Comment($$[$0]); +break; +case 45:this.$ = new yy.Code($$[$0-3], $$[$0], $$[$0-1]); +break; +case 46:this.$ = new yy.Code([], $$[$0], $$[$0-1]); +break; +case 47:this.$ = 'func'; +break; +case 48:this.$ = 'boundfunc'; +break; +case 49:this.$ = $$[$0]; +break; +case 50:this.$ = $$[$0]; +break; +case 51:this.$ = []; +break; +case 52:this.$ = [$$[$0]]; +break; +case 53:this.$ = $$[$0-2].concat($$[$0]); +break; +case 54:this.$ = new yy.Param($$[$0]); +break; +case 55:this.$ = new yy.Param($$[$0-1], null, true); +break; +case 56:this.$ = new yy.Param($$[$0-2], $$[$0]); +break; +case 57:this.$ = $$[$0]; +break; +case 58:this.$ = $$[$0]; +break; +case 59:this.$ = $$[$0]; +break; +case 60:this.$ = $$[$0]; +break; +case 61:this.$ = new yy.Splat($$[$0-1]); +break; +case 62:this.$ = new yy.Value($$[$0]); +break; +case 63:this.$ = $$[$0-1].push($$[$0]); +break; +case 64:this.$ = new yy.Value($$[$0-1], [$$[$0]]); +break; +case 65:this.$ = $$[$0]; +break; +case 66:this.$ = $$[$0]; +break; +case 67:this.$ = new yy.Value($$[$0]); +break; +case 68:this.$ = new yy.Value($$[$0]); +break; +case 69:this.$ = $$[$0]; +break; +case 70:this.$ = new yy.Value($$[$0]); +break; +case 71:this.$ = new yy.Value($$[$0]); +break; +case 72:this.$ = new yy.Value($$[$0]); +break; +case 73:this.$ = $$[$0]; +break; +case 74:this.$ = new yy.Access($$[$0]); +break; +case 75:this.$ = new yy.Access($$[$0], 'soak'); +break; +case 76:this.$ = new yy.Access($$[$0], 'proto'); +break; +case 77:this.$ = new yy.Access(new yy.Literal('prototype')); +break; +case 78:this.$ = $$[$0]; +break; +case 79:this.$ = $$[$0-1]; +break; +case 80:this.$ = yy.extend($$[$0], { + soak: true + }); +break; +case 81:this.$ = yy.extend($$[$0], { + proto: true + }); +break; +case 82:this.$ = new yy.Index($$[$0]); +break; +case 83:this.$ = new yy.Slice($$[$0]); +break; +case 84:this.$ = new yy.Obj($$[$0-2], $$[$0-3].generated); +break; +case 85:this.$ = []; +break; +case 86:this.$ = [$$[$0]]; +break; +case 87:this.$ = $$[$0-2].concat($$[$0]); +break; +case 88:this.$ = $$[$0-3].concat($$[$0]); +break; +case 89:this.$ = $$[$0-5].concat($$[$0-2]); +break; +case 90:this.$ = new yy.Class; +break; +case 91:this.$ = new yy.Class(null, null, $$[$0]); +break; +case 92:this.$ = new yy.Class(null, $$[$0]); +break; +case 93:this.$ = new yy.Class(null, $$[$0-1], $$[$0]); +break; +case 94:this.$ = new yy.Class($$[$0]); +break; +case 95:this.$ = new yy.Class($$[$0-1], null, $$[$0]); +break; +case 96:this.$ = new yy.Class($$[$0-2], $$[$0]); +break; +case 97:this.$ = new yy.Class($$[$0-3], $$[$0-1], $$[$0]); +break; +case 98:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); +break; +case 99:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); +break; +case 100:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]); +break; +case 101:this.$ = new yy.Call('super', $$[$0]); +break; +case 102:this.$ = false; +break; +case 103:this.$ = true; +break; +case 104:this.$ = []; +break; +case 105:this.$ = $$[$0-2]; +break; +case 106:this.$ = new yy.Value(new yy.Literal('this')); +break; +case 107:this.$ = new yy.Value(new yy.Literal('this')); +break; +case 108:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Access($$[$0])], 'this'); +break; +case 109:this.$ = new yy.Arr([]); +break; +case 110:this.$ = new yy.Arr($$[$0-2]); +break; +case 111:this.$ = 'inclusive'; +break; +case 112:this.$ = 'exclusive'; +break; +case 113:this.$ = new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]); +break; +case 114:this.$ = new yy.Range($$[$0-2], $$[$0], $$[$0-1]); +break; +case 115:this.$ = new yy.Range($$[$0-1], null, $$[$0]); +break; +case 116:this.$ = new yy.Range(null, $$[$0], $$[$0-1]); +break; +case 117:this.$ = [$$[$0]]; +break; +case 118:this.$ = $$[$0-2].concat($$[$0]); +break; +case 119:this.$ = $$[$0-3].concat($$[$0]); +break; +case 120:this.$ = $$[$0-2]; +break; +case 121:this.$ = $$[$0-5].concat($$[$0-2]); +break; +case 122:this.$ = $$[$0]; +break; +case 123:this.$ = $$[$0]; +break; +case 124:this.$ = $$[$0]; +break; +case 125:this.$ = [].concat($$[$0-2], $$[$0]); +break; +case 126:this.$ = new yy.Try($$[$0]); +break; +case 127:this.$ = new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]); +break; +case 128:this.$ = new yy.Try($$[$0-2], null, null, $$[$0]); +break; +case 129:this.$ = new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]); +break; +case 130:this.$ = [$$[$0-1], $$[$0]]; +break; +case 131:this.$ = new yy.Throw($$[$0]); +break; +case 132:this.$ = new yy.Parens($$[$0-1]); +break; +case 133:this.$ = new yy.Parens($$[$0-2]); +break; +case 134:this.$ = new yy.While($$[$0]); +break; +case 135:this.$ = new yy.While($$[$0-2], { + guard: $$[$0] + }); +break; +case 136:this.$ = new yy.While($$[$0], { + invert: true + }); +break; +case 137:this.$ = new yy.While($$[$0-2], { + invert: true, + guard: $$[$0] + }); +break; +case 138:this.$ = $$[$0-1].addBody($$[$0]); +break; +case 139:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); +break; +case 140:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); +break; +case 141:this.$ = $$[$0]; +break; +case 142:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0]); +break; +case 143:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Block.wrap([$$[$0]])); +break; +case 144:this.$ = new yy.For($$[$0-1], $$[$0]); +break; +case 145:this.$ = new yy.For($$[$0-1], $$[$0]); +break; +case 146:this.$ = new yy.For($$[$0], $$[$0-1]); +break; +case 147:this.$ = { + source: new yy.Value($$[$0]) + }; +break; +case 148:this.$ = (function () { + $$[$0].own = $$[$0-1].own; + $$[$0].name = $$[$0-1][0]; + $$[$0].index = $$[$0-1][1]; + return $$[$0]; + }()); +break; +case 149:this.$ = $$[$0]; +break; +case 150:this.$ = (function () { + $$[$0].own = true; + return $$[$0]; + }()); +break; +case 151:this.$ = $$[$0]; +break; +case 152:this.$ = new yy.Value($$[$0]); +break; +case 153:this.$ = new yy.Value($$[$0]); +break; +case 154:this.$ = [$$[$0]]; +break; +case 155:this.$ = [$$[$0-2], $$[$0]]; +break; +case 156:this.$ = { + source: $$[$0] + }; +break; +case 157:this.$ = { + source: $$[$0], + object: true + }; +break; +case 158:this.$ = { + source: $$[$0-2], + guard: $$[$0] + }; +break; +case 159:this.$ = { + source: $$[$0-2], + guard: $$[$0], + object: true + }; +break; +case 160:this.$ = { + source: $$[$0-2], + step: $$[$0] + }; +break; +case 161:this.$ = { + source: $$[$0-4], + guard: $$[$0-2], + step: $$[$0] + }; +break; +case 162:this.$ = { + source: $$[$0-4], + step: $$[$0-2], + guard: $$[$0] + }; +break; +case 163:this.$ = new yy.Switch($$[$0-3], $$[$0-1]); +break; +case 164:this.$ = new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]); +break; +case 165:this.$ = new yy.Switch(null, $$[$0-1]); +break; +case 166:this.$ = new yy.Switch(null, $$[$0-3], $$[$0-1]); +break; +case 167:this.$ = $$[$0]; +break; +case 168:this.$ = $$[$0-1].concat($$[$0]); +break; +case 169:this.$ = [[$$[$0-1], $$[$0]]]; +break; +case 170:this.$ = [[$$[$0-2], $$[$0-1]]]; +break; +case 171:this.$ = new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + }); +break; +case 172:this.$ = $$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + })); +break; +case 173:this.$ = $$[$0]; +break; +case 174:this.$ = $$[$0-2].addElse($$[$0]); +break; +case 175:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { + type: $$[$0-1], + statement: true + }); +break; +case 176:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { + type: $$[$0-1], + statement: true + }); +break; +case 177:this.$ = new yy.Op($$[$0-1], $$[$0]); +break; +case 178:this.$ = new yy.Op('-', $$[$0]); +break; +case 179:this.$ = new yy.Op('+', $$[$0]); +break; +case 180:this.$ = new yy.Op('--', $$[$0]); +break; +case 181:this.$ = new yy.Op('++', $$[$0]); +break; +case 182:this.$ = new yy.Op('--', $$[$0-1], null, true); +break; +case 183:this.$ = new yy.Op('++', $$[$0-1], null, true); +break; +case 184:this.$ = new yy.Existence($$[$0-1]); +break; +case 185:this.$ = new yy.Op('+', $$[$0-2], $$[$0]); +break; +case 186:this.$ = new yy.Op('-', $$[$0-2], $$[$0]); +break; +case 187:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); +break; +case 188:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); +break; +case 189:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); +break; +case 190:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); +break; +case 191:this.$ = (function () { + if ($$[$0-1].charAt(0) === '!') { + return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); + } else { + return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); + } + }()); +break; +case 192:this.$ = new yy.Assign($$[$0-2], $$[$0], $$[$0-1]); +break; +case 193:this.$ = new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]); +break; +case 194:this.$ = new yy.Extends($$[$0-2], $$[$0]); +break; +} +}, +table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,5],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,71]},{6:[1,72]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:74,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[1,73],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:87,101:[1,62],103:[1,63],106:88,107:[1,65],108:66,123:[1,86]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],46:[2,13],51:[2,13],54:[2,13],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,13],70:[1,97],71:[1,98],75:[2,13],78:89,81:[1,91],82:[2,102],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],46:[2,14],51:[2,14],54:[2,14],59:100,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,14],70:[1,97],71:[1,98],75:[2,14],78:99,81:[1,91],82:[2,102],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],46:[2,15],51:[2,15],54:[2,15],69:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],46:[2,16],51:[2,16],54:[2,16],69:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],46:[2,17],51:[2,17],54:[2,17],69:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],46:[2,18],51:[2,18],54:[2,18],69:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],46:[2,19],51:[2,19],54:[2,19],69:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],46:[2,20],51:[2,20],54:[2,20],69:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],46:[2,21],51:[2,21],54:[2,21],69:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],46:[2,22],51:[2,22],54:[2,22],69:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],46:[2,23],51:[2,23],54:[2,23],69:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,12],6:[2,12],26:[2,12],99:[2,12],101:[2,12],103:[2,12],107:[2,12],123:[2,12]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],37:[1,101],46:[2,69],51:[2,69],54:[2,69],63:[2,69],64:[2,69],65:[2,69],67:[2,69],69:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],46:[2,70],51:[2,70],54:[2,70],63:[2,70],64:[2,70],65:[2,70],67:[2,70],69:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],46:[2,71],51:[2,71],54:[2,71],63:[2,71],64:[2,71],65:[2,71],67:[2,71],69:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],46:[2,72],51:[2,72],54:[2,72],63:[2,72],64:[2,72],65:[2,72],67:[2,72],69:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],46:[2,73],51:[2,73],54:[2,73],63:[2,73],64:[2,73],65:[2,73],67:[2,73],69:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],46:[2,100],51:[2,100],54:[2,100],63:[2,100],64:[2,100],65:[2,100],67:[2,100],69:[2,100],70:[2,100],71:[2,100],75:[2,100],79:102,81:[2,100],82:[1,103],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{27:107,28:[1,70],41:108,45:104,46:[2,51],51:[2,51],52:105,53:106,55:109,56:110,73:[1,67],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{14:119,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:118,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{14:119,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:122,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],37:[2,66],46:[2,66],51:[2,66],54:[2,66],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[1,126],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[1,123],128:[1,124],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[1,125]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],46:[2,173],51:[2,173],54:[2,173],69:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[1,127],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],46:[2,141],51:[2,141],54:[2,141],69:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{5:130,25:[1,5]},{8:131,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,132],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,90],5:133,6:[2,90],14:119,15:120,25:[1,5],26:[2,90],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,46:[2,90],51:[2,90],54:[2,90],55:47,56:48,58:135,60:25,61:26,62:27,69:[2,90],73:[1,67],75:[2,90],77:[1,134],80:[1,28],83:[2,90],85:[1,55],86:[1,56],87:[1,54],88:[2,90],90:[2,90],98:[1,53],99:[2,90],101:[2,90],102:[2,90],103:[2,90],107:[2,90],115:[2,90],123:[2,90],125:[2,90],126:[2,90],129:[2,90],130:[2,90],131:[2,90],132:[2,90],133:[2,90],134:[2,90]},{1:[2,43],6:[2,43],8:136,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[2,43],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],99:[2,43],100:39,101:[2,43],103:[2,43],104:40,105:[1,64],106:41,107:[2,43],108:66,116:[1,42],121:37,122:[1,61],123:[2,43],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:137,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,44],6:[2,44],25:[2,44],26:[2,44],51:[2,44],75:[2,44],99:[2,44],101:[2,44],103:[2,44],107:[2,44],123:[2,44]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],37:[2,67],46:[2,67],51:[2,67],54:[2,67],63:[2,67],64:[2,67],65:[2,67],67:[2,67],69:[2,67],70:[2,67],71:[2,67],75:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],37:[2,68],46:[2,68],51:[2,68],54:[2,68],63:[2,68],64:[2,68],65:[2,68],67:[2,68],69:[2,68],70:[2,68],71:[2,68],75:[2,68],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],46:[2,29],51:[2,29],54:[2,29],63:[2,29],64:[2,29],65:[2,29],67:[2,29],69:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],46:[2,30],51:[2,30],54:[2,30],63:[2,30],64:[2,30],65:[2,30],67:[2,30],69:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],46:[2,31],51:[2,31],54:[2,31],63:[2,31],64:[2,31],65:[2,31],67:[2,31],69:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],46:[2,32],51:[2,32],54:[2,32],63:[2,32],64:[2,32],65:[2,32],67:[2,32],69:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{4:138,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,139],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:142,85:[1,55],86:[1,56],87:[1,54],88:[1,141],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],46:[2,106],51:[2,106],54:[2,106],63:[2,106],64:[2,106],65:[2,106],67:[2,106],69:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],27:146,28:[1,70],46:[2,107],51:[2,107],54:[2,107],63:[2,107],64:[2,107],65:[2,107],67:[2,107],69:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{25:[2,47]},{25:[2,48]},{1:[2,62],6:[2,62],25:[2,62],26:[2,62],37:[2,62],46:[2,62],51:[2,62],54:[2,62],63:[2,62],64:[2,62],65:[2,62],67:[2,62],69:[2,62],70:[2,62],71:[2,62],75:[2,62],77:[2,62],81:[2,62],82:[2,62],83:[2,62],88:[2,62],90:[2,62],99:[2,62],101:[2,62],102:[2,62],103:[2,62],107:[2,62],115:[2,62],123:[2,62],125:[2,62],126:[2,62],127:[2,62],128:[2,62],129:[2,62],130:[2,62],131:[2,62],132:[2,62],133:[2,62],134:[2,62],135:[2,62]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],37:[2,65],46:[2,65],51:[2,65],54:[2,65],63:[2,65],64:[2,65],65:[2,65],67:[2,65],69:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{8:147,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,5],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,70],55:157,56:158,61:152,73:[1,67],87:[1,54],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,85],12:165,25:[2,85],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:163,39:164,41:168,43:[1,46],51:[2,85],74:162,75:[2,85],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],40:[2,27],46:[2,27],51:[2,27],54:[2,27],63:[2,27],64:[2,27],65:[2,27],67:[2,27],69:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],40:[2,28],46:[2,28],51:[2,28],54:[2,28],63:[2,28],64:[2,28],65:[2,28],67:[2,28],69:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],37:[2,26],40:[2,26],46:[2,26],51:[2,26],54:[2,26],63:[2,26],64:[2,26],65:[2,26],67:[2,26],69:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,26:[2,6],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],99:[2,6],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],46:[2,24],51:[2,24],54:[2,24],69:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,71],26:[1,170]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],46:[2,184],51:[2,184],54:[2,184],69:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{8:171,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],46:[2,140],51:[2,140],54:[2,140],69:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],46:[2,145],51:[2,145],54:[2,145],69:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],101:[2,145],102:[2,145],103:[2,145],107:[2,145],115:[2,145],123:[2,145],125:[2,145],126:[2,145],129:[2,145],130:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145]},{8:179,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],46:[2,139],51:[2,139],54:[2,139],69:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],101:[2,139],102:[2,139],103:[2,139],107:[2,139],115:[2,139],123:[2,139],125:[2,139],126:[2,139],129:[2,139],130:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],46:[2,144],51:[2,144],54:[2,144],69:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],101:[2,144],102:[2,144],103:[2,144],107:[2,144],115:[2,144],123:[2,144],125:[2,144],126:[2,144],129:[2,144],130:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144]},{79:180,82:[1,103]},{1:[2,63],6:[2,63],25:[2,63],26:[2,63],37:[2,63],46:[2,63],51:[2,63],54:[2,63],63:[2,63],64:[2,63],65:[2,63],67:[2,63],69:[2,63],70:[2,63],71:[2,63],75:[2,63],77:[2,63],81:[2,63],82:[2,63],83:[2,63],88:[2,63],90:[2,63],99:[2,63],101:[2,63],102:[2,63],103:[2,63],107:[2,63],115:[2,63],123:[2,63],125:[2,63],126:[2,63],127:[2,63],128:[2,63],129:[2,63],130:[2,63],131:[2,63],132:[2,63],133:[2,63],134:[2,63],135:[2,63]},{82:[2,103]},{27:181,28:[1,70]},{27:182,28:[1,70]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],27:183,28:[1,70],37:[2,77],46:[2,77],51:[2,77],54:[2,77],63:[2,77],64:[2,77],65:[2,77],67:[2,77],69:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],37:[2,78],46:[2,78],51:[2,78],54:[2,78],63:[2,78],64:[2,78],65:[2,78],67:[2,78],69:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{8:185,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],54:[1,189],55:47,56:48,58:36,60:25,61:26,62:27,68:184,72:186,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],89:187,90:[1,188],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{66:190,67:[1,96],70:[1,97],71:[1,98]},{66:191,67:[1,96],70:[1,97],71:[1,98]},{79:192,82:[1,103]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],37:[2,64],46:[2,64],51:[2,64],54:[2,64],63:[2,64],64:[2,64],65:[2,64],67:[2,64],69:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{8:193,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,194],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],46:[2,101],51:[2,101],54:[2,101],63:[2,101],64:[2,101],65:[2,101],67:[2,101],69:[2,101],70:[2,101],71:[2,101],75:[2,101],81:[2,101],82:[2,101],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{46:[1,198],51:[1,199]},{46:[2,52],51:[2,52]},{37:[1,201],46:[2,54],51:[2,54],54:[1,200]},{37:[2,57],46:[2,57],51:[2,57],54:[2,57]},{37:[2,58],46:[2,58],51:[2,58],54:[2,58]},{37:[2,59],46:[2,59],51:[2,59],54:[2,59]},{37:[2,60],46:[2,60],51:[2,60],54:[2,60]},{27:146,28:[1,70]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:142,85:[1,55],86:[1,56],87:[1,54],88:[1,141],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],46:[2,46],51:[2,46],54:[2,46],69:[2,46],75:[2,46],83:[2,46],88:[2,46],90:[2,46],99:[2,46],101:[2,46],102:[2,46],103:[2,46],107:[2,46],115:[2,46],123:[2,46],125:[2,46],126:[2,46],129:[2,46],130:[2,46],131:[2,46],132:[2,46],133:[2,46],134:[2,46]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],46:[2,177],51:[2,177],54:[2,177],69:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:84,101:[2,177],102:[2,177],103:[2,177],106:85,107:[2,177],108:66,115:[2,177],123:[2,177],125:[2,177],126:[2,177],129:[1,75],130:[2,177],131:[2,177],132:[2,177],133:[2,177],134:[2,177]},{100:87,101:[1,62],103:[1,63],106:88,107:[1,65],108:66,123:[1,86]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],46:[2,178],51:[2,178],54:[2,178],69:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:84,101:[2,178],102:[2,178],103:[2,178],106:85,107:[2,178],108:66,115:[2,178],123:[2,178],125:[2,178],126:[2,178],129:[1,75],130:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],46:[2,179],51:[2,179],54:[2,179],69:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:84,101:[2,179],102:[2,179],103:[2,179],106:85,107:[2,179],108:66,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,75],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],46:[2,180],51:[2,180],54:[2,180],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,180],70:[2,66],71:[2,66],75:[2,180],81:[2,66],82:[2,66],83:[2,180],88:[2,180],90:[2,180],99:[2,180],101:[2,180],102:[2,180],103:[2,180],107:[2,180],115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[2,180],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],70:[1,97],71:[1,98],78:89,81:[1,91],82:[2,102]},{59:100,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],70:[1,97],71:[1,98],78:99,81:[1,91],82:[2,102]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],46:[2,69],51:[2,69],54:[2,69],63:[2,69],64:[2,69],65:[2,69],67:[2,69],69:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],46:[2,181],51:[2,181],54:[2,181],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,181],70:[2,66],71:[2,66],75:[2,181],81:[2,66],82:[2,66],83:[2,181],88:[2,181],90:[2,181],99:[2,181],101:[2,181],102:[2,181],103:[2,181],107:[2,181],115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[2,181],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],46:[2,182],51:[2,182],54:[2,182],69:[2,182],75:[2,182],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],46:[2,183],51:[2,183],54:[2,183],69:[2,183],75:[2,183],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{8:202,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,203],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,126],6:[2,126],25:[2,126],26:[2,126],46:[2,126],51:[2,126],54:[2,126],69:[2,126],75:[2,126],83:[2,126],88:[2,126],90:[2,126],94:207,95:[1,208],96:[1,209],99:[2,126],101:[2,126],102:[2,126],103:[2,126],107:[2,126],115:[2,126],123:[2,126],125:[2,126],126:[2,126],129:[2,126],130:[2,126],131:[2,126],132:[2,126],133:[2,126],134:[2,126]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],46:[2,138],51:[2,138],54:[2,138],69:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],101:[2,138],102:[2,138],103:[2,138],107:[2,138],115:[2,138],123:[2,138],125:[2,138],126:[2,138],129:[2,138],130:[2,138],131:[2,138],132:[2,138],133:[2,138],134:[2,138]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],46:[2,146],51:[2,146],54:[2,146],69:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{25:[1,210],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{117:211,119:212,120:[1,213]},{1:[2,91],6:[2,91],25:[2,91],26:[2,91],46:[2,91],51:[2,91],54:[2,91],69:[2,91],75:[2,91],83:[2,91],88:[2,91],90:[2,91],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{14:214,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:215,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,94],5:216,6:[2,94],25:[1,5],26:[2,94],46:[2,94],51:[2,94],54:[2,94],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,94],70:[2,66],71:[2,66],75:[2,94],77:[1,217],81:[2,66],82:[2,66],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,42],6:[2,42],26:[2,42],99:[2,42],100:84,101:[2,42],103:[2,42],106:85,107:[2,42],108:66,123:[2,42],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,131],6:[2,131],26:[2,131],99:[2,131],100:84,101:[2,131],103:[2,131],106:85,107:[2,131],108:66,123:[2,131],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,71],99:[1,218]},{4:219,7:4,8:6,9:7,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,122],25:[2,122],51:[2,122],54:[1,221],88:[2,122],89:220,90:[1,188],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],37:[2,109],46:[2,109],51:[2,109],54:[2,109],63:[2,109],64:[2,109],65:[2,109],67:[2,109],69:[2,109],70:[2,109],71:[2,109],75:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],113:[2,109],114:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109]},{6:[2,49],25:[2,49],50:222,51:[1,223],88:[2,49]},{6:[2,117],25:[2,117],26:[2,117],51:[2,117],83:[2,117],88:[2,117]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:224,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,123],25:[2,123],26:[2,123],51:[2,123],83:[2,123],88:[2,123]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],37:[2,108],40:[2,108],46:[2,108],51:[2,108],54:[2,108],63:[2,108],64:[2,108],65:[2,108],67:[2,108],69:[2,108],70:[2,108],71:[2,108],75:[2,108],77:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],127:[2,108],128:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108],135:[2,108]},{5:225,25:[1,5],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],46:[2,134],51:[2,134],54:[2,134],69:[2,134],75:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],100:84,101:[1,62],102:[1,226],103:[1,63],106:85,107:[1,65],108:66,115:[2,134],123:[2,134],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],46:[2,136],51:[2,136],54:[2,136],69:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:84,101:[1,62],102:[1,227],103:[1,63],106:85,107:[1,65],108:66,115:[2,136],123:[2,136],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],46:[2,142],51:[2,142],54:[2,142],69:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],46:[2,143],51:[2,143],54:[2,143],69:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],100:84,101:[1,62],102:[2,143],103:[1,63],106:85,107:[1,65],108:66,115:[2,143],123:[2,143],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],46:[2,147],51:[2,147],54:[2,147],69:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{113:[2,149],114:[2,149]},{27:156,28:[1,70],55:157,56:158,73:[1,67],87:[1,112],110:228,112:155},{51:[1,229],113:[2,154],114:[2,154]},{51:[2,151],113:[2,151],114:[2,151]},{51:[2,152],113:[2,152],114:[2,152]},{51:[2,153],113:[2,153],114:[2,153]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],46:[2,148],51:[2,148],54:[2,148],69:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{8:230,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:231,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,49],25:[2,49],50:232,51:[1,233],75:[2,49]},{6:[2,86],25:[2,86],26:[2,86],51:[2,86],75:[2,86]},{6:[2,35],25:[2,35],26:[2,35],40:[1,234],51:[2,35],75:[2,35]},{6:[2,38],25:[2,38],26:[2,38],51:[2,38],75:[2,38]},{6:[2,39],25:[2,39],26:[2,39],40:[2,39],51:[2,39],75:[2,39]},{6:[2,40],25:[2,40],26:[2,40],40:[2,40],51:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],40:[2,41],51:[2,41],75:[2,41]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],46:[2,25],51:[2,25],54:[2,25],69:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],46:[2,185],51:[2,185],54:[2,185],69:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],100:84,101:[2,185],102:[2,185],103:[2,185],106:85,107:[2,185],108:66,115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[1,75],130:[1,78],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],46:[2,186],51:[2,186],54:[2,186],69:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],100:84,101:[2,186],102:[2,186],103:[2,186],106:85,107:[2,186],108:66,115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[1,75],130:[1,78],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],46:[2,187],51:[2,187],54:[2,187],69:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:84,101:[2,187],102:[2,187],103:[2,187],106:85,107:[2,187],108:66,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,75],130:[2,187],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],46:[2,188],51:[2,188],54:[2,188],69:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:84,101:[2,188],102:[2,188],103:[2,188],106:85,107:[2,188],108:66,115:[2,188],123:[2,188],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],46:[2,189],51:[2,189],54:[2,189],69:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:84,101:[2,189],102:[2,189],103:[2,189],106:85,107:[2,189],108:66,115:[2,189],123:[2,189],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[2,189],133:[2,189],134:[1,82]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],46:[2,190],51:[2,190],54:[2,190],69:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:84,101:[2,190],102:[2,190],103:[2,190],106:85,107:[2,190],108:66,115:[2,190],123:[2,190],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[2,190],134:[1,82]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],46:[2,191],51:[2,191],54:[2,191],69:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:84,101:[2,191],102:[2,191],103:[2,191],106:85,107:[2,191],108:66,115:[2,191],123:[2,191],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[2,191],133:[2,191],134:[2,191]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],46:[2,176],51:[2,176],54:[2,176],69:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],100:84,101:[1,62],102:[2,176],103:[1,63],106:85,107:[1,65],108:66,115:[2,176],123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],46:[2,175],51:[2,175],54:[2,175],69:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],100:84,101:[1,62],102:[2,175],103:[1,63],106:85,107:[1,65],108:66,115:[2,175],123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],46:[2,98],51:[2,98],54:[2,98],63:[2,98],64:[2,98],65:[2,98],67:[2,98],69:[2,98],70:[2,98],71:[2,98],75:[2,98],81:[2,98],82:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],37:[2,74],46:[2,74],51:[2,74],54:[2,74],63:[2,74],64:[2,74],65:[2,74],67:[2,74],69:[2,74],70:[2,74],71:[2,74],75:[2,74],77:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],127:[2,74],128:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],37:[2,75],46:[2,75],51:[2,75],54:[2,75],63:[2,75],64:[2,75],65:[2,75],67:[2,75],69:[2,75],70:[2,75],71:[2,75],75:[2,75],77:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],127:[2,75],128:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],37:[2,76],46:[2,76],51:[2,76],54:[2,76],63:[2,76],64:[2,76],65:[2,76],67:[2,76],69:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{69:[1,235]},{54:[1,189],69:[2,82],89:236,90:[1,188],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{69:[2,83]},{8:237,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:[2,111],28:[2,111],30:[2,111],31:[2,111],33:[2,111],34:[2,111],35:[2,111],42:[2,111],43:[2,111],44:[2,111],48:[2,111],49:[2,111],69:[2,111],73:[2,111],76:[2,111],80:[2,111],85:[2,111],86:[2,111],87:[2,111],93:[2,111],97:[2,111],98:[2,111],101:[2,111],103:[2,111],105:[2,111],107:[2,111],116:[2,111],122:[2,111],124:[2,111],125:[2,111],126:[2,111],127:[2,111],128:[2,111]},{13:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],42:[2,112],43:[2,112],44:[2,112],48:[2,112],49:[2,112],69:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],37:[2,80],46:[2,80],51:[2,80],54:[2,80],63:[2,80],64:[2,80],65:[2,80],67:[2,80],69:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],37:[2,81],46:[2,81],51:[2,81],54:[2,81],63:[2,81],64:[2,81],65:[2,81],67:[2,81],69:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],46:[2,99],51:[2,99],54:[2,99],63:[2,99],64:[2,99],65:[2,99],67:[2,99],69:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],46:[2,33],51:[2,33],54:[2,33],69:[2,33],75:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],100:84,101:[2,33],102:[2,33],103:[2,33],106:85,107:[2,33],108:66,115:[2,33],123:[2,33],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:238,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],46:[2,104],51:[2,104],54:[2,104],63:[2,104],64:[2,104],65:[2,104],67:[2,104],69:[2,104],70:[2,104],71:[2,104],75:[2,104],81:[2,104],82:[2,104],83:[2,104],88:[2,104],90:[2,104],99:[2,104],101:[2,104],102:[2,104],103:[2,104],107:[2,104],115:[2,104],123:[2,104],125:[2,104],126:[2,104],129:[2,104],130:[2,104],131:[2,104],132:[2,104],133:[2,104],134:[2,104]},{6:[2,49],25:[2,49],50:239,51:[1,223],83:[2,49]},{6:[2,122],25:[2,122],26:[2,122],51:[2,122],54:[1,240],83:[2,122],88:[2,122],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{47:241,48:[1,57],49:[1,58]},{27:107,28:[1,70],41:108,52:242,53:106,55:109,56:110,73:[1,67],86:[1,111],87:[1,112]},{46:[2,55],51:[2,55]},{8:243,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],46:[2,192],51:[2,192],54:[2,192],69:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:84,101:[2,192],102:[2,192],103:[2,192],106:85,107:[2,192],108:66,115:[2,192],123:[2,192],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:244,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],46:[2,194],51:[2,194],54:[2,194],69:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],100:84,101:[2,194],102:[2,194],103:[2,194],106:85,107:[2,194],108:66,115:[2,194],123:[2,194],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],46:[2,174],51:[2,174],54:[2,174],69:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{8:245,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,127],6:[2,127],25:[2,127],26:[2,127],46:[2,127],51:[2,127],54:[2,127],69:[2,127],75:[2,127],83:[2,127],88:[2,127],90:[2,127],95:[1,246],99:[2,127],101:[2,127],102:[2,127],103:[2,127],107:[2,127],115:[2,127],123:[2,127],125:[2,127],126:[2,127],129:[2,127],130:[2,127],131:[2,127],132:[2,127],133:[2,127],134:[2,127]},{5:247,25:[1,5]},{27:248,28:[1,70]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,167],118:[2,167],120:[2,167]},{8:254,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],92:253,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,92],5:255,6:[2,92],25:[1,5],26:[2,92],46:[2,92],51:[2,92],54:[2,92],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,92],70:[1,97],71:[1,98],75:[2,92],78:89,81:[1,91],82:[2,102],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],46:[2,66],51:[2,66],54:[2,66],63:[2,66],64:[2,66],65:[2,66],67:[2,66],69:[2,66],70:[2,66],71:[2,66],75:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66]},{1:[2,95],6:[2,95],25:[2,95],26:[2,95],46:[2,95],51:[2,95],54:[2,95],69:[2,95],75:[2,95],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{14:256,15:120,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:121,41:60,55:47,56:48,58:215,60:25,61:26,62:27,73:[1,67],80:[1,28],85:[1,55],86:[1,56],87:[1,54],98:[1,53]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],46:[2,132],51:[2,132],54:[2,132],63:[2,132],64:[2,132],65:[2,132],67:[2,132],69:[2,132],70:[2,132],71:[2,132],75:[2,132],81:[2,132],82:[2,132],83:[2,132],88:[2,132],90:[2,132],99:[2,132],101:[2,132],102:[2,132],103:[2,132],107:[2,132],115:[2,132],123:[2,132],125:[2,132],126:[2,132],129:[2,132],130:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132]},{6:[1,71],26:[1,257]},{8:258,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,61],13:[2,112],25:[2,61],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],42:[2,112],43:[2,112],44:[2,112],48:[2,112],49:[2,112],51:[2,61],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],88:[2,61],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,50],8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[2,50],26:[2,50],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],83:[2,50],85:[1,55],86:[1,56],87:[1,54],88:[2,50],91:262,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,49],25:[2,49],26:[2,49],50:263,51:[1,223]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],46:[2,171],51:[2,171],54:[2,171],69:[2,171],75:[2,171],83:[2,171],88:[2,171],90:[2,171],99:[2,171],101:[2,171],102:[2,171],103:[2,171],107:[2,171],115:[2,171],118:[2,171],123:[2,171],125:[2,171],126:[2,171],129:[2,171],130:[2,171],131:[2,171],132:[2,171],133:[2,171],134:[2,171]},{8:264,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,150],114:[2,150]},{27:156,28:[1,70],55:157,56:158,73:[1,67],87:[1,112],112:266},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],46:[2,156],51:[2,156],54:[2,156],69:[2,156],75:[2,156],83:[2,156],88:[2,156],90:[2,156],99:[2,156],100:84,101:[2,156],102:[1,267],103:[2,156],106:85,107:[2,156],108:66,115:[1,268],123:[2,156],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],46:[2,157],51:[2,157],54:[2,157],69:[2,157],75:[2,157],83:[2,157],88:[2,157],90:[2,157],99:[2,157],100:84,101:[2,157],102:[1,269],103:[2,157],106:85,107:[2,157],108:66,115:[2,157],123:[2,157],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,50],12:165,25:[2,50],26:[2,50],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:273,39:164,41:168,43:[1,46],75:[2,50],86:[1,111]},{8:274,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,275],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],37:[2,79],46:[2,79],51:[2,79],54:[2,79],63:[2,79],64:[2,79],65:[2,79],67:[2,79],69:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{8:276,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,69:[2,115],73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{69:[2,116],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,277],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,61],25:[2,61],26:[2,61],51:[2,61],83:[2,61],88:[2,61]},{5:279,25:[1,5]},{46:[2,53],51:[2,53]},{46:[2,56],51:[2,56],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,280],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{5:281,25:[1,5],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{5:282,25:[1,5]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],46:[2,128],51:[2,128],54:[2,128],69:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],46:[2,165],51:[2,165],54:[2,165],69:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{5:286,25:[1,5]},{26:[2,168],118:[2,168],120:[2,168]},{5:287,25:[1,5],51:[1,288]},{25:[2,124],51:[2,124],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,93],6:[2,93],25:[2,93],26:[2,93],46:[2,93],51:[2,93],54:[2,93],69:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],101:[2,93],102:[2,93],103:[2,93],107:[2,93],115:[2,93],123:[2,93],125:[2,93],126:[2,93],129:[2,93],130:[2,93],131:[2,93],132:[2,93],133:[2,93],134:[2,93]},{1:[2,96],5:289,6:[2,96],25:[1,5],26:[2,96],46:[2,96],51:[2,96],54:[2,96],59:90,63:[1,92],64:[1,93],65:[1,94],66:95,67:[1,96],69:[2,96],70:[1,97],71:[1,98],75:[2,96],78:89,81:[1,91],82:[2,102],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{99:[1,290]},{88:[1,291],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],37:[2,110],46:[2,110],51:[2,110],54:[2,110],63:[2,110],64:[2,110],65:[2,110],67:[2,110],69:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],91:292,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,25:[1,144],27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,57:145,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],84:293,85:[1,55],86:[1,56],87:[1,54],91:143,93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,118],25:[2,118],26:[2,118],51:[2,118],83:[2,118],88:[2,118]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],46:[2,135],51:[2,135],54:[2,135],69:[2,135],75:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],100:84,101:[1,62],102:[2,135],103:[1,63],106:85,107:[1,65],108:66,115:[2,135],123:[2,135],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],46:[2,137],51:[2,137],54:[2,137],69:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:84,101:[1,62],102:[2,137],103:[1,63],106:85,107:[1,65],108:66,115:[2,137],123:[2,137],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{113:[2,155],114:[2,155]},{8:295,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],37:[2,84],46:[2,84],51:[2,84],54:[2,84],63:[2,84],64:[2,84],65:[2,84],67:[2,84],69:[2,84],70:[2,84],71:[2,84],75:[2,84],81:[2,84],82:[2,84],83:[2,84],88:[2,84],90:[2,84],99:[2,84],101:[2,84],102:[2,84],103:[2,84],107:[2,84],113:[2,84],114:[2,84],115:[2,84],123:[2,84],125:[2,84],126:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84]},{12:165,27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:298,39:164,41:168,43:[1,46],86:[1,111]},{6:[2,85],12:165,25:[2,85],26:[2,85],27:166,28:[1,70],29:167,30:[1,68],31:[1,69],38:163,39:164,41:168,43:[1,46],51:[2,85],74:299,86:[1,111]},{6:[2,87],25:[2,87],26:[2,87],51:[2,87],75:[2,87]},{6:[2,36],25:[2,36],26:[2,36],51:[2,36],75:[2,36],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{8:300,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{69:[2,114],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],46:[2,34],51:[2,34],54:[2,34],69:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],101:[2,34],102:[2,34],103:[2,34],107:[2,34],115:[2,34],123:[2,34],125:[2,34],126:[2,34],129:[2,34],130:[2,34],131:[2,34],132:[2,34],133:[2,34],134:[2,34]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],46:[2,105],51:[2,105],54:[2,105],63:[2,105],64:[2,105],65:[2,105],67:[2,105],69:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{1:[2,45],6:[2,45],25:[2,45],26:[2,45],46:[2,45],51:[2,45],54:[2,45],69:[2,45],75:[2,45],83:[2,45],88:[2,45],90:[2,45],99:[2,45],101:[2,45],102:[2,45],103:[2,45],107:[2,45],115:[2,45],123:[2,45],125:[2,45],126:[2,45],129:[2,45],130:[2,45],131:[2,45],132:[2,45],133:[2,45],134:[2,45]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],46:[2,193],51:[2,193],54:[2,193],69:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],101:[2,193],102:[2,193],103:[2,193],107:[2,193],115:[2,193],123:[2,193],125:[2,193],126:[2,193],129:[2,193],130:[2,193],131:[2,193],132:[2,193],133:[2,193],134:[2,193]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],46:[2,172],51:[2,172],54:[2,172],69:[2,172],75:[2,172],83:[2,172],88:[2,172],90:[2,172],99:[2,172],101:[2,172],102:[2,172],103:[2,172],107:[2,172],115:[2,172],118:[2,172],123:[2,172],125:[2,172],126:[2,172],129:[2,172],130:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],46:[2,129],51:[2,129],54:[2,129],69:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],46:[2,130],51:[2,130],54:[2,130],69:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],95:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],46:[2,163],51:[2,163],54:[2,163],69:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],101:[2,163],102:[2,163],103:[2,163],107:[2,163],115:[2,163],123:[2,163],125:[2,163],126:[2,163],129:[2,163],130:[2,163],131:[2,163],132:[2,163],133:[2,163],134:[2,163]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,169],118:[2,169],120:[2,169]},{8:304,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,97],6:[2,97],25:[2,97],26:[2,97],46:[2,97],51:[2,97],54:[2,97],69:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],101:[2,97],102:[2,97],103:[2,97],107:[2,97],115:[2,97],123:[2,97],125:[2,97],126:[2,97],129:[2,97],130:[2,97],131:[2,97],132:[2,97],133:[2,97],134:[2,97]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],46:[2,133],51:[2,133],54:[2,133],63:[2,133],64:[2,133],65:[2,133],67:[2,133],69:[2,133],70:[2,133],71:[2,133],75:[2,133],81:[2,133],82:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],101:[2,133],102:[2,133],103:[2,133],107:[2,133],115:[2,133],123:[2,133],125:[2,133],126:[2,133],129:[2,133],130:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],46:[2,113],51:[2,113],54:[2,113],63:[2,113],64:[2,113],65:[2,113],67:[2,113],69:[2,113],70:[2,113],71:[2,113],75:[2,113],81:[2,113],82:[2,113],83:[2,113],88:[2,113],90:[2,113],99:[2,113],101:[2,113],102:[2,113],103:[2,113],107:[2,113],115:[2,113],123:[2,113],125:[2,113],126:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113]},{6:[2,119],25:[2,119],26:[2,119],51:[2,119],83:[2,119],88:[2,119]},{6:[2,49],25:[2,49],26:[2,49],50:305,51:[1,223]},{6:[2,120],25:[2,120],26:[2,120],51:[2,120],83:[2,120],88:[2,120]},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],46:[2,158],51:[2,158],54:[2,158],69:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:84,101:[2,158],102:[2,158],103:[2,158],106:85,107:[2,158],108:66,115:[1,306],123:[2,158],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],46:[2,160],51:[2,160],54:[2,160],69:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:84,101:[2,160],102:[1,307],103:[2,160],106:85,107:[2,160],108:66,115:[2,160],123:[2,160],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],46:[2,159],51:[2,159],54:[2,159],69:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:84,101:[2,159],102:[2,159],103:[2,159],106:85,107:[2,159],108:66,115:[2,159],123:[2,159],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[2,88],25:[2,88],26:[2,88],51:[2,88],75:[2,88]},{6:[2,49],25:[2,49],26:[2,49],50:308,51:[1,233]},{26:[1,309],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{26:[1,310]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],46:[2,166],51:[2,166],54:[2,166],69:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{26:[2,170],118:[2,170],120:[2,170]},{25:[2,125],51:[2,125],100:84,101:[1,62],103:[1,63],106:85,107:[1,65],108:66,123:[1,83],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:19,11:20,12:21,13:[1,22],14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:18,27:59,28:[1,70],29:49,30:[1,68],31:[1,69],32:24,33:[1,50],34:[1,51],35:[1,52],36:23,41:60,42:[1,44],43:[1,46],44:[1,29],47:30,48:[1,57],49:[1,58],55:47,56:48,58:36,60:25,61:26,62:27,73:[1,67],76:[1,43],80:[1,28],85:[1,55],86:[1,56],87:[1,54],93:[1,38],97:[1,45],98:[1,53],100:39,101:[1,62],103:[1,63],104:40,105:[1,64],106:41,107:[1,65],108:66,116:[1,42],121:37,122:[1,61],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,37],25:[2,37],26:[2,37],51:[2,37],75:[2,37]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],46:[2,164],51:[2,164],54:[2,164],69:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],101:[2,164],102:[2,164],103:[2,164],107:[2,164],115:[2,164],123:[2,164],125:[2,164],126:[2,164],129:[2,164],130:[2,164],131:[2,164],132:[2,164],133:[2,164],134:[2,164]},{6:[2,121],25:[2,121],26:[2,121],51:[2,121],83:[2,121],88:[2,121]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],46:[2,161],51:[2,161],54:[2,161],69:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:84,101:[2,161],102:[2,161],103:[2,161],106:85,107:[2,161],108:66,115:[2,161],123:[2,161],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],46:[2,162],51:[2,162],54:[2,162],69:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:84,101:[2,162],102:[2,162],103:[2,162],106:85,107:[2,162],108:66,115:[2,162],123:[2,162],125:[1,77],126:[1,76],129:[1,75],130:[1,78],131:[1,79],132:[1,80],133:[1,81],134:[1,82]},{6:[2,89],25:[2,89],26:[2,89],51:[2,89],75:[2,89]}], +defaultActions: {57:[2,47],58:[2,48],72:[2,3],91:[2,103],186:[2,83]}, +parseError: function parseError(str, hash) { + throw new Error(str); +}, +parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], // semantic value stack + lstack = [], // location stack + table = this.table, + yytext = '', + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + + //this.reductionCount = this.shiftCount = 0; + + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + if (typeof this.lexer.yylloc == 'undefined') + this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + + if (typeof this.yy.parseError === 'function') + this.parseError = this.yy.parseError; + + function popStack (n) { + stack.length = stack.length - 2*n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + + function lex() { + var token; + token = self.lexer.lex() || 1; // $end = 1 + // if token isn't its numeric value, convert + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + + var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; + while (true) { + // retreive state number from top of stack + state = stack[stack.length-1]; + + // use default actions if available + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol == null) + symbol = lex(); + // read action for current state and first input + action = table[state] && table[state][symbol]; + } + + // handle parse error + if (typeof action === 'undefined' || !action.length || !action[0]) { + + if (!recovering) { + // Report error + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'"+this.terminals_[p]+"'"); + } + var errStr = ''; + if (this.lexer.showPosition) { + errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+'\nExpecting '+expected.join(', '); + } else { + errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + + (symbol == 1 /*EOF*/ ? "end of input" : + ("'"+(this.terminals_[symbol] || symbol)+"'")); + } + this.parseError(errStr, + {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + + // just recovered from another error + if (recovering == 3) { + if (symbol == EOF) { + throw new Error(errStr || 'Parsing halted.'); + } + + // discard current lookahead and grab another + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + symbol = lex(); + } + + // try to recover from error + while (1) { + // check for error recovery rule in this state + if ((TERROR.toString()) in table[state]) { + break; + } + if (state == 0) { + throw new Error(errStr || 'Parsing halted.'); + } + popStack(1); + state = stack[stack.length-1]; + } + + preErrorSymbol = symbol; // save the lookahead token + symbol = TERROR; // insert generic error symbol as new lookahead + state = stack[stack.length-1]; + action = table[state] && table[state][TERROR]; + recovering = 3; // allow 3 real symbols to be shifted before reporting a new error + } + + // this shouldn't happen, unless resolve defaults are off + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); + } + + switch (action[0]) { + + case 1: // shift + //this.shiftCount++; + + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); // push state + symbol = null; + if (!preErrorSymbol) { // normal execution/no error + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { // error just occurred, resume old lookahead f/ before error + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + + case 2: // reduce + //this.reductionCount++; + + len = this.productions_[action[1]][1]; + + // perform semantic action + yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 + // default location, uses first token for firsts, last for lasts + yyval._$ = { + first_line: lstack[lstack.length-(len||1)].first_line, + last_line: lstack[lstack.length-1].last_line, + first_column: lstack[lstack.length-(len||1)].first_column, + last_column: lstack[lstack.length-1].last_column + }; + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + + if (typeof r !== 'undefined') { + return r; + } + + // pop off stack + if (len) { + stack = stack.slice(0,-1*len*2); + vstack = vstack.slice(0, -1*len); + lstack = lstack.slice(0, -1*len); + } + + stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) + vstack.push(yyval.$); + lstack.push(yyval._$); + // goto new state = table[STATE][NONTERMINAL] + newState = table[stack[stack.length-2]][stack[stack.length-1]]; + stack.push(newState); + break; + + case 3: // accept + return true; + } + + } + + return true; +}}; + +module.exports = parser; +});/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/nodes', ['require', 'exports', 'module' , 'ace/mode/coffee/scope', 'ace/mode/coffee/helpers'], function(require, exports, module) { + var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, Comment, Existence, Extends, For, IDENTIFIER, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, Push, Range, Return, SIMPLENUM, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, compact, del, ends, extend, flatten, last, merge, multident, starts, unfoldSoak, utility, _ref; + var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { + for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor; + child.__super__ = parent.prototype; + return child; + }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) { + if (this[i] === item) return i; + } + return -1; + }; + Scope = require('./scope').Scope; + _ref = require('./helpers'), compact = _ref.compact, flatten = _ref.flatten, extend = _ref.extend, merge = _ref.merge, del = _ref.del, starts = _ref.starts, ends = _ref.ends, last = _ref.last; + exports.extend = extend; + YES = function() { + return true; + }; + NO = function() { + return false; + }; + THIS = function() { + return this; + }; + NEGATE = function() { + this.negated = !this.negated; + return this; + }; + exports.Base = Base = (function() { + function Base() {} + Base.prototype.compile = function(o, lvl) { + var node; + o = extend({}, o); + if (lvl) { + o.level = lvl; + } + node = this.unfoldSoak(o) || this; + node.tab = o.indent; + if (o.level === LEVEL_TOP || !node.isStatement(o)) { + return node.compileNode(o); + } else { + return node.compileClosure(o); + } + }; + Base.prototype.compileClosure = function(o) { + if (this.jumps() || this instanceof Throw) { + throw SyntaxError('cannot use a pure statement in an expression.'); + } + o.sharedScope = true; + return Closure.wrap(this).compileNode(o); + }; + Base.prototype.cache = function(o, level, reused) { + var ref, sub; + if (!this.isComplex()) { + ref = level ? this.compile(o, level) : this; + return [ref, ref]; + } else { + ref = new Literal(reused || o.scope.freeVariable('ref')); + sub = new Assign(ref, this); + if (level) { + return [sub.compile(o, level), ref.value]; + } else { + return [sub, ref]; + } + } + }; + Base.prototype.compileLoopReference = function(o, name) { + var src, tmp; + src = tmp = this.compile(o, LEVEL_LIST); + if (!((-Infinity < +src && +src < Infinity) || IDENTIFIER.test(src) && o.scope.check(src, true))) { + src = "" + (tmp = o.scope.freeVariable(name)) + " = " + src; + } + return [src, tmp]; + }; + Base.prototype.makeReturn = function() { + return new Return(this); + }; + Base.prototype.contains = function(pred) { + var contains; + contains = false; + this.traverseChildren(false, function(node) { + if (pred(node)) { + contains = true; + return false; + } + }); + return contains; + }; + Base.prototype.containsType = function(type) { + return this instanceof type || this.contains(function(node) { + return node instanceof type; + }); + }; + Base.prototype.lastNonComment = function(list) { + var i; + i = list.length; + while (i--) { + if (!(list[i] instanceof Comment)) { + return list[i]; + } + } + return null; + }; + Base.prototype.toString = function(idt, name) { + var tree; + if (idt == null) { + idt = ''; + } + if (name == null) { + name = this.constructor.name; + } + tree = '\n' + idt + name; + if (this.soak) { + tree += '?'; + } + this.eachChild(function(node) { + return tree += node.toString(idt + TAB); + }); + return tree; + }; + Base.prototype.eachChild = function(func) { + var attr, child, _i, _j, _len, _len2, _ref2, _ref3; + if (!this.children) { + return this; + } + _ref2 = this.children; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + attr = _ref2[_i]; + if (this[attr]) { + _ref3 = flatten([this[attr]]); + for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) { + child = _ref3[_j]; + if (func(child) === false) { + return this; + } + } + } + } + return this; + }; + Base.prototype.traverseChildren = function(crossScope, func) { + return this.eachChild(function(child) { + if (func(child) === false) { + return false; + } + return child.traverseChildren(crossScope, func); + }); + }; + Base.prototype.invert = function() { + return new Op('!', this); + }; + Base.prototype.unwrapAll = function() { + var node; + node = this; + while (node !== (node = node.unwrap())) { + continue; + } + return node; + }; + Base.prototype.children = []; + Base.prototype.isStatement = NO; + Base.prototype.jumps = NO; + Base.prototype.isComplex = YES; + Base.prototype.isChainable = NO; + Base.prototype.isAssignable = NO; + Base.prototype.unwrap = THIS; + Base.prototype.unfoldSoak = NO; + Base.prototype.assigns = NO; + return Base; + })(); + exports.Block = Block = (function() { + __extends(Block, Base); + function Block(nodes) { + this.expressions = compact(flatten(nodes || [])); + } + Block.prototype.children = ['expressions']; + Block.prototype.push = function(node) { + this.expressions.push(node); + return this; + }; + Block.prototype.pop = function() { + return this.expressions.pop(); + }; + Block.prototype.unshift = function(node) { + this.expressions.unshift(node); + return this; + }; + Block.prototype.unwrap = function() { + if (this.expressions.length === 1) { + return this.expressions[0]; + } else { + return this; + } + }; + Block.prototype.isEmpty = function() { + return !this.expressions.length; + }; + Block.prototype.isStatement = function(o) { + var exp, _i, _len, _ref2; + _ref2 = this.expressions; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + exp = _ref2[_i]; + if (exp.isStatement(o)) { + return true; + } + } + return false; + }; + Block.prototype.jumps = function(o) { + var exp, _i, _len, _ref2; + _ref2 = this.expressions; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + exp = _ref2[_i]; + if (exp.jumps(o)) { + return exp; + } + } + }; + Block.prototype.makeReturn = function() { + var expr, len; + len = this.expressions.length; + while (len--) { + expr = this.expressions[len]; + if (!(expr instanceof Comment)) { + this.expressions[len] = expr.makeReturn(); + if (expr instanceof Return && !expr.expression) { + this.expressions.splice(len, 1); + } + break; + } + } + return this; + }; + Block.prototype.compile = function(o, level) { + if (o == null) { + o = {}; + } + if (o.scope) { + return Block.__super__.compile.call(this, o, level); + } else { + return this.compileRoot(o); + } + }; + Block.prototype.compileNode = function(o) { + var code, codes, node, top, _i, _len, _ref2; + this.tab = o.indent; + top = o.level === LEVEL_TOP; + codes = []; + _ref2 = this.expressions; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + node = _ref2[_i]; + node = node.unwrapAll(); + node = node.unfoldSoak(o) || node; + if (top) { + node.front = true; + code = node.compile(o); + codes.push(node.isStatement(o) ? code : this.tab + code + ';'); + } else { + codes.push(node.compile(o, LEVEL_LIST)); + } + } + if (top) { + return codes.join('\n'); + } + code = codes.join(', ') || 'void 0'; + if (codes.length > 1 && o.level >= LEVEL_LIST) { + return "(" + code + ")"; + } else { + return code; + } + }; + Block.prototype.compileRoot = function(o) { + var code; + o.indent = this.tab = o.bare ? '' : TAB; + o.scope = new Scope(null, this, null); + o.level = LEVEL_TOP; + code = this.compileWithDeclarations(o); + if (o.bare) { + return code; + } else { + return "(function() {\n" + code + "\n}).call(this);\n"; + } + }; + Block.prototype.compileWithDeclarations = function(o) { + var assigns, code, declars, exp, i, post, rest, scope, _len, _ref2; + code = post = ''; + _ref2 = this.expressions; + for (i = 0, _len = _ref2.length; i < _len; i++) { + exp = _ref2[i]; + exp = exp.unwrap(); + if (!(exp instanceof Comment || exp instanceof Literal)) { + break; + } + } + o = merge(o, { + level: LEVEL_TOP + }); + if (i) { + rest = this.expressions.splice(i, this.expressions.length); + code = this.compileNode(o); + this.expressions = rest; + } + post = this.compileNode(o); + scope = o.scope; + if (scope.expressions === this) { + declars = o.scope.hasDeclarations(); + assigns = scope.hasAssignments; + if ((declars || assigns) && i) { + code += '\n'; + } + if (declars) { + code += "" + this.tab + "var " + (scope.declaredVariables().join(', ')) + ";\n"; + } + if (assigns) { + code += "" + this.tab + "var " + (multident(scope.assignedVariables().join(', '), this.tab)) + ";\n"; + } + } + return code + post; + }; + Block.wrap = function(nodes) { + if (nodes.length === 1 && nodes[0] instanceof Block) { + return nodes[0]; + } + return new Block(nodes); + }; + return Block; + })(); + exports.Literal = Literal = (function() { + __extends(Literal, Base); + function Literal(value) { + this.value = value; + } + Literal.prototype.makeReturn = function() { + if (this.isStatement()) { + return this; + } else { + return new Return(this); + } + }; + Literal.prototype.isAssignable = function() { + return IDENTIFIER.test(this.value); + }; + Literal.prototype.isStatement = function() { + var _ref2; + return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger'; + }; + Literal.prototype.isComplex = NO; + Literal.prototype.assigns = function(name) { + return name === this.value; + }; + Literal.prototype.jumps = function(o) { + if (!this.isStatement()) { + return false; + } + if (!(o && (o.loop || o.block && (this.value !== 'continue')))) { + return this; + } else { + return false; + } + }; + Literal.prototype.compileNode = function(o) { + var code; + code = this.isUndefined ? o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0' : this.value.reserved ? "\"" + this.value + "\"" : this.value; + if (this.isStatement()) { + return "" + this.tab + code + ";"; + } else { + return code; + } + }; + Literal.prototype.toString = function() { + return ' "' + this.value + '"'; + }; + return Literal; + })(); + exports.Return = Return = (function() { + __extends(Return, Base); + function Return(expr) { + if (expr && !expr.unwrap().isUndefined) { + this.expression = expr; + } + } + Return.prototype.children = ['expression']; + Return.prototype.isStatement = YES; + Return.prototype.makeReturn = THIS; + Return.prototype.jumps = THIS; + Return.prototype.compile = function(o, level) { + var expr, _ref2; + expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0; + if (expr && !(expr instanceof Return)) { + return expr.compile(o, level); + } else { + return Return.__super__.compile.call(this, o, level); + } + }; + Return.prototype.compileNode = function(o) { + return this.tab + ("return" + (this.expression ? ' ' + this.expression.compile(o, LEVEL_PAREN) : '') + ";"); + }; + return Return; + })(); + exports.Value = Value = (function() { + __extends(Value, Base); + function Value(base, props, tag) { + if (!props && base instanceof Value) { + return base; + } + this.base = base; + this.properties = props || []; + if (tag) { + this[tag] = true; + } + return this; + } + Value.prototype.children = ['base', 'properties']; + Value.prototype.push = function(prop) { + this.properties.push(prop); + return this; + }; + Value.prototype.hasProperties = function() { + return !!this.properties.length; + }; + Value.prototype.isArray = function() { + return !this.properties.length && this.base instanceof Arr; + }; + Value.prototype.isComplex = function() { + return this.hasProperties() || this.base.isComplex(); + }; + Value.prototype.isAssignable = function() { + return this.hasProperties() || this.base.isAssignable(); + }; + Value.prototype.isSimpleNumber = function() { + return this.base instanceof Literal && SIMPLENUM.test(this.base.value); + }; + Value.prototype.isAtomic = function() { + var node, _i, _len, _ref2; + _ref2 = this.properties.concat(this.base); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + node = _ref2[_i]; + if (node.soak || node instanceof Call) { + return false; + } + } + return true; + }; + Value.prototype.isStatement = function(o) { + return !this.properties.length && this.base.isStatement(o); + }; + Value.prototype.assigns = function(name) { + return !this.properties.length && this.base.assigns(name); + }; + Value.prototype.jumps = function(o) { + return !this.properties.length && this.base.jumps(o); + }; + Value.prototype.isObject = function(onlyGenerated) { + if (this.properties.length) { + return false; + } + return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); + }; + Value.prototype.isSplice = function() { + return last(this.properties) instanceof Slice; + }; + Value.prototype.makeReturn = function() { + if (this.properties.length) { + return Value.__super__.makeReturn.call(this); + } else { + return this.base.makeReturn(); + } + }; + Value.prototype.unwrap = function() { + if (this.properties.length) { + return this; + } else { + return this.base; + } + }; + Value.prototype.cacheReference = function(o) { + var base, bref, name, nref; + name = last(this.properties); + if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { + return [this, this]; + } + base = new Value(this.base, this.properties.slice(0, -1)); + if (base.isComplex()) { + bref = new Literal(o.scope.freeVariable('base')); + base = new Value(new Parens(new Assign(bref, base))); + } + if (!name) { + return [base, bref]; + } + if (name.isComplex()) { + nref = new Literal(o.scope.freeVariable('name')); + name = new Index(new Assign(nref, name.index)); + nref = new Index(nref); + } + return [base.push(name), new Value(bref || base.base, [nref || name])]; + }; + Value.prototype.compileNode = function(o) { + var code, prop, props, _i, _len; + this.base.front = this.front; + props = this.properties; + code = this.base.compile(o, props.length ? LEVEL_ACCESS : null); + if (props[0] instanceof Access && this.isSimpleNumber()) { + code = "(" + code + ")"; + } + for (_i = 0, _len = props.length; _i < _len; _i++) { + prop = props[_i]; + code += prop.compile(o); + } + return code; + }; + Value.prototype.unfoldSoak = function(o) { + var result; + if (this.unfoldedSoak != null) { + return this.unfoldedSoak; + } + result = __bind(function() { + var fst, i, ifn, prop, ref, snd, _len, _ref2; + if (ifn = this.base.unfoldSoak(o)) { + Array.prototype.push.apply(ifn.body.properties, this.properties); + return ifn; + } + _ref2 = this.properties; + for (i = 0, _len = _ref2.length; i < _len; i++) { + prop = _ref2[i]; + if (prop.soak) { + prop.soak = false; + fst = new Value(this.base, this.properties.slice(0, i)); + snd = new Value(this.base, this.properties.slice(i)); + if (fst.isComplex()) { + ref = new Literal(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, fst)); + snd.base = ref; + } + return new If(new Existence(fst), snd, { + soak: true + }); + } + } + return null; + }, this)(); + return this.unfoldedSoak = result || false; + }; + return Value; + })(); + exports.Comment = Comment = (function() { + __extends(Comment, Base); + function Comment(comment) { + this.comment = comment; + } + Comment.prototype.isStatement = YES; + Comment.prototype.makeReturn = THIS; + Comment.prototype.compileNode = function(o, level) { + var code; + code = '/*' + multident(this.comment, this.tab) + '*/'; + if ((level || o.level) === LEVEL_TOP) { + code = o.indent + code; + } + return code; + }; + return Comment; + })(); + exports.Call = Call = (function() { + __extends(Call, Base); + function Call(variable, args, soak) { + this.args = args != null ? args : []; + this.soak = soak; + this.isNew = false; + this.isSuper = variable === 'super'; + this.variable = this.isSuper ? null : variable; + } + Call.prototype.children = ['variable', 'args']; + Call.prototype.newInstance = function() { + var base; + base = this.variable.base || this.variable; + if (base instanceof Call) { + base.newInstance(); + } else { + this.isNew = true; + } + return this; + }; + Call.prototype.superReference = function(o) { + var method, name; + method = o.scope.method; + if (!method) { + throw SyntaxError('cannot call super outside of a function.'); + } + name = method.name; + if (!name) { + throw SyntaxError('cannot call super on an anonymous function.'); + } + if (method.klass) { + return "" + method.klass + ".__super__." + name; + } else { + return "" + name + ".__super__.constructor"; + } + }; + Call.prototype.unfoldSoak = function(o) { + var call, ifn, left, list, rite, _i, _len, _ref2, _ref3; + if (this.soak) { + if (this.variable) { + if (ifn = unfoldSoak(o, this, 'variable')) { + return ifn; + } + _ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1]; + } else { + left = new Literal(this.superReference(o)); + rite = new Value(left); + } + rite = new Call(rite, this.args); + rite.isNew = this.isNew; + left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); + return new If(left, new Value(rite), { + soak: true + }); + } + call = this; + list = []; + while (true) { + if (call.variable instanceof Call) { + list.push(call); + call = call.variable; + continue; + } + if (!(call.variable instanceof Value)) { + break; + } + list.push(call); + if (!((call = call.variable.base) instanceof Call)) { + break; + } + } + _ref3 = list.reverse(); + for (_i = 0, _len = _ref3.length; _i < _len; _i++) { + call = _ref3[_i]; + if (ifn) { + if (call.variable instanceof Call) { + call.variable = ifn; + } else { + call.variable.base = ifn; + } + } + ifn = unfoldSoak(o, call, 'variable'); + } + return ifn; + }; + Call.prototype.filterImplicitObjects = function(list) { + var node, nodes, obj, prop, properties, _i, _j, _len, _len2, _ref2; + nodes = []; + for (_i = 0, _len = list.length; _i < _len; _i++) { + node = list[_i]; + if (!((typeof node.isObject === "function" ? node.isObject() : void 0) && node.base.generated)) { + nodes.push(node); + continue; + } + obj = null; + _ref2 = node.base.properties; + for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { + prop = _ref2[_j]; + if (prop instanceof Assign) { + if (!obj) { + nodes.push(obj = new Obj(properties = [], true)); + } + properties.push(prop); + } else { + nodes.push(prop); + obj = null; + } + } + } + return nodes; + }; + Call.prototype.compileNode = function(o) { + var arg, args, code, _ref2; + if ((_ref2 = this.variable) != null) { + _ref2.front = this.front; + } + if (code = Splat.compileSplattedArray(o, this.args, true)) { + return this.compileSplat(o, code); + } + args = this.filterImplicitObjects(this.args); + args = ((function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = args.length; _i < _len; _i++) { + arg = args[_i]; + _results.push(arg.compile(o, LEVEL_LIST)); + } + return _results; + })()).join(', '); + if (this.isSuper) { + return this.superReference(o) + (".call(this" + (args && ', ' + args) + ")"); + } else { + return (this.isNew ? 'new ' : '') + this.variable.compile(o, LEVEL_ACCESS) + ("(" + args + ")"); + } + }; + Call.prototype.compileSuper = function(args, o) { + return "" + (this.superReference(o)) + ".call(this" + (args.length ? ', ' : '') + args + ")"; + }; + Call.prototype.compileSplat = function(o, splatArgs) { + var base, fun, idt, name, ref; + if (this.isSuper) { + return "" + (this.superReference(o)) + ".apply(this, " + splatArgs + ")"; + } + if (this.isNew) { + idt = this.tab + TAB; + return "(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return typeof result === \"object\" ? result : child;\n" + this.tab + "})(" + (this.variable.compile(o, LEVEL_LIST)) + ", " + splatArgs + ", function() {})"; + } + base = new Value(this.variable); + if ((name = base.properties.pop()) && base.isComplex()) { + ref = o.scope.freeVariable('ref'); + fun = "(" + ref + " = " + (base.compile(o, LEVEL_LIST)) + ")" + (name.compile(o)); + } else { + fun = base.compile(o, LEVEL_ACCESS); + if (SIMPLENUM.test(fun)) { + fun = "(" + fun + ")"; + } + if (name) { + ref = fun; + fun += name.compile(o); + } else { + ref = 'null'; + } + } + return "" + fun + ".apply(" + ref + ", " + splatArgs + ")"; + }; + return Call; + })(); + exports.Extends = Extends = (function() { + __extends(Extends, Base); + function Extends(child, parent) { + this.child = child; + this.parent = parent; + } + Extends.prototype.children = ['child', 'parent']; + Extends.prototype.compile = function(o) { + utility('hasProp'); + return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compile(o); + }; + return Extends; + })(); + exports.Access = Access = (function() { + __extends(Access, Base); + function Access(name, tag) { + this.name = name; + this.name.asKey = true; + this.proto = tag === 'proto' ? '.prototype' : ''; + this.soak = tag === 'soak'; + } + Access.prototype.children = ['name']; + Access.prototype.compile = function(o) { + var name; + name = this.name.compile(o); + return this.proto + (IS_STRING.test(name) ? "[" + name + "]" : "." + name); + }; + Access.prototype.isComplex = NO; + return Access; + })(); + exports.Index = Index = (function() { + __extends(Index, Base); + function Index(index) { + this.index = index; + } + Index.prototype.children = ['index']; + Index.prototype.compile = function(o) { + return (this.proto ? '.prototype' : '') + ("[" + (this.index.compile(o, LEVEL_PAREN)) + "]"); + }; + Index.prototype.isComplex = function() { + return this.index.isComplex(); + }; + return Index; + })(); + exports.Range = Range = (function() { + __extends(Range, Base); + Range.prototype.children = ['from', 'to']; + function Range(from, to, tag) { + this.from = from; + this.to = to; + this.exclusive = tag === 'exclusive'; + this.equals = this.exclusive ? '' : '='; + } + Range.prototype.compileVariables = function(o) { + var step, _ref2, _ref3, _ref4, _ref5; + o = merge(o, { + top: true + }); + _ref2 = this.from.cache(o, LEVEL_LIST), this.from = _ref2[0], this.fromVar = _ref2[1]; + _ref3 = this.to.cache(o, LEVEL_LIST), this.to = _ref3[0], this.toVar = _ref3[1]; + if (step = del(o, 'step')) { + _ref4 = step.cache(o, LEVEL_LIST), this.step = _ref4[0], this.stepVar = _ref4[1]; + } + _ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1]; + if (this.stepVar) { + return this.stepNum = this.stepVar.match(SIMPLENUM); + } + }; + Range.prototype.compileNode = function(o) { + var cond, condPart, from, gt, idx, known, lt, stepPart, to, varPart, _ref2, _ref3; + if (!this.fromVar) { + this.compileVariables(o); + } + if (!o.index) { + return this.compileArray(o); + } + known = this.fromNum && this.toNum; + idx = del(o, 'index'); + varPart = "" + idx + " = " + this.from; + if (this.to !== this.toVar) { + varPart += ", " + this.to; + } + if (this.step !== this.stepVar) { + varPart += ", " + this.step; + } + _ref2 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref2[0], gt = _ref2[1]; + condPart = this.stepNum ? condPart = +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), condPart = from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = "" + this.fromVar + " <= " + this.toVar, condPart = "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); + stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? from <= to ? "" + idx + "++" : "" + idx + "--" : "" + cond + " ? " + idx + "++ : " + idx + "--"; + return "" + varPart + "; " + condPart + "; " + stepPart; + }; + Range.prototype.compileArray = function(o) { + var body, cond, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results; + if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) { + range = (function() { + _results = []; + for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); } + return _results; + }).apply(this, arguments); + if (this.exclusive) { + range.pop(); + } + return "[" + (range.join(', ')) + "]"; + } + idt = this.tab + TAB; + i = o.scope.freeVariable('i'); + result = o.scope.freeVariable('results'); + pre = "\n" + idt + result + " = [];"; + if (this.fromNum && this.toNum) { + o.index = i; + body = this.compileNode(o); + } else { + vars = ("" + i + " = " + this.from) + (this.to !== this.toVar ? ", " + this.to : ''); + cond = "" + this.fromVar + " <= " + this.toVar; + body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; + } + post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; + return "(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this, arguments)"; + }; + return Range; + })(); + exports.Slice = Slice = (function() { + __extends(Slice, Base); + Slice.prototype.children = ['range']; + function Slice(range) { + this.range = range; + Slice.__super__.constructor.call(this); + } + Slice.prototype.compileNode = function(o) { + var compiled, from, fromStr, to, toStr, _ref2; + _ref2 = this.range, to = _ref2.to, from = _ref2.from; + fromStr = from && from.compile(o, LEVEL_PAREN) || '0'; + compiled = to && to.compile(o, LEVEL_PAREN); + if (to && !(!this.range.exclusive && +compiled === -1)) { + toStr = ', ' + (this.range.exclusive ? compiled : SIMPLENUM.test(compiled) ? (+compiled + 1).toString() : "(" + compiled + " + 1) || 9e9"); + } + return ".slice(" + fromStr + (toStr || '') + ")"; + }; + return Slice; + })(); + exports.Obj = Obj = (function() { + __extends(Obj, Base); + function Obj(props, generated) { + this.generated = generated != null ? generated : false; + this.objects = this.properties = props || []; + } + Obj.prototype.children = ['properties']; + Obj.prototype.compileNode = function(o) { + var i, idt, indent, join, lastNoncom, node, obj, prop, props, _i, _len; + props = this.properties; + if (!props.length) { + if (this.front) { + return '({})'; + } else { + return '{}'; + } + } + if (this.generated) { + for (_i = 0, _len = props.length; _i < _len; _i++) { + node = props[_i]; + if (node instanceof Value) { + throw new Error('cannot have an implicit value in an implicit object'); + } + } + } + idt = o.indent += TAB; + lastNoncom = this.lastNonComment(this.properties); + props = (function() { + var _len2, _results; + _results = []; + for (i = 0, _len2 = props.length; i < _len2; i++) { + prop = props[i]; + join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; + indent = prop instanceof Comment ? '' : idt; + if (prop instanceof Value && prop["this"]) { + prop = new Assign(prop.properties[0].name, prop, 'object'); + } + if (!(prop instanceof Comment)) { + if (!(prop instanceof Assign)) { + prop = new Assign(prop, prop, 'object'); + } + (prop.variable.base || prop.variable).asKey = true; + } + _results.push(indent + prop.compile(o, LEVEL_TOP) + join); + } + return _results; + })(); + props = props.join(''); + obj = "{" + (props && '\n' + props + '\n' + this.tab) + "}"; + if (this.front) { + return "(" + obj + ")"; + } else { + return obj; + } + }; + Obj.prototype.assigns = function(name) { + var prop, _i, _len, _ref2; + _ref2 = this.properties; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + prop = _ref2[_i]; + if (prop.assigns(name)) { + return true; + } + } + return false; + }; + return Obj; + })(); + exports.Arr = Arr = (function() { + __extends(Arr, Base); + function Arr(objs) { + this.objects = objs || []; + } + Arr.prototype.children = ['objects']; + Arr.prototype.filterImplicitObjects = Call.prototype.filterImplicitObjects; + Arr.prototype.compileNode = function(o) { + var code, obj, objs; + if (!this.objects.length) { + return '[]'; + } + o.indent += TAB; + objs = this.filterImplicitObjects(this.objects); + if (code = Splat.compileSplattedArray(o, objs)) { + return code; + } + code = ((function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = objs.length; _i < _len; _i++) { + obj = objs[_i]; + _results.push(obj.compile(o, LEVEL_LIST)); + } + return _results; + })()).join(', '); + if (code.indexOf('\n') >= 0) { + return "[\n" + o.indent + code + "\n" + this.tab + "]"; + } else { + return "[" + code + "]"; + } + }; + Arr.prototype.assigns = function(name) { + var obj, _i, _len, _ref2; + _ref2 = this.objects; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + obj = _ref2[_i]; + if (obj.assigns(name)) { + return true; + } + } + return false; + }; + return Arr; + })(); + exports.Class = Class = (function() { + __extends(Class, Base); + function Class(variable, parent, body) { + this.variable = variable; + this.parent = parent; + this.body = body != null ? body : new Block; + this.boundFuncs = []; + this.body.classBody = true; + } + Class.prototype.children = ['variable', 'parent', 'body']; + Class.prototype.determineName = function() { + var decl, tail; + if (!this.variable) { + return null; + } + decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value; + return decl && (decl = IDENTIFIER.test(decl) && decl); + }; + Class.prototype.setContext = function(name) { + return this.body.traverseChildren(false, function(node) { + if (node.classBody) { + return false; + } + if (node instanceof Literal && node.value === 'this') { + return node.value = name; + } else if (node instanceof Code) { + node.klass = name; + if (node.bound) { + return node.context = name; + } + } + }); + }; + Class.prototype.addBoundFunctions = function(o) { + var bname, bvar, _i, _len, _ref2, _results; + if (this.boundFuncs.length) { + _ref2 = this.boundFuncs; + _results = []; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + bvar = _ref2[_i]; + bname = bvar.compile(o); + _results.push(this.ctor.body.unshift(new Literal("this." + bname + " = " + (utility('bind')) + "(this." + bname + ", this)"))); + } + return _results; + } + }; + Class.prototype.addProperties = function(node, name, o) { + var assign, base, exprs, func, props; + props = node.base.properties.slice(0); + exprs = (function() { + var _results; + _results = []; + while (assign = props.shift()) { + if (assign instanceof Assign) { + base = assign.variable.base; + delete assign.context; + func = assign.value; + if (base.value === 'constructor') { + if (this.ctor) { + throw new Error('cannot define more than one constructor in a class'); + } + if (func.bound) { + throw new Error('cannot define a constructor as a bound function'); + } + if (func instanceof Code) { + assign = this.ctor = func; + } else { + this.externalCtor = o.scope.freeVariable('class'); + assign = new Assign(new Literal(this.externalCtor), func); + } + } else { + if (!assign.variable["this"]) { + assign.variable = new Value(new Literal(name), [new Access(base, 'proto')]); + } + if (func instanceof Code && func.bound) { + this.boundFuncs.push(base); + func.bound = false; + } + } + } + _results.push(assign); + } + return _results; + }).call(this); + return compact(exprs); + }; + Class.prototype.walkBody = function(name, o) { + return this.traverseChildren(false, __bind(function(child) { + var exps, i, node, _len, _ref2; + if (child instanceof Class) { + return false; + } + if (child instanceof Block) { + _ref2 = exps = child.expressions; + for (i = 0, _len = _ref2.length; i < _len; i++) { + node = _ref2[i]; + if (node instanceof Value && node.isObject(true)) { + exps[i] = this.addProperties(node, name, o); + } + } + return child.expressions = exps = flatten(exps); + } + }, this)); + }; + Class.prototype.ensureConstructor = function(name) { + if (!this.ctor) { + this.ctor = new Code; + if (this.parent) { + this.ctor.body.push(new Literal("" + name + ".__super__.constructor.apply(this, arguments)")); + } + if (this.externalCtor) { + this.ctor.body.push(new Literal("" + this.externalCtor + ".apply(this, arguments)")); + } + this.body.expressions.unshift(this.ctor); + } + this.ctor.ctor = this.ctor.name = name; + this.ctor.klass = null; + return this.ctor.noReturn = true; + }; + Class.prototype.compileNode = function(o) { + var decl, klass, lname, name; + decl = this.determineName(); + name = decl || this.name || '_Class'; + lname = new Literal(name); + this.setContext(name); + this.walkBody(name, o); + this.ensureConstructor(name); + if (this.parent) { + this.body.expressions.unshift(new Extends(lname, this.parent)); + } + if (!(this.ctor instanceof Code)) { + this.body.expressions.unshift(this.ctor); + } + this.body.expressions.push(lname); + this.addBoundFunctions(o); + klass = new Parens(Closure.wrap(this.body), true); + if (this.variable) { + klass = new Assign(this.variable, klass); + } + return klass.compile(o); + }; + return Class; + })(); + exports.Assign = Assign = (function() { + __extends(Assign, Base); + function Assign(variable, value, context, options) { + this.variable = variable; + this.value = value; + this.context = context; + this.param = options && options.param; + } + Assign.prototype.children = ['variable', 'value']; + Assign.prototype.assigns = function(name) { + return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); + }; + Assign.prototype.unfoldSoak = function(o) { + return unfoldSoak(o, this, 'variable'); + }; + Assign.prototype.compileNode = function(o) { + var isValue, match, name, val, _ref2; + if (isValue = this.variable instanceof Value) { + if (this.variable.isArray() || this.variable.isObject()) { + return this.compilePatternMatch(o); + } + if (this.variable.isSplice()) { + return this.compileSplice(o); + } + if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') { + return this.compileConditional(o); + } + } + name = this.variable.compile(o, LEVEL_LIST); + if (!(this.context || this.variable.isAssignable())) { + throw SyntaxError("\"" + (this.variable.compile(o)) + "\" cannot be assigned."); + } + if (!(this.context || isValue && (this.variable.namespaced || this.variable.hasProperties()))) { + if (this.param) { + o.scope.add(name, 'var'); + } else { + o.scope.find(name); + } + } + if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) { + this.value.name = match[2]; + if (match[1]) { + this.value.klass = match[1]; + } + } + val = this.value.compile(o, LEVEL_LIST); + if (this.context === 'object') { + return "" + name + ": " + val; + } + val = name + (" " + (this.context || '=') + " ") + val; + if (o.level <= LEVEL_LIST) { + return val; + } else { + return "(" + val + ")"; + } + }; + Assign.prototype.compilePatternMatch = function(o) { + var acc, assigns, code, i, idx, isObject, ivar, obj, objects, olen, ref, rest, splat, top, val, value, vvar, _len, _ref2, _ref3, _ref4, _ref5; + top = o.level === LEVEL_TOP; + value = this.value; + objects = this.variable.base.objects; + if (!(olen = objects.length)) { + code = value.compile(o); + if (o.level >= LEVEL_OP) { + return "(" + code + ")"; + } else { + return code; + } + } + isObject = this.variable.isObject(); + if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) { + if (obj instanceof Assign) { + _ref2 = obj, idx = _ref2.variable.base, obj = _ref2.value; + } else { + if (obj.base instanceof Parens) { + _ref3 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref3[0], idx = _ref3[1]; + } else { + idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0); + } + } + acc = IDENTIFIER.test(idx.unwrap().value || 0); + value = new Value(value); + value.properties.push(new (acc ? Access : Index)(idx)); + return new Assign(obj, value, null, { + param: this.param + }).compile(o, LEVEL_TOP); + } + vvar = value.compile(o, LEVEL_LIST); + assigns = []; + splat = false; + if (!IDENTIFIER.test(vvar) || this.variable.assigns(vvar)) { + assigns.push("" + (ref = o.scope.freeVariable('ref')) + " = " + vvar); + vvar = ref; + } + for (i = 0, _len = objects.length; i < _len; i++) { + obj = objects[i]; + idx = i; + if (isObject) { + if (obj instanceof Assign) { + _ref4 = obj, idx = _ref4.variable.base, obj = _ref4.value; + } else { + if (obj.base instanceof Parens) { + _ref5 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref5[0], idx = _ref5[1]; + } else { + idx = obj["this"] ? obj.properties[0].name : obj; + } + } + } + if (!splat && obj instanceof Splat) { + val = "" + olen + " <= " + vvar + ".length ? " + (utility('slice')) + ".call(" + vvar + ", " + i; + if (rest = olen - i - 1) { + ivar = o.scope.freeVariable('i'); + val += ", " + ivar + " = " + vvar + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; + } else { + val += ") : []"; + } + val = new Literal(val); + splat = "" + ivar + "++"; + } else { + if (obj instanceof Splat) { + obj = obj.name.compile(o); + throw SyntaxError("multiple splats are disallowed in an assignment: " + obj + " ..."); + } + if (typeof idx === 'number') { + idx = new Literal(splat || idx); + acc = false; + } else { + acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0); + } + val = new Value(new Literal(vvar), [new (acc ? Access : Index)(idx)]); + } + assigns.push(new Assign(obj, val, null, { + param: this.param + }).compile(o, LEVEL_TOP)); + } + if (!top) { + assigns.push(vvar); + } + code = assigns.join(', '); + if (o.level < LEVEL_LIST) { + return code; + } else { + return "(" + code + ")"; + } + }; + Assign.prototype.compileConditional = function(o) { + var left, rite, _ref2; + _ref2 = this.variable.cacheReference(o), left = _ref2[0], rite = _ref2[1]; + if (__indexOf.call(this.context, "?") >= 0) { + o.isExistentialEquals = true; + } + return new Op(this.context.slice(0, -1), left, new Assign(rite, this.value, '=')).compile(o); + }; + Assign.prototype.compileSplice = function(o) { + var code, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4; + _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive; + name = this.variable.compile(o); + _ref3 = (from != null ? from.cache(o, LEVEL_OP) : void 0) || ['0', '0'], fromDecl = _ref3[0], fromRef = _ref3[1]; + if (to) { + if ((from != null ? from.isSimpleNumber() : void 0) && to.isSimpleNumber()) { + to = +to.compile(o) - +fromRef; + if (!exclusive) { + to += 1; + } + } else { + to = to.compile(o) + ' - ' + fromRef; + if (!exclusive) { + to += ' + 1'; + } + } + } else { + to = "9e9"; + } + _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1]; + code = "[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat(" + valDef + ")), " + valRef; + if (o.level > LEVEL_TOP) { + return "(" + code + ")"; + } else { + return code; + } + }; + return Assign; + })(); + exports.Code = Code = (function() { + __extends(Code, Base); + function Code(params, body, tag) { + this.params = params || []; + this.body = body || new Block; + this.bound = tag === 'boundfunc'; + if (this.bound) { + this.context = 'this'; + } + } + Code.prototype.children = ['params', 'body']; + Code.prototype.isStatement = function() { + return !!this.ctor; + }; + Code.prototype.jumps = NO; + Code.prototype.compileNode = function(o) { + var code, exprs, i, idt, lit, p, param, ref, splats, v, val, vars, wasEmpty, _i, _j, _k, _len, _len2, _len3, _len4, _ref2, _ref3, _ref4, _ref5; + o.scope = new Scope(o.scope, this.body, this); + o.scope.shared = del(o, 'sharedScope'); + o.indent += TAB; + delete o.bare; + vars = []; + exprs = []; + _ref2 = this.params; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + param = _ref2[_i]; + if (param.splat) { + _ref3 = this.params; + for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) { + p = _ref3[_j]; + if (p.name.value) { + o.scope.add(p.name.value, 'var', true); + } + } + splats = new Assign(new Value(new Arr((function() { + var _k, _len3, _ref4, _results; + _ref4 = this.params; + _results = []; + for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { + p = _ref4[_k]; + _results.push(p.asReference(o)); + } + return _results; + }).call(this))), new Value(new Literal('arguments'))); + break; + } + } + _ref4 = this.params; + for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { + param = _ref4[_k]; + if (param.isComplex()) { + val = ref = param.asReference(o); + if (param.value) { + val = new Op('?', ref, param.value); + } + exprs.push(new Assign(new Value(param.name), val, '=', { + param: true + })); + } else { + ref = param; + if (param.value) { + lit = new Literal(ref.name.value + ' == null'); + val = new Assign(new Value(param.name), param.value, '='); + exprs.push(new If(lit, val)); + } + } + if (!splats) { + vars.push(ref); + } + } + wasEmpty = this.body.isEmpty(); + if (splats) { + exprs.unshift(splats); + } + if (exprs.length) { + (_ref5 = this.body.expressions).unshift.apply(_ref5, exprs); + } + if (!splats) { + for (i = 0, _len4 = vars.length; i < _len4; i++) { + v = vars[i]; + o.scope.parameter(vars[i] = v.compile(o)); + } + } + if (!(wasEmpty || this.noReturn)) { + this.body.makeReturn(); + } + idt = o.indent; + code = 'function'; + if (this.ctor) { + code += ' ' + this.name; + } + code += '(' + vars.join(', ') + ') {'; + if (!this.body.isEmpty()) { + code += "\n" + (this.body.compileWithDeclarations(o)) + "\n" + this.tab; + } + code += '}'; + if (this.ctor) { + return this.tab + code; + } + if (this.bound) { + return utility('bind') + ("(" + code + ", " + this.context + ")"); + } + if (this.front || (o.level >= LEVEL_ACCESS)) { + return "(" + code + ")"; + } else { + return code; + } + }; + Code.prototype.traverseChildren = function(crossScope, func) { + if (crossScope) { + return Code.__super__.traverseChildren.call(this, crossScope, func); + } + }; + return Code; + })(); + exports.Param = Param = (function() { + __extends(Param, Base); + function Param(name, value, splat) { + this.name = name; + this.value = value; + this.splat = splat; + } + Param.prototype.children = ['name', 'value']; + Param.prototype.compile = function(o) { + return this.name.compile(o, LEVEL_LIST); + }; + Param.prototype.asReference = function(o) { + var node; + if (this.reference) { + return this.reference; + } + node = this.name; + if (node["this"]) { + node = node.properties[0].name; + if (node.value.reserved) { + node = new Literal('_' + node.value); + } + } else if (node.isComplex()) { + node = new Literal(o.scope.freeVariable('arg')); + } + node = new Value(node); + if (this.splat) { + node = new Splat(node); + } + return this.reference = node; + }; + Param.prototype.isComplex = function() { + return this.name.isComplex(); + }; + return Param; + })(); + exports.Splat = Splat = (function() { + __extends(Splat, Base); + Splat.prototype.children = ['name']; + Splat.prototype.isAssignable = YES; + function Splat(name) { + this.name = name.compile ? name : new Literal(name); + } + Splat.prototype.assigns = function(name) { + return this.name.assigns(name); + }; + Splat.prototype.compile = function(o) { + if (this.index != null) { + return this.compileParam(o); + } else { + return this.name.compile(o); + } + }; + Splat.compileSplattedArray = function(o, list, apply) { + var args, base, code, i, index, node, _len; + index = -1; + while ((node = list[++index]) && !(node instanceof Splat)) { + continue; + } + if (index >= list.length) { + return ''; + } + if (list.length === 1) { + code = list[0].compile(o, LEVEL_LIST); + if (apply) { + return code; + } + return "" + (utility('slice')) + ".call(" + code + ")"; + } + args = list.slice(index); + for (i = 0, _len = args.length; i < _len; i++) { + node = args[i]; + code = node.compile(o, LEVEL_LIST); + args[i] = node instanceof Splat ? "" + (utility('slice')) + ".call(" + code + ")" : "[" + code + "]"; + } + if (index === 0) { + return args[0] + (".concat(" + (args.slice(1).join(', ')) + ")"); + } + base = (function() { + var _i, _len2, _ref2, _results; + _ref2 = list.slice(0, index); + _results = []; + for (_i = 0, _len2 = _ref2.length; _i < _len2; _i++) { + node = _ref2[_i]; + _results.push(node.compile(o, LEVEL_LIST)); + } + return _results; + })(); + return "[" + (base.join(', ')) + "].concat(" + (args.join(', ')) + ")"; + }; + return Splat; + })(); + exports.While = While = (function() { + __extends(While, Base); + function While(condition, options) { + this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; + this.guard = options != null ? options.guard : void 0; + } + While.prototype.children = ['condition', 'guard', 'body']; + While.prototype.isStatement = YES; + While.prototype.makeReturn = function() { + this.returns = true; + return this; + }; + While.prototype.addBody = function(body) { + this.body = body; + return this; + }; + While.prototype.jumps = function() { + var expressions, node, _i, _len; + expressions = this.body.expressions; + if (!expressions.length) { + return false; + } + for (_i = 0, _len = expressions.length; _i < _len; _i++) { + node = expressions[_i]; + if (node.jumps({ + loop: true + })) { + return node; + } + } + return false; + }; + While.prototype.compileNode = function(o) { + var body, code, rvar, set; + o.indent += TAB; + set = ''; + body = this.body; + if (body.isEmpty()) { + body = ''; + } else { + if (o.level > LEVEL_TOP || this.returns) { + rvar = o.scope.freeVariable('results'); + set = "" + this.tab + rvar + " = [];\n"; + if (body) { + body = Push.wrap(rvar, body); + } + } + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + body = "\n" + (body.compile(o, LEVEL_TOP)) + "\n" + this.tab; + } + code = set + this.tab + ("while (" + (this.condition.compile(o, LEVEL_PAREN)) + ") {" + body + "}"); + if (this.returns) { + code += "\n" + this.tab + "return " + rvar + ";"; + } + return code; + }; + return While; + })(); + exports.Op = Op = (function() { + var CONVERSIONS, INVERSIONS; + __extends(Op, Base); + function Op(op, first, second, flip) { + var call; + if (op === 'in') { + return new In(first, second); + } + if (op === 'do') { + call = new Call(first, first.params || []); + call["do"] = true; + return call; + } + if (op === 'new') { + if (first instanceof Call && !first["do"]) { + return first.newInstance(); + } + if (first instanceof Code && first.bound || first["do"]) { + first = new Parens(first); + } + } + this.operator = CONVERSIONS[op] || op; + this.first = first; + this.second = second; + this.flip = !!flip; + return this; + } + CONVERSIONS = { + '==': '===', + '!=': '!==', + 'of': 'in' + }; + INVERSIONS = { + '!==': '===', + '===': '!==' + }; + Op.prototype.children = ['first', 'second']; + Op.prototype.isSimpleNumber = NO; + Op.prototype.isUnary = function() { + return !this.second; + }; + Op.prototype.isComplex = function() { + var _ref2; + return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex(); + }; + Op.prototype.isChainable = function() { + var _ref2; + return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!=='; + }; + Op.prototype.invert = function() { + var allInvertable, curr, fst, op, _ref2; + if (this.isChainable() && this.first.isChainable()) { + allInvertable = true; + curr = this; + while (curr && curr.operator) { + allInvertable && (allInvertable = curr.operator in INVERSIONS); + curr = curr.first; + } + if (!allInvertable) { + return new Parens(this).invert(); + } + curr = this; + while (curr && curr.operator) { + curr.invert = !curr.invert; + curr.operator = INVERSIONS[curr.operator]; + curr = curr.first; + } + return this; + } else if (op = INVERSIONS[this.operator]) { + this.operator = op; + if (this.first.unwrap() instanceof Op) { + this.first.invert(); + } + return this; + } else if (this.second) { + return new Parens(this).invert(); + } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) { + return fst; + } else { + return new Op('!', this); + } + }; + Op.prototype.unfoldSoak = function(o) { + var _ref2; + return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first'); + }; + Op.prototype.compileNode = function(o) { + var code; + if (this.isUnary()) { + return this.compileUnary(o); + } + if (this.isChainable() && this.first.isChainable()) { + return this.compileChain(o); + } + if (this.operator === '?') { + return this.compileExistence(o); + } + this.first.front = this.front; + code = this.first.compile(o, LEVEL_OP) + ' ' + this.operator + ' ' + this.second.compile(o, LEVEL_OP); + if (o.level <= LEVEL_OP) { + return code; + } else { + return "(" + code + ")"; + } + }; + Op.prototype.compileChain = function(o) { + var code, fst, shared, _ref2; + _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1]; + fst = this.first.compile(o, LEVEL_OP); + code = "" + fst + " " + (this.invert ? '&&' : '||') + " " + (shared.compile(o)) + " " + this.operator + " " + (this.second.compile(o, LEVEL_OP)); + return "(" + code + ")"; + }; + Op.prototype.compileExistence = function(o) { + var fst, ref; + if (this.first.isComplex()) { + ref = new Literal(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, this.first)); + } else { + fst = this.first; + ref = fst; + } + return new If(new Existence(fst), ref, { + type: 'if' + }).addElse(this.second).compile(o); + }; + Op.prototype.compileUnary = function(o) { + var op, parts; + parts = [op = this.operator]; + if ((op === 'new' || op === 'typeof' || op === 'delete') || (op === '+' || op === '-') && this.first instanceof Op && this.first.operator === op) { + parts.push(' '); + } + if (op === 'new' && this.first.isStatement(o)) { + this.first = new Parens(this.first); + } + parts.push(this.first.compile(o, LEVEL_OP)); + if (this.flip) { + parts.reverse(); + } + return parts.join(''); + }; + Op.prototype.toString = function(idt) { + return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); + }; + return Op; + })(); + exports.In = In = (function() { + __extends(In, Base); + function In(object, array) { + this.object = object; + this.array = array; + } + In.prototype.children = ['object', 'array']; + In.prototype.invert = NEGATE; + In.prototype.compileNode = function(o) { + var hasSplat, obj, _i, _len, _ref2; + if (this.array instanceof Value && this.array.isArray()) { + _ref2 = this.array.base.objects; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + obj = _ref2[_i]; + if (obj instanceof Splat) { + hasSplat = true; + break; + } + } + if (!hasSplat) { + return this.compileOrTest(o); + } + } + return this.compileLoopTest(o); + }; + In.prototype.compileOrTest = function(o) { + var cmp, cnj, i, item, ref, sub, tests, _ref2, _ref3; + _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1]; + _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1]; + tests = (function() { + var _len, _ref4, _results; + _ref4 = this.array.base.objects; + _results = []; + for (i = 0, _len = _ref4.length; i < _len; i++) { + item = _ref4[i]; + _results.push((i ? ref : sub) + cmp + item.compile(o, LEVEL_OP)); + } + return _results; + }).call(this); + if (tests.length === 0) { + return 'false'; + } + tests = tests.join(cnj); + if (o.level < LEVEL_OP) { + return tests; + } else { + return "(" + tests + ")"; + } + }; + In.prototype.compileLoopTest = function(o) { + var code, ref, sub, _ref2; + _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1]; + code = utility('indexOf') + (".call(" + (this.array.compile(o, LEVEL_LIST)) + ", " + ref + ") ") + (this.negated ? '< 0' : '>= 0'); + if (sub === ref) { + return code; + } + code = sub + ', ' + code; + if (o.level < LEVEL_LIST) { + return code; + } else { + return "(" + code + ")"; + } + }; + In.prototype.toString = function(idt) { + return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); + }; + return In; + })(); + exports.Try = Try = (function() { + __extends(Try, Base); + function Try(attempt, error, recovery, ensure) { + this.attempt = attempt; + this.error = error; + this.recovery = recovery; + this.ensure = ensure; + } + Try.prototype.children = ['attempt', 'recovery', 'ensure']; + Try.prototype.isStatement = YES; + Try.prototype.jumps = function(o) { + var _ref2; + return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0); + }; + Try.prototype.makeReturn = function() { + if (this.attempt) { + this.attempt = this.attempt.makeReturn(); + } + if (this.recovery) { + this.recovery = this.recovery.makeReturn(); + } + return this; + }; + Try.prototype.compileNode = function(o) { + var catchPart, errorPart; + o.indent += TAB; + errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' '; + catchPart = this.recovery ? " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : !(this.ensure || this.recovery) ? ' catch (_e) {}' : void 0; + return ("" + this.tab + "try {\n" + (this.attempt.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" + (catchPart || '')) + (this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : ''); + }; + return Try; + })(); + exports.Throw = Throw = (function() { + __extends(Throw, Base); + function Throw(expression) { + this.expression = expression; + } + Throw.prototype.children = ['expression']; + Throw.prototype.isStatement = YES; + Throw.prototype.jumps = NO; + Throw.prototype.makeReturn = THIS; + Throw.prototype.compileNode = function(o) { + return this.tab + ("throw " + (this.expression.compile(o)) + ";"); + }; + return Throw; + })(); + exports.Existence = Existence = (function() { + __extends(Existence, Base); + function Existence(expression) { + this.expression = expression; + } + Existence.prototype.children = ['expression']; + Existence.prototype.invert = NEGATE; + Existence.prototype.compileNode = function(o) { + var cmp, cnj, code, _ref2; + code = this.expression.compile(o, LEVEL_OP); + code = IDENTIFIER.test(code) && !o.scope.check(code) ? ((_ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1], _ref2), "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null") : "" + code + " " + (this.negated ? '==' : '!=') + " null"; + if (o.level <= LEVEL_COND) { + return code; + } else { + return "(" + code + ")"; + } + }; + return Existence; + })(); + exports.Parens = Parens = (function() { + __extends(Parens, Base); + function Parens(body) { + this.body = body; + } + Parens.prototype.children = ['body']; + Parens.prototype.unwrap = function() { + return this.body; + }; + Parens.prototype.isComplex = function() { + return this.body.isComplex(); + }; + Parens.prototype.makeReturn = function() { + return this.body.makeReturn(); + }; + Parens.prototype.compileNode = function(o) { + var bare, code, expr; + expr = this.body.unwrap(); + if (expr instanceof Value && expr.isAtomic()) { + expr.front = this.front; + return expr.compile(o); + } + code = expr.compile(o, LEVEL_PAREN); + bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)); + if (bare) { + return code; + } else { + return "(" + code + ")"; + } + }; + return Parens; + })(); + exports.For = For = (function() { + __extends(For, Base); + function For(body, source) { + var _ref2; + this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; + this.body = Block.wrap([body]); + this.own = !!source.own; + this.object = !!source.object; + if (this.object) { + _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1]; + } + if (this.index instanceof Value) { + throw SyntaxError('index cannot be a pattern matching expression'); + } + this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length; + this.pattern = this.name instanceof Value; + if (this.range && this.index) { + throw SyntaxError('indexes do not apply to range loops'); + } + if (this.range && this.pattern) { + throw SyntaxError('cannot pattern match over range loops'); + } + this.returns = false; + } + For.prototype.children = ['body', 'source', 'guard', 'step']; + For.prototype.isStatement = YES; + For.prototype.jumps = While.prototype.jumps; + For.prototype.makeReturn = function() { + this.returns = true; + return this; + }; + For.prototype.compileNode = function(o) { + var body, defPart, forPart, forVarPart, guardPart, idt1, index, ivar, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, stepPart, stepvar, svar, varPart, _ref2; + body = Block.wrap([this.body]); + lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0; + if (lastJumps && lastJumps instanceof Return) { + this.returns = false; + } + source = this.range ? this.source.base : this.source; + scope = o.scope; + name = this.name && this.name.compile(o, LEVEL_LIST); + index = this.index && this.index.compile(o, LEVEL_LIST); + if (name && !this.pattern) { + scope.find(name, { + immediate: true + }); + } + if (index) { + scope.find(index, { + immediate: true + }); + } + if (this.returns) { + rvar = scope.freeVariable('results'); + } + ivar = (this.range ? name : index) || scope.freeVariable('i'); + if (this.step && !this.range) { + stepvar = scope.freeVariable("step"); + } + if (this.pattern) { + name = ivar; + } + varPart = ''; + guardPart = ''; + defPart = ''; + idt1 = this.tab + TAB; + if (this.range) { + forPart = source.compile(merge(o, { + index: ivar, + step: this.step + })); + } else { + svar = this.source.compile(o, LEVEL_LIST); + if ((name || this.own) && !IDENTIFIER.test(svar)) { + defPart = "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; + svar = ref; + } + if (name && !this.pattern) { + namePart = "" + name + " = " + svar + "[" + ivar + "]"; + } + if (!this.object) { + lvar = scope.freeVariable('len'); + forVarPart = ("" + ivar + " = 0, " + lvar + " = " + svar + ".length") + (this.step ? ", " + stepvar + " = " + (this.step.compile(o, LEVEL_OP)) : ''); + stepPart = this.step ? "" + ivar + " += " + stepvar : "" + ivar + "++"; + forPart = "" + forVarPart + "; " + ivar + " < " + lvar + "; " + stepPart; + } + } + if (this.returns) { + resultPart = "" + this.tab + rvar + " = [];\n"; + returnResult = "\n" + this.tab + "return " + rvar + ";"; + body = Push.wrap(rvar, body); + } + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + if (this.pattern) { + body.expressions.unshift(new Assign(this.name, new Literal("" + svar + "[" + ivar + "]"))); + } + defPart += this.pluckDirectCall(o, body); + if (namePart) { + varPart = "\n" + idt1 + namePart + ";"; + } + if (this.object) { + forPart = "" + ivar + " in " + svar; + if (this.own) { + guardPart = "\n" + idt1 + "if (!" + (utility('hasProp')) + ".call(" + svar + ", " + ivar + ")) continue;"; + } + } + body = body.compile(merge(o, { + indent: idt1 + }), LEVEL_TOP); + if (body) { + body = '\n' + body + '\n'; + } + return "" + defPart + (resultPart || '') + this.tab + "for (" + forPart + ") {" + guardPart + varPart + body + this.tab + "}" + (returnResult || ''); + }; + For.prototype.pluckDirectCall = function(o, body) { + var base, defs, expr, fn, idx, ref, val, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; + defs = ''; + _ref2 = body.expressions; + for (idx = 0, _len = _ref2.length; idx < _len; idx++) { + expr = _ref2[idx]; + expr = expr.unwrapAll(); + if (!(expr instanceof Call)) { + continue; + } + val = expr.variable.unwrapAll(); + if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) { + continue; + } + fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val; + ref = new Literal(o.scope.freeVariable('fn')); + base = new Value(ref); + if (val.base) { + _ref7 = [base, val], val.base = _ref7[0], base = _ref7[1]; + args.unshift(new Literal('this')); + } + body.expressions[idx] = new Call(base, expr.args); + defs += this.tab + new Assign(ref, fn).compile(o, LEVEL_TOP) + ';\n'; + } + return defs; + }; + return For; + })(); + exports.Switch = Switch = (function() { + __extends(Switch, Base); + function Switch(subject, cases, otherwise) { + this.subject = subject; + this.cases = cases; + this.otherwise = otherwise; + } + Switch.prototype.children = ['subject', 'cases', 'otherwise']; + Switch.prototype.isStatement = YES; + Switch.prototype.jumps = function(o) { + var block, conds, _i, _len, _ref2, _ref3, _ref4; + if (o == null) { + o = { + block: true + }; + } + _ref2 = this.cases; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1]; + if (block.jumps(o)) { + return block; + } + } + return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0; + }; + Switch.prototype.makeReturn = function() { + var pair, _i, _len, _ref2, _ref3; + _ref2 = this.cases; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + pair = _ref2[_i]; + pair[1].makeReturn(); + } + if ((_ref3 = this.otherwise) != null) { + _ref3.makeReturn(); + } + return this; + }; + Switch.prototype.compileNode = function(o) { + var block, body, code, cond, conditions, expr, i, idt1, idt2, _i, _len, _len2, _ref2, _ref3, _ref4, _ref5; + idt1 = o.indent + TAB; + idt2 = o.indent = idt1 + TAB; + code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + ") {\n"); + _ref3 = this.cases; + for (i = 0, _len = _ref3.length; i < _len; i++) { + _ref4 = _ref3[i], conditions = _ref4[0], block = _ref4[1]; + _ref5 = flatten([conditions]); + for (_i = 0, _len2 = _ref5.length; _i < _len2; _i++) { + cond = _ref5[_i]; + if (!this.subject) { + cond = cond.invert(); + } + code += idt1 + ("case " + (cond.compile(o, LEVEL_PAREN)) + ":\n"); + } + if (body = block.compile(o, LEVEL_TOP)) { + code += body + '\n'; + } + if (i === this.cases.length - 1 && !this.otherwise) { + break; + } + expr = this.lastNonComment(block.expressions); + if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { + continue; + } + code += idt2 + 'break;\n'; + } + if (this.otherwise && this.otherwise.expressions.length) { + code += idt1 + ("default:\n" + (this.otherwise.compile(o, LEVEL_TOP)) + "\n"); + } + return code + this.tab + '}'; + }; + return Switch; + })(); + exports.If = If = (function() { + __extends(If, Base); + function If(condition, body, options) { + this.body = body; + if (options == null) { + options = {}; + } + this.condition = options.type === 'unless' ? condition.invert() : condition; + this.elseBody = null; + this.isChain = false; + this.soak = options.soak; + } + If.prototype.children = ['condition', 'body', 'elseBody']; + If.prototype.bodyNode = function() { + var _ref2; + return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0; + }; + If.prototype.elseBodyNode = function() { + var _ref2; + return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0; + }; + If.prototype.addElse = function(elseBody) { + if (this.isChain) { + this.elseBodyNode().addElse(elseBody); + } else { + this.isChain = elseBody instanceof If; + this.elseBody = this.ensureBlock(elseBody); + } + return this; + }; + If.prototype.isStatement = function(o) { + var _ref2; + return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0); + }; + If.prototype.jumps = function(o) { + var _ref2; + return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0); + }; + If.prototype.compileNode = function(o) { + if (this.isStatement(o)) { + return this.compileStatement(o); + } else { + return this.compileExpression(o); + } + }; + If.prototype.makeReturn = function() { + this.body && (this.body = new Block([this.body.makeReturn()])); + this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn()])); + return this; + }; + If.prototype.ensureBlock = function(node) { + if (node instanceof Block) { + return node; + } else { + return new Block([node]); + } + }; + If.prototype.compileStatement = function(o) { + var body, child, cond, exeq, ifPart; + child = del(o, 'chainChild'); + exeq = del(o, 'isExistentialEquals'); + if (exeq) { + return new If(this.condition.invert(), this.elseBodyNode(), { + type: 'if' + }).compile(o); + } + cond = this.condition.compile(o, LEVEL_PAREN); + o.indent += TAB; + body = this.ensureBlock(this.body).compile(o); + if (body) { + body = "\n" + body + "\n" + this.tab; + } + ifPart = "if (" + cond + ") {" + body + "}"; + if (!child) { + ifPart = this.tab + ifPart; + } + if (!this.elseBody) { + return ifPart; + } + return ifPart + ' else ' + (this.isChain ? (o.indent = this.tab, o.chainChild = true, this.elseBody.unwrap().compile(o, LEVEL_TOP)) : "{\n" + (this.elseBody.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"); + }; + If.prototype.compileExpression = function(o) { + var alt, body, code, cond; + cond = this.condition.compile(o, LEVEL_COND); + body = this.bodyNode().compile(o, LEVEL_LIST); + alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0'; + code = "" + cond + " ? " + body + " : " + alt; + if (o.level >= LEVEL_COND) { + return "(" + code + ")"; + } else { + return code; + } + }; + If.prototype.unfoldSoak = function() { + return this.soak && this; + }; + return If; + })(); + Push = { + wrap: function(name, exps) { + if (exps.isEmpty() || last(exps.expressions).jumps()) { + return exps; + } + return exps.push(new Call(new Value(new Literal(name), [new Access(new Literal('push'))]), [exps.pop()])); + } + }; + Closure = { + wrap: function(expressions, statement, noReturn) { + var args, call, func, mentionsArgs, meth; + if (expressions.jumps()) { + return expressions; + } + func = new Code([], Block.wrap([expressions])); + args = []; + if ((mentionsArgs = expressions.contains(this.literalArgs)) || expressions.contains(this.literalThis)) { + meth = new Literal(mentionsArgs ? 'apply' : 'call'); + args = [new Literal('this')]; + if (mentionsArgs) { + args.push(new Literal('arguments')); + } + func = new Value(func, [new Access(meth)]); + } + func.noReturn = noReturn; + call = new Call(func, args); + if (statement) { + return Block.wrap([call]); + } else { + return call; + } + }, + literalArgs: function(node) { + return node instanceof Literal && node.value === 'arguments' && !node.asKey; + }, + literalThis: function(node) { + return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound); + } + }; + unfoldSoak = function(o, parent, name) { + var ifn; + if (!(ifn = parent[name].unfoldSoak(o))) { + return; + } + parent[name] = ifn.body; + ifn.body = new Value(parent); + return ifn; + }; + UTILITIES = { + "extends": 'function(child, parent) {\n for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor;\n child.__super__ = parent.prototype;\n return child;\n}', + bind: 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }', + indexOf: 'Array.prototype.indexOf || function(item) {\n for (var i = 0, l = this.length; i < l; i++) {\n if (this[i] === item) return i;\n }\n return -1;\n}', + hasProp: 'Object.prototype.hasOwnProperty', + slice: 'Array.prototype.slice' + }; + LEVEL_TOP = 1; + LEVEL_PAREN = 2; + LEVEL_LIST = 3; + LEVEL_COND = 4; + LEVEL_OP = 5; + LEVEL_ACCESS = 6; + TAB = ' '; + IDENTIFIER = /^[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*$/; + SIMPLENUM = /^[+-]?\d+$/; + METHOD_DEF = /^(?:([$A-Za-z_][$\w\x7f-\uffff]*)\.prototype\.)?([$A-Za-z_][$\w\x7f-\uffff]*)$/; + IS_STRING = /^['"]/; + utility = function(name) { + var ref; + ref = "__" + name; + Scope.root.assign(ref, UTILITIES[name]); + return ref; + }; + multident = function(code, tab) { + return code.replace(/\n/g, '$&' + tab); + }; +}); +/** + * Copyright (c) 2011 Jeremy Ashkenas + * + * 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. + */ + +define('ace/mode/coffee/scope', ['require', 'exports', 'module' , 'ace/mode/coffee/helpers'], function(require, exports, module) { + var Scope, extend, last, _ref; + _ref = require('./helpers'), extend = _ref.extend, last = _ref.last; + exports.Scope = Scope = (function() { + Scope.root = null; + function Scope(parent, expressions, method) { + this.parent = parent; + this.expressions = expressions; + this.method = method; + this.variables = [ + { + name: 'arguments', + type: 'arguments' + } + ]; + this.positions = {}; + if (!this.parent) { + Scope.root = this; + } + } + Scope.prototype.add = function(name, type, immediate) { + var pos; + if (this.shared && !immediate) { + return this.parent.add(name, type, immediate); + } + if (typeof (pos = this.positions[name]) === 'number') { + return this.variables[pos].type = type; + } else { + return this.positions[name] = this.variables.push({ + name: name, + type: type + }) - 1; + } + }; + Scope.prototype.find = function(name, options) { + if (this.check(name, options)) { + return true; + } + this.add(name, 'var'); + return false; + }; + Scope.prototype.parameter = function(name) { + if (this.shared && this.parent.check(name, true)) { + return; + } + return this.add(name, 'param'); + }; + Scope.prototype.check = function(name, immediate) { + var found, _ref2; + found = !!this.type(name); + if (found || immediate) { + return found; + } + return !!((_ref2 = this.parent) != null ? _ref2.check(name) : void 0); + }; + Scope.prototype.temporary = function(name, index) { + if (name.length > 1) { + return '_' + name + (index > 1 ? index : ''); + } else { + return '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a'); + } + }; + Scope.prototype.type = function(name) { + var v, _i, _len, _ref2; + _ref2 = this.variables; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + v = _ref2[_i]; + if (v.name === name) { + return v.type; + } + } + return null; + }; + Scope.prototype.freeVariable = function(type) { + var index, temp; + index = 0; + while (this.check((temp = this.temporary(type, index)))) { + index++; + } + this.add(temp, 'var', true); + return temp; + }; + Scope.prototype.assign = function(name, value) { + this.add(name, { + value: value, + assigned: true + }); + return this.hasAssignments = true; + }; + Scope.prototype.hasDeclarations = function() { + return !!this.declaredVariables().length; + }; + Scope.prototype.declaredVariables = function() { + var realVars, tempVars, v, _i, _len, _ref2; + realVars = []; + tempVars = []; + _ref2 = this.variables; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + v = _ref2[_i]; + if (v.type === 'var') { + (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name); + } + } + return realVars.sort().concat(tempVars.sort()); + }; + Scope.prototype.assignedVariables = function() { + var v, _i, _len, _ref2, _results; + _ref2 = this.variables; + _results = []; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + v = _ref2[_i]; + if (v.type.assigned) { + _results.push("" + v.name + " = " + v.type.value); + } + } + return _results; + }; + return Scope; + })(); +}); diff --git a/apps/files_texteditor/js/aceeditor/worker-css.js b/apps/files_texteditor/js/aceeditor/worker-css.js index cfd506b289f..7b179068ae1 100644 --- a/apps/files_texteditor/js/aceeditor/worker-css.js +++ b/apps/files_texteditor/js/aceeditor/worker-css.js @@ -1 +1,9538 @@ -function initSender(){var a=require("pilot/event_emitter").EventEmitter,b=require("pilot/oop"),c=function(){};(function(){b.implement(this,a),this.callback=function(a,b){postMessage({type:"call",id:b,data:a})},this.emit=function(a,b){postMessage({type:"event",name:a,data:b})}}).call(c.prototype);return new c}function initBaseUrls(a){require.tlns=a}var console={log:function(a){postMessage({type:"log",data:a})}},window={console:console},require=function(a){var b=require.modules[a];if(b){b.initialized||(b.exports=b.factory().exports,b.initialized=!0);return b.exports}var c=a.split("/");c[0]=require.tlns[c[0]]||c[0],path=c.join("/")+".js",require.id=a,importScripts(path);return require(a)};require.modules={},require.tlns={};var define=function(a,b,c){arguments.length==2?c=b:arguments.length==1&&(c=a,a=require.id);a.indexOf("text/")!==0&&(require.modules[a]={factory:function(){var a={exports:{}},b=c(require,a.exports,a);b&&(a.exports=b);return a}})},main,sender;onmessage=function(a){var b=a.data;if(b.command)main[b.command].apply(main,b.args);else if(b.init){initBaseUrls(b.tlns),require("pilot/fixoldbrowsers"),sender=initSender();var c=require(b.module)[b.classname];main=new c(sender)}else b.event&&sender&&sender._dispatchEvent(b.event,b.data)},define("pilot/fixoldbrowsers",["require","exports","module"],function(a,b,c){if(!Function.prototype.bind){var d=Array.prototype.slice;Function.prototype.bind=function(a){var b=this;if(typeof b.apply!="function"||typeof b.call!="function")return new TypeError;var c=d.call(arguments),e=function f(){if(this instanceof f){var a=Object.create(b.prototype);b.apply(a,c.concat(d.call(arguments)));return a}return b.call.apply(b,c.concat(d.call(arguments)))};e.length=typeof b=="function"?Math.max(b.length-c.length,0):0;return e}}var e=Function.prototype.call,f=Array.prototype,g=Object.prototype,h=e.bind(g.hasOwnProperty),i,j,k,l,m;if(m=h(g,"__defineGetter__"))i=e.bind(g.__defineGetter__),j=e.bind(g.__defineSetter__),k=e.bind(g.__lookupGetter__),l=e.bind(g.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=+this.length;for(var d=0;d=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c=2)var d=arguments[1];else do{if(c in this){d=this[c--];break}if(--c<0)throw new TypeError}while(!0);for(;c>=0;c--)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length;if(!b)return-1;var c=arguments[1]||0;if(c>=b)return-1;c<0&&(c+=b);for(;c=0;c--){if(!h(this,c))continue;if(a===this[c])return c}return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||a.constructor.prototype});if(!Object.getOwnPropertyDescriptor){var n="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(n+a);if(!h(a,b))return undefined;var c,d,e;c={enumerable:!0,configurable:!0};if(m){var f=a.__proto__;a.__proto__=g;var d=k(a,b),e=l(a,b);a.__proto__=f;if(d||e){d&&(descriptor.get=d),e&&(descriptor.set=e);return descriptor}}descriptor.value=a[b];return descriptor}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}typeof b!="undefined"&&Object.defineProperties(c,b);return c});if(!Object.defineProperty){var o="Property description must be an object: ",p="Object.defineProperty called on non-object: ",q="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function")throw new TypeError(p+a);if(typeof a!="object"||a===null)throw new TypeError(o+c);if(h(c,"value"))if(m&&(k(a,b)||l(a,b))){var d=a.__proto__;a.__proto__=g,delete a[b],a[b]=c.value,a.prototype}else a[b]=c.value;else{if(!m)throw new TypeError(q);h(c,"get")&&i(a,b,c.get),h(c,"set")&&j(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)h(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(r){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){return!0});if(!Object.keys){var s=!0,t=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=t.length;for(var v in{toString:null})s=!1;Object.keys=function W(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var W=[];for(var b in a)h(a,b)&&W.push(b);if(s)for(var c=0,d=u;c=7?new a(c,d,e,f,g,h,i):j>=6?new a(c,d,e,f,g,h):j>=5?new a(c,d,e,f,g):j>=4?new a(c,d,e,f):j>=3?new a(c,d,e):j>=2?new a(c,d):j>=1?new a(c):new a;k.constructor=b;return k}return a.apply(this,arguments)},c=new RegExp("^(?:((?:[+-]\\d\\d)?\\d\\d\\d\\d)(?:-(\\d\\d)(?:-(\\d\\d))?)?)?(?:T(\\d\\d):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?)?(?:Z|([+-])(\\d\\d):(\\d\\d))?$");for(var d in a)b[d]=a[d];b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function e(b){var d=c.exec(b);if(d){d.shift();var e=d[0]===undefined;for(var f=0;f<10;f++){if(f===7)continue;d[f]=+(d[f]||(f<3?1:0)),f===1&&d[f]--}if(e)return((d[3]*60+d[4])*60+d[5])*1e3+d[6];var g=(d[8]*60+d[9])*60*1e3;d[6]==="-"&&(g=-g);return a.UTC.apply(this,d.slice(0,7))+g}return a.parse.apply(this,arguments)};return b}(Date));if(!String.prototype.trim){var w=/^\s\s*/,x=/\s\s*$/;String.prototype.trim=function(){return String(this).replace(w,"").replace(x,"")}}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!!c&&!!c.length){var b=b||{};b.type=a;for(var d=0;d=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length);return a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||""));return a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};this._dispatchEvent("change",{data:e});return d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:d});return c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};this._dispatchEvent("change",{data:e});return d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b!=c){var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};this._dispatchEvent("change",{data:i});return d.start}},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};this._dispatchEvent("change",{data:e});return d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/range",["require","exports","module"],function(a,b,c){var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;b=this.compare(c.row,c.column);if(b==1){b=this.compare(d.row,d.column);return b==1?2:b==0?1:0}if(b==-1)return-2;b=this.compare(d.row,d.column);return b==-1?-1:b==1?42:0},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)||this.isStart(a,b)?!1:!0;return!1},this.insideStart=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)?!1:!0;return!1},this.insideEnd=function(a,b){if(this.compare(a,b)==0)return this.isStart(a,b)?!1:!0;return!1},this.compare=function(a,b){if(!this.isMultiLine()&&a===this.start.row)return bthis.end.column?1:0;return athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.rowthis.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0);return c}}).call(f.prototype)}),define("pilot/lang",["require","exports","module"],function(a,b,c){b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return Array(b+1).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(i=0,l=a.length;i=0&&this._ltIndex-1&&!b[h.type].hide&&(h.channel=b[h.type].channel,this._token=h,this._lt.push(h),this._ltIndexCache.push(this._lt.length-this._ltIndex+e),this._lt.length>5&&this._lt.shift(),this._ltIndexCache.length>5&&this._ltIndexCache.shift(),this._ltIndex=this._lt.length),i=b[h.type];return i&&(i.hide||i.channel!==undefined&&a!==i.channel)?this.get(a):h.type},LA:function(a){var b=a,c;if(a>0){if(a>5)throw new Error("Too much lookahead.");while(b)c=this.get(),b--;while(bthis._tokenData.length?"UNKNOWN_TOKEN":this._tokenData[a].name},tokenType:function(a){return this._tokenData[a]||-1},unget:function(){if(this._ltIndexCache.length)this._ltIndex-=this._ltIndexCache.pop(),this._token=this._lt[this._ltIndex-1];else throw new Error("Too much lookahead.")}},parserlib.util={StringReader:b,SyntaxError:c,SyntaxUnit:d,EventTarget:a,TokenStreamBase:e}})(),function(){function TokenStream(a){TokenStreamBase.call(this,a,Tokens)}function mix(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function isIdentStart(a){return a!=null&&(isNameStart(a)||/\-\\/.test(a))}function isNameChar(a){return a!=null&&(isNameStart(a)||/[0-9\-\\]/.test(a))}function isNameStart(a){return a!=null&&/[a-z_\u0080-\uFFFF\\]/i.test(a)}function isNewLine(a){return a!=null&&nl.test(a)}function isWhitespace(a){return a!=null&&/\s/.test(a)}function isDigit(a){return a!=null&&/\d/.test(a)}function isHexDigit(a){return a!=null&&h.test(a)}function SelectorSubPart(a,b,c,d){SyntaxUnit.call(this,a,c,d),this.type=b,this.args=[]}function SelectorPart(a,b,c,d,e){SyntaxUnit.call(this,c,d,e),this.elementName=a,this.modifiers=b}function Selector(a,b,c){SyntaxUnit.call(this,a.join(" "),b,c),this.parts=a}function PropertyValuePart(text,line,col){SyntaxUnit.apply(this,arguments),this.type="unknown";var temp;if(/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)){this.type="dimension",this.value=+RegExp.$1,this.units=RegExp.$2;switch(this.units.toLowerCase()){case"em":case"rem":case"ex":case"px":case"cm":case"mm":case"in":case"pt":case"pc":this.type="length";break;case"deg":case"rad":case"grad":this.type="angle";break;case"ms":case"s":this.type="time";break;case"hz":case"khz":this.type="frequency";break;case"dpi":case"dpcm":this.type="resolution"}}else/^([+\-]?[\d\.]+)%$/i.test(text)?(this.type="percentage",this.value=+RegExp.$1):/^([+\-]?[\d\.]+)%$/i.test(text)?(this.type="percentage",this.value=+RegExp.$1):/^([+\-]?\d+)$/i.test(text)?(this.type="integer",this.value=+RegExp.$1):/^([+\-]?[\d\.]+)$/i.test(text)?(this.type="number",this.value=+RegExp.$1):/^#([a-f0-9]{3,6})/i.test(text)?(this.type="color",temp=RegExp.$1,temp.length==3?(this.red=parseInt(temp.charAt(0)+temp.charAt(0),16),this.green=parseInt(temp.charAt(1)+temp.charAt(1),16),this.blue=parseInt(temp.charAt(2)+temp.charAt(2),16)):(this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16))):/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1,this.green=+RegExp.$2,this.blue=+RegExp.$3):/^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)?(this.type="color",this.red=+RegExp.$1*255/100,this.green=+RegExp.$2*255/100,this.blue=+RegExp.$3*255/100):/^url\(["']?([^\)"']+)["']?\)/i.test(text)?(this.type="uri",this.uri=RegExp.$1):/^["'][^"']*["']/.test(text)?(this.type="string",this.value=eval(text)):Colors[text.toLowerCase()]?(this.type="color",temp=Colors[text.toLowerCase()].substring(1),this.red=parseInt(temp.substring(0,2),16),this.green=parseInt(temp.substring(2,4),16),this.blue=parseInt(temp.substring(4,6),16)):/^[\,\/]$/.test(text)?(this.type="operator",this.value=text):/^[a-z\-\u0080-\uFFFF][a-z0-9\-\u0080-\uFFFF]*$/i.test(text)&&(this.type="identifier",this.value=text)}function PropertyValue(a,b,c){SyntaxUnit.call(this,a.join(" "),b,c),this.parts=a}function PropertyName(a,b,c,d){SyntaxUnit.call(this,(b||"")+a,c,d),this.hack=b}function Parser(a){EventTarget.call(this),this.options=a||{},this._tokenStream=null}function MediaQuery(a,b,c,d,e){SyntaxUnit.call(this,(a?a+" ":"")+(b?b+" ":"")+c.join(" and "),d,e),this.modifier=a,this.mediaType=b,this.features=c}function MediaFeature(a,b){SyntaxUnit.call(this,"("+a+(b!==null?":"+b:"")+")",a.startLine,a.startCol),this.name=a,this.value=b}function Combinator(a,b,c){SyntaxUnit.call(this,a,b,c),this.type="unknown",/^\s+$/.test(a)?this.type="descendant":a==">"?this.type="child":a=="+"?this.type="adjacent-sibling":a=="~"&&(this.type="sibling")}var EventTarget=parserlib.util.EventTarget,TokenStreamBase=parserlib.util.TokenStreamBase,StringReader=parserlib.util.StringReader,SyntaxError=parserlib.util.SyntaxError,SyntaxUnit=parserlib.util.SyntaxUnit,Colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};Combinator.prototype=new SyntaxUnit,Combinator.prototype.constructor=Combinator;var Level1Properties={background:1,"background-attachment":1,"background-color":1,"background-image":1,"background-position":1,"background-repeat":1,border:1,"border-bottom":1,"border-bottom-width":1,"border-color":1,"border-left":1,"border-left-width":1,"border-right":1,"border-right-width":1,"border-style":1,"border-top":1,"border-top-width":1,"border-width":1,clear:1,color:1,display:1,"float":1,font:1,"font-family":1,"font-size":1,"font-style":1,"font-variant":1,"font-weight":1,height:1,"letter-spacing":1,"line-height":1,"list-style":1,"list-style-image":1,"list-style-position":1,"list-style-type":1,margin:1,"margin-bottom":1,"margin-left":1,"margin-right":1,"margin-top":1,padding:1,"padding-bottom":1,"padding-left":1,"padding-right":1,"padding-top":1,"text-align":1,"text-decoration":1,"text-indent":1,"text-transform":1,"vertical-align":1,"white-space":1,width:1,"word-spacing":1},Level2Properties={azimuth:1,"cue-after":1,"cue-before":1,cue:1,elevation:1,"pause-after":1,"pause-before":1,pause:1,"pitch-range":1,pitch:1,"play-during":1,richness:1,"speak-header":1,"speak-numeral":1,"speak-punctuation":1,speak:1,"speech-rate":1,stress:1,"voice-family":1,volume:1,orphans:1,"page-break-after":1,"page-break-before":1,"page-break-inside":1,widows:1,cursor:1,"outline-color":1,"outline-style":1,"outline-width":1,outline:1,"background-attachment":1,"background-color":1,"background-image":1,"background-position":1,"background-repeat":1,background:1,"border-collapse":1,"border-color":1,"border-spacing":1,"border-style":1,"border-top":1,"border-top-color":1,"border-top-style":1,"border-top-width":1,"border-width":1,border:1,bottom:1,"caption-side":1,clear:1,clip:1,color:1,content:1,"counter-increment":1,"counter-reset":1,direction:1,display:1,"empty-cells":1,"float":1,"font-family":1,"font-size":1,"font-style":1,"font-variant":1,"font-weight":1,font:1,height:1,left:1,"letter-spacing":1,"line-height":1,"list-style-image":1,"list-style-position":1,"list-style-type":1,"list-style":1,"margin-right":1,"margin-top":1,margin:1,"max-height":1,"max-width":1,"min-height":1,"min-width":1,overflow:1,"padding-top":1,padding:1,position:1,quotes:1,right:1,"table-layout":1,"text-align":1,"text-decoration":1,"text-indent":1,"text-transform":1,top:1,"unicode-bidi":1,"vertical-align":1,visibility:1,"white-space":1,width:1,"word-spacing":1,"z-index":1};MediaFeature.prototype=new SyntaxUnit,MediaFeature.prototype.constructor=MediaFeature,MediaQuery.prototype=new SyntaxUnit,MediaQuery.prototype.constructor=MediaQuery,Parser.prototype=function(){var a=new EventTarget,b,c={constructor:Parser,_stylesheet:function(){var a=this._tokenStream,b=null,c,d;this.fire("startstylesheet"),this._charset(),this._skipCruft();while(a.peek()==Tokens.IMPORT_SYM)this._import(),this._skipCruft();while(a.peek()==Tokens.NAMESPACE_SYM)this._namespace(),this._skipCruft();d=a.peek();while(d>Tokens.EOF){try{switch(d){case Tokens.MEDIA_SYM:this._media(),this._skipCruft();break;case Tokens.PAGE_SYM:this._page(),this._skipCruft();break;case Tokens.FONT_FACE_SYM:this._font_face(),this._skipCruft();break;case Tokens.KEYFRAMES_SYM:this._keyframes(),this._skipCruft();break;case Tokens.S:this._readWhitespace();break;default:if(!this._ruleset())switch(d){case Tokens.CHARSET_SYM:c=a.LT(1),this._charset(!1);throw new SyntaxError("@charset not allowed here.",c.startLine,c.startCol);case Tokens.IMPORT_SYM:c=a.LT(1),this._import(!1);throw new SyntaxError("@import not allowed here.",c.startLine,c.startCol);case Tokens.NAMESPACE_SYM:c=a.LT(1),this._namespace(!1);throw new SyntaxError("@namespace not allowed here.",c.startLine,c.startCol);default:a.get(),this._unexpectedToken(a.token())}}}catch(e){if(e instanceof SyntaxError&&!this.options.strict)this.fire({type:"error",error:e,message:e.message,line:e.line,col:e.col});else throw e}d=a.peek()}d!=Tokens.EOF&&this._unexpectedToken(a.token()),this.fire("endstylesheet")},_charset:function(a){var b=this._tokenStream,c,d,e,f;b.match(Tokens.CHARSET_SYM)&&(e=b.token().startLine,f=b.token().startCol,this._readWhitespace(),b.mustMatch(Tokens.STRING),d=b.token(),c=d.value,this._readWhitespace(),b.mustMatch(Tokens.SEMICOLON),a!==!1&&this.fire({type:"charset",charset:c,line:e,col:f}))},_import:function(a){var b=this._tokenStream,c,d,e,f=[];b.mustMatch(Tokens.IMPORT_SYM),e=b.token(),this._readWhitespace(),b.mustMatch([Tokens.STRING,Tokens.URI]),d=b.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/,"$1"),this._readWhitespace(),f=this._media_query_list(),b.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),a!==!1&&this.fire({type:"import",uri:d,media:f,line:e.startLine,col:e.startCol})},_namespace:function(a){var b=this._tokenStream,c,d,e,f;b.mustMatch(Tokens.NAMESPACE_SYM),c=b.token().startLine,d=b.token().startCol,this._readWhitespace(),b.match(Tokens.IDENT)&&(e=b.token().value,this._readWhitespace()),b.mustMatch([Tokens.STRING,Tokens.URI]),f=b.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/,"$1"),this._readWhitespace(),b.mustMatch(Tokens.SEMICOLON),this._readWhitespace(),a!==!1&&this.fire({type:"namespace",prefix:e,uri:f,line:c,col:d})},_media:function(){var a=this._tokenStream,b,c,d;a.mustMatch(Tokens.MEDIA_SYM),b=a.token().startLine,c=a.token().startCol,this._readWhitespace(),d=this._media_query_list(),a.mustMatch(Tokens.LBRACE),this._readWhitespace(),this.fire({type:"startmedia",media:d,line:b,col:c});for(;;)if(a.peek()==Tokens.PAGE_SYM)this._page();else if(!this._ruleset())break;a.mustMatch(Tokens.RBRACE),this._readWhitespace(),this.fire({type:"endmedia",media:d,line:b,col:c})},_media_query_list:function(){var a=this._tokenStream,b=[];this._readWhitespace(),(a.peek()==Tokens.IDENT||a.peek()==Tokens.LPAREN)&&b.push(this._media_query());while(a.match(Tokens.COMMA))this._readWhitespace(),b.push(this._media_query());return b},_media_query:function(){var a=this._tokenStream,b=null,c=null,d=null,e=[];a.match(Tokens.IDENT)&&(c=a.token().value.toLowerCase(),c!="only"&&c!="not"?(a.unget(),c=null):d=a.token()),this._readWhitespace(),a.peek()==Tokens.IDENT?(b=this._media_type(),d===null&&(d=a.token())):a.peek()==Tokens.LPAREN&&(d===null&&(d=a.LT(1)),e.push(this._media_expression()));if(b===null&&e.length===0)return null;this._readWhitespace();while(a.match(Tokens.IDENT))a.token().value.toLowerCase()!="and"&&this._unexpectedToken(a.token()),this._readWhitespace(),e.push(this._media_expression());return new MediaQuery(c,b,e,d.startLine,d.startCol)},_media_type:function(){return this._media_feature()},_media_expression:function(){var a=this._tokenStream,b=null,c,d=null;a.mustMatch(Tokens.LPAREN),b=this._media_feature(),this._readWhitespace(),a.match(Tokens.COLON)&&(this._readWhitespace(),c=a.LT(1),d=this._expression()),a.mustMatch(Tokens.RPAREN),this._readWhitespace();return new MediaFeature(b,d?new SyntaxUnit(d,c.startLine,c.startCol):null)},_media_feature:function(){var a=this._tokenStream;a.mustMatch(Tokens.IDENT);return SyntaxUnit.fromToken(a.token())},_page:function(){var a=this._tokenStream,b,c,d=null,e=null;a.mustMatch(Tokens.PAGE_SYM),b=a.token().startLine,c=a.token().startCol,this._readWhitespace(),a.match(Tokens.IDENT)&&(d=a.token().value,d.toLowerCase()==="auto"&&this._unexpectedToken(a.token())),a.peek()==Tokens.COLON&&(e=this._pseudo_page()),this._readWhitespace(),this.fire({type:"startpage",id:d,pseudo:e,line:b,col:c}),this._readDeclarations(!0,!0),this.fire({type:"endpage",id:d,pseudo:e,line:b,col:c})},_margin:function(){var a=this._tokenStream,b,c,d=this._margin_sym();if(d){b=a.token().startLine,c=a.token().startCol,this.fire({type:"startpagemargin",margin:d,line:b,col:c}),this._readDeclarations(!0),this.fire({type:"endpagemargin",margin:d,line:b,col:c});return!0}return!1},_margin_sym:function(){var a=this._tokenStream;return a.match([Tokens.TOPLEFTCORNER_SYM,Tokens.TOPLEFT_SYM,Tokens.TOPCENTER_SYM,Tokens.TOPRIGHT_SYM,Tokens.TOPRIGHTCORNER_SYM,Tokens.BOTTOMLEFTCORNER_SYM,Tokens.BOTTOMLEFT_SYM,Tokens.BOTTOMCENTER_SYM,Tokens.BOTTOMRIGHT_SYM,Tokens.BOTTOMRIGHTCORNER_SYM,Tokens.LEFTTOP_SYM,Tokens.LEFTMIDDLE_SYM,Tokens.LEFTBOTTOM_SYM,Tokens.RIGHTTOP_SYM,Tokens.RIGHTMIDDLE_SYM,Tokens.RIGHTBOTTOM_SYM])?SyntaxUnit.fromToken(a.token()):null},_pseudo_page:function(){var a=this._tokenStream;a.mustMatch(Tokens.COLON),a.mustMatch(Tokens.IDENT);return a.token().value},_font_face:function(){var a=this._tokenStream,b,c;a.mustMatch(Tokens.FONT_FACE_SYM),b=a.token().startLine,c=a.token().startCol,this._readWhitespace(),this.fire({type:"startfontface",line:b,col:c}),this._readDeclarations(!0),this.fire({type:"endfontface",line:b,col:c})},_operator:function(){var a=this._tokenStream,b=null;a.match([Tokens.SLASH,Tokens.COMMA])&&(b=a.token(),this._readWhitespace());return b?PropertyValuePart.fromToken(b):null},_combinator:function(){var a=this._tokenStream,b=null,c;a.match([Tokens.PLUS,Tokens.GREATER,Tokens.TILDE])&&(c=a.token(),b=new Combinator(c.value,c.startLine,c.startCol),this._readWhitespace());return b},_unary_operator:function(){var a=this._tokenStream;return a.match([Tokens.MINUS,Tokens.PLUS])?a.token().value:null},_property:function(){var a=this._tokenStream,b=null,c=null,d,e,f,g;a.peek()==Tokens.STAR&&this.options.starHack&&(a.get(),e=a.token(),c=e.value,f=e.startLine,g=e.startCol),a.match(Tokens.IDENT)&&(e=a.token(),d=e.value,d.charAt(0)=="_"&&this.options.underscoreHack&&(c="_",d=d.substring(1)),b=new PropertyName(d,c,f||e.startLine,g||e.startCol),this._readWhitespace());return b},_ruleset:function(){var a=this._tokenStream,b,c;try{c=this._selectors_group()}catch(d){if(!(d instanceof SyntaxError&&!this.options.strict))throw d;this.fire({type:"error",error:d,message:d.message,line:d.line,col:d.col}),b=a.advance([Tokens.RBRACE]);if(b!=Tokens.RBRACE)throw d;return!0}c&&(this.fire({type:"startrule",selectors:c,line:c[0].line,col:c[0].col}),this._readDeclarations(!0),this.fire({type:"endrule",selectors:c,line:c[0].line,col:c[0].col}));return c},_selectors_group:function(){var a=this._tokenStream,b=[],c;c=this._selector();if(c!==null){b.push(c);while(a.match(Tokens.COMMA))this._readWhitespace(),c=this._selector(),c!==null?b.push(c):this._unexpectedToken(a.LT(1))}return b.length?b:null},_selector:function(){var a=this._tokenStream,b=[],c=null,d=null,e=null;c=this._simple_selector_sequence();if(c===null)return null;b.push(c);do{d=this._combinator();if(d!==null)b.push(d),c=this._simple_selector_sequence(),c===null?this._unexpectedToken(this.LT(1)):b.push(c);else if(this._readWhitespace())e=new Combinator(a.token().value,a.token().startLine,a.token().startCol),d=this._combinator(),c=this._simple_selector_sequence(),c===null?d!==null&&this._unexpectedToken(a.LT(1)):(d!==null?b.push(d):b.push(e),b.push(c));else break}while(!0);return new Selector(b,b[0].line,b[0].col)},_simple_selector_sequence:function(){var a=this._tokenStream,b=null,c=[],d="",e=[function(){return a.match(Tokens.HASH)?new SelectorSubPart(a.token().value,"id",a.token().startLine,a.token().startCol):null},this._class,this._attrib,this._pseudo,this._negation],f=0,g=e.length,h=null,i=!1,j,k;j=a.LT(1).startLine,k=a.LT(1).startCol,b=this._type_selector(),b||(b=this._universal()),b!==null&&(d+=b);for(;;){if(a.peek()===Tokens.S)break;while(f1&&a.unget());return null}b&&(c.text=b+c.text,c.col-=b.length);return c},_class:function(){var a=this._tokenStream,b;if(a.match(Tokens.DOT)){a.mustMatch(Tokens.IDENT),b=a.token();return new SelectorSubPart("."+b.value,"class",b.startLine,b.startCol-1)}return null},_element_name:function(){var a=this._tokenStream,b;if(a.match(Tokens.IDENT)){b=a.token();return new SelectorSubPart(b.value,"elementName",b.startLine,b.startCol)}return null},_namespace_prefix:function(){var a=this._tokenStream,b="";if(a.LA(1)===Tokens.PIPE||a.LA(2)===Tokens.PIPE)a.match([Tokens.IDENT,Tokens.STAR])&&(b+=a.token().value),a.mustMatch(Tokens.PIPE),b+="|";return b.length?b:null},_universal:function(){var a=this._tokenStream,b="",c;c=this._namespace_prefix(),c&&(b+=c),a.match(Tokens.STAR)&&(b+="*");return b.length?b:null},_attrib:function(){var a=this._tokenStream,b=null,c,d;if(a.match(Tokens.LBRACKET)){d=a.token(),b=d.value,b+=this._readWhitespace(),c=this._namespace_prefix(),c&&(b+=c),a.mustMatch(Tokens.IDENT),b+=a.token().value,b+=this._readWhitespace(),a.match([Tokens.PREFIXMATCH,Tokens.SUFFIXMATCH,Tokens.SUBSTRINGMATCH,Tokens.EQUALS,Tokens.INCLUDES,Tokens.DASHMATCH])&&(b+=a.token().value,b+=this._readWhitespace(),a.mustMatch([Tokens.IDENT,Tokens.STRING]),b+=a.token().value,b+=this._readWhitespace()),a.mustMatch(Tokens.RBRACKET);return new SelectorSubPart(b+"]","attribute",d.startLine,d.startCol)}return null},_pseudo:function(){var a=this._tokenStream,b=null,c=":",d,e;a.match(Tokens.COLON)&&(a.match(Tokens.COLON)&&(c+=":"),a.match(Tokens.IDENT)?(b=a.token().value,d=a.token().startLine,e=a.token().startCol-c.length):a.peek()==Tokens.FUNCTION&&(d=a.LT(1).startLine,e=a.LT(1).startCol-c.length,b=this._functional_pseudo()),b&&(b=new SelectorSubPart(c+b,"pseudo",d,e)));return b},_functional_pseudo:function(){var a=this._tokenStream,b=null;a.match(Tokens.FUNCTION)&&(b=a.token().value,b+=this._readWhitespace(),b+=this._expression(),a.mustMatch(Tokens.RPAREN),b+=")");return b},_expression:function(){var a=this._tokenStream,b="";while(a.match([Tokens.PLUS,Tokens.MINUS,Tokens.DIMENSION,Tokens.NUMBER,Tokens.STRING,Tokens.IDENT,Tokens.LENGTH,Tokens.FREQ,Tokens.ANGLE,Tokens.TIME,Tokens.RESOLUTION]))b+=a.token().value,b+=this._readWhitespace();return b.length?b:null},_negation:function(){var a=this._tokenStream,b,c,d="",e,f=null;a.match(Tokens.NOT)&&(d=a.token().value,b=a.token().startLine,c=a.token().startCol,d+=this._readWhitespace(),e=this._negation_arg(),d+=e,d+=this._readWhitespace(),a.match(Tokens.RPAREN),d+=a.token().value,f=new SelectorSubPart(d,"not",b,c),f.args.push(e));return f},_negation_arg:function(){var a=this._tokenStream,b=[this._type_selector,this._universal,function(){return a.match(Tokens.HASH)?new SelectorSubPart(a.token().value,"id",a.token().startLine,a.token().startCol):null},this._class,this._attrib,this._pseudo],c=null,d=0,e=b.length,f,g,h,i;g=a.LT(1).startLine,h=a.LT(1).startCol;while(d0?new PropertyValue(b,b[0].startLine,b[0].startCol):null},_term:function(){var a=this._tokenStream,b=null,c=null,d,e;b=this._unary_operator(),b!==null&&(d=a.token().startLine,e=a.token().startCol),a.peek()==Tokens.IE_FUNCTION&&this.options.ieFilters?(c=this._ie_function(),b===null&&(d=a.token().startLine,e=a.token().startCol)):a.match([Tokens.NUMBER,Tokens.PERCENTAGE,Tokens.LENGTH,Tokens.ANGLE,Tokens.TIME,Tokens.FREQ,Tokens.STRING,Tokens.IDENT,Tokens.URI,Tokens.UNICODE_RANGE])?(c=a.token().value,b===null&&(d=a.token().startLine,e=a.token().startCol),this._readWhitespace()):(c=this._hexcolor(),c===null?(b===null&&(d=a.LT(1).startLine,e=a.LT(1).startCol),c===null&&(a.LA(3)==Tokens.EQUALS&&this.options.ieFilters?c=this._ie_function():c=this._function())):b===null&&(d=a.token().startLine,e=a.token().startCol));return c!==null?new PropertyValuePart(b!==null?b+c:c,d,e):null},_function:function(){var a=this._tokenStream,b=null,c=null;a.match(Tokens.FUNCTION)&&(b=a.token().value,this._readWhitespace(),c=this._expr(),a.match(Tokens.RPAREN),b+=c+")",this._readWhitespace());return b},_ie_function:function(){var a=this._tokenStream,b=null,c=null,d;if(a.match([Tokens.IE_FUNCTION,Tokens.FUNCTION])){b=a.token().value;do{this._readWhitespace()&&(b+=a.token().value),a.LA(0)==Tokens.COMMA&&(b+=a.token().value),a.match(Tokens.IDENT),b+=a.token().value,a.match(Tokens.EQUALS),b+=a.token().value,d=a.peek();while(d!=Tokens.COMMA&&d!=Tokens.S&&d!=Tokens.RPAREN)a.get(),b+=a.token().value,d=a.peek()}while(a.match([Tokens.COMMA,Tokens.S]));a.match(Tokens.RPAREN),b+=")",this._readWhitespace()}return b},_hexcolor:function(){var a=this._tokenStream,b,c=null;if(a.match(Tokens.HASH)){b=a.token(),c=b.value;if(!/#[a-f0-9]{3,6}/i.test(c))throw new SyntaxError("Expected a hex color but found '"+c+"' at line "+b.startLine+", col "+b.startCol+".",b.startLine,b.startCol);this._readWhitespace()}return c},_keyframes:function(){var a=this._tokenStream,b,c,d;a.mustMatch(Tokens.KEYFRAMES_SYM),this._readWhitespace(),d=this._keyframe_name(),this._readWhitespace(),a.mustMatch(Tokens.LBRACE),this.fire({type:"startkeyframes",name:d,line:d.line,col:d.col}),this._readWhitespace(),c=a.peek();while(c==Tokens.IDENT||c==Tokens.PERCENTAGE)this._keyframe_rule(),this._readWhitespace(),c=a.peek();this.fire({type:"endkeyframes",name:d,line:d.line,col:d.col}),this._readWhitespace(),a.mustMatch(Tokens.RBRACE)},_keyframe_name:function(){var a=this._tokenStream,b;a.mustMatch([Tokens.IDENT,Tokens.STRING]);return SyntaxUnit.fromToken(a.token())},_keyframe_rule:function(){var a=this._tokenStream,b,c=this._key_list();this.fire({type:"startkeyframerule",keys:c,line:c[0].line,col:c[0].col}),this._readDeclarations(!0),this.fire({type:"endkeyframerule",keys:c,line:c[0].line,col:c[0].col})},_key_list:function(){var a=this._tokenStream,b,c,d=[];d.push(this._key()),this._readWhitespace();while(a.match(Tokens.COMMA))this._readWhitespace(),d.push(this._key()),this._readWhitespace();return d},_key:function(){var a=this._tokenStream,b;if(a.match(Tokens.PERCENTAGE))return SyntaxUnit.fromToken(a.token());if(a.match(Tokens.IDENT)){b=a.token();if(/from|to/i.test(b.value))return SyntaxUnit.fromToken(b);a.unget()}this._unexpectedToken(a.LT(1))},_skipCruft:function(){while(this._tokenStream.match([Tokens.S,Tokens.CDO,Tokens.CDC]));},_readDeclarations:function(a,b){var c=this._tokenStream,d;this._readWhitespace(),a&&c.mustMatch(Tokens.LBRACE),this._readWhitespace();try{for(;;){if(!b||!this._margin()){if(!this._declaration())break;if(!c.match(Tokens.SEMICOLON))break}this._readWhitespace()}c.mustMatch(Tokens.RBRACE),this._readWhitespace()}catch(e){if(!(e instanceof SyntaxError&&!this.options.strict))throw e;this.fire({type:"error",error:e,message:e.message,line:e.line,col:e.col}),d=c.advance([Tokens.SEMICOLON,Tokens.RBRACE]);if(d==Tokens.SEMICOLON)this._readDeclarations(!1,b);else if(d!=Tokens.RBRACE)throw e}},_readWhitespace:function(){var a=this._tokenStream,b="";while(a.match(Tokens.S))b+=a.token().value;return b},_unexpectedToken:function(a){throw new SyntaxError("Unexpected token '"+a.value+"' at line "+a.startLine+", col "+a.startCol+".",a.startLine,a.startCol)},_verifyEnd:function(){this._tokenStream.LA(1)!=Tokens.EOF&&this._unexpectedToken(this._tokenStream.LT(1))},parse:function(a){this._tokenStream=new TokenStream(a,Tokens),this._stylesheet()},parseStyleSheet:function(a){return this.parse(a)},parseMediaQuery:function(a){this._tokenStream=new TokenStream(a,Tokens);var b=this._media_query();this._verifyEnd();return b},parsePropertyValue:function(a){this._tokenStream=new TokenStream(a,Tokens),this._readWhitespace();var b=this._expr();this._readWhitespace(),this._verifyEnd();return b},parseRule:function(a){this._tokenStream=new TokenStream(a,Tokens),this._readWhitespace();var b=this._ruleset();this._readWhitespace(),this._verifyEnd();return b},parseSelector:function(a){this._tokenStream=new TokenStream(a,Tokens),this._readWhitespace();var b=this._selector();this._readWhitespace(),this._verifyEnd();return b}};for(b in c)a[b]=c[b];return a}(),PropertyName.prototype=new SyntaxUnit,PropertyName.prototype.constructor=PropertyName,PropertyValue.prototype=new SyntaxUnit,PropertyValue.prototype.constructor=PropertyValue,PropertyValuePart.prototype=new SyntaxUnit,PropertyValuePart.prototype.constructor=PropertyValue,PropertyValuePart.fromToken=function(a){return new PropertyValuePart(a.value,a.startLine,a.startCol)},Selector.prototype=new SyntaxUnit,Selector.prototype.constructor=Selector,SelectorPart.prototype=new SyntaxUnit,SelectorPart.prototype.constructor=SelectorPart,SelectorSubPart.prototype=new SyntaxUnit,SelectorSubPart.prototype.constructor=SelectorSubPart;var h=/^[0-9a-fA-F]$/,nonascii=/^[\u0080-\uFFFF]$/,nl=/\n|\r\n|\r|\f/;TokenStream.prototype=mix(new TokenStreamBase,{_getToken:function(a){var b,c=this._reader,d=null,e=c.getLine(),f=c.getCol();b=c.read();while(b){switch(b){case"/":c.peek()=="*"?d=this.commentToken(b,e,f):d=this.charToken(b,e,f);break;case"|":case"~":case"^":case"$":case"*":c.peek()=="="?d=this.comparisonToken(b,e,f):d=this.charToken(b,e,f);break;case'"':case"'":d=this.stringToken(b,e,f);break;case"#":isNameChar(c.peek())?d=this.hashToken(b,e,f):d=this.charToken(b,e,f);break;case".":isDigit(c.peek())?d=this.numberToken(b,e,f):d=this.charToken(b,e,f);break;case"-":c.peek()=="-"?d=this.htmlCommentEndToken(b,e,f):isNameStart(c.peek())?d=this.identOrFunctionToken(b,e,f):d=this.charToken(b,e,f);break;case"!":d=this.importantToken(b,e,f);break;case"@":d=this.atRuleToken(b,e,f);break;case":":d=this.notToken(b,e,f);break;case"<":d=this.htmlCommentStartToken(b,e,f);break;case"U":case"u":if(c.peek()=="+"){d=this.unicodeRangeToken(b,e,f);break};default:isDigit(b)?d=this.numberToken(b,e,f):isWhitespace(b)?d=this.whitespaceToken(b,e,f):isIdentStart(b)?d=this.identOrFunctionToken(b,e,f):d=this.charToken(b,e,f)}break}!d&&b==null&&(d=this.createToken(Tokens.EOF,null,e,f));return d},createToken:function(a,b,c,d,e){var f=this._reader;e=e||{};return{value:b,type:a,channel:e.channel,hide:e.hide||!1,startLine:c,startCol:d,endLine:f.getLine(),endCol:f.getCol()}},atRuleToken:function(a,b,c){var d=a,e=this._reader,f=Tokens.CHAR,g=!1,h,i;e.mark(),h=this.readName(),d=a+h,f=Tokens.type(d.toLowerCase());if(f==Tokens.CHAR||f==Tokens.UNKNOWN)f=Tokens.CHAR,d=a,e.reset();return this.createToken(f,d,b,c)},charToken:function(a,b,c){var d=Tokens.type(a);d==-1&&(d=Tokens.CHAR);return this.createToken(d,a,b,c)},commentToken:function(a,b,c){var d=this._reader,e=this.readComment(a);return this.createToken(Tokens.COMMENT,e,b,c)},comparisonToken:function(a,b,c){var d=this._reader,e=a+d.read(),f=Tokens.type(e)||Tokens.CHAR;return this.createToken(f,e,b,c)},hashToken:function(a,b,c){var d=this._reader,e=this.readName(a);return this.createToken(Tokens.HASH,e,b,c)},htmlCommentStartToken:function(a,b,c){var d=this._reader,e=a;d.mark(),e+=d.readCount(3);if(e=="")return this.createToken(Tokens.CDC,e,b,c);d.reset();return this.charToken(a,b,c)},identOrFunctionToken:function(a,b,c){var d=this._reader,e=this.readName(a),f=Tokens.IDENT;d.peek()=="("?(e+=d.read(),e.toLowerCase()=="url("?(f=Tokens.URI,e=this.readURI(e),e.toLowerCase()=="url("&&(f=Tokens.FUNCTION)):f=Tokens.FUNCTION):d.peek()==":"&&e.toLowerCase()=="progid"&&(e+=d.readTo("("),f=Tokens.IE_FUNCTION);return this.createToken(f,e,b,c)},importantToken:function(a,b,c){var d=this._reader,e=a,f=Tokens.CHAR,g,h;d.mark(),h=d.read();while(h){if(h=="/"){if(d.peek()!="*")break;g=this.readComment(h);if(g=="")break}else if(isWhitespace(h))e+=h+this.readWhitespace();else{if(/i/i.test(h)){g=d.readCount(8),/mportant/i.test(g)&&(e+=h+g,f=Tokens.IMPORTANT_SYM);break}break}h=d.read()}if(f==Tokens.CHAR){d.reset();return this.charToken(a,b,c)}return this.createToken(f,e,b,c)},notToken:function(a,b,c){var d=this._reader,e=a;d.mark(),e+=d.readCount(4);if(e.toLowerCase()==":not(")return this.createToken(Tokens.NOT,e,b,c);d.reset();return this.charToken(a,b,c)},numberToken:function(a,b,c){var d=this._reader,e=this.readNumber(a),f,g=Tokens.NUMBER,h=d.peek();isIdentStart(h)?(f=this.readName(d.read()),e+=f,/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(f)?g=Tokens.LENGTH:/^deg|^rad$|^grad$/i.test(f)?g=Tokens.ANGLE:/^ms$|^s$/i.test(f)?g=Tokens.TIME:/^hz$|^khz$/i.test(f)?g=Tokens.FREQ:/^dpi$|^dpcm$/i.test(f)?g=Tokens.RESOLUTION:g=Tokens.DIMENSION):h=="%"&&(e+=d.read(),g=Tokens.PERCENTAGE);return this.createToken(g,e,b,c)},stringToken:function(a,b,c){var d=a,e=a,f=this._reader,g=a,h=Tokens.STRING,i=f.read();while(i){e+=i;if(i==d&&g!="\\")break;if(isNewLine(f.peek())&&i!="\\"){h=Tokens.INVALID;break}g=i,i=f.read()}i==null&&(h=Tokens.INVALID);return this.createToken(h,e,b,c)},unicodeRangeToken:function(a,b,c){var d=this._reader,e=a,f,g=Tokens.CHAR;d.peek()=="+"&&(d.mark(),e+=d.read(),e+=this.readUnicodeRangePart(!0),e.length==2?d.reset():(g=Tokens.UNICODE_RANGE,e.indexOf("?")==-1&&d.peek()=="-"&&(d.mark(),f=d.read(),f+=this.readUnicodeRangePart(!1),f.length==1?d.reset():e+=f)));return this.createToken(g,e,b,c)},whitespaceToken:function(a,b,c){var d=this._reader,e=a+this.readWhitespace();return this.createToken(Tokens.S,e,b,c)},readUnicodeRangePart:function(a){var b=this._reader,c="",d=b.peek();while(isHexDigit(d)&&c.length<6)b.read(),c+=d,d=b.peek();if(a)while(d=="?"&&c.length<6)b.read(),c+=d,d=b.peek();return c},readWhitespace:function(){var a=this._reader,b="",c=a.peek();while(isWhitespace(c))a.read(),b+=c,c=a.peek();return b},readNumber:function(a){var b=this._reader,c=a,d=a==".",e=b.peek();while(e){if(isDigit(e))c+=b.read();else{if(e!=".")break;if(d)break;d=!0,c+=b.read()}e=b.peek()}return c},readString:function(){var a=this._reader,b=a.read(),c=b,d=b,e=a.peek();while(e){e=a.read(),c+=e;if(e==b&&d!="\\")break;if(isNewLine(a.peek())&&e!="\\"){c="";break}d=e,e=a.peek()}e==null&&(c="");return c},readURI:function(a){var b=this._reader,c=a,d="",e=b.peek();b.mark();while(e&&isWhitespace(e))b.read(),e=b.peek();e=="'"||e=='"'?d=this.readString():d=this.readURL(),e=b.peek();while(e&&isWhitespace(e))b.read(),e=b.peek();d==""||e!=")"?(c=a,b.reset()):c+=d+b.read();return c},readURL:function(){var a=this._reader,b="",c=a.peek();while(/^[!#$%&\\*-~]$/.test(c))b+=a.read(),c=a.peek();return b},readName:function(a){var b=this._reader,c=a||"",d=b.peek();for(;;)if(d=="\\")c+=this.readEscape(b.read()),d=b.peek();else if(d&&isNameChar(d))c+=b.read(),d=b.peek();else break;return c},readEscape:function(a){var b=this._reader,c=a||"",d=0,e=b.peek();if(isHexDigit(e))do c+=b.read(),e=b.peek();while(e&&isHexDigit(e)&&++d<6);c.length==3&&/\s/.test(e)||c.length==7||c.length==1?b.read():e="";return c+e},readComment:function(a){var b=this._reader,c=a||"",d=b.read();if(d=="*"){while(d){c+=d;if(d=="*"&&b.peek()=="/"){c+=b.read();break}d=b.read()}return c}return""}});var Tokens=[{name:"CDO"},{name:"CDC"},{name:"S",whitespace:!0},{name:"COMMENT",comment:!0,hide:!0,channel:"comment"},{name:"INCLUDES",text:"~="},{name:"DASHMATCH",text:"|="},{name:"PREFIXMATCH",text:"^="},{name:"SUFFIXMATCH",text:"$="},{name:"SUBSTRINGMATCH",text:"*="},{name:"STRING"},{name:"IDENT"},{name:"HASH"},{name:"IMPORT_SYM",text:"@import"},{name:"PAGE_SYM",text:"@page"},{name:"MEDIA_SYM",text:"@media"},{name:"FONT_FACE_SYM",text:"@font-face"},{name:"CHARSET_SYM",text:"@charset"},{name:"NAMESPACE_SYM",text:"@namespace"},{name:"KEYFRAMES_SYM",text:["@keyframes","@-webkit-keyframes","@-moz-keyframes"]},{name:"IMPORTANT_SYM"},{name:"LENGTH"},{name:"ANGLE"},{name:"TIME"},{name:"FREQ"},{name:"DIMENSION"},{name:"PERCENTAGE"},{name:"NUMBER"},{name:"URI"},{name:"FUNCTION"},{name:"UNICODE_RANGE"},{name:"INVALID"},{name:"PLUS",text:"+"},{name:"GREATER",text:">"},{name:"COMMA",text:","},{name:"TILDE",text:"~"},{name:"NOT"},{name:"TOPLEFTCORNER_SYM",text:"@top-left-corner"},{name:"TOPLEFT_SYM",text:"@top-left"},{name:"TOPCENTER_SYM",text:"@top-center"},{name:"TOPRIGHT_SYM",text:"@top-right"},{name:"TOPRIGHTCORNER_SYM",text:"@top-right-corner"},{name:"BOTTOMLEFTCORNER_SYM",text:"@bottom-left-corner"},{name:"BOTTOMLEFT_SYM",text:"@bottom-left"},{name:"BOTTOMCENTER_SYM",text:"@bottom-center"},{name:"BOTTOMRIGHT_SYM",text:"@bottom-right"},{name:"BOTTOMRIGHTCORNER_SYM",text:"@bottom-right-corner"},{name:"LEFTTOP_SYM",text:"@left-top"},{name:"LEFTMIDDLE_SYM",text:"@left-middle"},{name:"LEFTBOTTOM_SYM",text:"@left-bottom"},{name:"RIGHTTOP_SYM",text:"@right-top"},{name:"RIGHTMIDDLE_SYM",text:"@right-middle"},{name:"RIGHTBOTTOM_SYM",text:"@right-bottom"},{name:"RESOLUTION",state:"media"},{name:"IE_FUNCTION"},{name:"CHAR"},{name:"PIPE",text:"|"},{name:"SLASH",text:"/"},{name:"MINUS",text:"-"},{name:"STAR",text:"*"},{name:"LBRACE",text:"{"},{name:"RBRACE",text:"}"},{name:"LBRACKET",text:"["},{name:"RBRACKET",text:"]"},{name:"EQUALS",text:"="},{name:"COLON",text:":"},{name:"SEMICOLON",text:";"},{name:"LPAREN",text:"("},{name:"RPAREN",text:")"},{name:"DOT",text:"."}];(function(){var a=[],b={};Tokens.UNKNOWN=-1,Tokens.unshift({name:"EOF"});for(var c=0,d=Tokens.length;c1&&b.warn("Don't use adjoining classes.",f.line,f.col,c)}}}})}}),CSSLint.addRule({id:"box-model",name:"Box Model",desc:"Don't use width or height when using padding or border.",browsers:"All",init:function(a,b){var c=this,d={border:1,"border-left":1,"border-right":1,padding:1,"padding-left":1,"padding-right":1},e={border:1,"border-bottom":1,"border-top":1,padding:1,"padding-bottom":1,"padding-top":1},f;a.addListener("startrule",function(){f={}}),a.addListener("property",function(a){var b=a.property.text.toLowerCase();if(e[b]||d[b])!/^0\S*$/.test(a.value)&&(b!="border"||a.value!="none")&&(f[b]={line:a.property.line,col:a.property.col,value:a.value});else if(b=="width"||b=="height")f[b]=1}),a.addListener("endrule",function(){var a;if(f.height)for(a in e)e.hasOwnProperty(a)&&f[a]&&(a!="padding"||f[a].value.parts.length!=2||f[a].value.parts[0].value!=0)&&b.warn("Broken box model: using height with "+a+".",f[a].line,f[a].col,c);if(f.width)for(a in d)d.hasOwnProperty(a)&&f[a]&&(a!="padding"||f[a].value.parts.length!=2||f[a].value.parts[1].value!=0)&&b.warn("Broken box model: using width with "+a+".",f[a].line,f[a].col,c)})}}),CSSLint.addRule({id:"compatible-vendor-prefixes",name:"Compatible Vendor Prefixes",desc:"Include all compatible vendor prefixes to reach a wider range of users.",browsers:"All",init:function(a,b){var c=this,d,e,f,g,h,i,j,k=Array.prototype.push,l=[];d={animation:"webkit moz","animation-delay":"webkit moz","animation-direction":"webkit moz","animation-duration":"webkit moz","animation-fill-mode":"webkit moz","animation-iteration-count":"webkit moz","animation-name":"webkit moz","animation-play-state":"webkit moz","animation-timing-function":"webkit moz",appearance:"webkit moz","border-end":"webkit moz","border-end-color":"webkit moz","border-end-style":"webkit moz","border-end-width":"webkit moz","border-image":"webkit moz o","border-radius":"webkit moz","border-start":"webkit moz","border-start-color":"webkit moz","border-start-style":"webkit moz","border-start-width":"webkit moz","box-align":"webkit moz ms","box-direction":"webkit moz ms","box-flex":"webkit moz ms","box-lines":"webkit ms","box-ordinal-group":"webkit moz ms","box-orient":"webkit moz ms","box-pack":"webkit moz ms","box-sizing":"webkit moz","box-shadow":"webkit moz","column-count":"webkit moz","column-gap":"webkit moz","column-rule":"webkit moz","column-rule-color":"webkit moz","column-rule-style":"webkit moz","column-rule-width":"webkit moz","column-width":"webkit moz",hyphens:"epub moz","line-break":"webkit ms","margin-end":"webkit moz","margin-start":"webkit moz","marquee-speed":"webkit wap","marquee-style":"webkit wap","padding-end":"webkit moz","padding-start":"webkit moz","tab-size":"moz o","text-size-adjust":"webkit ms",transform:"webkit moz ms o","transform-origin":"webkit moz ms o",transition:"webkit moz o","transition-delay":"webkit moz o","transition-duration":"webkit moz o","transition-property":"webkit moz o","transition-timing-function":"webkit moz o","user-modify":"webkit moz","user-select":"webkit moz","word-break":"epub ms","writing-mode":"epub ms"};for(f in d)if(d.hasOwnProperty(f)){g=[],h=d[f].split(" ");for(i=0,j=h.length;i-1&&e.push(b)}),a.addListener("endrule",function(a){if(!!e.length){var f={},g,h,i,j,k,l,m,n,o,p;for(g=0,h=e.length;g-1&&(f[j]===undefined&&(f[j]={full:k.slice(0),actual:[]}),f[j].actual.indexOf(i)===-1&&f[j].actual.push(i)))}for(j in f)if(f.hasOwnProperty(j)){l=f[j],m=l.full,n=l.actual;if(m.length>n.length)for(g=0,h=m.length;g=10&&b.rollupWarn("Too many floats ("+d+"), you're probably using them for layout. Consider using a grid system instead.",c)})}}),CSSLint.addRule({id:"font-faces",name:"Font Faces",desc:"Too many different web fonts in the same stylesheet.",browsers:"All",init:function(a,b){var c=this,d=0;a.addListener("startfontface",function(){d++}),a.addListener("endstylesheet",function(){d>5&&b.rollupWarn("Too many @font-face declarations ("+d+").",c)})}}),CSSLint.addRule({id:"font-sizes",name:"Font Sizes",desc:"Checks the number of font-size declarations.",browsers:"All",init:function(a,b){var c=this,d=0;a.addListener("property",function(a){a.property=="font-size"&&d++}),a.addListener("endstylesheet",function(){b.stat("font-sizes",d),d>=10&&b.rollupWarn("Too many font-size declarations ("+d+"), abstraction needed.",c)})}}),CSSLint.addRule({id:"gradients",name:"Gradients",desc:"When using a vendor-prefixed gradient, make sure to use them all.",browsers:"All",init:function(a,b){var c=this,d;a.addListener("startrule",function(){d={moz:0,webkit:0,ms:0,o:0}}),a.addListener("property",function(a){/\-(moz|ms|o|webkit)(?:\-(?:linear|radial))\-gradient/.test(a.value)&&(d[RegExp.$1]=1)}),a.addListener("endrule",function(a){var e=[];d.moz||e.push("Firefox 3.6+"),d.webkit||e.push("Webkit (Safari, Chrome)"),d.ms||e.push("Internet Explorer 10+"),d.o||e.push("Opera 11.1+"),e.length&&e.length<4&&b.warn("Missing vendor-prefixed CSS gradients for "+e.join(", ")+".",a.selectors[0].line,a.selectors[0].col,c)})}}),CSSLint.addRule({id:"ids",name:"IDs",desc:"Selectors should not contain IDs.",browsers:"All",init:function(a,b){var c=this;a.addListener("startrule",function(a){var d=a.selectors,e,f,g,h,i,j,k;for(i=0;i1&&b.warn(h+" IDs in the selector, really?",e.line,e.col,c)}})}}),CSSLint.addRule({id:"import",name:"@import",desc:"Don't use @import, use instead.",browsers:"All",init:function(a,b){var c=this;a.addListener("import",function(a){b.warn("@import prevents parallel downloads, use instead.",a.line,a.col,c)})}}),CSSLint.addRule({id:"important",name:"Important",desc:"Be careful when using !important declaration",browsers:"All",init:function(a,b){var c=this,d=0;a.addListener("property",function(a){a.important===!0&&(d++,b.warn("Use of !important",a.line,a.col,c))}),a.addListener("endstylesheet",function(){b.stat("important",d),d>=10&&b.rollupWarn("Too many !important declarations ("+d+"), try to use less than 10 to avoid specifity issues.",c)})}}),CSSLint.addRule({id:"known-properties",name:"Known Properties",desc:"Properties should be known (listed in CSS specification) or be a vendor-prefixed property.",browsers:"All",init:function(a,b){var c=this,d={"alignment-adjust":1,"alignment-baseline":1,animation:1,"animation-delay":1,"animation-direction":1,"animation-duration":1,"animation-iteration-count":1,"animation-name":1,"animation-play-state":1,"animation-timing-function":1,appearance:1,azimuth:1,"backface-visibility":1,background:1,"background-attachment":1,"background-break":1,"background-clip":1,"background-color":1,"background-image":1,"background-origin":1,"background-position":1,"background-repeat":1,"background-size":1,"baseline-shift":1,binding:1,bleed:1,"bookmark-label":1,"bookmark-level":1,"bookmark-state":1,"bookmark-target":1,border:1,"border-bottom":1,"border-bottom-color":1,"border-bottom-left-radius":1,"border-bottom-right-radius":1,"border-bottom-style":1,"border-bottom-width":1,"border-collapse":1,"border-color":1,"border-image":1,"border-image-outset":1,"border-image-repeat":1,"border-image-slice":1,"border-image-source":1,"border-image-width":1,"border-left":1,"border-left-color":1,"border-left-style":1,"border-left-width":1,"border-radius":1,"border-right":1,"border-right-color":1,"border-right-style":1,"border-right-width":1,"border-spacing":1,"border-style":1,"border-top":1,"border-top-color":1,"border-top-left-radius":1,"border-top-right-radius":1,"border-top-style":1,"border-top-width":1,"border-width":1,bottom:1,"box-align":1,"box-decoration-break":1,"box-direction":1,"box-flex":1,"box-flex-group":1,"box-lines":1,"box-ordinal-group":1,"box-orient":1,"box-pack":1,"box-shadow":1,"box-sizing":1,"break-after":1,"break-before":1,"break-inside":1,"caption-side":1,clear:1,clip:1,color:1,"color-profile":1,"column-count":1,"column-fill":1,"column-gap":1,"column-rule":1,"column-rule-color":1,"column-rule-style":1,"column-rule-width":1,"column-span":1,"column-width":1,columns:1,content:1,"counter-increment":1,"counter-reset":1,crop:1,cue:1,"cue-after":1,"cue-before":1,cursor:1,direction:1,display:1,"dominant-baseline":1,"drop-initial-after-adjust":1,"drop-initial-after-align":1,"drop-initial-before-adjust":1,"drop-initial-before-align":1,"drop-initial-size":1,"drop-initial-value":1,elevation:1,"empty-cells":1,fit:1,"fit-position":1,"float":1,"float-offset":1,font:1,"font-family":1,"font-size":1,"font-size-adjust":1,"font-stretch":1,"font-style":1,"font-variant":1,"font-weight":1,"grid-columns":1,"grid-rows":1,"hanging-punctuation":1,height:1,"hyphenate-after":1,"hyphenate-before":1,"hyphenate-character":1,"hyphenate-lines":1,"hyphenate-resource":1,hyphens:1,icon:1,"image-orientation":1,"image-rendering":1,"image-resolution":1,"inline-box-align":1,left:1,"letter-spacing":1,"line-height":1,"line-stacking":1,"line-stacking-ruby":1,"line-stacking-shift":1,"line-stacking-strategy":1,"list-style":1,"list-style-image":1,"list-style-position":1,"list-style-type":1,margin:1,"margin-bottom":1,"margin-left":1,"margin-right":1,"margin-top":1,mark:1,"mark-after":1,"mark-before":1,marks:1,"marquee-direction":1,"marquee-play-count":1,"marquee-speed":1,"marquee-style":1,"max-height":1,"max-width":1,"min-height":1,"min-width":1,"move-to":1,"nav-down":1,"nav-index":1,"nav-left":1,"nav-right":1,"nav-up":1,opacity:1,orphans:1,outline:1,"outline-color":1,"outline-offset":1,"outline-style":1,"outline-width":1,overflow:1,"overflow-style":1,"overflow-x":1,"overflow-y":1,padding:1,"padding-bottom":1,"padding-left":1,"padding-right":1,"padding-top":1,page:1,"page-break-after":1,"page-break-before":1,"page-break-inside":1,"page-policy":1,pause:1,"pause-after":1,"pause-before":1,perspective:1,"perspective-origin":1,phonemes:1,pitch:1,"pitch-range":1,"play-during":1,position:1,"presentation-level":1,"punctuation-trim":1,quotes:1,"rendering-intent":1,resize:1,rest:1,"rest-after":1,"rest-before":1,richness:1,right:1,rotation:1,"rotation-point":1,"ruby-align":1,"ruby-overhang":1,"ruby-position":1,"ruby-span":1,size:1,speak:1,"speak-header":1,"speak-numeral":1,"speak-punctuation":1,"speech-rate":1,stress:1,"string-set":1,"table-layout":1,target:1,"target-name":1,"target-new":1,"target-position":1,"text-align":1,"text-align-last":1,"text-decoration":1,"text-emphasis":1,"text-height":1,"text-indent":1,"text-justify":1,"text-outline":1,"text-shadow":1,"text-transform":1,"text-wrap":1,top:1,transform:1,"transform-origin":1,"transform-style":1,transition:1,"transition-delay":1,"transition-duration":1,"transition-property":1,"transition-timing-function":1,"unicode-bidi":1,"vertical-align":1,visibility:1,"voice-balance":1,"voice-duration":1,"voice-family":1,"voice-pitch":1,"voice-pitch-range":1,"voice-rate":1,"voice-stress":1,"voice-volume":1,volume:1,"white-space":1,"white-space-collapse":1,widows:1,width:1,"word-break":1,"word-spacing":1,"word-wrap":1,"z-index":1,filter:1,zoom:1};a.addListener("property",function(a){var e=a.property.text.toLowerCase();!d[e]&&e.charAt(0)!="-"&&b.error("Unknown property '"+a.property+"'.",a.line,a.col,c)})}}),CSSLint.addRule({id:"overqualified-elements",name:"Overqualified Elements",desc:"Don't use classes or IDs with elements (a.foo or a#foo).",browsers:"All",init:function(a,b){var c=this,d={};a.addListener("startrule",function(a){var e=a.selectors,f,g,h,i,j,k;for(i=0;i0&&b.warn("Heading ("+f.elementName+") should not be qualified.",f.line,f.col,c)}})}}),CSSLint.addRule({id:"regex-selectors",name:"Regex Selectors",desc:"Selectors that look like regular expressions are slow and should be avoided.",browsers:"All",init:function(a,b){var c=this;a.addListener("startrule",function(a){var d=a.selectors,e,f,g,h,i,j;for(h=0;h1&&b.warn("Heading ("+g.elementName+") has already been defined.",g.line,g.col,c))})}}),CSSLint.addRule({id:"universal-selector",name:"Universal Selector",desc:"The universal selector (*) is known to be slow.",browsers:"All",init:function(a,b){var c=this;a.addListener("startrule",function(a){var d=a.selectors,e,f,g,h,i,j;for(h=0;h + * Provides an augmented, extensible, cross-browser implementation of regular expressions, + * including support for additional syntax, flags, and methods + */ + +define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + + //--------------------------------- + // Private variables + //--------------------------------- + + var real = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + real.test.call(x, ""); + return !x.lastIndex; + }(); + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match = real.exec.apply(this, arguments), + name, r2; + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + + // Don't override `test` if it won't change anything + if (!compliantLastIndexIncrement) { + // Fix browser bug in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the overriden + // `exec` would take care of the `lastIndex` fix + var match = real.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + //--------------------------------- + // Private helper functions + //--------------------------------- + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + }; + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + }; + +});// vim: ts=4 sts=4 sw=4 expandtab +// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License +// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project) +// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA +// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License +// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License +// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License +// -- kossnocorp Sasha Koss XXX TODO License or CLA +// -- bryanforbes Bryan Forbes XXX TODO License or CLA +// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence +// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License +// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License +// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain) +// -- iwyg XXX TODO License or CLA +// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License +// -- xavierm02 Montillet Xavier XXX TODO License or CLA +// -- Raynos Raynos XXX TODO License or CLA +// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License +// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License +// -- lexer Alexey Zakharov XXX TODO License or CLA + +/*! + Copyright (c) 2009, 280 North Inc. http://280north.com/ + MIT License. http://github.com/280north/narwhal/blob/master/README.md +*/ + +define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { + +/** + * Brings an environment as close to ECMAScript 5 compliance + * as is possible with the facilities of erstwhile engines. + * + * Annotated ES5: http://es5.github.com/ (specific links below) + * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf + * + * @module + */ + +/*whatsupdoc*/ + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (typeof target != "function") + throw new TypeError(); // TODO message + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var bound = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var F = function(){}; + F.prototype = target.prototype; + var self = new F; + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (result !== null && Object(result) === result) + return result; + return self; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + // XXX bound.length is never writable, so don't even try + // + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + }; +} + +// Shortcut to an often accessed properties, in order to avoid multiple +// dereference that costs universally. +// _Please note: Shortcuts are defined after `Function.prototype.bind` as we +// us it in defining shortcuts. +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); + +// If JS engine supports accessors creating shortcuts. +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} + +// +// Array +// ===== +// + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return toString(obj) == "[object Array]"; + }; +} + +// The IsCallable() check in the Array functions +// has been replaced with a strict check on the +// internal class of the object to trap cases where +// the provided function was actually a regular +// expression literal, which in V8 and +// JavaScriptCore is a typeof "function". Only in +// V8 are regular expression literals permitted as +// reduce parameters, so it is desirable in the +// general case for the shim to match the more +// strict and common behavior of rejecting regular +// expressions. + +// ES5 15.4.4.18 +// http://es5.github.com/#x15.4.4.18 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var self = toObject(this), + thisp = arguments[1], + i = 0, + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object context + fun.call(thisp, self[i], i, self); + } + i++; + } + }; +} + +// ES5 15.4.4.19 +// http://es5.github.com/#x15.4.4.19 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var self = toObject(this), + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, self); + } + return result; + }; +} + +// ES5 15.4.4.20 +// http://es5.github.com/#x15.4.4.20 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + result = [], + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + result.push(self[i]); + } + return result; + }; +} + +// ES5 15.4.4.16 +// http://es5.github.com/#x15.4.4.16 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, self)) + return false; + } + return true; + }; +} + +// ES5 15.4.4.17 +// http://es5.github.com/#x15.4.4.17 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + return true; + } + return false; + }; +} + +// ES5 15.4.4.21 +// http://es5.github.com/#x15.4.4.21 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value and an empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + + // if array contains no values, no initial value to return + if (++i >= length) + throw new TypeError(); // TODO message + } while (true); + } + + for (; i < length; i++) { + if (i in self) + result = fun.call(void 0, result, self[i], i, self); + } + + return result; + }; +} + +// ES5 15.4.4.22 +// http://es5.github.com/#x15.4.4.22 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value, empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + + // if array contains no values, no initial value to return + if (--i < 0) + throw new TypeError(); // TODO message + } while (true); + } + + do { + if (i in this) + result = fun.call(void 0, result, self[i], i, self); + } while (i--); + + return result; + }; +} + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + + var i = 0; + if (arguments.length > 1) + i = toInteger(arguments[1]); + + // handle negative indices + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} + +// ES5 15.4.4.15 +// http://es5.github.com/#x15.4.4.15 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf +if (!Array.prototype.lastIndexOf) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + var i = length - 1; + if (arguments.length > 1) + i = Math.min(i, toInteger(arguments[1])); + // handle negative indices + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) + return i; + } + return -1; + }; +} + +// +// Object +// ====== +// + +// ES5 15.2.3.2 +// http://es5.github.com/#x15.2.3.2 +if (!Object.getPrototypeOf) { + // https://github.com/kriskowal/es5-shim/issues#issue/2 + // http://ejohn.org/blog/objectgetprototypeof/ + // recommended by fschaefer on github + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} + +// ES5 15.2.3.3 +// http://es5.github.com/#x15.2.3.3 +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + // If object does not owns property return undefined immediately. + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + + // If object has a property then it's for sure both `enumerable` and + // `configurable`. + descriptor = { enumerable: true, configurable: true }; + + // If JS engine supports accessor properties then property may be a + // getter or setter. + if (supportsAccessors) { + // Unfortunately `__lookupGetter__` will return a getter even + // if object has own non getter property along with a same named + // inherited getter. To avoid misbehavior we temporary remove + // `__proto__` so that `__lookupGetter__` will return getter only + // if it's owned by an object. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + + // Once we have getter and setter we can put values back. + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + + // If it was accessor property we're done and return here + // in order to avoid adding `value` to the descriptor. + return descriptor; + } + } + + // If we got this far we know that object has an own property that is + // not an accessor so we set it as a value and return descriptor. + descriptor.value = object[property]; + return descriptor; + }; +} + +// ES5 15.2.3.4 +// http://es5.github.com/#x15.2.3.4 +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} + +// ES5 15.2.3.5 +// http://es5.github.com/#x15.2.3.5 +if (!Object.create) { + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = { "__proto__": null }; + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + // IE has no built-in implementation of `Object.getPrototypeOf` + // neither `__proto__`, but this manually setting `__proto__` will + // guarantee that `Object.getPrototypeOf` will work as expected with + // objects created using `Object.create` + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +// ES5 15.2.3.6 +// http://es5.github.com/#x15.2.3.6 + +// Patch for WebKit and IE8 standard mode +// Designed by hax +// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5 +// IE8 Reference: +// http://msdn.microsoft.com/en-us/library/dd282900.aspx +// http://msdn.microsoft.com/en-us/library/dd229916.aspx +// WebKit Bugs: +// https://bugs.webkit.org/show_bug.cgi?id=36423 + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + // returns falsy + } +} + +// check whether defineProperty works if it's given. Otherwise, +// shim partially. +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + + // make a valiant attempt to use the real defineProperty + // for I8's DOM elements. + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + // try the shim if the real one doesn't work + } + } + + // If it's a data property. + if (owns(descriptor, "value")) { + // fail silently if "writable", "enumerable", or "configurable" + // are requested but not supported + /* + // alternate approach: + if ( // can't implement these features; allow false but not true + !(owns(descriptor, "writable") ? descriptor.writable : true) || + !(owns(descriptor, "enumerable") ? descriptor.enumerable : true) || + !(owns(descriptor, "configurable") ? descriptor.configurable : true) + ) + throw new RangeError( + "This implementation of Object.defineProperty does not " + + "support configurable, enumerable, or writable." + ); + */ + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + // As accessors are supported only on engines implementing + // `__proto__` we can safely override `__proto__` while defining + // a property to make sure that we don't hit an inherited + // accessor. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + // Deleting a property anyway since getter / setter may be + // defined on object itself. + delete object[property]; + object[property] = descriptor.value; + // Setting original `__proto__` back now. + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + // If we got that far then getters and setters can be defined !! + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} + +// ES5 15.2.3.7 +// http://es5.github.com/#x15.2.3.7 +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} + +// ES5 15.2.3.8 +// http://es5.github.com/#x15.2.3.8 +if (!Object.seal) { + Object.seal = function seal(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.9 +// http://es5.github.com/#x15.2.3.9 +if (!Object.freeze) { + Object.freeze = function freeze(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// detect a Rhino bug and patch it +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} + +// ES5 15.2.3.10 +// http://es5.github.com/#x15.2.3.10 +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.11 +// http://es5.github.com/#x15.2.3.11 +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} + +// ES5 15.2.3.12 +// http://es5.github.com/#x15.2.3.12 +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} + +// ES5 15.2.3.13 +// http://es5.github.com/#x15.2.3.13 +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + // 1. If Type(O) is not Object throw a TypeError exception. + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + // 2. Return the Boolean value of the [[Extensible]] internal property of O. + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} + +// ES5 15.2.3.14 +// http://es5.github.com/#x15.2.3.14 +if (!Object.keys) { + // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) + hasDontEnumBug = false; + + Object.keys = function keys(object) { + + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError("Object.keys called on a non-object"); + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + + return keys; + }; + +} + +// +// Date +// ==== +// + +// ES5 15.9.5.43 +// http://es5.github.com/#x15.9.5.43 +// This function returns a String value represent the instance in time +// represented by this Date object. The format of the String is the Date Time +// string format defined in 15.9.1.15. All fields are present in the String. +// The time zone is always UTC, denoted by the suffix Z. If the time value of +// this object is not a finite Number a RangeError exception is thrown. +if (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) { + Date.prototype.toISOString = function toISOString() { + var result, length, value, year; + if (!isFinite(this)) + throw new RangeError; + + // the date time string format is specified in 15.9.1.15. + result = [this.getUTCMonth() + 1, this.getUTCDate(), + this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; + year = this.getUTCFullYear(); + year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6); + + length = result.length; + while (length--) { + value = result[length]; + // pad months, days, hours, minutes, and seconds to have two digits. + if (value < 10) + result[length] = "0" + value; + } + // pad milliseconds to have three digits. + return year + "-" + result.slice(0, 2).join("-") + "T" + result.slice(2).join(":") + "." + + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"; + } +} + +// ES5 15.9.4.4 +// http://es5.github.com/#x15.9.4.4 +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} + +// ES5 15.9.5.44 +// http://es5.github.com/#x15.9.5.44 +// This function provides a String representation of a Date object for use by +// JSON.stringify (15.12.3). +if (!Date.prototype.toJSON) { + Date.prototype.toJSON = function toJSON(key) { + // When the toJSON method is called with argument key, the following + // steps are taken: + + // 1. Let O be the result of calling ToObject, giving it the this + // value as its argument. + // 2. Let tv be ToPrimitive(O, hint Number). + // 3. If tv is a Number and is not finite, return null. + // XXX + // 4. Let toISO be the result of calling the [[Get]] internal method of + // O with argument "toISOString". + // 5. If IsCallable(toISO) is false, throw a TypeError exception. + if (typeof this.toISOString != "function") + throw new TypeError(); // TODO message + // 6. Return the result of calling the [[Call]] internal method of + // toISO with O as the this value and an empty argument list. + return this.toISOString(); + + // NOTE 1 The argument is ignored. + + // NOTE 2 The toJSON function is intentionally generic; it does not + // require that its this value be a Date object. Therefore, it can be + // transferred to other kinds of objects for use as a method. However, + // it does require that any such object have a toISOString method. An + // object is free to use the argument key to filter its + // stringification. + }; +} + +// ES5 15.9.4.2 +// http://es5.github.com/#x15.9.4.2 +// based on work shared by Daniel Friesen (dantman) +// http://gist.github.com/303249 +if (Date.parse("+275760-09-13T00:00:00.000Z") !== 8.64e15) { + // XXX global assignment won't work in embeddings that use + // an alternate object for the context. + Date = (function(NativeDate) { + + // Date.length === 7 + var Date = function Date(Y, M, D, h, m, s, ms) { + var length = arguments.length; + if (this instanceof NativeDate) { + var date = length == 1 && String(Y) === Y ? // isString(Y) + // We explicitly pass it through parse: + new NativeDate(Date.parse(Y)) : + // We have to manually make calls depending on argument + // length here + length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) : + length >= 6 ? new NativeDate(Y, M, D, h, m, s) : + length >= 5 ? new NativeDate(Y, M, D, h, m) : + length >= 4 ? new NativeDate(Y, M, D, h) : + length >= 3 ? new NativeDate(Y, M, D) : + length >= 2 ? new NativeDate(Y, M) : + length >= 1 ? new NativeDate(Y) : + new NativeDate(); + // Prevent mixups with unfixed Date object + date.constructor = Date; + return date; + } + return NativeDate.apply(this, arguments); + }; + + // 15.9.1.15 Date Time String Format. + var isoDateExpression = new RegExp("^" + + "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + 6-digit extended year + "(?:-(\\d{2})" + // optional month capture + "(?:-(\\d{2})" + // optional day capture + "(?:" + // capture hours:minutes:seconds.milliseconds + "T(\\d{2})" + // hours capture + ":(\\d{2})" + // minutes capture + "(?:" + // optional :seconds.milliseconds + ":(\\d{2})" + // seconds capture + "(?:\\.(\\d{3}))?" + // milliseconds capture + ")?" + + "(?:" + // capture UTC offset component + "Z|" + // UTC capture + "(?:" + // offset specifier +/-hours:minutes + "([-+])" + // sign capture + "(\\d{2})" + // hours offset capture + ":(\\d{2})" + // minutes offset capture + ")" + + ")?)?)?)?" + + "$"); + + // Copy any custom methods a 3rd party library may have added + for (var key in NativeDate) + Date[key] = NativeDate[key]; + + // Copy "native" methods explicitly; they may be non-enumerable + Date.now = NativeDate.now; + Date.UTC = NativeDate.UTC; + Date.prototype = NativeDate.prototype; + Date.prototype.constructor = Date; + + // Upgrade Date.parse to handle simplified ISO 8601 strings + Date.parse = function parse(string) { + var match = isoDateExpression.exec(string); + if (match) { + match.shift(); // kill match[0], the full match + // parse months, days, hours, minutes, seconds, and milliseconds + for (var i = 1; i < 7; i++) { + // provide default values if necessary + match[i] = +(match[i] || (i < 3 ? 1 : 0)); + // match[1] is the month. Months are 0-11 in JavaScript + // `Date` objects, but 1-12 in ISO notation, so we + // decrement. + if (i == 1) + match[i]--; + } + + // parse the UTC offset component + var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop(); + + // compute the explicit time zone offset if specified + var offset = 0; + if (sign) { + // detect invalid offsets and return early + if (hourOffset > 23 || minuteOffset > 59) + return NaN; + + // express the provided time zone offset in minutes. The offset is + // negative for time zones west of UTC; positive otherwise. + offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == "+" ? -1 : 1); + } + + // Date.UTC for years between 0 and 99 converts year to 1900 + year + // The Gregorian calendar has a 400-year cycle, so + // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...), + // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years + var year = +match[0]; + if (0 <= year && year <= 99) { + match[0] = year + 400; + return NativeDate.UTC.apply(this, match) + offset - 12622780800000; + } + + // compute a new UTC date value, accounting for the optional offset + return NativeDate.UTC.apply(this, match) + offset; + } + return NativeDate.parse.apply(this, arguments); + }; + + return Date; + })(Date); +} + +// +// String +// ====== +// + +// ES5 15.5.4.20 +// http://es5.github.com/#x15.5.4.20 +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + // http://blog.stevenlevithan.com/archives/faster-trim-javascript + // http://perfectionkills.com/whitespace-deviations/ + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer +var toInteger = function (n) { + n = +n; + if (n !== n) // isNaN + n = 0; + else if (n !== 0 && n !== (1/0) && n !== -(1/0)) + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + return n; +}; + +var prepareString = "a"[0] != "a", + // ES5 9.9 + // http://es5.github.com/#x9.9 + toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError(); // TODO message + } + // If the implementation doesn't support by-index access of + // string characters (ex. IE < 7), split the string + if (prepareString && typeof o == "string" && o) { + return o.split(""); + } + return Object(o); + }; +});/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * Irakli Gozalishvili (http://jeditoolkit.com) + * Mike de Boer + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry = this._eventRegistry || {}; + this._defaultHandlers = this._defaultHandlers || {}; + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + e = e || {}; + e.type = eventName; + + if (!e.stopPropagation) { + e.stopPropagation = function() { + this.propagationStopped = true; + }; + } + + if (!e.preventDefault) { + e.preventDefault = function() { + this.defaultPrevented = true; + }; + } + + for (var i=0; i + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.inherits = (function() { + var tempCtor = function() {}; + return function(ctor, superCtor) { + tempCtor.prototype = superCtor.prototype; + ctor.super_ = superCtor.prototype; + ctor.prototype = new tempCtor(); + ctor.prototype.constructor = ctor; + }; +}()); + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/mode/css_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/css/csslint'], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var CSSLint = require("./css/csslint").CSSLint; + +var Worker = exports.Worker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(200); +}; + +oop.inherits(Worker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + + var result = CSSLint.verify(value); + this.sender.emit("csslint", result.messages.map(function(msg) { + delete msg.rule; + return msg; + })); + }; + +}).call(Worker.prototype); + +});define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) { +"use strict"; + +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + doc.applyDeltas([e.data]); + deferredUpdate.schedule(_self.$timeout); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + // abstract method + }; + +}).call(Mirror.prototype); + +});/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(text) { + this.$lines = []; + + if (Array.isArray(text)) { + this.insertLines(0, text); + } + // There has to be one line at least in the document. If you pass an empty + // string to the insert function, nothing will happen. Workaround. + else if (text.length == 0) { + this.$lines = [""]; + } else { + this.insert({row: 0, column:0}, text); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setValue = function(text) { + var len = this.getLength(); + this.remove(new Range(0, 0, len, this.getLine(len-1).length)); + this.insert({row: 0, column:0}, text); + }; + + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + + // check for IE split bug + if ("aaa".split(/a/).length == 0) + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + } + else + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + if (match) { + this.$autoNewLine = match[1]; + } else { + this.$autoNewLine = "\n"; + } + }; + + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + + case "unix": + return "\n"; + + case "auto": + return this.$autoNewLine; + } + }; + + this.$autoNewLine = "\n"; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + }; + + this.getNewLineMode = function() { + return this.$newLineMode; + }; + + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + + /** + * Get a verbatim copy of the given line as it is in the document + */ + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + + /** + * Returns all lines in the document as string array. Warning: The caller + * should not modify this array! + */ + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + + this.getLength = function() { + return this.$lines.length; + }; + + this.getTextRange = function(range) { + if (range.start.row == range.end.row) { + return this.$lines[range.start.row].substring(range.start.column, + range.end.column); + } + else { + var lines = []; + lines.push(this.$lines[range.start.row].substring(range.start.column)); + lines.push.apply(lines, this.getLines(range.start.row+1, range.end.row-1)); + lines.push(this.$lines[range.end.row].substring(0, range.end.column)); + return lines.join(this.getNewLineCharacter()); + } + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length-1).length; + } + return position; + }; + + this.insert = function(position, text) { + if (text.length == 0) + return position; + + position = this.$clipPosition(position); + + if (this.getLength() <= 1) + this.$detectNewLine(text); + + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; + + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this.insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); + } + return position; + }; + + this.insertLines = function(row, lines) { + if (lines.length == 0) + return {row: row, column: 0}; + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return range.end; + }; + + this.insertNewLine = function(position) { + position = this.$clipPosition(position); + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column); + this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); + + var end = { + row : position.row + 1, + column : 0 + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.insertInLine = function(position, text) { + if (text.length == 0) + return position; + + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column) + text + + line.substring(position.column); + + var end = { + row : position.row, + column : position.column + text.length + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: text + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.remove = function(range) { + // clip to document + range.start = this.$clipPosition(range.start); + range.end = this.$clipPosition(range.end); + + if (range.isEmpty()) + return range.start; + + var firstRow = range.start.row; + var lastRow = range.end.row; + + if (range.isMultiLine()) { + var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; + var lastFullRow = lastRow - 1; + + if (range.end.column > 0) + this.removeInLine(lastRow, 0, range.end.column); + + if (lastFullRow >= firstFullRow) + this.removeLines(firstFullRow, lastFullRow); + + if (firstFullRow != firstRow) { + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); + this.removeNewLine(range.start.row); + } + } + else { + this.removeInLine(firstRow, range.start.column, range.end.column); + } + return range.start; + }; + + this.removeInLine = function(row, startColumn, endColumn) { + if (startColumn == endColumn) + return; + + var range = new Range(row, startColumn, row, endColumn); + var line = this.getLine(row); + var removed = line.substring(startColumn, endColumn); + var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); + this.$lines.splice(row, 1, newLine); + + var delta = { + action: "removeText", + range: range, + text: removed + }; + this._emit("change", { data: delta }); + return range.start; + }; + + /** + * Removes a range of full lines + * + * @param firstRow {Integer} The first row to be removed + * @param lastRow {Integer} The last row to be removed + * @return {String[]} The removed lines + */ + this.removeLines = function(firstRow, lastRow) { + var range = new Range(firstRow, 0, lastRow + 1, 0); + var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); + + var delta = { + action: "removeLines", + range: range, + nl: this.getNewLineCharacter(), + lines: removed + }; + this._emit("change", { data: delta }); + return removed; + }; + + this.removeNewLine = function(row) { + var firstLine = this.getLine(row); + var secondLine = this.getLine(row+1); + + var range = new Range(row, firstLine.length, row+1, 0); + var line = firstLine + secondLine; + + this.$lines.splice(row, 2, line); + + var delta = { + action: "removeText", + range: range, + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + }; + + this.replace = function(range, text) { + if (text.length == 0 && range.isEmpty()) + return range.start; + + // Shortcut: If the text we want to insert is the same as it is already + // in the document, we don't have to replace anything. + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + if (text) { + var end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + var delta = deltas[i]; + + var range = Range.fromPoints(delta.range.start, delta.range.end); + + if (delta.action == "insertLines") + this.removeLines(range.start.row, range.end.row - 1); + else if (delta.action == "insertText") + this.remove(range); + else if (delta.action == "removeLines") + this.insertLines(range.start.row, delta.lines); + else if (delta.action == "removeText") + this.insert(range.start, delta.text); + } + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEequal = function(range) { + return this.start.row == range.start.row && + this.end.row == range.end.row && + this.start.column == range.start.column && + this.end.column == range.end.column + }; + + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + + /** + * Compares this range (A) with another range (B), where B is the passed in + * range. + * + * Return values: + * -2: (B) is infront of (A) and doesn't intersect with (A) + * -1: (B) begins before (A) but ends inside of (A) + * 0: (B) is completly inside of (A) OR (A) is complety inside of (B) + * +1: (B) begins inside of (A) but ends outside of (A) + * +2: (B) is after (A) and doesn't intersect with (A) + * + * 42: FTW state: (B) ends in (A) but starts outside of (A) + */ + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + } + + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + } + + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + } + + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + } + + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + } + + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + } + + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + } + + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + }; + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + + /** + * Like .compare(), but if isStart is true, return -1; + */ + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + /** + * Like .compare(), but if isEnd is true, return 1; + */ + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + } + + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) { + var end = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row > lastRow) { + var start = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row < firstRow) { + var start = { + row: firstRow, + column: 0 + }; + } + + if (this.end.row < firstRow) { + var end = { + row: firstRow, + column: 0 + }; + } + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row == this.end.row && this.start.column == this.end.column); + }; + + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + + this.toScreenRange = function(session) { + var screenPosStart = + session.documentToScreenPosition(this.start); + var screenPosEnd = + session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + +}).call(Range.prototype); + + +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; + +exports.Range = Range; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +/** + * An Anchor is a floating pointer in the document. Whenever text is inserted or + * deleted before the cursor, the position of the cursor is updated + */ +var Anchor = exports.Anchor = function(doc, row, column) { + this.document = doc; + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + + this.$onChange = this.onChange.bind(this); + doc.on("change", this.$onChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + + this.getDocument = function() { + return this.document; + }; + + this.onChange = function(e) { + var delta = e.data; + var range = delta.range; + + if (range.start.row == range.end.row && range.start.row != this.row) + return; + + if (range.start.row > this.row) + return; + + if (range.start.row == this.row && range.start.column > this.column) + return; + + var row = this.row; + var column = this.column; + + if (delta.action === "insertText") { + if (range.start.row === row && range.start.column <= column) { + if (range.start.row === range.end.row) { + column += range.end.column - range.start.column; + } + else { + column -= range.start.column; + row += range.end.row - range.start.row; + } + } + else if (range.start.row !== range.end.row && range.start.row < row) { + row += range.end.row - range.start.row; + } + } else if (delta.action === "insertLines") { + if (range.start.row <= row) { + row += range.end.row - range.start.row; + } + } + else if (delta.action == "removeText") { + if (range.start.row == row && range.start.column < column) { + if (range.end.column >= column) + column = range.start.column; + else + column = Math.max(0, column - (range.end.column - range.start.column)); + + } else if (range.start.row !== range.end.row && range.start.row < row) { + if (range.end.row == row) { + column = Math.max(0, column - range.end.column) + range.start.column; + } + row -= (range.end.row - range.start.row); + } + else if (range.end.row == row) { + row -= range.end.row - range.start.row; + column = Math.max(0, column - range.end.column) + range.start.column; + } + } else if (delta.action == "removeLines") { + if (range.start.row <= row) { + if (range.end.row <= row) + row -= range.end.row - range.start.row; + else { + row = range.start.row; + column = 0; + } + } + } + + this.setPosition(row, column, true); + }; + + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._emit("change", { + old: old, + value: pos + }); + }; + + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + return new Array(count + 1).join(string); +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i= 0 && this._ltIndex < this._lt.length){ + + i++; + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + + //obey channels logic + while((info.channel !== undefined && channel !== info.channel) && + this._ltIndex < this._lt.length){ + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + i++; + } + + //here be dragons + if ((info.channel === undefined || channel === info.channel) && + this._ltIndex <= this._lt.length){ + this._ltIndexCache.push(i); + return this._token.type; + } + } + + //call token retriever method + token = this._getToken(); + + //if it should be hidden, don't save a token + if (token.type > -1 && !tokenInfo[token.type].hide){ + + //apply token channel + token.channel = tokenInfo[token.type].channel; + + //save for later + this._token = token; + this._lt.push(token); + + //save space that will be moved (must be done before array is truncated) + this._ltIndexCache.push(this._lt.length - this._ltIndex + i); + + //keep the buffer under 5 items + if (this._lt.length > 5){ + this._lt.shift(); + } + + //also keep the shift buffer under 5 items + if (this._ltIndexCache.length > 5){ + this._ltIndexCache.shift(); + } + + //update lookahead index + this._ltIndex = this._lt.length; + } + + /* + * Skip to the next token if: + * 1. The token type is marked as hidden. + * 2. The token type has a channel specified and it isn't the current channel. + */ + info = tokenInfo[token.type]; + if (info && + (info.hide || + (info.channel !== undefined && channel !== info.channel))){ + return this.get(channel); + } else { + //return just the type + return token.type; + } + }, + + /** + * Looks ahead a certain number of tokens and returns the token type at + * that position. This will throw an error if you lookahead past the + * end of input, past the size of the lookahead buffer, or back past + * the first token in the lookahead buffer. + * @param {int} The index of the token type to retrieve. 0 for the + * current token, 1 for the next, -1 for the previous, etc. + * @return {int} The token type of the token in the given position. + * @method LA + */ + LA: function(index){ + var total = index, + tt; + if (index > 0){ + //TODO: Store 5 somewhere + if (index > 5){ + throw new Error("Too much lookahead."); + } + + //get all those tokens + while(total){ + tt = this.get(); + total--; + } + + //unget all those tokens + while(total < index){ + this.unget(); + total++; + } + } else if (index < 0){ + + if(this._lt[this._ltIndex+index]){ + tt = this._lt[this._ltIndex+index].type; + } else { + throw new Error("Too much lookbehind."); + } + + } else { + tt = this._token.type; + } + + return tt; + + }, + + /** + * Looks ahead a certain number of tokens and returns the token at + * that position. This will throw an error if you lookahead past the + * end of input, past the size of the lookahead buffer, or back past + * the first token in the lookahead buffer. + * @param {int} The index of the token type to retrieve. 0 for the + * current token, 1 for the next, -1 for the previous, etc. + * @return {Object} The token of the token in the given position. + * @method LA + */ + LT: function(index){ + + //lookahead first to prime the token buffer + this.LA(index); + + //now find the token, subtract one because _ltIndex is already at the next index + return this._lt[this._ltIndex+index-1]; + }, + + /** + * Returns the token type for the next token in the stream without + * consuming it. + * @return {int} The token type of the next token in the stream. + * @method peek + */ + peek: function(){ + return this.LA(1); + }, + + /** + * Returns the actual token object for the last consumed token. + * @return {Token} The token object for the last consumed token. + * @method token + */ + token: function(){ + return this._token; + }, + + /** + * Returns the name of the token for the given token type. + * @param {int} tokenType The type of token to get the name of. + * @return {String} The name of the token or "UNKNOWN_TOKEN" for any + * invalid token type. + * @method tokenName + */ + tokenName: function(tokenType){ + if (tokenType < 0 || tokenType > this._tokenData.length){ + return "UNKNOWN_TOKEN"; + } else { + return this._tokenData[tokenType].name; + } + }, + + /** + * Returns the token type value for the given token name. + * @param {String} tokenName The name of the token whose value should be returned. + * @return {int} The token type value for the given token name or -1 + * for an unknown token. + * @method tokenName + */ + tokenType: function(tokenName){ + return this._tokenData[tokenName] || -1; + }, + + /** + * Returns the last consumed token to the token stream. + * @method unget + */ + unget: function(){ + //if (this._ltIndex > -1){ + if (this._ltIndexCache.length){ + this._ltIndex -= this._ltIndexCache.pop();//--; + this._token = this._lt[this._ltIndex - 1]; + } else { + throw new Error("Too much lookahead."); + } + } + +}; + + + +parserlib.util = { +StringReader: StringReader, +SyntaxError : SyntaxError, +SyntaxUnit : SyntaxUnit, +EventTarget : EventTarget, +TokenStreamBase : TokenStreamBase +}; +})(); + +/* +Parser-Lib +Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved. + +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. + +*/ +/* Build time: 13-July-2011 04:35:28 */ +(function(){ +var EventTarget = parserlib.util.EventTarget, +TokenStreamBase = parserlib.util.TokenStreamBase, +StringReader = parserlib.util.StringReader, +SyntaxError = parserlib.util.SyntaxError, +SyntaxUnit = parserlib.util.SyntaxUnit; + +var Colors = { + aliceblue :"#f0f8ff", + antiquewhite :"#faebd7", + aqua :"#00ffff", + aquamarine :"#7fffd4", + azure :"#f0ffff", + beige :"#f5f5dc", + bisque :"#ffe4c4", + black :"#000000", + blanchedalmond :"#ffebcd", + blue :"#0000ff", + blueviolet :"#8a2be2", + brown :"#a52a2a", + burlywood :"#deb887", + cadetblue :"#5f9ea0", + chartreuse :"#7fff00", + chocolate :"#d2691e", + coral :"#ff7f50", + cornflowerblue :"#6495ed", + cornsilk :"#fff8dc", + crimson :"#dc143c", + cyan :"#00ffff", + darkblue :"#00008b", + darkcyan :"#008b8b", + darkgoldenrod :"#b8860b", + darkgray :"#a9a9a9", + darkgreen :"#006400", + darkkhaki :"#bdb76b", + darkmagenta :"#8b008b", + darkolivegreen :"#556b2f", + darkorange :"#ff8c00", + darkorchid :"#9932cc", + darkred :"#8b0000", + darksalmon :"#e9967a", + darkseagreen :"#8fbc8f", + darkslateblue :"#483d8b", + darkslategray :"#2f4f4f", + darkturquoise :"#00ced1", + darkviolet :"#9400d3", + deeppink :"#ff1493", + deepskyblue :"#00bfff", + dimgray :"#696969", + dodgerblue :"#1e90ff", + firebrick :"#b22222", + floralwhite :"#fffaf0", + forestgreen :"#228b22", + fuchsia :"#ff00ff", + gainsboro :"#dcdcdc", + ghostwhite :"#f8f8ff", + gold :"#ffd700", + goldenrod :"#daa520", + gray :"#808080", + green :"#008000", + greenyellow :"#adff2f", + honeydew :"#f0fff0", + hotpink :"#ff69b4", + indianred :"#cd5c5c", + indigo :"#4b0082", + ivory :"#fffff0", + khaki :"#f0e68c", + lavender :"#e6e6fa", + lavenderblush :"#fff0f5", + lawngreen :"#7cfc00", + lemonchiffon :"#fffacd", + lightblue :"#add8e6", + lightcoral :"#f08080", + lightcyan :"#e0ffff", + lightgoldenrodyellow :"#fafad2", + lightgrey :"#d3d3d3", + lightgreen :"#90ee90", + lightpink :"#ffb6c1", + lightsalmon :"#ffa07a", + lightseagreen :"#20b2aa", + lightskyblue :"#87cefa", + lightslategray :"#778899", + lightsteelblue :"#b0c4de", + lightyellow :"#ffffe0", + lime :"#00ff00", + limegreen :"#32cd32", + linen :"#faf0e6", + magenta :"#ff00ff", + maroon :"#800000", + mediumaquamarine:"#66cdaa", + mediumblue :"#0000cd", + mediumorchid :"#ba55d3", + mediumpurple :"#9370d8", + mediumseagreen :"#3cb371", + mediumslateblue :"#7b68ee", + mediumspringgreen :"#00fa9a", + mediumturquoise :"#48d1cc", + mediumvioletred :"#c71585", + midnightblue :"#191970", + mintcream :"#f5fffa", + mistyrose :"#ffe4e1", + moccasin :"#ffe4b5", + navajowhite :"#ffdead", + navy :"#000080", + oldlace :"#fdf5e6", + olive :"#808000", + olivedrab :"#6b8e23", + orange :"#ffa500", + orangered :"#ff4500", + orchid :"#da70d6", + palegoldenrod :"#eee8aa", + palegreen :"#98fb98", + paleturquoise :"#afeeee", + palevioletred :"#d87093", + papayawhip :"#ffefd5", + peachpuff :"#ffdab9", + peru :"#cd853f", + pink :"#ffc0cb", + plum :"#dda0dd", + powderblue :"#b0e0e6", + purple :"#800080", + red :"#ff0000", + rosybrown :"#bc8f8f", + royalblue :"#4169e1", + saddlebrown :"#8b4513", + salmon :"#fa8072", + sandybrown :"#f4a460", + seagreen :"#2e8b57", + seashell :"#fff5ee", + sienna :"#a0522d", + silver :"#c0c0c0", + skyblue :"#87ceeb", + slateblue :"#6a5acd", + slategray :"#708090", + snow :"#fffafa", + springgreen :"#00ff7f", + steelblue :"#4682b4", + tan :"#d2b48c", + teal :"#008080", + thistle :"#d8bfd8", + tomato :"#ff6347", + turquoise :"#40e0d0", + violet :"#ee82ee", + wheat :"#f5deb3", + white :"#ffffff", + whitesmoke :"#f5f5f5", + yellow :"#ffff00", + yellowgreen :"#9acd32" +}; +/** + * Represents a selector combinator (whitespace, +, >). + * @namespace parserlib.css + * @class Combinator + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {String} text The text representation of the unit. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function Combinator(text, line, col){ + + SyntaxUnit.call(this, text, line, col); + + /** + * The type of modifier. + * @type String + * @property type + */ + this.type = "unknown"; + + //pretty simple + if (/^\s+$/.test(text)){ + this.type = "descendant"; + } else if (text == ">"){ + this.type = "child"; + } else if (text == "+"){ + this.type = "adjacent-sibling"; + } else if (text == "~"){ + this.type = "sibling"; + } + +} + +Combinator.prototype = new SyntaxUnit(); +Combinator.prototype.constructor = Combinator; + + + +var Level1Properties = { + + "background": 1, + "background-attachment": 1, + "background-color": 1, + "background-image": 1, + "background-position": 1, + "background-repeat": 1, + + "border": 1, + "border-bottom": 1, + "border-bottom-width": 1, + "border-color": 1, + "border-left": 1, + "border-left-width": 1, + "border-right": 1, + "border-right-width": 1, + "border-style": 1, + "border-top": 1, + "border-top-width": 1, + "border-width": 1, + + "clear": 1, + "color": 1, + "display": 1, + "float": 1, + + "font": 1, + "font-family": 1, + "font-size": 1, + "font-style": 1, + "font-variant": 1, + "font-weight": 1, + + "height": 1, + "letter-spacing": 1, + "line-height": 1, + + "list-style": 1, + "list-style-image": 1, + "list-style-position": 1, + "list-style-type": 1, + + "margin": 1, + "margin-bottom": 1, + "margin-left": 1, + "margin-right": 1, + "margin-top": 1, + + "padding": 1, + "padding-bottom": 1, + "padding-left": 1, + "padding-right": 1, + "padding-top": 1, + + "text-align": 1, + "text-decoration": 1, + "text-indent": 1, + "text-transform": 1, + + "vertical-align": 1, + "white-space": 1, + "width": 1, + "word-spacing": 1 + +}; + +var Level2Properties = { + + //Aural + "azimuth": 1, + "cue-after": 1, + "cue-before": 1, + "cue": 1, + "elevation": 1, + "pause-after": 1, + "pause-before": 1, + "pause": 1, + "pitch-range": 1, + "pitch": 1, + "play-during": 1, + "richness": 1, + "speak-header": 1, + "speak-numeral": 1, + "speak-punctuation": 1, + "speak": 1, + "speech-rate": 1, + "stress": 1, + "voice-family": 1, + "volume": 1, + + //Paged + "orphans": 1, + "page-break-after": 1, + "page-break-before": 1, + "page-break-inside": 1, + "widows": 1, + + //Interactive + "cursor": 1, + "outline-color": 1, + "outline-style": 1, + "outline-width": 1, + "outline": 1, + + //Visual + "background-attachment": 1, + "background-color": 1, + "background-image": 1, + "background-position": 1, + "background-repeat": 1, + "background": 1, + "border-collapse": 1, + "border-color": 1, + "border-spacing": 1, + "border-style": 1, + "border-top": 1, + "border-top-color": 1, + "border-top-style": 1, + "border-top-width": 1, + "border-width": 1, + "border": 1, + "bottom": 1, + "caption-side": 1, + "clear": 1, + "clip": 1, + "color": 1, + "content": 1, + "counter-increment": 1, + "counter-reset": 1, + "direction": 1, + "display": 1, + "empty-cells": 1, + "float": 1, + "font-family": 1, + "font-size": 1, + "font-style": 1, + "font-variant": 1, + "font-weight": 1, + "font": 1, + "height": 1, + "left": 1, + "letter-spacing": 1, + "line-height": 1, + "list-style-image": 1, + "list-style-position": 1, + "list-style-type": 1, + "list-style": 1, + "margin-right": 1, + "margin-top": 1, + "margin": 1, + "max-height": 1, + "max-width": 1, + "min-height": 1, + "min-width": 1, + "overflow": 1, + "padding-top": 1, + "padding": 1, + "position": 1, + "quotes": 1, + "right": 1, + "table-layout": 1, + "text-align": 1, + "text-decoration": 1, + "text-indent": 1, + "text-transform": 1, + "top": 1, + "unicode-bidi": 1, + "vertical-align": 1, + "visibility": 1, + "white-space": 1, + "width": 1, + "word-spacing": 1, + "z-index": 1 +}; +/** + * Represents a media feature, such as max-width:500. + * @namespace parserlib.css + * @class MediaFeature + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {SyntaxUnit} name The name of the feature. + * @param {SyntaxUnit} value The value of the feature or null if none. + */ +function MediaFeature(name, value){ + + SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol); + + /** + * The name of the media feature + * @type String + * @property name + */ + this.name = name; + + /** + * The value for the feature or null if there is none. + * @type SyntaxUnit + * @property value + */ + this.value = value; +} + +MediaFeature.prototype = new SyntaxUnit(); +MediaFeature.prototype.constructor = MediaFeature; + + +/** + * Represents an individual media query. + * @namespace parserlib.css + * @class MediaQuery + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {String} modifier The modifier "not" or "only" (or null). + * @param {String} mediaType The type of media (i.e., "print"). + * @param {Array} parts Array of selectors parts making up this selector. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function MediaQuery(modifier, mediaType, features, line, col){ + + SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType + " " : "") + features.join(" and "), line, col); + + /** + * The media modifier ("not" or "only") + * @type String + * @property modifier + */ + this.modifier = modifier; + + /** + * The mediaType (i.e., "print") + * @type String + * @property mediaType + */ + this.mediaType = mediaType; + + /** + * The parts that make up the selector. + * @type Array + * @property features + */ + this.features = features; + +} + +MediaQuery.prototype = new SyntaxUnit(); +MediaQuery.prototype.constructor = MediaQuery; + + +/** + * A CSS3 parser. + * @namespace parserlib.css + * @class Parser + * @constructor + * @param {Object} options (Optional) Various options for the parser: + * starHack (true|false) to allow IE6 star hack as valid, + * underscoreHack (true|false) to interpret leading underscores + * as IE6-7 targeting for known properties, ieFilters (true|false) + * to indicate that IE < 8 filters should be accepted and not throw + * syntax errors. + */ +function Parser(options){ + + //inherit event functionality + EventTarget.call(this); + + + this.options = options || {}; + + this._tokenStream = null; +} + +Parser.prototype = function(){ + + var proto = new EventTarget(), //new prototype + prop, + additions = { + + //restore constructor + constructor: Parser, + + //----------------------------------------------------------------- + // Grammar + //----------------------------------------------------------------- + + _stylesheet: function(){ + + /* + * stylesheet + * : [ CHARSET_SYM S* STRING S* ';' ]? + * [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* + * [ namespace [S|CDO|CDC]* ]* + * [ [ ruleset | media | page | font_face | keyframes ] [S|CDO|CDC]* ]* + * ; + */ + + var tokenStream = this._tokenStream, + charset = null, + token, + tt; + + this.fire("startstylesheet"); + + //try to read character set + this._charset(); + + this._skipCruft(); + + //try to read imports - may be more than one + while (tokenStream.peek() == Tokens.IMPORT_SYM){ + this._import(); + this._skipCruft(); + } + + //try to read namespaces - may be more than one + while (tokenStream.peek() == Tokens.NAMESPACE_SYM){ + this._namespace(); + this._skipCruft(); + } + + //get the next token + tt = tokenStream.peek(); + + //try to read the rest + while(tt > Tokens.EOF){ + + try { + + switch(tt){ + case Tokens.MEDIA_SYM: + this._media(); + this._skipCruft(); + break; + case Tokens.PAGE_SYM: + this._page(); + this._skipCruft(); + break; + case Tokens.FONT_FACE_SYM: + this._font_face(); + this._skipCruft(); + break; + case Tokens.KEYFRAMES_SYM: + this._keyframes(); + this._skipCruft(); + break; + case Tokens.S: + this._readWhitespace(); + break; + default: + if(!this._ruleset()){ + + //error handling for known issues + switch(tt){ + case Tokens.CHARSET_SYM: + token = tokenStream.LT(1); + this._charset(false); + throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol); + case Tokens.IMPORT_SYM: + token = tokenStream.LT(1); + this._import(false); + throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol); + case Tokens.NAMESPACE_SYM: + token = tokenStream.LT(1); + this._namespace(false); + throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol); + default: + tokenStream.get(); //get the last token + this._unexpectedToken(tokenStream.token()); + } + + } + } + } catch(ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + } else { + throw ex; + } + } + + tt = tokenStream.peek(); + } + + if (tt != Tokens.EOF){ + this._unexpectedToken(tokenStream.token()); + } + + this.fire("endstylesheet"); + }, + + _charset: function(emit){ + var tokenStream = this._tokenStream, + charset, + token, + line, + col; + + if (tokenStream.match(Tokens.CHARSET_SYM)){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.STRING); + + token = tokenStream.token(); + charset = token.value; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.SEMICOLON); + + if (emit !== false){ + this.fire({ + type: "charset", + charset:charset, + line: line, + col: col + }); + } + } + }, + + _import: function(emit){ + /* + * import + * : IMPORT_SYM S* + * [STRING|URI] S* media_query_list? ';' S* + */ + + var tokenStream = this._tokenStream, + tt, + uri, + importToken, + mediaList = []; + + //read import symbol + tokenStream.mustMatch(Tokens.IMPORT_SYM); + importToken = tokenStream.token(); + this._readWhitespace(); + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + + //grab the URI value + uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); + + this._readWhitespace(); + + mediaList = this._media_query_list(); + + //must end with a semicolon + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "import", + uri: uri, + media: mediaList, + line: importToken.startLine, + col: importToken.startCol + }); + } + + }, + + _namespace: function(emit){ + /* + * namespace + * : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S* + */ + + var tokenStream = this._tokenStream, + line, + col, + prefix, + uri; + + //read import symbol + tokenStream.mustMatch(Tokens.NAMESPACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + this._readWhitespace(); + + //it's a namespace prefix - no _namespace_prefix() method because it's just an IDENT + if (tokenStream.match(Tokens.IDENT)){ + prefix = tokenStream.token().value; + this._readWhitespace(); + } + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + /*if (!tokenStream.match(Tokens.STRING)){ + tokenStream.mustMatch(Tokens.URI); + }*/ + + //grab the URI value + uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); + + this._readWhitespace(); + + //must end with a semicolon + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "namespace", + prefix: prefix, + uri: uri, + line: line, + col: col + }); + } + + }, + + _media: function(){ + /* + * media + * : MEDIA_SYM S* media_query_list S* '{' S* ruleset* '}' S* + * ; + */ + var tokenStream = this._tokenStream, + line, + col, + mediaList;// = []; + + //look for @media + tokenStream.mustMatch(Tokens.MEDIA_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + mediaList = this._media_query_list(); + + tokenStream.mustMatch(Tokens.LBRACE); + this._readWhitespace(); + + this.fire({ + type: "startmedia", + media: mediaList, + line: line, + col: col + }); + + while(true) { + if (tokenStream.peek() == Tokens.PAGE_SYM){ + this._page(); + } else if (!this._ruleset()){ + break; + } + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + this.fire({ + type: "endmedia", + media: mediaList, + line: line, + col: col + }); + }, + + + //CSS3 Media Queries + _media_query_list: function(){ + /* + * media_query_list + * : S* [media_query [ ',' S* media_query ]* ]? + * ; + */ + var tokenStream = this._tokenStream, + mediaList = []; + + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){ + mediaList.push(this._media_query()); + } + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + mediaList.push(this._media_query()); + } + + return mediaList; + }, + + /* + * Note: "expression" in the grammar maps to the _media_expression + * method. + + */ + _media_query: function(){ + /* + * media_query + * : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* + * | expression [ AND S* expression ]* + * ; + */ + var tokenStream = this._tokenStream, + type = null, + ident = null, + token = null, + expressions = []; + + if (tokenStream.match(Tokens.IDENT)){ + ident = tokenStream.token().value.toLowerCase(); + + //since there's no custom tokens for these, need to manually check + if (ident != "only" && ident != "not"){ + tokenStream.unget(); + ident = null; + } else { + token = tokenStream.token(); + } + } + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT){ + type = this._media_type(); + if (token === null){ + token = tokenStream.token(); + } + } else if (tokenStream.peek() == Tokens.LPAREN){ + if (token === null){ + token = tokenStream.LT(1); + } + expressions.push(this._media_expression()); + } + + if (type === null && expressions.length === 0){ + return null; + } else { + this._readWhitespace(); + while (tokenStream.match(Tokens.IDENT)){ + if (tokenStream.token().value.toLowerCase() != "and"){ + this._unexpectedToken(tokenStream.token()); + } + + this._readWhitespace(); + expressions.push(this._media_expression()); + } + } + + return new MediaQuery(ident, type, expressions, token.startLine, token.startCol); + }, + + //CSS3 Media Queries + _media_type: function(){ + /* + * media_type + * : IDENT + * ; + */ + return this._media_feature(); + }, + + /** + * Note: in CSS3 Media Queries, this is called "expression". + * Renamed here to avoid conflict with CSS3 Selectors + * definition of "expression". Also note that "expr" in the + * grammar now maps to "expression" from CSS3 selectors. + * @method _media_expression + * @private + */ + _media_expression: function(){ + /* + * expression + * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* + * ; + */ + var tokenStream = this._tokenStream, + feature = null, + token, + expression = null; + + tokenStream.mustMatch(Tokens.LPAREN); + + feature = this._media_feature(); + this._readWhitespace(); + + if (tokenStream.match(Tokens.COLON)){ + this._readWhitespace(); + token = tokenStream.LT(1); + expression = this._expression(); + } + + tokenStream.mustMatch(Tokens.RPAREN); + this._readWhitespace(); + + return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null)); + }, + + //CSS3 Media Queries + _media_feature: function(){ + /* + * media_feature + * : IDENT + * ; + */ + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.IDENT); + + return SyntaxUnit.fromToken(tokenStream.token()); + }, + + //CSS3 Paged Media + _page: function(){ + /* + * page: + * PAGE_SYM S* IDENT? pseudo_page? S* + * '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* + * ; + */ + var tokenStream = this._tokenStream, + line, + col, + identifier = null, + pseudoPage = null; + + //look for @page + tokenStream.mustMatch(Tokens.PAGE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + if (tokenStream.match(Tokens.IDENT)){ + identifier = tokenStream.token().value; + + //The value 'auto' may not be used as a page name and MUST be treated as a syntax error. + if (identifier.toLowerCase() === "auto"){ + this._unexpectedToken(tokenStream.token()); + } + } + + //see if there's a colon upcoming + if (tokenStream.peek() == Tokens.COLON){ + pseudoPage = this._pseudo_page(); + } + + this._readWhitespace(); + + this.fire({ + type: "startpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + this._readDeclarations(true, true); + + this.fire({ + type: "endpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + }, + + //CSS3 Paged Media + _margin: function(){ + /* + * margin : + * margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S* + * ; + */ + var tokenStream = this._tokenStream, + line, + col, + marginSym = this._margin_sym(); + + if (marginSym){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this.fire({ + type: "startpagemargin", + margin: marginSym, + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endpagemargin", + margin: marginSym, + line: line, + col: col + }); + return true; + } else { + return false; + } + }, + + //CSS3 Paged Media + _margin_sym: function(){ + + /* + * margin_sym : + * TOPLEFTCORNER_SYM | + * TOPLEFT_SYM | + * TOPCENTER_SYM | + * TOPRIGHT_SYM | + * TOPRIGHTCORNER_SYM | + * BOTTOMLEFTCORNER_SYM | + * BOTTOMLEFT_SYM | + * BOTTOMCENTER_SYM | + * BOTTOMRIGHT_SYM | + * BOTTOMRIGHTCORNER_SYM | + * LEFTTOP_SYM | + * LEFTMIDDLE_SYM | + * LEFTBOTTOM_SYM | + * RIGHTTOP_SYM | + * RIGHTMIDDLE_SYM | + * RIGHTBOTTOM_SYM + * ; + */ + + var tokenStream = this._tokenStream; + + if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM, + Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM, + Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, + Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM, + Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, + Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM, + Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) + { + return SyntaxUnit.fromToken(tokenStream.token()); + } else { + return null; + } + + }, + + _pseudo_page: function(){ + /* + * pseudo_page + * : ':' IDENT + * ; + */ + + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.COLON); + tokenStream.mustMatch(Tokens.IDENT); + + //TODO: CSS3 Paged Media says only "left", "center", and "right" are allowed + + return tokenStream.token().value; + }, + + _font_face: function(){ + /* + * font_face + * : FONT_FACE_SYM S* + * '{' S* declaration [ ';' S* declaration ]* '}' S* + * ; + */ + var tokenStream = this._tokenStream, + line, + col; + + //look for @page + tokenStream.mustMatch(Tokens.FONT_FACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + this.fire({ + type: "startfontface", + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endfontface", + line: line, + col: col + }); + }, + + _operator: function(){ + + /* + * operator + * : '/' S* | ',' S* | /( empty )/ + * ; + */ + + var tokenStream = this._tokenStream, + token = null; + + if (tokenStream.match([Tokens.SLASH, Tokens.COMMA])){ + token = tokenStream.token(); + this._readWhitespace(); + } + return token ? PropertyValuePart.fromToken(token) : null; + + }, + + _combinator: function(){ + + /* + * combinator + * : PLUS S* | GREATER S* | TILDE S* | S+ + * ; + */ + + var tokenStream = this._tokenStream, + value = null, + token; + + if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){ + token = tokenStream.token(); + value = new Combinator(token.value, token.startLine, token.startCol); + this._readWhitespace(); + } + + return value; + }, + + _unary_operator: function(){ + + /* + * unary_operator + * : '-' | '+' + * ; + */ + + var tokenStream = this._tokenStream; + + if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){ + return tokenStream.token().value; + } else { + return null; + } + }, + + _property: function(){ + + /* + * property + * : IDENT S* + * ; + */ + + var tokenStream = this._tokenStream, + value = null, + hack = null, + tokenValue, + token, + line, + col; + + //check for star hack - throws error if not allowed + if (tokenStream.peek() == Tokens.STAR && this.options.starHack){ + tokenStream.get(); + token = tokenStream.token(); + hack = token.value; + line = token.startLine; + col = token.startCol; + } + + if(tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + tokenValue = token.value; + + //check for underscore hack - no error if not allowed because it's valid CSS syntax + if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){ + hack = "_"; + tokenValue = tokenValue.substring(1); + } + + value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol)); + this._readWhitespace(); + } + + return value; + }, + + //Augmented with CSS3 Selectors + _ruleset: function(){ + /* + * ruleset + * : selectors_group + * '{' S* declaration? [ ';' S* declaration? ]* '}' S* + * ; + */ + + var tokenStream = this._tokenStream, + tt, + selectors; + + + /* + * Error Recovery: If even a single selector fails to parse, + * then the entire ruleset should be thrown away. + */ + try { + selectors = this._selectors_group(); + } catch (ex){ + if (ex instanceof SyntaxError && !this.options.strict){ + + //fire error event + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + + //skip over everything until closing brace + tt = tokenStream.advance([Tokens.RBRACE]); + if (tt == Tokens.RBRACE){ + //if there's a right brace, the rule is finished so don't do anything + } else { + //otherwise, rethrow the error because it wasn't handled properly + throw ex; + } + + } else { + //not a syntax error, rethrow it + throw ex; + } + + //trigger parser to continue + return true; + } + + //if it got here, all selectors parsed + if (selectors){ + + this.fire({ + type: "startrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + } + + return selectors; + + }, + + //CSS3 Selectors + _selectors_group: function(){ + + /* + * selectors_group + * : selector [ COMMA S* selector ]* + * ; + */ + var tokenStream = this._tokenStream, + selectors = [], + selector; + + selector = this._selector(); + if (selector !== null){ + + selectors.push(selector); + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + selector = this._selector(); + if (selector !== null){ + selectors.push(selector); + } else { + this._unexpectedToken(tokenStream.LT(1)); + } + } + } + + return selectors.length ? selectors : null; + }, + + //CSS3 Selectors + _selector: function(){ + /* + * selector + * : simple_selector_sequence [ combinator simple_selector_sequence ]* + * ; + */ + + var tokenStream = this._tokenStream, + selector = [], + nextSelector = null, + combinator = null, + ws = null; + + //if there's no simple selector, then there's no selector + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + return null; + } + + selector.push(nextSelector); + + do { + + //look for a combinator + combinator = this._combinator(); + + if (combinator !== null){ + selector.push(combinator); + nextSelector = this._simple_selector_sequence(); + + //there must be a next selector + if (nextSelector === null){ + this._unexpectedToken(this.LT(1)); + } else { + + //nextSelector is an instance of SelectorPart + selector.push(nextSelector); + } + } else { + + //if there's not whitespace, we're done + if (this._readWhitespace()){ + + //add whitespace separator + ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol); + + //combinator is not required + combinator = this._combinator(); + + //selector is required if there's a combinator + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + if (combinator !== null){ + this._unexpectedToken(tokenStream.LT(1)); + } + } else { + + if (combinator !== null){ + selector.push(combinator); + } else { + selector.push(ws); + } + + selector.push(nextSelector); + } + } else { + break; + } + + } + } while(true); + + return new Selector(selector, selector[0].line, selector[0].col); + }, + + //CSS3 Selectors + _simple_selector_sequence: function(){ + /* + * simple_selector_sequence + * : [ type_selector | universal ] + * [ HASH | class | attrib | pseudo | negation ]* + * | [ HASH | class | attrib | pseudo | negation ]+ + * ; + */ + + var tokenStream = this._tokenStream, + + //parts of a simple selector + elementName = null, + modifiers = [], + + //complete selector text + selectorText= "", + + //the different parts after the element name to search for + components = [ + //HASH + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo, + this._negation + ], + i = 0, + len = components.length, + component = null, + found = false, + line, + col; + + + //get starting line and column for the selector + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + elementName = this._type_selector(); + if (!elementName){ + elementName = this._universal(); + } + + if (elementName !== null){ + selectorText += elementName; + } + + while(true){ + + //whitespace means we're done + if (tokenStream.peek() === Tokens.S){ + break; + } + + //check for each component + while(i < len && component === null){ + component = components[i++].call(this); + } + + if (component === null){ + + //we don't have a selector + if (selectorText === ""){ + return null; + } else { + break; + } + } else { + i = 0; + modifiers.push(component); + selectorText += component.toString(); + component = null; + } + } + + + return selectorText !== "" ? + new SelectorPart(elementName, modifiers, selectorText, line, col) : + null; + }, + + //CSS3 Selectors + _type_selector: function(){ + /* + * type_selector + * : [ namespace_prefix ]? element_name + * ; + */ + + var tokenStream = this._tokenStream, + ns = this._namespace_prefix(), + elementName = this._element_name(); + + if (!elementName){ + /* + * Need to back out the namespace that was read due to both + * type_selector and universal reading namespace_prefix + * first. Kind of hacky, but only way I can figure out + * right now how to not change the grammar. + */ + if (ns){ + tokenStream.unget(); + if (ns.length > 1){ + tokenStream.unget(); + } + } + + return null; + } else { + if (ns){ + elementName.text = ns + elementName.text; + elementName.col -= ns.length; + } + return elementName; + } + }, + + //CSS3 Selectors + _class: function(){ + /* + * class + * : '.' IDENT + * ; + */ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.DOT)){ + tokenStream.mustMatch(Tokens.IDENT); + token = tokenStream.token(); + return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1); + } else { + return null; + } + + }, + + //CSS3 Selectors + _element_name: function(){ + /* + * element_name + * : IDENT + * ; + */ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol); + + } else { + return null; + } + }, + + //CSS3 Selectors + _namespace_prefix: function(){ + /* + * namespace_prefix + * : [ IDENT | '*' ]? '|' + * ; + */ + var tokenStream = this._tokenStream, + value = ""; + + //verify that this is a namespace prefix + if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){ + + if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){ + value += tokenStream.token().value; + } + + tokenStream.mustMatch(Tokens.PIPE); + value += "|"; + + } + + return value.length ? value : null; + }, + + //CSS3 Selectors + _universal: function(){ + /* + * universal + * : [ namespace_prefix ]? '*' + * ; + */ + var tokenStream = this._tokenStream, + value = "", + ns; + + ns = this._namespace_prefix(); + if(ns){ + value += ns; + } + + if(tokenStream.match(Tokens.STAR)){ + value += "*"; + } + + return value.length ? value : null; + + }, + + //CSS3 Selectors + _attrib: function(){ + /* + * attrib + * : '[' S* [ namespace_prefix ]? IDENT S* + * [ [ PREFIXMATCH | + * SUFFIXMATCH | + * SUBSTRINGMATCH | + * '=' | + * INCLUDES | + * DASHMATCH ] S* [ IDENT | STRING ] S* + * ]? ']' + * ; + */ + + var tokenStream = this._tokenStream, + value = null, + ns, + token; + + if (tokenStream.match(Tokens.LBRACKET)){ + token = tokenStream.token(); + value = token.value; + value += this._readWhitespace(); + + ns = this._namespace_prefix(); + + if (ns){ + value += ns; + } + + tokenStream.mustMatch(Tokens.IDENT); + value += tokenStream.token().value; + value += this._readWhitespace(); + + if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, + Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACKET); + + return new SelectorSubPart(value + "]", "attribute", token.startLine, token.startCol); + } else { + return null; + } + }, + + //CSS3 Selectors + _pseudo: function(){ + + /* + * pseudo + * : ':' ':'? [ IDENT | functional_pseudo ] + * ; + */ + + var tokenStream = this._tokenStream, + pseudo = null, + colons = ":", + line, + col; + + if (tokenStream.match(Tokens.COLON)){ + + if (tokenStream.match(Tokens.COLON)){ + colons += ":"; + } + + if (tokenStream.match(Tokens.IDENT)){ + pseudo = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol - colons.length; + } else if (tokenStream.peek() == Tokens.FUNCTION){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol - colons.length; + pseudo = this._functional_pseudo(); + } + + if (pseudo){ + pseudo = new SelectorSubPart(colons + pseudo, "pseudo", line, col); + } + } + + return pseudo; + }, + + //CSS3 Selectors + _functional_pseudo: function(){ + /* + * functional_pseudo + * : FUNCTION S* expression ')' + * ; + */ + + var tokenStream = this._tokenStream, + value = null; + + if(tokenStream.match(Tokens.FUNCTION)){ + value = tokenStream.token().value; + value += this._readWhitespace(); + value += this._expression(); + tokenStream.mustMatch(Tokens.RPAREN); + value += ")"; + } + + return value; + }, + + //CSS3 Selectors + _expression: function(){ + /* + * expression + * : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ + * ; + */ + + var tokenStream = this._tokenStream, + value = ""; + + while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, + Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, + Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, + Tokens.RESOLUTION])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + return value.length ? value : null; + + }, + + //CSS3 Selectors + _negation: function(){ + /* + * negation + * : NOT S* negation_arg S* ')' + * ; + */ + + var tokenStream = this._tokenStream, + line, + col, + value = "", + arg, + subpart = null; + + if (tokenStream.match(Tokens.NOT)){ + value = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + value += this._readWhitespace(); + arg = this._negation_arg(); + value += arg; + value += this._readWhitespace(); + tokenStream.match(Tokens.RPAREN); + value += tokenStream.token().value; + + subpart = new SelectorSubPart(value, "not", line, col); + subpart.args.push(arg); + } + + return subpart; + }, + + //CSS3 Selectors + _negation_arg: function(){ + /* + * negation_arg + * : type_selector | universal | HASH | class | attrib | pseudo + * ; + */ + + var tokenStream = this._tokenStream, + args = [ + this._type_selector, + this._universal, + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo + ], + arg = null, + i = 0, + len = args.length, + elementName, + line, + col, + part; + + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + while(i < len && arg === null){ + + arg = args[i].call(this); + i++; + } + + //must be a negation arg + if (arg === null){ + this._unexpectedToken(tokenStream.LT(1)); + } + + //it's an element name + if (arg.type == "elementName"){ + part = new SelectorPart(arg, [], arg.toString(), line, col); + } else { + part = new SelectorPart(null, [arg], arg.toString(), line, col); + } + + return part; + }, + + _declaration: function(){ + + /* + * declaration + * : property ':' S* expr prio? + * | /( empty )/ + * ; + */ + + var tokenStream = this._tokenStream, + property = null, + expr = null, + prio = null; + + property = this._property(); + if (property !== null){ + + tokenStream.mustMatch(Tokens.COLON); + this._readWhitespace(); + + expr = this._expr(); + + //if there's no parts for the value, it's an error + if (!expr || expr.length === 0){ + this._unexpectedToken(tokenStream.LT(1)); + } + + prio = this._prio(); + + this.fire({ + type: "property", + property: property, + value: expr, + important: prio, + line: property.line, + col: property.col + }); + + return true; + } else { + return false; + } + }, + + _prio: function(){ + /* + * prio + * : IMPORTANT_SYM S* + * ; + */ + + var tokenStream = this._tokenStream, + result = tokenStream.match(Tokens.IMPORTANT_SYM); + + this._readWhitespace(); + return result; + }, + + _expr: function(){ + /* + * expr + * : term [ operator term ]* + * ; + */ + + var tokenStream = this._tokenStream, + values = [], + //valueParts = [], + value = null, + operator = null; + + value = this._term(); + if (value !== null){ + + values.push(value); + + do { + operator = this._operator(); + + //if there's an operator, keep building up the value parts + if (operator){ + values.push(operator); + } /*else { + //if there's not an operator, you have a full value + values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); + valueParts = []; + }*/ + + value = this._term(); + + if (value === null){ + break; + } else { + values.push(value); + } + } while(true); + } + + //cleanup + /*if (valueParts.length){ + values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); + }*/ + + return values.length > 0 ? new PropertyValue(values, values[0].startLine, values[0].startCol) : null; + }, + + _term: function(){ + + /* + * term + * : unary_operator? + * [ NUMBER S* | PERCENTAGE S* | LENGTH S* | ANGLE S* | + * TIME S* | FREQ S* | function | ie_function ] + * | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor + * ; + */ + + var tokenStream = this._tokenStream, + unary = null, + value = null, + line, + col; + + //returns the operator or null + unary = this._unary_operator(); + if (unary !== null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + + //exception for IE filters + if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){ + + value = this._ie_function(); + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + + //see if there's a simple match + } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, + Tokens.ANGLE, Tokens.TIME, + Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){ + + value = tokenStream.token().value; + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + this._readWhitespace(); + } else { + + //see if it's a color + value = this._hexcolor(); + if (value === null){ + + //if there's no unary, get the start of the next token for line/col info + if (unary === null){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + } + + //has to be a function + if (value === null){ + + /* + * This checks for alpha(opacity=0) style of IE + * functions. IE_FUNCTION only presents progid: style. + */ + if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){ + value = this._ie_function(); + } else { + value = this._function(); + } + } + + /*if (value === null){ + return null; + //throw new Error("Expected identifier at line " + tokenStream.token().startLine + ", character " + tokenStream.token().startCol + "."); + }*/ + + } else { + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + } + + } + + return value !== null ? + new PropertyValuePart(unary !== null ? unary + value : value, line, col) : + null; + + }, + + _function: function(){ + + /* + * function + * : FUNCTION S* expr ')' S* + * ; + */ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null; + + if (tokenStream.match(Tokens.FUNCTION)){ + functionText = tokenStream.token().value; + this._readWhitespace(); + expr = this._expr(); + + tokenStream.match(Tokens.RPAREN); + functionText += expr + ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _ie_function: function(){ + + /* (My own extension) + * ie_function + * : IE_FUNCTION S* IDENT '=' term [S* ','? IDENT '=' term]+ ')' S* + * ; + */ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null, + lt; + + //IE function can begin like a regular function, too + if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){ + functionText = tokenStream.token().value; + + do { + + if (this._readWhitespace()){ + functionText += tokenStream.token().value; + } + + //might be second time in the loop + if (tokenStream.LA(0) == Tokens.COMMA){ + functionText += tokenStream.token().value; + } + + tokenStream.match(Tokens.IDENT); + functionText += tokenStream.token().value; + + tokenStream.match(Tokens.EQUALS); + functionText += tokenStream.token().value; + + //functionText += this._term(); + lt = tokenStream.peek(); + while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ + tokenStream.get(); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + } + } while(tokenStream.match([Tokens.COMMA, Tokens.S])); + + tokenStream.match(Tokens.RPAREN); + functionText += ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _hexcolor: function(){ + /* + * There is a constraint on the color that it must + * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F]) + * after the "#"; e.g., "#000" is OK, but "#abcd" is not. + * + * hexcolor + * : HASH S* + * ; + */ + + var tokenStream = this._tokenStream, + token, + color = null; + + if(tokenStream.match(Tokens.HASH)){ + + //need to do some validation here + + token = tokenStream.token(); + color = token.value; + if (!/#[a-f0-9]{3,6}/i.test(color)){ + throw new SyntaxError("Expected a hex color but found '" + color + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + } + this._readWhitespace(); + } + + return color; + }, + + //----------------------------------------------------------------- + // Animations methods + //----------------------------------------------------------------- + + _keyframes: function(){ + + /* + * keyframes: + * : KEYFRAMES_SYM S* keyframe_name S* '{' S* keyframe_rule* '}' { + * ; + */ + var tokenStream = this._tokenStream, + token, + tt, + name; + + tokenStream.mustMatch(Tokens.KEYFRAMES_SYM); + this._readWhitespace(); + name = this._keyframe_name(); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.LBRACE); + + this.fire({ + type: "startkeyframes", + name: name, + line: name.line, + col: name.col + }); + + this._readWhitespace(); + tt = tokenStream.peek(); + + //check for key + while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) { + this._keyframe_rule(); + this._readWhitespace(); + tt = tokenStream.peek(); + } + + this.fire({ + type: "endkeyframes", + name: name, + line: name.line, + col: name.col + }); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.RBRACE); + + }, + + _keyframe_name: function(){ + + /* + * keyframe_name: + * : IDENT + * | STRING + * ; + */ + var tokenStream = this._tokenStream, + token; + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + return SyntaxUnit.fromToken(tokenStream.token()); + }, + + _keyframe_rule: function(){ + + /* + * keyframe_rule: + * : key_list S* + * '{' S* declaration [ ';' S* declaration ]* '}' S* + * ; + */ + var tokenStream = this._tokenStream, + token, + keyList = this._key_list(); + + this.fire({ + type: "startkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + }, + + _key_list: function(){ + + /* + * key_list: + * : key [ S* ',' S* key]* + * ; + */ + var tokenStream = this._tokenStream, + token, + key, + keyList = []; + + //must be least one key + keyList.push(this._key()); + + this._readWhitespace(); + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + keyList.push(this._key()); + this._readWhitespace(); + } + + return keyList; + }, + + _key: function(){ + /* + * There is a restriction that IDENT can be only "from" or "to". + * + * key + * : PERCENTAGE + * | IDENT + * ; + */ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.PERCENTAGE)){ + return SyntaxUnit.fromToken(tokenStream.token()); + } else if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + + if (/from|to/i.test(token.value)){ + return SyntaxUnit.fromToken(token); + } + + tokenStream.unget(); + } + + //if it gets here, there wasn't a valid token, so time to explode + this._unexpectedToken(tokenStream.LT(1)); + }, + + //----------------------------------------------------------------- + // Helper methods + //----------------------------------------------------------------- + + /** + * Not part of CSS grammar, but useful for skipping over + * combination of white space and HTML-style comments. + * @return {void} + * @method _skipCruft + * @private + */ + _skipCruft: function(){ + while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){ + //noop + } + }, + + /** + * Not part of CSS grammar, but this pattern occurs frequently + * in the official CSS grammar. Split out here to eliminate + * duplicate code. + * @param {Boolean} checkStart Indicates if the rule should check + * for the left brace at the beginning. + * @param {Boolean} readMargins Indicates if the rule should check + * for margin patterns. + * @return {void} + * @method _readDeclarations + * @private + */ + _readDeclarations: function(checkStart, readMargins){ + /* + * Reads the pattern + * S* '{' S* declaration [ ';' S* declaration ]* '}' S* + * or + * S* '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* + * Note that this is how it is described in CSS3 Paged Media, but is actually incorrect. + * A semicolon is only necessary following a delcaration is there's another declaration + * or margin afterwards. + */ + var tokenStream = this._tokenStream, + tt; + + + this._readWhitespace(); + + if (checkStart){ + tokenStream.mustMatch(Tokens.LBRACE); + } + + this._readWhitespace(); + + try { + + while(true){ + + if (readMargins && this._margin()){ + //noop + } else if (this._declaration()){ + if (!tokenStream.match(Tokens.SEMICOLON)){ + break; + } + } else { + break; + } + + //if ((!this._margin() && !this._declaration()) || !tokenStream.match(Tokens.SEMICOLON)){ + // break; + //} + this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + } catch (ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + + //fire error event + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + + //see if there's another declaration + tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]); + if (tt == Tokens.SEMICOLON){ + //if there's a semicolon, then there might be another declaration + this._readDeclarations(false, readMargins); + } else if (tt == Tokens.RBRACE){ + //if there's a right brace, the rule is finished so don't do anything + } else { + //otherwise, rethrow the error because it wasn't handled properly + throw ex; + } + + } else { + //not a syntax error, rethrow it + throw ex; + } + } + + }, + + /** + * In some cases, you can end up with two white space tokens in a + * row. Instead of making a change in every function that looks for + * white space, this function is used to match as much white space + * as necessary. + * @method _readWhitespace + * @return {String} The white space if found, empty string if not. + * @private + */ + _readWhitespace: function(){ + + var tokenStream = this._tokenStream, + ws = ""; + + while(tokenStream.match(Tokens.S)){ + ws += tokenStream.token().value; + } + + return ws; + }, + + + /** + * Throws an error when an unexpected token is found. + * @param {Object} token The token that was found. + * @method _unexpectedToken + * @return {void} + * @private + */ + _unexpectedToken: function(token){ + throw new SyntaxError("Unexpected token '" + token.value + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + }, + + /** + * Helper method used for parsing subparts of a style sheet. + * @return {void} + * @method _verifyEnd + * @private + */ + _verifyEnd: function(){ + if (this._tokenStream.LA(1) != Tokens.EOF){ + this._unexpectedToken(this._tokenStream.LT(1)); + } + }, + + //----------------------------------------------------------------- + // Parsing methods + //----------------------------------------------------------------- + + parse: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + this._stylesheet(); + }, + + parseStyleSheet: function(input){ + //just passthrough + return this.parse(input); + }, + + parseMediaQuery: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + var result = this._media_query(); + + //if there's anything more, then it's an invalid selector + this._verifyEnd(); + + //otherwise return result + return result; + }, + + /** + * Parses a property value (everything after the semicolon). + * @return {parserlib.css.PropertyValue} The property value. + * @throws parserlib.util.SyntaxError If an unexpected token is found. + * @method parserPropertyValue + */ + parsePropertyValue: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._expr(); + + //okay to have a trailing white space + this._readWhitespace(); + + //if there's anything more, then it's an invalid selector + this._verifyEnd(); + + //otherwise return result + return result; + }, + + /** + * Parses a complete CSS rule, including selectors and + * properties. + * @param {String} input The text to parser. + * @return {Boolean} True if the parse completed successfully, false if not. + * @method parseRule + */ + parseRule: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + + //skip any leading white space + this._readWhitespace(); + + var result = this._ruleset(); + + //skip any trailing white space + this._readWhitespace(); + + //if there's anything more, then it's an invalid selector + this._verifyEnd(); + + //otherwise return result + return result; + }, + + /** + * Parses a single CSS selector (no comma) + * @param {String} input The text to parse as a CSS selector. + * @return {Selector} An object representing the selector. + * @throws parserlib.util.SyntaxError If an unexpected token is found. + * @method parseSelector + */ + parseSelector: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + + //skip any leading white space + this._readWhitespace(); + + var result = this._selector(); + + //skip any trailing white space + this._readWhitespace(); + + //if there's anything more, then it's an invalid selector + this._verifyEnd(); + + //otherwise return result + return result; + } + + }; + + //copy over onto prototype + for (prop in additions){ + proto[prop] = additions[prop]; + } + + return proto; +}(); + + +/* +nth + : S* [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]? | + ['-'|'+']? INTEGER | {O}{D}{D} | {E}{V}{E}{N} ] S* + ; +*/ +/** + * Represents a selector combinator (whitespace, +, >). + * @namespace parserlib.css + * @class PropertyName + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {String} text The text representation of the unit. + * @param {String} hack The type of IE hack applied ("*", "_", or null). + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function PropertyName(text, hack, line, col){ + + SyntaxUnit.call(this, (hack||"") + text, line, col); + + /** + * The type of IE hack applied ("*", "_", or null). + * @type String + * @property hack + */ + this.hack = hack; + +} + +PropertyName.prototype = new SyntaxUnit(); +PropertyName.prototype.constructor = PropertyName; + + +/** + * Represents a single part of a CSS property value, meaning that it represents + * just everything single part between ":" and ";". If there are multiple values + * separated by commas, this type represents just one of the values. + * @param {String[]} parts An array of value parts making up this value. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + * @namespace parserlib.css + * @class PropertyValue + * @extends parserlib.util.SyntaxUnit + * @constructor + */ +function PropertyValue(parts, line, col){ + + SyntaxUnit.call(this, parts.join(" "), line, col); + + /** + * The parts that make up the selector. + * @type Array + * @property parts + */ + this.parts = parts; + +} + +PropertyValue.prototype = new SyntaxUnit(); +PropertyValue.prototype.constructor = PropertyValue; + + +/** + * Represents a single part of a CSS property value, meaning that it represents + * just one part of the data between ":" and ";". + * @param {String} text The text representation of the unit. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + * @namespace parserlib.css + * @class PropertyValuePart + * @extends parserlib.util.SyntaxUnit + * @constructor + */ +function PropertyValuePart(text, line, col){ + + SyntaxUnit.apply(this,arguments); + + /** + * Indicates the type of value unit. + * @type String + * @property type + */ + this.type = "unknown"; + + //figure out what type of data it is + + var temp; + + //it is a measurement? + if (/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)){ //dimension + this.type = "dimension"; + this.value = +RegExp.$1; + this.units = RegExp.$2; + + //try to narrow down + switch(this.units.toLowerCase()){ + + case "em": + case "rem": + case "ex": + case "px": + case "cm": + case "mm": + case "in": + case "pt": + case "pc": + this.type = "length"; + break; + + case "deg": + case "rad": + case "grad": + this.type = "angle"; + break; + + case "ms": + case "s": + this.type = "time"; + break; + + case "hz": + case "khz": + this.type = "frequency"; + break; + + case "dpi": + case "dpcm": + this.type = "resolution"; + break; + + //default + + } + + } else if (/^([+\-]?[\d\.]+)%$/i.test(text)){ //percentage + this.type = "percentage"; + this.value = +RegExp.$1; + } else if (/^([+\-]?[\d\.]+)%$/i.test(text)){ //percentage + this.type = "percentage"; + this.value = +RegExp.$1; + } else if (/^([+\-]?\d+)$/i.test(text)){ //integer + this.type = "integer"; + this.value = +RegExp.$1; + } else if (/^([+\-]?[\d\.]+)$/i.test(text)){ //number + this.type = "number"; + this.value = +RegExp.$1; + + } else if (/^#([a-f0-9]{3,6})/i.test(text)){ //hexcolor + this.type = "color"; + temp = RegExp.$1; + if (temp.length == 3){ + this.red = parseInt(temp.charAt(0)+temp.charAt(0),16); + this.green = parseInt(temp.charAt(1)+temp.charAt(1),16); + this.blue = parseInt(temp.charAt(2)+temp.charAt(2),16); + } else { + this.red = parseInt(temp.substring(0,2),16); + this.green = parseInt(temp.substring(2,4),16); + this.blue = parseInt(temp.substring(4,6),16); + } + } else if (/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)){ //rgb() color with absolute numbers + this.type = "color"; + this.red = +RegExp.$1; + this.green = +RegExp.$2; + this.blue = +RegExp.$3; + } else if (/^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)){ //rgb() color with percentages + this.type = "color"; + this.red = +RegExp.$1 * 255 / 100; + this.green = +RegExp.$2 * 255 / 100; + this.blue = +RegExp.$3 * 255 / 100; + } else if (/^url\(["']?([^\)"']+)["']?\)/i.test(text)){ //URI + this.type = "uri"; + this.uri = RegExp.$1; + } else if (/^["'][^"']*["']/.test(text)){ //string + this.type = "string"; + this.value = eval(text); + } else if (Colors[text.toLowerCase()]){ //named color + this.type = "color"; + temp = Colors[text.toLowerCase()].substring(1); + this.red = parseInt(temp.substring(0,2),16); + this.green = parseInt(temp.substring(2,4),16); + this.blue = parseInt(temp.substring(4,6),16); + } else if (/^[\,\/]$/.test(text)){ + this.type = "operator"; + this.value = text; + } else if (/^[a-z\-\u0080-\uFFFF][a-z0-9\-\u0080-\uFFFF]*$/i.test(text)){ + this.type = "identifier"; + this.value = text; + } + +} + +PropertyValuePart.prototype = new SyntaxUnit(); +PropertyValuePart.prototype.constructor = PropertyValue; + +/** + * Create a new syntax unit based solely on the given token. + * Convenience method for creating a new syntax unit when + * it represents a single token instead of multiple. + * @param {Object} token The token object to represent. + * @return {parserlib.css.PropertyValuePart} The object representing the token. + * @static + * @method fromToken + */ +PropertyValuePart.fromToken = function(token){ + return new PropertyValuePart(token.value, token.startLine, token.startCol); +}; +/** + * Represents an entire single selector, including all parts but not + * including multiple selectors (those separated by commas). + * @namespace parserlib.css + * @class Selector + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {Array} parts Array of selectors parts making up this selector. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function Selector(parts, line, col){ + + SyntaxUnit.call(this, parts.join(" "), line, col); + + /** + * The parts that make up the selector. + * @type Array + * @property parts + */ + this.parts = parts; + +} + +Selector.prototype = new SyntaxUnit(); +Selector.prototype.constructor = Selector; + + +/** + * Represents a single part of a selector string, meaning a single set of + * element name and modifiers. This does not include combinators such as + * spaces, +, >, etc. + * @namespace parserlib.css + * @class SelectorPart + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {String} elementName The element name in the selector or null + * if there is no element name. + * @param {Array} modifiers Array of individual modifiers for the element. + * May be empty if there are none. + * @param {String} text The text representation of the unit. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function SelectorPart(elementName, modifiers, text, line, col){ + + SyntaxUnit.call(this, text, line, col); + + /** + * The tag name of the element to which this part + * of the selector affects. + * @type String + * @property elementName + */ + this.elementName = elementName; + + /** + * The parts that come after the element name, such as class names, IDs, + * pseudo classes/elements, etc. + * @type Array + * @property modifiers + */ + this.modifiers = modifiers; + +} + +SelectorPart.prototype = new SyntaxUnit(); +SelectorPart.prototype.constructor = SelectorPart; + + +/** + * Represents a selector modifier string, meaning a class name, element name, + * element ID, pseudo rule, etc. + * @namespace parserlib.css + * @class SelectorSubPart + * @extends parserlib.util.SyntaxUnit + * @constructor + * @param {String} text The text representation of the unit. + * @param {String} type The type of selector modifier. + * @param {int} line The line of text on which the unit resides. + * @param {int} col The column of text on which the unit resides. + */ +function SelectorSubPart(text, type, line, col){ + + SyntaxUnit.call(this, text, line, col); + + /** + * The type of modifier. + * @type String + * @property type + */ + this.type = type; + + /** + * Some subparts have arguments, this represents them. + * @type Array + * @property args + */ + this.args = []; + +} + +SelectorSubPart.prototype = new SyntaxUnit(); +SelectorSubPart.prototype.constructor = SelectorSubPart; + + + + +var h = /^[0-9a-fA-F]$/, + nonascii = /^[\u0080-\uFFFF]$/, + nl = /\n|\r\n|\r|\f/; + +//----------------------------------------------------------------------------- +// Helper functions +//----------------------------------------------------------------------------- + + +function isHexDigit(c){ + return c != null && h.test(c); +} + +function isDigit(c){ + return c != null && /\d/.test(c); +} + +function isWhitespace(c){ + return c != null && /\s/.test(c); +} + +function isNewLine(c){ + return c != null && nl.test(c); +} + +function isNameStart(c){ + return c != null && (/[a-z_\u0080-\uFFFF\\]/i.test(c)); +} + +function isNameChar(c){ + return c != null && (isNameStart(c) || /[0-9\-\\]/.test(c)); +} + +function isIdentStart(c){ + return c != null && (isNameStart(c) || /\-\\/.test(c)); +} + +function mix(receiver, supplier){ + for (var prop in supplier){ + if (supplier.hasOwnProperty(prop)){ + receiver[prop] = supplier[prop]; + } + } + return receiver; +} + +//----------------------------------------------------------------------------- +// CSS Token Stream +//----------------------------------------------------------------------------- + + +/** + * A token stream that produces CSS tokens. + * @param {String|Reader} input The source of text to tokenize. + * @constructor + * @class TokenStream + * @namespace parserlib.css + */ +function TokenStream(input){ + TokenStreamBase.call(this, input, Tokens); +} + +TokenStream.prototype = mix(new TokenStreamBase(), { + + /** + * Overrides the TokenStreamBase method of the same name + * to produce CSS tokens. + * @param {variant} channel The name of the channel to use + * for the next token. + * @return {Object} A token object representing the next token. + * @method _getToken + * @private + */ + _getToken: function(channel){ + + var c, + reader = this._reader, + token = null, + startLine = reader.getLine(), + startCol = reader.getCol(); + + c = reader.read(); + + + while(c){ + switch(c){ + + /* + * Potential tokens: + * - COMMENT + * - SLASH + * - CHAR + */ + case "/": + + if(reader.peek() == "*"){ + token = this.commentToken(c, startLine, startCol); + } else { + token = this.charToken(c, startLine, startCol); + } + break; + + /* + * Potential tokens: + * - DASHMATCH + * - INCLUDES + * - PREFIXMATCH + * - SUFFIXMATCH + * - SUBSTRINGMATCH + * - CHAR + */ + case "|": + case "~": + case "^": + case "$": + case "*": + if(reader.peek() == "="){ + token = this.comparisonToken(c, startLine, startCol); + } else { + token = this.charToken(c, startLine, startCol); + } + break; + + /* + * Potential tokens: + * - STRING + * - INVALID + */ + case "\"": + case "'": + token = this.stringToken(c, startLine, startCol); + break; + + /* + * Potential tokens: + * - HASH + * - CHAR + */ + case "#": + if (isNameChar(reader.peek())){ + token = this.hashToken(c, startLine, startCol); + } else { + token = this.charToken(c, startLine, startCol); + } + break; + + /* + * Potential tokens: + * - DOT + * - NUMBER + * - DIMENSION + * - PERCENTAGE + */ + case ".": + if (isDigit(reader.peek())){ + token = this.numberToken(c, startLine, startCol); + } else { + token = this.charToken(c, startLine, startCol); + } + break; + + /* + * Potential tokens: + * - CDC + * - MINUS + * - NUMBER + * - DIMENSION + * - PERCENTAGE + */ + case "-": + if (reader.peek() == "-"){ //could be closing HTML-style comment + token = this.htmlCommentEndToken(c, startLine, startCol); + } else if (isNameStart(reader.peek())){ + token = this.identOrFunctionToken(c, startLine, startCol); + } else { + token = this.charToken(c, startLine, startCol); + } + break; + + /* + * Potential tokens: + * - IMPORTANT_SYM + * - CHAR + */ + case "!": + token = this.importantToken(c, startLine, startCol); + break; + + /* + * Any at-keyword or CHAR + */ + case "@": + token = this.atRuleToken(c, startLine, startCol); + break; + + /* + * Potential tokens: + * - NOT + * - CHAR + */ + case ":": + token = this.notToken(c, startLine, startCol); + break; + + /* + * Potential tokens: + * - CDO + * - CHAR + */ + case "<": + token = this.htmlCommentStartToken(c, startLine, startCol); + break; + + /* + * Potential tokens: + * - UNICODE_RANGE + * - URL + * - CHAR + */ + case "U": + case "u": + if (reader.peek() == "+"){ + token = this.unicodeRangeToken(c, startLine, startCol); + break; + } + /*falls through*/ + + default: + + /* + * Potential tokens: + * - NUMBER + * - DIMENSION + * - LENGTH + * - FREQ + * - TIME + * - EMS + * - EXS + * - ANGLE + */ + if (isDigit(c)){ + token = this.numberToken(c, startLine, startCol); + } else + + /* + * Potential tokens: + * - S + */ + if (isWhitespace(c)){ + token = this.whitespaceToken(c, startLine, startCol); + } else + + /* + * Potential tokens: + * - IDENT + */ + if (isIdentStart(c)){ + token = this.identOrFunctionToken(c, startLine, startCol); + } else + + /* + * Potential tokens: + * - CHAR + * - PLUS + */ + { + token = this.charToken(c, startLine, startCol); + } + + + + + + + } + + //make sure this token is wanted + //TODO: check channel + break; + + c = reader.read(); + } + + if (!token && c == null){ + token = this.createToken(Tokens.EOF,null,startLine,startCol); + } + + return token; + }, + + //------------------------------------------------------------------------- + // Methods to create tokens + //------------------------------------------------------------------------- + + /** + * Produces a token based on available data and the current + * reader position information. This method is called by other + * private methods to create tokens and is never called directly. + * @param {int} tt The token type. + * @param {String} value The text value of the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @param {Object} options (Optional) Specifies a channel property + * to indicate that a different channel should be scanned + * and/or a hide property indicating that the token should + * be hidden. + * @return {Object} A token object. + * @method createToken + */ + createToken: function(tt, value, startLine, startCol, options){ + var reader = this._reader; + options = options || {}; + + return { + value: value, + type: tt, + channel: options.channel, + hide: options.hide || false, + startLine: startLine, + startCol: startCol, + endLine: reader.getLine(), + endCol: reader.getCol() + }; + }, + + //------------------------------------------------------------------------- + // Methods to create specific tokens + //------------------------------------------------------------------------- + + /** + * Produces a token for any at-rule. If the at-rule is unknown, then + * the token is for a single "@" character. + * @param {String} first The first character for the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method atRuleToken + */ + atRuleToken: function(first, startLine, startCol){ + var rule = first, + reader = this._reader, + tt = Tokens.CHAR, + valid = false, + ident, + c; + + /* + * First, mark where we are. There are only four @ rules, + * so anything else is really just an invalid token. + * Basically, if this doesn't match one of the known @ + * rules, just return '@' as an unknown token and allow + * parsing to continue after that point. + */ + reader.mark(); + + //try to find the at-keyword + ident = this.readName(); + rule = first + ident; + tt = Tokens.type(rule.toLowerCase()); + + //if it's not valid, use the first character only and reset the reader + if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){ + tt = Tokens.CHAR; + rule = first; + reader.reset(); + } + + return this.createToken(tt, rule, startLine, startCol); + }, + + /** + * Produces a character token based on the given character + * and location in the stream. If there's a special (non-standard) + * token name, this is used; otherwise CHAR is used. + * @param {String} c The character for the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method charToken + */ + charToken: function(c, startLine, startCol){ + var tt = Tokens.type(c); + + if (tt == -1){ + tt = Tokens.CHAR; + } + + return this.createToken(tt, c, startLine, startCol); + }, + + /** + * Produces a character token based on the given character + * and location in the stream. If there's a special (non-standard) + * token name, this is used; otherwise CHAR is used. + * @param {String} first The first character for the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method commentToken + */ + commentToken: function(first, startLine, startCol){ + var reader = this._reader, + comment = this.readComment(first); + + return this.createToken(Tokens.COMMENT, comment, startLine, startCol); + }, + + /** + * Produces a comparison token based on the given character + * and location in the stream. The next character must be + * read and is already known to be an equals sign. + * @param {String} c The character for the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method comparisonToken + */ + comparisonToken: function(c, startLine, startCol){ + var reader = this._reader, + comparison = c + reader.read(), + tt = Tokens.type(comparison) || Tokens.CHAR; + + return this.createToken(tt, comparison, startLine, startCol); + }, + + /** + * Produces a hash token based on the specified information. The + * first character provided is the pound sign (#) and then this + * method reads a name afterward. + * @param {String} first The first character (#) in the hash name. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method hashToken + */ + hashToken: function(first, startLine, startCol){ + var reader = this._reader, + name = this.readName(first); + + return this.createToken(Tokens.HASH, name, startLine, startCol); + }, + + /** + * Produces a CDO or CHAR token based on the specified information. The + * first character is provided and the rest is read by the function to determine + * the correct token to create. + * @param {String} first The first character in the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method htmlCommentStartToken + */ + htmlCommentStartToken: function(first, startLine, startCol){ + var reader = this._reader, + text = first; + + reader.mark(); + text += reader.readCount(3); + + if (text == ""){ + return this.createToken(Tokens.CDC, text, startLine, startCol); + } else { + reader.reset(); + return this.charToken(first, startLine, startCol); + } + }, + + /** + * Produces an IDENT or FUNCTION token based on the specified information. The + * first character is provided and the rest is read by the function to determine + * the correct token to create. + * @param {String} first The first character in the identifier. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method identOrFunctionToken + */ + identOrFunctionToken: function(first, startLine, startCol){ + var reader = this._reader, + ident = this.readName(first), + tt = Tokens.IDENT; + + //if there's a left paren immediately after, it's a URI or function + if (reader.peek() == "("){ + ident += reader.read(); + if (ident.toLowerCase() == "url("){ + tt = Tokens.URI; + ident = this.readURI(ident); + + //didn't find a valid URL or there's no closing paren + if (ident.toLowerCase() == "url("){ + tt = Tokens.FUNCTION; + } + } else { + tt = Tokens.FUNCTION; + } + } else if (reader.peek() == ":"){ //might be an IE function + + //IE-specific functions always being with progid: + if (ident.toLowerCase() == "progid"){ + ident += reader.readTo("("); + tt = Tokens.IE_FUNCTION; + } + } + + return this.createToken(tt, ident, startLine, startCol); + }, + + /** + * Produces an IMPORTANT_SYM or CHAR token based on the specified information. The + * first character is provided and the rest is read by the function to determine + * the correct token to create. + * @param {String} first The first character in the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method importantToken + */ + importantToken: function(first, startLine, startCol){ + var reader = this._reader, + important = first, + tt = Tokens.CHAR, + temp, + c; + + reader.mark(); + c = reader.read(); + + while(c){ + + //there can be a comment in here + if (c == "/"){ + + //if the next character isn't a star, then this isn't a valid !important token + if (reader.peek() != "*"){ + break; + } else { + temp = this.readComment(c); + if (temp == ""){ //broken! + break; + } + } + } else if (isWhitespace(c)){ + important += c + this.readWhitespace(); + } else if (/i/i.test(c)){ + temp = reader.readCount(8); + if (/mportant/i.test(temp)){ + important += c + temp; + tt = Tokens.IMPORTANT_SYM; + + } + break; //we're done + } else { + break; + } + + c = reader.read(); + } + + if (tt == Tokens.CHAR){ + reader.reset(); + return this.charToken(first, startLine, startCol); + } else { + return this.createToken(tt, important, startLine, startCol); + } + + + }, + + /** + * Produces a NOT or CHAR token based on the specified information. The + * first character is provided and the rest is read by the function to determine + * the correct token to create. + * @param {String} first The first character in the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method notToken + */ + notToken: function(first, startLine, startCol){ + var reader = this._reader, + text = first; + + reader.mark(); + text += reader.readCount(4); + + if (text.toLowerCase() == ":not("){ + return this.createToken(Tokens.NOT, text, startLine, startCol); + } else { + reader.reset(); + return this.charToken(first, startLine, startCol); + } + }, + + /** + * Produces a number token based on the given character + * and location in the stream. This may return a token of + * NUMBER, EMS, EXS, LENGTH, ANGLE, TIME, FREQ, DIMENSION, + * or PERCENTAGE. + * @param {String} first The first character for the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method numberToken + */ + numberToken: function(first, startLine, startCol){ + var reader = this._reader, + value = this.readNumber(first), + ident, + tt = Tokens.NUMBER, + c = reader.peek(); + + if (isIdentStart(c)){ + ident = this.readName(reader.read()); + value += ident; + + if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){ + tt = Tokens.LENGTH; + } else if (/^deg|^rad$|^grad$/i.test(ident)){ + tt = Tokens.ANGLE; + } else if (/^ms$|^s$/i.test(ident)){ + tt = Tokens.TIME; + } else if (/^hz$|^khz$/i.test(ident)){ + tt = Tokens.FREQ; + } else if (/^dpi$|^dpcm$/i.test(ident)){ + tt = Tokens.RESOLUTION; + } else { + tt = Tokens.DIMENSION; + } + + } else if (c == "%"){ + value += reader.read(); + tt = Tokens.PERCENTAGE; + } + + return this.createToken(tt, value, startLine, startCol); + }, + + /** + * Produces a string token based on the given character + * and location in the stream. Since strings may be indicated + * by single or double quotes, a failure to match starting + * and ending quotes results in an INVALID token being generated. + * The first character in the string is passed in and then + * the rest are read up to and including the final quotation mark. + * @param {String} first The first character in the string. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method stringToken + */ + stringToken: function(first, startLine, startCol){ + var delim = first, + string = first, + reader = this._reader, + prev = first, + tt = Tokens.STRING, + c = reader.read(); + + while(c){ + string += c; + + //if the delimiter is found with an escapement, we're done. + if (c == delim && prev != "\\"){ + break; + } + + //if there's a newline without an escapement, it's an invalid string + if (isNewLine(reader.peek()) && c != "\\"){ + tt = Tokens.INVALID; + break; + } + + //save previous and get next + prev = c; + c = reader.read(); + } + + //if c is null, that means we're out of input and the string was never closed + if (c == null){ + tt = Tokens.INVALID; + } + + return this.createToken(tt, string, startLine, startCol); + }, + + unicodeRangeToken: function(first, startLine, startCol){ + var reader = this._reader, + value = first, + temp, + tt = Tokens.CHAR; + + //then it should be a unicode range + if (reader.peek() == "+"){ + reader.mark(); + value += reader.read(); + value += this.readUnicodeRangePart(true); + + //ensure there's an actual unicode range here + if (value.length == 2){ + reader.reset(); + } else { + + tt = Tokens.UNICODE_RANGE; + + //if there's a ? in the first part, there can't be a second part + if (value.indexOf("?") == -1){ + + if (reader.peek() == "-"){ + reader.mark(); + temp = reader.read(); + temp += this.readUnicodeRangePart(false); + + //if there's not another value, back up and just take the first + if (temp.length == 1){ + reader.reset(); + } else { + value += temp; + } + } + + } + } + } + + return this.createToken(tt, value, startLine, startCol); + }, + + /** + * Produces a S token based on the specified information. Since whitespace + * may have multiple characters, this consumes all whitespace characters + * into a single token. + * @param {String} first The first character in the token. + * @param {int} startLine The beginning line for the character. + * @param {int} startCol The beginning column for the character. + * @return {Object} A token object. + * @method whitespaceToken + */ + whitespaceToken: function(first, startLine, startCol){ + var reader = this._reader, + value = first + this.readWhitespace(); + return this.createToken(Tokens.S, value, startLine, startCol); + }, + + + + + //------------------------------------------------------------------------- + // Methods to read values from the string stream + //------------------------------------------------------------------------- + + readUnicodeRangePart: function(allowQuestionMark){ + var reader = this._reader, + part = "", + c = reader.peek(); + + //first read hex digits + while(isHexDigit(c) && part.length < 6){ + reader.read(); + part += c; + c = reader.peek(); + } + + //then read question marks if allowed + if (allowQuestionMark){ + while(c == "?" && part.length < 6){ + reader.read(); + part += c; + c = reader.peek(); + } + } + + //there can't be any other characters after this point + + return part; + }, + + readWhitespace: function(){ + var reader = this._reader, + whitespace = "", + c = reader.peek(); + + while(isWhitespace(c)){ + reader.read(); + whitespace += c; + c = reader.peek(); + } + + return whitespace; + }, + readNumber: function(first){ + var reader = this._reader, + number = first, + hasDot = (first == "."), + c = reader.peek(); + + + while(c){ + if (isDigit(c)){ + number += reader.read(); + } else if (c == "."){ + if (hasDot){ + break; + } else { + hasDot = true; + number += reader.read(); + } + } else { + break; + } + + c = reader.peek(); + } + + return number; + }, + readString: function(){ + var reader = this._reader, + delim = reader.read(), + string = delim, + prev = delim, + c = reader.peek(); + + while(c){ + c = reader.read(); + string += c; + + //if the delimiter is found with an escapement, we're done. + if (c == delim && prev != "\\"){ + break; + } + + //if there's a newline without an escapement, it's an invalid string + if (isNewLine(reader.peek()) && c != "\\"){ + string = ""; + break; + } + + //save previous and get next + prev = c; + c = reader.peek(); + } + + //if c is null, that means we're out of input and the string was never closed + if (c == null){ + string = ""; + } + + return string; + }, + readURI: function(first){ + var reader = this._reader, + uri = first, + inner = "", + c = reader.peek(); + + reader.mark(); + + //skip whitespace before + while(c && isWhitespace(c)){ + reader.read(); + c = reader.peek(); + } + + //it's a string + if (c == "'" || c == "\""){ + inner = this.readString(); + } else { + inner = this.readURL(); + } + + c = reader.peek(); + + //skip whitespace after + while(c && isWhitespace(c)){ + reader.read(); + c = reader.peek(); + } + + //if there was no inner value or the next character isn't closing paren, it's not a URI + if (inner == "" || c != ")"){ + uri = first; + reader.reset(); + } else { + uri += inner + reader.read(); + } + + return uri; + }, + readURL: function(){ + var reader = this._reader, + url = "", + c = reader.peek(); + + //TODO: Check for escape and nonascii + while (/^[!#$%&\\*-~]$/.test(c)){ + url += reader.read(); + c = reader.peek(); + } + + return url; + + }, + readName: function(first){ + var reader = this._reader, + ident = first || "", + c = reader.peek(); + + while(true){ + if (c == "\\"){ + ident += this.readEscape(reader.read()); + c = reader.peek(); + } else if(c && isNameChar(c)){ + ident += reader.read(); + c = reader.peek(); + } else { + break; + } + } + + return ident; + }, + + readEscape: function(first){ + var reader = this._reader, + cssEscape = first || "", + i = 0, + c = reader.peek(); + + if (isHexDigit(c)){ + do { + cssEscape += reader.read(); + c = reader.peek(); + } while(c && isHexDigit(c) && ++i < 6); + } + + if (cssEscape.length == 3 && /\s/.test(c) || + cssEscape.length == 7 || cssEscape.length == 1){ + reader.read(); + } else { + c = ""; + } + + return cssEscape + c; + }, + + readComment: function(first){ + var reader = this._reader, + comment = first || "", + c = reader.read(); + + if (c == "*"){ + while(c){ + comment += c; + + //look for end of comment + if (c == "*" && reader.peek() == "/"){ + comment += reader.read(); + break; + } + + c = reader.read(); + } + + return comment; + } else { + return ""; + } + + } +}); + + +var Tokens = [ + + /* + * The following token names are defined in CSS3 Grammar: http://www.w3.org/TR/css3-syntax/#lexical + */ + + //HTML-style comments + { name: "CDO"}, + { name: "CDC"}, + + //ignorables + { name: "S", whitespace: true/*, channel: "ws"*/}, + { name: "COMMENT", comment: true, hide: true, channel: "comment" }, + + //attribute equality + { name: "INCLUDES", text: "~="}, + { name: "DASHMATCH", text: "|="}, + { name: "PREFIXMATCH", text: "^="}, + { name: "SUFFIXMATCH", text: "$="}, + { name: "SUBSTRINGMATCH", text: "*="}, + + //identifier types + { name: "STRING"}, + { name: "IDENT"}, + { name: "HASH"}, + + //at-keywords + { name: "IMPORT_SYM", text: "@import"}, + { name: "PAGE_SYM", text: "@page"}, + { name: "MEDIA_SYM", text: "@media"}, + { name: "FONT_FACE_SYM", text: "@font-face"}, + { name: "CHARSET_SYM", text: "@charset"}, + { name: "NAMESPACE_SYM", text: "@namespace"}, + //{ name: "ATKEYWORD"}, + + //CSS3 animations + { name: "KEYFRAMES_SYM", text: [ "@keyframes", "@-webkit-keyframes", "@-moz-keyframes" ] }, + + //important symbol + { name: "IMPORTANT_SYM"}, + + //measurements + { name: "LENGTH"}, + { name: "ANGLE"}, + { name: "TIME"}, + { name: "FREQ"}, + { name: "DIMENSION"}, + { name: "PERCENTAGE"}, + { name: "NUMBER"}, + + //functions + { name: "URI"}, + { name: "FUNCTION"}, + + //Unicode ranges + { name: "UNICODE_RANGE"}, + + /* + * The following token names are defined in CSS3 Selectors: http://www.w3.org/TR/css3-selectors/#selector-syntax + */ + + //invalid string + { name: "INVALID"}, + + //combinators + { name: "PLUS", text: "+" }, + { name: "GREATER", text: ">"}, + { name: "COMMA", text: ","}, + { name: "TILDE", text: "~"}, + + //modifier + { name: "NOT"}, + + /* + * Defined in CSS3 Paged Media + */ + { name: "TOPLEFTCORNER_SYM", text: "@top-left-corner"}, + { name: "TOPLEFT_SYM", text: "@top-left"}, + { name: "TOPCENTER_SYM", text: "@top-center"}, + { name: "TOPRIGHT_SYM", text: "@top-right"}, + { name: "TOPRIGHTCORNER_SYM", text: "@top-right-corner"}, + { name: "BOTTOMLEFTCORNER_SYM", text: "@bottom-left-corner"}, + { name: "BOTTOMLEFT_SYM", text: "@bottom-left"}, + { name: "BOTTOMCENTER_SYM", text: "@bottom-center"}, + { name: "BOTTOMRIGHT_SYM", text: "@bottom-right"}, + { name: "BOTTOMRIGHTCORNER_SYM", text: "@bottom-right-corner"}, + { name: "LEFTTOP_SYM", text: "@left-top"}, + { name: "LEFTMIDDLE_SYM", text: "@left-middle"}, + { name: "LEFTBOTTOM_SYM", text: "@left-bottom"}, + { name: "RIGHTTOP_SYM", text: "@right-top"}, + { name: "RIGHTMIDDLE_SYM", text: "@right-middle"}, + { name: "RIGHTBOTTOM_SYM", text: "@right-bottom"}, + + /* + * The following token names are defined in CSS3 Media Queries: http://www.w3.org/TR/css3-mediaqueries/#syntax + */ + /*{ name: "MEDIA_ONLY", state: "media"}, + { name: "MEDIA_NOT", state: "media"}, + { name: "MEDIA_AND", state: "media"},*/ + { name: "RESOLUTION", state: "media"}, + + /* + * The following token names are not defined in any CSS specification but are used by the lexer. + */ + + //not a real token, but useful for stupid IE filters + { name: "IE_FUNCTION" }, + + //part of CSS3 grammar but not the Flex code + { name: "CHAR" }, + + //TODO: Needed? + //Not defined as tokens, but might as well be + { + name: "PIPE", + text: "|" + }, + { + name: "SLASH", + text: "/" + }, + { + name: "MINUS", + text: "-" + }, + { + name: "STAR", + text: "*" + }, + + { + name: "LBRACE", + text: "{" + }, + { + name: "RBRACE", + text: "}" + }, + { + name: "LBRACKET", + text: "[" + }, + { + name: "RBRACKET", + text: "]" + }, + { + name: "EQUALS", + text: "=" + }, + { + name: "COLON", + text: ":" + }, + { + name: "SEMICOLON", + text: ";" + }, + + { + name: "LPAREN", + text: "(" + }, + { + name: "RPAREN", + text: ")" + }, + { + name: "DOT", + text: "." + } +]; + +(function(){ + + var nameMap = [], + typeMap = {}; + + Tokens.UNKNOWN = -1; + Tokens.unshift({name:"EOF"}); + for (var i=0, len = Tokens.length; i < len; i++){ + nameMap.push(Tokens[i].name); + Tokens[Tokens[i].name] = i; + if (Tokens[i].text){ + if (Tokens[i].text instanceof Array){ + for (var j=0; j < Tokens[i].text.length; j++){ + typeMap[Tokens[i].text[j]] = i; + } + } else { + typeMap[Tokens[i].text] = i; + } + } + } + + Tokens.name = function(tt){ + return nameMap[tt]; + }; + + Tokens.type = function(c){ + return typeMap[c] || -1; + }; + +})(); + + + + + +parserlib.css = { +Colors :Colors, +Combinator :Combinator, +Parser :Parser, +PropertyName :PropertyName, +PropertyValue :PropertyValue, +PropertyValuePart :PropertyValuePart, +MediaFeature :MediaFeature, +MediaQuery :MediaQuery, +Selector :Selector, +SelectorPart :SelectorPart, +SelectorSubPart :SelectorSubPart, +TokenStream :TokenStream, +Tokens :Tokens +}; +})(); + +/** + * Main CSSLint object. + * @class CSSLint + * @static + * @extends parserlib.util.EventTarget + */ +var CSSLint = (function(){ + + var rules = [], + formatters = [], + api = new parserlib.util.EventTarget(); + + api.version = "@VERSION@"; + + //------------------------------------------------------------------------- + // Rule Management + //------------------------------------------------------------------------- + + /** + * Adds a new rule to the engine. + * @param {Object} rule The rule to add. + * @method addRule + */ + api.addRule = function(rule){ + rules.push(rule); + rules[rule.id] = rule; + }; + + /** + * Clears all rule from the engine. + * @method clearRules + */ + api.clearRules = function(){ + rules = []; + }; + + //------------------------------------------------------------------------- + // Formatters + //------------------------------------------------------------------------- + + /** + * Adds a new formatter to the engine. + * @param {Object} formatter The formatter to add. + * @method addFormatter + */ + api.addFormatter = function(formatter) { + // formatters.push(formatter); + formatters[formatter.id] = formatter; + }; + + /** + * Retrieves a formatter for use. + * @param {String} formatId The name of the format to retrieve. + * @return {Object} The formatter or undefined. + * @method getFormatter + */ + api.getFormatter = function(formatId){ + return formatters[formatId]; + }; + + /** + * Formats the results in a particular format for a single file. + * @param {Object} result The results returned from CSSLint.verify(). + * @param {String} filename The filename for which the results apply. + * @param {String} formatId The name of the formatter to use. + * @return {String} A formatted string for the results. + * @method format + */ + api.format = function(results, filename, formatId) { + var formatter = this.getFormatter(formatId), + result = null; + + if (formatter){ + result = formatter.startFormat(); + result += formatter.formatResults(results, filename); + result += formatter.endFormat(); + } + + return result; + } + + /** + * Indicates if the given format is supported. + * @param {String} formatId The ID of the format to check. + * @return {Boolean} True if the format exists, false if not. + * @method hasFormat + */ + api.hasFormat = function(formatId){ + return formatters.hasOwnProperty(formatId); + }; + + //------------------------------------------------------------------------- + // Verification + //------------------------------------------------------------------------- + + /** + * Starts the verification process for the given CSS text. + * @param {String} text The CSS text to verify. + * @param {Object} ruleset (Optional) List of rules to apply. If null, then + * all rules are used. + * @return {Object} Results of the verification. + * @method verify + */ + api.verify = function(text, ruleset){ + + var i = 0, + len = rules.length, + reporter, + lines, + parser = new parserlib.css.Parser({ starHack: true, ieFilters: true, + underscoreHack: true, strict: false }); + + lines = text.split(/\n\r?/g); + reporter = new Reporter(lines); + + if (!ruleset){ + while (i < len){ + rules[i++].init(parser, reporter); + } + } else { + ruleset.errors = 1; //always report parsing errors + for (i in ruleset){ + if(ruleset.hasOwnProperty(i)){ + if (rules[i]){ + rules[i].init(parser, reporter); + } + } + } + } + + //capture most horrible error type + try { + parser.parse(text); + } catch (ex) { + reporter.error("Fatal error, cannot continue: " + ex.message, ex.line, ex.col); + } + + return { + messages : reporter.messages, + stats : reporter.stats + }; + }; + + //------------------------------------------------------------------------- + // Publish the API + //------------------------------------------------------------------------- + + return api; + +})(); +/** + * An instance of Report is used to report results of the + * verification back to the main API. + * @class Reporter + * @constructor + * @param {String[]} lines The text lines of the source. + */ +function Reporter(lines){ + + /** + * List of messages being reported. + * @property messages + * @type String[] + */ + this.messages = []; + + /** + * List of statistics being reported. + * @property stats + * @type String[] + */ + this.stats = []; + + /** + * Lines of code being reported on. Used to provide contextual information + * for messages. + * @property lines + * @type String[] + */ + this.lines = lines; +} + +Reporter.prototype = { + + //restore constructor + constructor: Reporter, + + /** + * Report an error. + * @param {String} message The message to store. + * @param {int} line The line number. + * @param {int} col The column number. + * @param {Object} rule The rule this message relates to. + * @method error + */ + error: function(message, line, col, rule){ + this.messages.push({ + type : "error", + line : line, + col : col, + message : message, + evidence: this.lines[line-1], + rule : rule + }); + }, + + /** + * Report an warning. + * @param {String} message The message to store. + * @param {int} line The line number. + * @param {int} col The column number. + * @param {Object} rule The rule this message relates to. + * @method warn + */ + warn: function(message, line, col, rule){ + this.messages.push({ + type : "warning", + line : line, + col : col, + message : message, + evidence: this.lines[line-1], + rule : rule + }); + }, + + /** + * Report some informational text. + * @param {String} message The message to store. + * @param {int} line The line number. + * @param {int} col The column number. + * @param {Object} rule The rule this message relates to. + * @method info + */ + info: function(message, line, col, rule){ + this.messages.push({ + type : "info", + line : line, + col : col, + message : message, + evidence: this.lines[line-1], + rule : rule + }); + }, + + /** + * Report some rollup error information. + * @param {String} message The message to store. + * @param {Object} rule The rule this message relates to. + * @method rollupError + */ + rollupError: function(message, rule){ + this.messages.push({ + type : "error", + rollup : true, + message : message, + rule : rule + }); + }, + + /** + * Report some rollup warning information. + * @param {String} message The message to store. + * @param {Object} rule The rule this message relates to. + * @method rollupWarn + */ + rollupWarn: function(message, rule){ + this.messages.push({ + type : "warning", + rollup : true, + message : message, + rule : rule + }); + }, + + /** + * Report a statistic. + * @param {String} name The name of the stat to store. + * @param {Variant} value The value of the stat. + * @method stat + */ + stat: function(name, value){ + this.stats[name] = value; + } +}; +/* + * Utility functions that make life easier. + */ + +/* + * Adds all properties from supplier onto receiver, + * overwriting if the same name already exists on + * reciever. + * @param {Object} The object to receive the properties. + * @param {Object} The object to provide the properties. + * @return {Object} The receiver + */ +function mix(reciever, supplier){ + var prop; + + for (prop in supplier){ + if (supplier.hasOwnProperty(prop)){ + receiver[prop] = supplier[prop]; + } + } + + return prop; +} + +/* + * Polyfill for array indexOf() method. + * @param {Array} values The array to search. + * @param {Variant} value The value to search for. + * @return {int} The index of the value if found, -1 if not. + */ +function indexOf(values, value){ + if (values.indexOf){ + return values.indexOf(value); + } else { + for (var i=0, len=values.length; i < len; i++){ + if (values[i] === value){ + return i; + } + } + return -1; + } +} +/* + * Rule: Don't use adjoining classes (.foo.bar). + */ +CSSLint.addRule({ + + //rule information + id: "adjoining-classes", + name: "Adjoining Classes", + desc: "Don't use adjoining classes.", + browsers: "IE6", + + //initialization + init: function(parser, reporter){ + var rule = this; + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + modifier, + classCount, + i, j, k; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + for (j=0; j < selector.parts.length; j++){ + part = selector.parts[j]; + if (part instanceof parserlib.css.SelectorPart){ + classCount = 0; + for (k=0; k < part.modifiers.length; k++){ + modifier = part.modifiers[k]; + if (modifier.type == "class"){ + classCount++; + } + if (classCount > 1){ + reporter.warn("Don't use adjoining classes.", part.line, part.col, rule); + } + } + } + } + } + }); + } + +}); +/* + * Rule: Don't use width or height when using padding or border. + */ +CSSLint.addRule({ + + //rule information + id: "box-model", + name: "Box Model", + desc: "Don't use width or height when using padding or border.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + widthProperties = { + border: 1, + "border-left": 1, + "border-right": 1, + padding: 1, + "padding-left": 1, + "padding-right": 1 + }, + heightProperties = { + border: 1, + "border-bottom": 1, + "border-top": 1, + padding: 1, + "padding-bottom": 1, + "padding-top": 1 + }, + properties; + + parser.addListener("startrule", function(){ + properties = { + }; + }); + + parser.addListener("property", function(event){ + var name = event.property.text.toLowerCase(); + + if (heightProperties[name] || widthProperties[name]){ + if (!/^0\S*$/.test(event.value) && !(name == "border" && event.value == "none")){ + properties[name] = { line: event.property.line, col: event.property.col, value: event.value }; + } + } else { + if (name == "width" || name == "height"){ + properties[name] = 1; + } + } + + }); + + parser.addListener("endrule", function(){ + var prop; + if (properties["height"]){ + for (prop in heightProperties){ + if (heightProperties.hasOwnProperty(prop) && properties[prop]){ + + //special case for padding + if (prop == "padding" && properties[prop].value.parts.length == 2 && properties[prop].value.parts[0].value == 0){ + //noop + } else { + reporter.warn("Broken box model: using height with " + prop + ".", properties[prop].line, properties[prop].col, rule); + } + } + } + } + + if (properties["width"]){ + for (prop in widthProperties){ + if (widthProperties.hasOwnProperty(prop) && properties[prop]){ + + if (prop == "padding" && properties[prop].value.parts.length == 2 && properties[prop].value.parts[1].value == 0){ + //noop + } else { + reporter.warn("Broken box model: using width with " + prop + ".", properties[prop].line, properties[prop].col, rule); + } + } + } + } + + }); + } + +}); +/* + * Rule: Include all compatible vendor prefixes to reach a wider + * range of users. + */ +/*global CSSLint*/ +CSSLint.addRule({ + + //rule information + id: "compatible-vendor-prefixes", + name: "Compatible Vendor Prefixes", + desc: "Include all compatible vendor prefixes to reach a wider range of users.", + browsers: "All", + + //initialization + init: function (parser, reporter) { + var rule = this, + compatiblePrefixes, + properties, + prop, + variations, + prefixed, + i, + len, + arrayPush = Array.prototype.push, + applyTo = []; + + // See http://peter.sh/experiments/vendor-prefixed-css-property-overview/ for details + compatiblePrefixes = { + "animation" : "webkit moz", + "animation-delay" : "webkit moz", + "animation-direction" : "webkit moz", + "animation-duration" : "webkit moz", + "animation-fill-mode" : "webkit moz", + "animation-iteration-count" : "webkit moz", + "animation-name" : "webkit moz", + "animation-play-state" : "webkit moz", + "animation-timing-function" : "webkit moz", + "appearance" : "webkit moz", + "border-end" : "webkit moz", + "border-end-color" : "webkit moz", + "border-end-style" : "webkit moz", + "border-end-width" : "webkit moz", + "border-image" : "webkit moz o", + "border-radius" : "webkit moz", + "border-start" : "webkit moz", + "border-start-color" : "webkit moz", + "border-start-style" : "webkit moz", + "border-start-width" : "webkit moz", + "box-align" : "webkit moz ms", + "box-direction" : "webkit moz ms", + "box-flex" : "webkit moz ms", + "box-lines" : "webkit ms", + "box-ordinal-group" : "webkit moz ms", + "box-orient" : "webkit moz ms", + "box-pack" : "webkit moz ms", + "box-sizing" : "webkit moz", + "box-shadow" : "webkit moz", + "column-count" : "webkit moz", + "column-gap" : "webkit moz", + "column-rule" : "webkit moz", + "column-rule-color" : "webkit moz", + "column-rule-style" : "webkit moz", + "column-rule-width" : "webkit moz", + "column-width" : "webkit moz", + "hyphens" : "epub moz", + "line-break" : "webkit ms", + "margin-end" : "webkit moz", + "margin-start" : "webkit moz", + "marquee-speed" : "webkit wap", + "marquee-style" : "webkit wap", + "padding-end" : "webkit moz", + "padding-start" : "webkit moz", + "tab-size" : "moz o", + "text-size-adjust" : "webkit ms", + "transform" : "webkit moz ms o", + "transform-origin" : "webkit moz ms o", + "transition" : "webkit moz o", + "transition-delay" : "webkit moz o", + "transition-duration" : "webkit moz o", + "transition-property" : "webkit moz o", + "transition-timing-function" : "webkit moz o", + "user-modify" : "webkit moz", + "user-select" : "webkit moz", + "word-break" : "epub ms", + "writing-mode" : "epub ms" + }; + + for (prop in compatiblePrefixes) { + if (compatiblePrefixes.hasOwnProperty(prop)) { + variations = []; + prefixed = compatiblePrefixes[prop].split(' '); + for (i = 0, len = prefixed.length; i < len; i++) { + variations.push('-' + prefixed[i] + '-' + prop); + } + compatiblePrefixes[prop] = variations; + arrayPush.apply(applyTo, variations); + } + } + parser.addListener("startrule", function () { + properties = []; + }); + + parser.addListener("property", function (event) { + var name = event.property.text; + if (applyTo.indexOf(name) > -1) { + properties.push(name); + } + }); + + parser.addListener("endrule", function (event) { + if (!properties.length) { + return; + } + + var propertyGroups = {}, + i, + len, + name, + prop, + variations, + value, + full, + actual, + item, + propertiesSpecified; + + for (i = 0, len = properties.length; i < len; i++) { + name = properties[i]; + + for (prop in compatiblePrefixes) { + if (compatiblePrefixes.hasOwnProperty(prop)) { + variations = compatiblePrefixes[prop]; + if (variations.indexOf(name) > -1) { + if (propertyGroups[prop] === undefined) { + propertyGroups[prop] = { + full : variations.slice(0), + actual : [] + }; + } + if (propertyGroups[prop].actual.indexOf(name) === -1) { + propertyGroups[prop].actual.push(name); + } + } + } + } + } + + for (prop in propertyGroups) { + if (propertyGroups.hasOwnProperty(prop)) { + value = propertyGroups[prop]; + full = value.full; + actual = value.actual; + + if (full.length > actual.length) { + for (i = 0, len = full.length; i < len; i++) { + item = full[i]; + if (actual.indexOf(item) === -1) { + propertiesSpecified = (actual.length === 1) ? actual[0] : (actual.length == 2) ? actual.join(" and ") : actual.join(", "); + reporter.warn("The property " + item + " is compatible with " + propertiesSpecified + " and should be included as well.", event.selectors[0].line, event.selectors[0].col, rule); + } + } + + } + } + } + }); + } +}); +/* + * Rule: Certain properties don't play well with certain display values. + * - float should not be used with inline-block + * - height, width, margin-top, margin-bottom, float should not be used with inline + * - vertical-align should not be used with block + * - margin, float should not be used with table-* + */ +CSSLint.addRule({ + + //rule information + id: "display-property-grouping", + name: "Display Property Grouping", + desc: "Certain properties shouldn't be used with certain display property values.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + var propertiesToCheck = { + display: 1, + "float": "none", + height: 1, + width: 1, + margin: 1, + "margin-left": 1, + "margin-right": 1, + "margin-bottom": 1, + "margin-top": 1, + padding: 1, + "padding-left": 1, + "padding-right": 1, + "padding-bottom": 1, + "padding-top": 1, + "vertical-align": 1 + }, + properties; + + parser.addListener("startrule", function(){ + properties = {}; + }); + + parser.addListener("property", function(event){ + var name = event.property.text.toLowerCase(); + + if (propertiesToCheck[name]){ + properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col }; + } + }); + + parser.addListener("endrule", function(){ + + var display = properties.display ? properties.display.value : null; + if (display){ + switch(display){ + + case "inline": + //height, width, margin-top, margin-bottom, float should not be used with inline + reportProperty("height", display); + reportProperty("width", display); + reportProperty("margin", display); + reportProperty("margin-top", display); + reportProperty("margin-bottom", display); + reportProperty("float", display, "display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug)."); + break; + + case "block": + //vertical-align should not be used with block + reportProperty("vertical-align", display); + break; + + case "inline-block": + //float should not be used with inline-block + reportProperty("float", display); + break; + + default: + //margin, float should not be used with table + if (display.indexOf("table-") == 0){ + reportProperty("margin", display); + reportProperty("margin-left", display); + reportProperty("margin-right", display); + reportProperty("margin-top", display); + reportProperty("margin-bottom", display); + reportProperty("float", display); + } + + //otherwise do nothing + } + } + + }); + + + function reportProperty(name, display, msg){ + if (properties[name]){ + if (!(typeof propertiesToCheck[name] == "string") || properties[name].value.toLowerCase() != propertiesToCheck[name]){ + reporter.warn(msg || name + " can't be used with display: " + display + ".", properties[name].line, properties[name].col, rule); + } + } + } + } + +}); +/* + * Rule: Duplicate properties must appear one after the other. If an already-defined + * property appears somewhere else in the rule, then it's likely an error. + */ +CSSLint.addRule({ + + //rule information + id: "duplicate-properties", + name: "Duplicate Properties", + desc: "Duplicate properties must appear one after the other.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + properties, + lastProperty; + + function startRule(event){ + properties = {}; + } + + parser.addListener("startrule", startRule); + parser.addListener("startfontface", startRule); + parser.addListener("startpage", startRule); + + parser.addListener("property", function(event){ + var property = event.property, + name = property.text.toLowerCase(); + + if (properties[name] && (lastProperty != name || properties[name] == event.value.text)){ + reporter.warn("Duplicate property '" + event.property + "' found.", event.line, event.col, rule); + } + + properties[name] = event.value.text; + lastProperty = name; + + }); + + + } + +}); +/* + * Rule: Style rules without any properties defined should be removed. + */ +CSSLint.addRule({ + + //rule information + id: "empty-rules", + name: "Empty Rules", + desc: "Rules without any properties specified should be removed.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + count = 0; + + parser.addListener("startrule", function(){ + count=0; + }); + + parser.addListener("property", function(){ + count++; + }); + + parser.addListener("endrule", function(event){ + var selectors = event.selectors; + if (count == 0){ + reporter.warn("Rule is empty.", selectors[0].line, selectors[0].col, rule); + } + }); + } + +}); +/* + * Rule: There should be no syntax errors. (Duh.) + */ +CSSLint.addRule({ + + //rule information + id: "errors", + name: "Parsing Errors", + desc: "This rule looks for recoverable syntax errors.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + parser.addListener("error", function(event){ + reporter.error(event.message, event.line, event.col, rule); + }); + + } + +}); +/* + * Rule: You shouldn't use more than 10 floats. If you do, there's probably + * room for some abstraction. + */ +CSSLint.addRule({ + + //rule information + id: "floats", + name: "Floats", + desc: "This rule tests if the float property is used too many times", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + var count = 0; + + //count how many times "float" is used + parser.addListener("property", function(event){ + if (event.property.text.toLowerCase() == "float" && + event.value.text.toLowerCase() != "none"){ + count++; + } + }); + + //report the results + parser.addListener("endstylesheet", function(){ + reporter.stat("floats", count); + if (count >= 10){ + reporter.rollupWarn("Too many floats (" + count + "), you're probably using them for layout. Consider using a grid system instead.", rule); + } + }); + } + +}); +/* + * Rule: Avoid too many @font-face declarations in the same stylesheet. + */ +CSSLint.addRule({ + + //rule information + id: "font-faces", + name: "Font Faces", + desc: "Too many different web fonts in the same stylesheet.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + count = 0; + + + parser.addListener("startfontface", function(){ + count++; + }); + + parser.addListener("endstylesheet", function(){ + if (count > 5){ + reporter.rollupWarn("Too many @font-face declarations (" + count + ").", rule); + } + }); + } + +}); +/* + * Rule: You shouldn't need more than 9 font-size declarations. + */ + +CSSLint.addRule({ + + //rule information + id: "font-sizes", + name: "Font Sizes", + desc: "Checks the number of font-size declarations.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + count = 0; + + //check for use of "font-size" + parser.addListener("property", function(event){ + if (event.property == "font-size"){ + count++; + } + }); + + //report the results + parser.addListener("endstylesheet", function(){ + reporter.stat("font-sizes", count); + if (count >= 10){ + reporter.rollupWarn("Too many font-size declarations (" + count + "), abstraction needed.", rule); + } + }); + } + +}); +/* + * Rule: When using a vendor-prefixed gradient, make sure to use them all. + */ +CSSLint.addRule({ + + //rule information + id: "gradients", + name: "Gradients", + desc: "When using a vendor-prefixed gradient, make sure to use them all.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + gradients; + + parser.addListener("startrule", function(){ + gradients = { + moz: 0, + webkit: 0, + ms: 0, + o: 0 + }; + }); + + parser.addListener("property", function(event){ + + if (/\-(moz|ms|o|webkit)(?:\-(?:linear|radial))\-gradient/.test(event.value)){ + gradients[RegExp.$1] = 1; + } + + }); + + parser.addListener("endrule", function(event){ + var missing = []; + + if (!gradients.moz){ + missing.push("Firefox 3.6+"); + } + + if (!gradients.webkit){ + missing.push("Webkit (Safari, Chrome)"); + } + + if (!gradients.ms){ + missing.push("Internet Explorer 10+"); + } + + if (!gradients.o){ + missing.push("Opera 11.1+"); + } + + if (missing.length && missing.length < 4){ + reporter.warn("Missing vendor-prefixed CSS gradients for " + missing.join(", ") + ".", event.selectors[0].line, event.selectors[0].col, rule); + } + + }); + + } + +}); +/* + * Rule: Don't use IDs for selectors. + */ +CSSLint.addRule({ + + //rule information + id: "ids", + name: "IDs", + desc: "Selectors should not contain IDs.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + modifier, + idCount, + i, j, k; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + idCount = 0; + + for (j=0; j < selector.parts.length; j++){ + part = selector.parts[j]; + if (part instanceof parserlib.css.SelectorPart){ + for (k=0; k < part.modifiers.length; k++){ + modifier = part.modifiers[k]; + if (modifier.type == "id"){ + idCount++; + } + } + } + } + + if (idCount == 1){ + reporter.warn("Don't use IDs in selectors.", selector.line, selector.col, rule); + } else if (idCount > 1){ + reporter.warn(idCount + " IDs in the selector, really?", selector.line, selector.col, rule); + } + } + + }); + } + +}); +/* + * Rule: Don't use @import, use instead. + */ +CSSLint.addRule({ + + //rule information + id: "import", + name: "@import", + desc: "Don't use @import, use instead.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + parser.addListener("import", function(event){ + reporter.warn("@import prevents parallel downloads, use instead.", event.line, event.col, rule); + }); + + } + +}); +/* + * Rule: Make sure !important is not overused, this could lead to specificity + * war. Display a warning on !important declarations, an error if it's + * used more at least 10 times. + */ +CSSLint.addRule({ + + //rule information + id: "important", + name: "Important", + desc: "Be careful when using !important declaration", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + count = 0; + + //warn that important is used and increment the declaration counter + parser.addListener("property", function(event){ + if (event.important === true){ + count++; + reporter.warn("Use of !important", event.line, event.col, rule); + } + }); + + //if there are more than 10, show an error + parser.addListener("endstylesheet", function(){ + reporter.stat("important", count); + if (count >= 10){ + reporter.rollupWarn("Too many !important declarations (" + count + "), try to use less than 10 to avoid specifity issues.", rule); + } + }); + } + +}); +/* + * Rule: Properties should be known (listed in CSS3 specification) or + * be a vendor-prefixed property. + */ +CSSLint.addRule({ + + //rule information + id: "known-properties", + name: "Known Properties", + desc: "Properties should be known (listed in CSS specification) or be a vendor-prefixed property.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + properties = { + + "alignment-adjust": 1, + "alignment-baseline": 1, + "animation": 1, + "animation-delay": 1, + "animation-direction": 1, + "animation-duration": 1, + "animation-iteration-count": 1, + "animation-name": 1, + "animation-play-state": 1, + "animation-timing-function": 1, + "appearance": 1, + "azimuth": 1, + "backface-visibility": 1, + "background": 1, + "background-attachment": 1, + "background-break": 1, + "background-clip": 1, + "background-color": 1, + "background-image": 1, + "background-origin": 1, + "background-position": 1, + "background-repeat": 1, + "background-size": 1, + "baseline-shift": 1, + "binding": 1, + "bleed": 1, + "bookmark-label": 1, + "bookmark-level": 1, + "bookmark-state": 1, + "bookmark-target": 1, + "border": 1, + "border-bottom": 1, + "border-bottom-color": 1, + "border-bottom-left-radius": 1, + "border-bottom-right-radius": 1, + "border-bottom-style": 1, + "border-bottom-width": 1, + "border-collapse": 1, + "border-color": 1, + "border-image": 1, + "border-image-outset": 1, + "border-image-repeat": 1, + "border-image-slice": 1, + "border-image-source": 1, + "border-image-width": 1, + "border-left": 1, + "border-left-color": 1, + "border-left-style": 1, + "border-left-width": 1, + "border-radius": 1, + "border-right": 1, + "border-right-color": 1, + "border-right-style": 1, + "border-right-width": 1, + "border-spacing": 1, + "border-style": 1, + "border-top": 1, + "border-top-color": 1, + "border-top-left-radius": 1, + "border-top-right-radius": 1, + "border-top-style": 1, + "border-top-width": 1, + "border-width": 1, + "bottom": 1, + "box-align": 1, + "box-decoration-break": 1, + "box-direction": 1, + "box-flex": 1, + "box-flex-group": 1, + "box-lines": 1, + "box-ordinal-group": 1, + "box-orient": 1, + "box-pack": 1, + "box-shadow": 1, + "box-sizing": 1, + "break-after": 1, + "break-before": 1, + "break-inside": 1, + "caption-side": 1, + "clear": 1, + "clip": 1, + "color": 1, + "color-profile": 1, + "column-count": 1, + "column-fill": 1, + "column-gap": 1, + "column-rule": 1, + "column-rule-color": 1, + "column-rule-style": 1, + "column-rule-width": 1, + "column-span": 1, + "column-width": 1, + "columns": 1, + "content": 1, + "counter-increment": 1, + "counter-reset": 1, + "crop": 1, + "cue": 1, + "cue-after": 1, + "cue-before": 1, + "cursor": 1, + "direction": 1, + "display": 1, + "dominant-baseline": 1, + "drop-initial-after-adjust": 1, + "drop-initial-after-align": 1, + "drop-initial-before-adjust": 1, + "drop-initial-before-align": 1, + "drop-initial-size": 1, + "drop-initial-value": 1, + "elevation": 1, + "empty-cells": 1, + "fit": 1, + "fit-position": 1, + "float": 1, + "float-offset": 1, + "font": 1, + "font-family": 1, + "font-size": 1, + "font-size-adjust": 1, + "font-stretch": 1, + "font-style": 1, + "font-variant": 1, + "font-weight": 1, + "grid-columns": 1, + "grid-rows": 1, + "hanging-punctuation": 1, + "height": 1, + "hyphenate-after": 1, + "hyphenate-before": 1, + "hyphenate-character": 1, + "hyphenate-lines": 1, + "hyphenate-resource": 1, + "hyphens": 1, + "icon": 1, + "image-orientation": 1, + "image-rendering": 1, + "image-resolution": 1, + "inline-box-align": 1, + "left": 1, + "letter-spacing": 1, + "line-height": 1, + "line-stacking": 1, + "line-stacking-ruby": 1, + "line-stacking-shift": 1, + "line-stacking-strategy": 1, + "list-style": 1, + "list-style-image": 1, + "list-style-position": 1, + "list-style-type": 1, + "margin": 1, + "margin-bottom": 1, + "margin-left": 1, + "margin-right": 1, + "margin-top": 1, + "mark": 1, + "mark-after": 1, + "mark-before": 1, + "marks": 1, + "marquee-direction": 1, + "marquee-play-count": 1, + "marquee-speed": 1, + "marquee-style": 1, + "max-height": 1, + "max-width": 1, + "min-height": 1, + "min-width": 1, + "move-to": 1, + "nav-down": 1, + "nav-index": 1, + "nav-left": 1, + "nav-right": 1, + "nav-up": 1, + "opacity": 1, + "orphans": 1, + "outline": 1, + "outline-color": 1, + "outline-offset": 1, + "outline-style": 1, + "outline-width": 1, + "overflow": 1, + "overflow-style": 1, + "overflow-x": 1, + "overflow-y": 1, + "padding": 1, + "padding-bottom": 1, + "padding-left": 1, + "padding-right": 1, + "padding-top": 1, + "page": 1, + "page-break-after": 1, + "page-break-before": 1, + "page-break-inside": 1, + "page-policy": 1, + "pause": 1, + "pause-after": 1, + "pause-before": 1, + "perspective": 1, + "perspective-origin": 1, + "phonemes": 1, + "pitch": 1, + "pitch-range": 1, + "play-during": 1, + "position": 1, + "presentation-level": 1, + "punctuation-trim": 1, + "quotes": 1, + "rendering-intent": 1, + "resize": 1, + "rest": 1, + "rest-after": 1, + "rest-before": 1, + "richness": 1, + "right": 1, + "rotation": 1, + "rotation-point": 1, + "ruby-align": 1, + "ruby-overhang": 1, + "ruby-position": 1, + "ruby-span": 1, + "size": 1, + "speak": 1, + "speak-header": 1, + "speak-numeral": 1, + "speak-punctuation": 1, + "speech-rate": 1, + "stress": 1, + "string-set": 1, + "table-layout": 1, + "target": 1, + "target-name": 1, + "target-new": 1, + "target-position": 1, + "text-align": 1, + "text-align-last": 1, + "text-decoration": 1, + "text-emphasis": 1, + "text-height": 1, + "text-indent": 1, + "text-justify": 1, + "text-outline": 1, + "text-shadow": 1, + "text-transform": 1, + "text-wrap": 1, + "top": 1, + "transform": 1, + "transform-origin": 1, + "transform-style": 1, + "transition": 1, + "transition-delay": 1, + "transition-duration": 1, + "transition-property": 1, + "transition-timing-function": 1, + "unicode-bidi": 1, + "vertical-align": 1, + "visibility": 1, + "voice-balance": 1, + "voice-duration": 1, + "voice-family": 1, + "voice-pitch": 1, + "voice-pitch-range": 1, + "voice-rate": 1, + "voice-stress": 1, + "voice-volume": 1, + "volume": 1, + "white-space": 1, + "white-space-collapse": 1, + "widows": 1, + "width": 1, + "word-break": 1, + "word-spacing": 1, + "word-wrap": 1, + "z-index": 1, + + //IE + "filter": 1, + "zoom": 1 + }; + + parser.addListener("property", function(event){ + var name = event.property.text.toLowerCase(); + + if (!properties[name] && name.charAt(0) != "-"){ + reporter.error("Unknown property '" + event.property + "'.", event.line, event.col, rule); + } + + }); + } + +}); +/* + * Rule: Don't use classes or IDs with elements (a.foo or a#foo). + */ +CSSLint.addRule({ + + //rule information + id: "overqualified-elements", + name: "Overqualified Elements", + desc: "Don't use classes or IDs with elements (a.foo or a#foo).", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + classes = {}; + + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + modifier, + i, j, k; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + + for (j=0; j < selector.parts.length; j++){ + part = selector.parts[j]; + if (part instanceof parserlib.css.SelectorPart){ + for (k=0; k < part.modifiers.length; k++){ + modifier = part.modifiers[k]; + if (part.elementName && modifier.type == "id"){ + reporter.warn("Element (" + part + ") is overqualified, just use " + modifier + " without element name.", part.line, part.col, rule); + } else if (modifier.type == "class"){ + + if (!classes[modifier]){ + classes[modifier] = []; + } + classes[modifier].push({ modifier: modifier, part: part }); + } + } + } + } + } + }); + + parser.addListener("endstylesheet", function(){ + + var prop; + for (prop in classes){ + if (classes.hasOwnProperty(prop)){ + + //one use means that this is overqualified + if (classes[prop].length == 1 && classes[prop][0].part.elementName){ + reporter.warn("Element (" + classes[prop][0].part + ") is overqualified, just use " + classes[prop][0].modifier + " without element name.", classes[prop][0].part.line, classes[prop][0].part.col, rule); + } + } + } + }); + } + +}); +/* + * Rule: Headings (h1-h6) should not be qualified (namespaced). + */ +CSSLint.addRule({ + + //rule information + id: "qualified-headings", + name: "Qualified Headings", + desc: "Headings should not be qualified (namespaced).", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + i, j; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + + for (j=0; j < selector.parts.length; j++){ + part = selector.parts[j]; + if (part instanceof parserlib.css.SelectorPart){ + if (part.elementName && /h[1-6]/.test(part.elementName.toString()) && j > 0){ + reporter.warn("Heading (" + part.elementName + ") should not be qualified.", part.line, part.col, rule); + } + } + } + } + }); + } + +}); +/* + * Rule: Selectors that look like regular expressions are slow and should be avoided. + */ +CSSLint.addRule({ + + //rule information + id: "regex-selectors", + name: "Regex Selectors", + desc: "Selectors that look like regular expressions are slow and should be avoided.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + modifier, + i, j, k; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + for (j=0; j < selector.parts.length; j++){ + part = selector.parts[j]; + if (part instanceof parserlib.css.SelectorPart){ + for (k=0; k < part.modifiers.length; k++){ + modifier = part.modifiers[k]; + if (modifier.type == "attribute"){ + if (/([\~\|\^\$\*]=)/.test(modifier)){ + reporter.warn("Attribute selectors with " + RegExp.$1 + " are slow!", modifier.line, modifier.col, rule); + } + } + + } + } + } + } + }); + } + +}); +/* + * Rule: Total number of rules should not exceed x. + */ +CSSLint.addRule({ + + //rule information + id: "rules-count", + name: "Rules Count", + desc: "Track how many rules there are.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + count = 0; + + //count each rule + parser.addListener("startrule", function(){ + count++; + }); + + parser.addListener("endstylesheet", function(){ + reporter.stat("rule-count", count); + }); + } + +}); +/* + * Rule: Don't use text-indent for image replacement if you need to support rtl. + * + */ +/* + * Should we be checking for rtl/ltr? + */ +//Commented out due to lack of tests +CSSLint.addRule({ + + //rule information + id: "text-indent", + name: "Text Indent", + desc: "Checks for text indent less than -99px", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + //check for use of "font-size" + parser.addListener("property", function(event){ + var name = event.property, + value = event.value.parts[0].value; + + if (name == "text-indent" && value < -99){ + reporter.warn("Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set text-direction for that item to ltr.", name.line, name.col, rule); + } + }); + } + +}); +/* + * Rule: Headings (h1-h6) should be defined only once. + */ +CSSLint.addRule({ + + //rule information + id: "unique-headings", + name: "Unique Headings", + desc: "Headings should be defined only once.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + var headings = { + h1: 0, + h2: 0, + h3: 0, + h4: 0, + h5: 0, + h6: 0 + }; + + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + i; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + part = selector.parts[selector.parts.length-1]; + + if (part.elementName && /(h[1-6])/.test(part.elementName.toString())){ + headings[RegExp.$1]++; + if (headings[RegExp.$1] > 1) { + reporter.warn("Heading (" + part.elementName + ") has already been defined.", part.line, part.col, rule); + } + } + } + }); + } + +}); +/* + * Rule: Don't use universal selector because it's slow. + */ +CSSLint.addRule({ + + //rule information + id: "universal-selector", + name: "Universal Selector", + desc: "The universal selector (*) is known to be slow.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + parser.addListener("startrule", function(event){ + var selectors = event.selectors, + selector, + part, + modifier, + i, j, k; + + for (i=0; i < selectors.length; i++){ + selector = selectors[i]; + + part = selector.parts[selector.parts.length-1]; + if (part.elementName == "*"){ + reporter.warn(rule.desc, part.line, part.col, rule); + } + } + }); + } + +}); +/* + * Rule: When using a vendor-prefixed property, make sure to + * include the standard one. + */ +CSSLint.addRule({ + + //rule information + id: "vendor-prefix", + name: "Vendor Prefix", + desc: "When using a vendor-prefixed property, make sure to include the standard one.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + properties, + num, + propertiesToCheck = { + "-moz-border-radius": "border-radius", + "-webkit-border-radius": "border-radius", + "-webkit-border-top-left-radius": "border-top-left-radius", + "-webkit-border-top-right-radius": "border-top-right-radius", + "-webkit-border-bottom-left-radius": "border-bottom-left-radius", + "-webkit-border-bottom-right-radius": "border-bottom-right-radius", + "-moz-border-radius-topleft": "border-top-left-radius", + "-moz-border-radius-topright": "border-top-right-radius", + "-moz-border-radius-bottomleft": "border-bottom-left-radius", + "-moz-border-radius-bottomright": "border-bottom-right-radius", + "-moz-box-shadow": "box-shadow", + "-webkit-box-shadow": "box-shadow", + "-moz-transform" : "transform", + "-webkit-transform" : "transform", + "-o-transform" : "transform", + "-ms-transform" : "transform", + "-moz-box-sizing" : "box-sizing", + "-webkit-box-sizing" : "box-sizing", + "-moz-user-select" : "user-select", + "-khtml-user-select" : "user-select", + "-webkit-user-select" : "user-select" + }; + + //event handler for beginning of rules + function startRule(){ + properties = {}; + num=1; + } + + //event handler for end of rules + function endRule(event){ + var prop, + i, len, + standard, + needed, + actual, + needsStandard = []; + + for (prop in properties){ + if (propertiesToCheck[prop]){ + needsStandard.push({ actual: prop, needed: propertiesToCheck[prop]}); + } + } + + for (i=0, len=needsStandard.length; i < len; i++){ + needed = needsStandard[i].needed; + actual = needsStandard[i].actual; + + if (!properties[needed]){ + reporter.warn("Missing standard property '" + needed + "' to go along with '" + actual + "'.", event.line, event.col, rule); + } else { + //make sure standard property is last + if (properties[needed][0].pos < properties[actual][0].pos){ + reporter.warn("Standard property '" + needed + "' should come after vendor-prefixed property '" + actual + "'.", event.line, event.col, rule); + } + } + } + + } + + parser.addListener("startrule", startRule); + parser.addListener("startfontface", startRule); + + parser.addListener("property", function(event){ + var name = event.property.text.toLowerCase(); + + if (!properties[name]){ + properties[name] = []; + } + + properties[name].push({ name: event.property, value : event.value, pos:num++ }); + }); + + parser.addListener("endrule", endRule); + parser.addListener("endfontface", endRule); + } + +}); +/* + * Rule: If an element has a width of 100%, be careful when placing within + * an element that has padding. It may look strange. + */ +//Commented out pending further review. +/*CSSLint.addRule({ + + //rule information + id: "width-100", + name: "Width 100%", + desc: "Be careful when using width: 100% on elements.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this, + width100, + boxsizing; + + parser.addListener("startrule", function(){ + width100 = null; + boxsizing = false; + }); + + parser.addListener("property", function(event){ + var name = event.property.text.toLowerCase(), + value = event.value; + + if (name == "width" && value == "100%"){ + width100 = event.property; + } else if (name == "box-sizing" || /\-(?:webkit|ms|moz)\-box-sizing/.test(name)){ //means you know what you're doing + boxsizing = true; + } + }); + + parser.addListener("endrule", function(){ + if (width100 && !boxsizing){ + reporter.warn("Elements with a width of 100% may not appear as you expect inside of other elements.", width100.line, width100.col, rule); + } + }); + } + +});*/ +/* + * Rule: You don't need to specify units when a value is 0. + */ +CSSLint.addRule({ + + //rule information + id: "zero-units", + name: "Zero Units", + desc: "You don't need to specify units when a value is 0.", + browsers: "All", + + //initialization + init: function(parser, reporter){ + var rule = this; + + //count how many times "float" is used + parser.addListener("property", function(event){ + var parts = event.value.parts, + i = 0, + len = parts.length; + + while(i < len){ + if ((parts[i].units || parts[i].type == "percentage") && parts[i].value === 0){ + reporter.warn("Values of 0 shouldn't have units specified.", parts[i].line, parts[i].col, rule); + } + i++; + } + + }); + + } + +}); + +exports.CSSLint = CSSLint; +}); diff --git a/apps/files_texteditor/js/aceeditor/worker-javascript.js b/apps/files_texteditor/js/aceeditor/worker-javascript.js index 5792f4562c4..e48c6e810dc 100644 --- a/apps/files_texteditor/js/aceeditor/worker-javascript.js +++ b/apps/files_texteditor/js/aceeditor/worker-javascript.js @@ -1 +1,9752 @@ -function initSender(){var a=require("pilot/event_emitter").EventEmitter,b=require("pilot/oop"),c=function(){};(function(){b.implement(this,a),this.callback=function(a,b){postMessage({type:"call",id:b,data:a})},this.emit=function(a,b){postMessage({type:"event",name:a,data:b})}}).call(c.prototype);return new c}function initBaseUrls(a){require.tlns=a}var console={log:function(a){postMessage({type:"log",data:a})}},window={console:console},require=function(a){var b=require.modules[a];if(b){b.initialized||(b.exports=b.factory().exports,b.initialized=!0);return b.exports}var c=a.split("/");c[0]=require.tlns[c[0]]||c[0],path=c.join("/")+".js",require.id=a,importScripts(path);return require(a)};require.modules={},require.tlns={};var define=function(a,b,c){arguments.length==2?c=b:arguments.length==1&&(c=a,a=require.id);a.indexOf("text/")!==0&&(require.modules[a]={factory:function(){var a={exports:{}},b=c(require,a.exports,a);b&&(a.exports=b);return a}})},main,sender;onmessage=function(a){var b=a.data;if(b.command)main[b.command].apply(main,b.args);else if(b.init){initBaseUrls(b.tlns),require("pilot/fixoldbrowsers"),sender=initSender();var c=require(b.module)[b.classname];main=new c(sender)}else b.event&&sender&&sender._dispatchEvent(b.event,b.data)},define("pilot/fixoldbrowsers",["require","exports","module"],function(a,b,c){if(!Function.prototype.bind){var d=Array.prototype.slice;Function.prototype.bind=function(a){var b=this;if(typeof b.apply!="function"||typeof b.call!="function")return new TypeError;var c=d.call(arguments),e=function f(){if(this instanceof f){var a=Object.create(b.prototype);b.apply(a,c.concat(d.call(arguments)));return a}return b.call.apply(b,c.concat(d.call(arguments)))};e.length=typeof b=="function"?Math.max(b.length-c.length,0):0;return e}}var e=Function.prototype.call,f=Array.prototype,g=Object.prototype,h=e.bind(g.hasOwnProperty),i,j,k,l,m;if(m=h(g,"__defineGetter__"))i=e.bind(g.__defineGetter__),j=e.bind(g.__defineSetter__),k=e.bind(g.__lookupGetter__),l=e.bind(g.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=+this.length;for(var d=0;d=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c=2)var d=arguments[1];else do{if(c in this){d=this[c--];break}if(--c<0)throw new TypeError}while(!0);for(;c>=0;c--)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length;if(!b)return-1;var c=arguments[1]||0;if(c>=b)return-1;c<0&&(c+=b);for(;c=0;c--){if(!h(this,c))continue;if(a===this[c])return c}return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||a.constructor.prototype});if(!Object.getOwnPropertyDescriptor){var n="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(n+a);if(!h(a,b))return undefined;var c,d,e;c={enumerable:!0,configurable:!0};if(m){var f=a.__proto__;a.__proto__=g;var d=k(a,b),e=l(a,b);a.__proto__=f;if(d||e){d&&(descriptor.get=d),e&&(descriptor.set=e);return descriptor}}descriptor.value=a[b];return descriptor}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}typeof b!="undefined"&&Object.defineProperties(c,b);return c});if(!Object.defineProperty){var o="Property description must be an object: ",p="Object.defineProperty called on non-object: ",q="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function")throw new TypeError(p+a);if(typeof a!="object"||a===null)throw new TypeError(o+c);if(h(c,"value"))if(m&&(k(a,b)||l(a,b))){var d=a.__proto__;a.__proto__=g,delete a[b],a[b]=c.value,a.prototype}else a[b]=c.value;else{if(!m)throw new TypeError(q);h(c,"get")&&i(a,b,c.get),h(c,"set")&&j(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)h(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(r){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){return!0});if(!Object.keys){var s=!0,t=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=t.length;for(var v in{toString:null})s=!1;Object.keys=function W(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var W=[];for(var b in a)h(a,b)&&W.push(b);if(s)for(var c=0,d=u;c=7?new a(c,d,e,f,g,h,i):j>=6?new a(c,d,e,f,g,h):j>=5?new a(c,d,e,f,g):j>=4?new a(c,d,e,f):j>=3?new a(c,d,e):j>=2?new a(c,d):j>=1?new a(c):new a;k.constructor=b;return k}return a.apply(this,arguments)},c=new RegExp("^(?:((?:[+-]\\d\\d)?\\d\\d\\d\\d)(?:-(\\d\\d)(?:-(\\d\\d))?)?)?(?:T(\\d\\d):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?)?(?:Z|([+-])(\\d\\d):(\\d\\d))?$");for(var d in a)b[d]=a[d];b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function e(b){var d=c.exec(b);if(d){d.shift();var e=d[0]===undefined;for(var f=0;f<10;f++){if(f===7)continue;d[f]=+(d[f]||(f<3?1:0)),f===1&&d[f]--}if(e)return((d[3]*60+d[4])*60+d[5])*1e3+d[6];var g=(d[8]*60+d[9])*60*1e3;d[6]==="-"&&(g=-g);return a.UTC.apply(this,d.slice(0,7))+g}return a.parse.apply(this,arguments)};return b}(Date));if(!String.prototype.trim){var w=/^\s\s*/,x=/\s\s*$/;String.prototype.trim=function(){return String(this).replace(w,"").replace(x,"")}}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!!c&&!!c.length){var b=b||{};b.type=a;for(var d=0;d=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length);return a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||""));return a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};this._dispatchEvent("change",{data:e});return d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:d});return c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};this._dispatchEvent("change",{data:e});return d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b!=c){var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};this._dispatchEvent("change",{data:i});return d.start}},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};this._dispatchEvent("change",{data:e});return d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/range",["require","exports","module"],function(a,b,c){var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;b=this.compare(c.row,c.column);if(b==1){b=this.compare(d.row,d.column);return b==1?2:b==0?1:0}if(b==-1)return-2;b=this.compare(d.row,d.column);return b==-1?-1:b==1?42:0},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)||this.isStart(a,b)?!1:!0;return!1},this.insideStart=function(a,b){if(this.compare(a,b)==0)return this.isEnd(a,b)?!1:!0;return!1},this.insideEnd=function(a,b){if(this.compare(a,b)==0)return this.isStart(a,b)?!1:!0;return!1},this.compare=function(a,b){if(!this.isMultiLine()&&a===this.start.row)return bthis.end.column?1:0;return athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.rowthis.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0);return c}}).call(f.prototype)}),define("pilot/lang",["require","exports","module"],function(a,b,c){b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return Array(b+1).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(i=0,l=a.length;ip)p+=A.indent;!a&&!bQ()&&!f&&A.strict&&j["(context)"]["(global)"]&&be('Missing "use strict" statement.'),c=bR(),L=f,p-=A.indent,bt()}bm("}",h),p=e}else a?((!b||A.curly)&&be("Expected '{a}' and instead saw '{b}'.",x,"{",x.value),z=!0,c=[bP()],z=!1):bg("Expected '{a}' and instead saw '{b}'.",x,"{",x.value);j["(verb)"]=null,G=g,o=d,a&&A.noempty&&(!c||c.length===0)&&be("Empty block.");return c}function bR(a){var b=[],c,d;while(!x.reach&&x.id!=="(end)")x.id===";"?(be("Unnecessary semicolon."),bm(";")):b.push(bP());return b}function bQ(){if(x.value==="use strict"){L&&be('Unnecessary "use strict".'),bm(),bm(";"),L=!0,A.newcap=!0,A.undef=!0;return!0}return!1}function bP(a){var b=p,c,d=G,e=x;if(e.id===";")be("Unnecessary semicolon.",e),bm(";");else{e.identifier&&!e.reserved&&bl().id===":"&&(bm(),bm(":"),G=Object.create(d),bj(e.value,"label"),x.labelled||be("Label '{a}' on {b} statement.",x,e.value,x.value),Z.test(e.value+":")&&be("Label '{a}' looks like a javascript url.",e,e.value),x.label=e.value,e=x),a||bt(),c=bn(0,!0),e.block||(!A.expr&&(!c||!c.exps)?be("Expected an assignment or function call and instead saw an expression.",O):A.nonew&&c.id==="("&&c.left.id==="new"&&be("Do not use 'new' for side effects."),x.id!==";"?!A.asi&&(!A.lastsemic||x.id!="}"||x.line!=O.line)&&bf("Missing semicolon.",O.line,O.from+O.value.length):(bo(O,x),bm(";"),br(O,x))),p=b,G=d;return c}}function bO(a){var b=0,c;if(x.id===";"&&!z)for(;;){c=bl(b);if(c.reach)return;if(c.id!=="(endline)"){if(c.id==="function"){be("Inner functions should be listed at the top of the outer function.",c);break}be("Unreachable '{a}' after '{b}'.",c,c.value,a);break}b+=1}}function bN(a){var b=bM(a);if(b)return b;O.id==="function"&&x.id==="("?be("Missing name in function declaration."):bg("Expected an identifier and instead saw '{a}'.",x,x.value)}function bM(a){if(x.identifier){bm(),O.reserved&&!A.es5&&(!a||O.value!="undefined")&&be("Expected an identifier and instead saw '{a}' (a reserved word).",O,O.id);return O.value}}function bL(a,b){var c=bw(a,150);c.led=function(a){A.plusplus?be("Unexpected use of '{a}'.",this,this.id):(!a.identifier||a.reserved)&&a.id!=="."&&a.id!=="["&&be("Bad operand.",this),this.left=a;return this};return c}function bK(a){bw(a,20).exps=!0;return bF(a,function(a,b){A.bitwise&&be("Unexpected use of '{a}'.",b,b.id),br(D,O),br(O,x);if(a){if(a.id==="."||a.id==="["||a.identifier&&!a.reserved){bn(19);return b}a===M["function"]&&be("Expected an identifier in an assignment, and instead saw a function invocation.",O);return b}bg("Bad assignment.",b)},20)}function bJ(a,b,c){var d=bw(a,c);bA(d),d.led=typeof b=="function"?b:function(a){A.bitwise&&be("Unexpected use of '{a}'.",this,this.id),this.left=a,this.right=bn(c);return this};return d}function bI(a,b){bw(a,20).exps=!0;return bF(a,function(a,b){var c;b.left=a,B[a.value]===!1&&G[a.value]["(global)"]===!0?be("Read only.",a):a["function"]&&be("'{a}' is a function.",a,a.value);if(a){if(a.id==="."||a.id==="["){(!a.left||a.left.value==="arguments")&&be("Bad assignment.",b),b.right=bn(19);return b}if(a.identifier&&!a.reserved){j[a.value]==="exception"&&be("Do not assign to the exception parameter.",a),b.right=bn(19);return b}a===M["function"]&&be("Expected an identifier in an assignment and instead saw a function invocation.",O)}bg("Bad assignment.",b)},20)}function bH(a){return a&&(a.type==="(number)"&&+a.value===0||a.type==="(string)"&&a.value===""||a.type==="null"&&!A.eqnull||a.type==="true"||a.type==="false"||a.type==="undefined")}function bG(a,b){var c=bw(a,100);c.led=function(a){bs(D,O),br(O,x);var c=bn(100);a&&a.id==="NaN"||c&&c.id==="NaN"?be("Use the isNaN function to compare with NaN.",this):b&&b.apply(this,[a,c]),a.id==="!"&&be("Confusing use of '{a}'.",a,"!"),c.id==="!"&&be("Confusing use of '{a}'.",a,"!"),this.left=a,this.right=c;return this};return c}function bF(a,b,c,d){var e=bw(a,c);bA(e),e.led=function(a){d||(bs(D,O),br(O,x));if(typeof b=="function")return b(a,this);this.left=a,this.right=bn(c);return this};return e}function bE(a,b){return bD(a,function(){typeof b=="function"&&b(this);return this})}function bD(a,b){var c=bC(a,b);c.identifier=c.reserved=!0;return c}function bC(a,b){var c=bx(a);c.type=a,c.nud=b;return c}function bB(a,b){var c=bw(a,150);bA(c),c.nud=typeof b=="function"?b:function(){this.right=bn(150),this.arity="unary";if(this.id==="++"||this.id==="--")A.plusplus?be("Unexpected use of '{a}'.",this,this.id):(!this.right.identifier||this.right.reserved)&&this.right.id!=="."&&this.right.id!=="["&&be("Bad operand.",this);return this};return c}function bA(a){var b=a.id.charAt(0);if(b>="a"&&b<="z"||b>="A"&&b<="Z")a.identifier=a.reserved=!0;return a}function bz(a,b){var c=by(a,b);c.block=!0;return c}function by(a,b){var c=bx(a);c.identifier=c.reserved=!0,c.fud=b;return c}function bx(a){return bw(a,0)}function bw(a,b){var c=M[a];if(!c||typeof c!="object")M[a]=c={id:a,lbp:b,value:a};return c}function bv(){O.line!==x.line?A.laxbreak||be("Bad line breaking before '{a}'.",O,x.id):O.character!==x.from&&A.white&&be("Unexpected space after '{a}'.",x,O.value),bm(","),br(O,x)}function bu(a){a=a||O,a.line!==x.line&&be("Line breaking error '{a}'.",a,a.value)}function bt(a){var b;A.white&&x.id!=="(end)"&&(b=p+(a||0),x.from!==b&&be("Expected '{a}' to have an indentation at {b} instead at {c}.",x,x.value,b,x.from))}function bs(a,b){a=a||O,b=b||x,!A.laxbreak&&a.line!==b.line?be("Bad line breaking before '{a}'.",b,b.id):A.white&&(a=a||O,b=b||x,a.character===b.from&&be("Missing space after '{a}'.",x,a.value))}function br(a,b){A.white&&(a=a||O,b=b||x,a.line===b.line&&a.character===b.from&&be("Missing space after '{a}'.",x,a.value))}function bq(a,b){a=a||O,b=b||x,A.white&&!a.comment&&a.line===b.line&&bo(a,b)}function bp(a,b){a=a||O,b=b||x,A.white&&(a.character!==b.from||a.line!==b.line)&&be("Unexpected space before '{a}'.",b,b.value)}function bo(a,b){a=a||O,b=b||x,A.white&&a.character!==b.from&&a.line===b.line&&be("Unexpected space after '{a}'.",b,a.value)}function bn(b,c){var d,e=!1;x.id==="(end)"&&bg("Unexpected early end of program.",O),bm(),c&&(a="anonymous",j["(verb)"]=O.value);if(c===!0&&O.fud)d=O.fud();else{if(O.nud)d=O.nud();else{if(x.type==="(number)"&&O.id==="."){be("A leading decimal point can be confused with a dot: '.{a}'.",O,x.value),bm();return O}bg("Expected an identifier and instead saw '{a}'.",O,O.id)}while(b=A.maxerr&&bd("Too many errors.",i,h);return j}function bd(a,b,c){var d=Math.floor(b/s.length*100);throw{name:"JSHintError",line:b,character:c,message:a+" ("+d+"% scanned)."}}function bc(){A.couch&&bb(B,f),A.rhino&&bb(B,F),A.prototypejs&&bb(B,E),A.node&&bb(B,y),A.devel&&bb(B,g),A.dojo&&bb(B,h),A.browser&&bb(B,e),A.jquery&&bb(B,r),A.mootools&&bb(B,w),A.wsh&&bb(B,R),A.globalstrict&&A.strict!==!1&&(A.strict=!0)}function bb(a,b){var c;for(c in b)ba(b,c)&&(a[c]=b[c])}function ba(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function _(){}"use strict";var a,b={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},c={asi:!0,bitwise:!0,boss:!0,browser:!0,couch:!0,curly:!0,debug:!0,devel:!0,dojo:!0,eqeqeq:!0,eqnull:!0,es5:!0,evil:!0,expr:!0,forin:!0,globalstrict:!0,immed:!0,iterator:!0,jquery:!0,latedef:!0,laxbreak:!0,loopfunc:!0,mootools:!0,newcap:!0,noarg:!0,node:!0,noempty:!0,nonew:!0,nomen:!0,onevar:!0,passfail:!0,plusplus:!0,proto:!0,prototypejs:!0,regexdash:!0,regexp:!0,rhino:!0,undef:!0,scripturl:!0,shadow:!0,strict:!0,sub:!0,supernew:!0,trailing:!0,white:!0,wsh:!0},e={ArrayBuffer:!1,ArrayBufferView:!1,addEventListener:!1,applicationCache:!1,blur:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,DataView:!1,defaultStatus:!1,document:!1,event:!1,FileReader:!1,Float32Array:!1,Float64Array:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,history:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Image:!1,length:!1,localStorage:!1,location:!1,moveBy:!1,moveTo:!1,name:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,print:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,setInterval:!1,setTimeout:!1,status:!1,top:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,WebSocket:!1,window:!1,Worker:!1,XMLHttpRequest:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},f={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1},g={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},h={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},i={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"/":"\\/","\\":"\\\\"},j,k=["closure","exception","global","label","outer","unused","var"],l,m,n,o,p,q,r={$:!1,jQuery:!1},s,t,u,v,w={$:!1,$$:!1,Assets:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,Iframe:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},x,y={__filename:!1,__dirname:!1,exports:!1,Buffer:!1,GLOBAL:!1,global:!1,module:!1,process:!1,require:!1},z,A,B,C,D,E={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},F={defineClass:!1,deserialize:!1,gc:!1,help:!1,load:!1,loadClass:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},G,H,I,J={Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,JSON:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},K={E:!0,LN2:!0,LN10:!0,LOG2E:!0,LOG10E:!0,MAX_VALUE:!0,MIN_VALUE:!0,NEGATIVE_INFINITY:!0,PI:!0,POSITIVE_INFINITY:!0,SQRT1_2:!0,SQRT2:!0},L,M={},N,O,P,Q,R={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0},S,T,U,V,W,X,Y,Z,$;(function(){S=/@cc|<\/?|script|\]\s*\]|<\s*!|</i,T=/[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,U=/^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jshint|jslint|members?|global)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/,V=/[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,W=/[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,X=/\*\/|\/\*/,Y=/^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,Z=/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i,$=/^\s*\/\*\s*falls\sthrough\s*\*\/\s*$/})(),typeof Array.isArray!="function"&&(Array.isArray=function(a){return Object.prototype.toString.apply(a)==="[object Array]"}),typeof Object.create!="function"&&(Object.create=function(a){_.prototype=a;return new _}),typeof Object.keys!="function"&&(Object.keys=function(a){var b=[],c;for(c in a)ba(a,c)&&b.push(c);return b}),typeof String.prototype.entityify!="function"&&(String.prototype.entityify=function(){return this.replace(/&/g,"&").replace(//g,">")}),typeof String.prototype.isAlpha!="function"&&(String.prototype.isAlpha=function(){return this>="a"&&this<="z￿"||this>="A"&&this<="Z￿"}),typeof String.prototype.isDigit!="function"&&(String.prototype.isDigit=function(){return this>="0"&&this<="9"}),typeof String.prototype.supplant!="function"&&(String.prototype.supplant=function(a){return this.replace(/\{([^{}]*)\}/g,function(b,c){var d=a[c];return typeof d=="string"||typeof d=="number"?d:b})}),typeof String.prototype.name!="function"&&(String.prototype.name=function(){return Y.test(this)?this:V.test(this)?'"'+this.replace(W,function(a){var b=i[a];return b?b:"\\u"+("0000"+a.charCodeAt().toString(16)).slice(-4)})+'"':'"'+this+'"'});var bi=function(){function f(d,e){var f,g;d==="(color)"||d==="(range)"?g={type:d}:d==="(punctuator)"||d==="(identifier)"&&ba(M,e)?g=M[e]||M["(error)"]:g=M[d],g=Object.create(g),(d==="(string)"||d==="(range)")&&!A.scripturl&&Z.test(e)&&bf("Script URL.",c,b),d==="(identifier)"&&(g.identifier=!0,e==="__proto__"&&!A.proto?bf("The '{a}' property is deprecated.",c,b,e):e==="__iterator__"&&!A.iterator?bf("'{a}' is only available in JavaScript 1.7.",c,b,e):A.nomen&&(e.charAt(0)==="_"||e.charAt(e.length-1)==="_")&&bf("Unexpected {a} in '{b}'.",c,b,"dangling '_'",e)),g.value=e,g.line=c,g.character=a,g.from=b,f=g.id,f!=="(endline)"&&(C=f&&("(,=:[!&|?{};".indexOf(f.charAt(f.length-1))>=0||f==="return"));return g}function e(){var b,e;if(c>=s.length)return!1;a=1,d=s[c],c+=1,b=d.search(/ \t/),b>=0&&bf("Mixed spaces and tabs.",c,b+1),d=d.replace(/\t/g,N),b=d.search(T),b>=0&&bf("Unsafe character.",c,b),A.maxlen&&A.maxlen=32&&e<=126&&e!==34&&e!==92&&e!==39&&bf("Unnecessary escapement.",c,a),a+=b,h=String.fromCharCode(e)}var h,i,j="";q&&g!=='"'&&bf("Strings must use doublequote.",c,a),i=0;for(;;){while(i>=d.length)i=0,e()||bh("Unclosed string.",c,b);h=d.charAt(i);if(h===g){a+=1,d=d.substr(i+1);return f("(string)",j,g)}if(h<" "){if(h==="\n"||h==="\r")break;bf("Control character in string: {a}.",c,a+i,d.slice(0,i))}else if(h==="\\"){i+=1,a+=1,h=d.charAt(i);switch(h){case"\\":case'"':case"/":break;case"'":q&&bf("Avoid \\'.",c,a);break;case"b":h="\b";break;case"f":h="\f";break;case"n":h="\n";break;case"r":h="\r";break;case"t":h="\t";break;case"u":k(4);break;case"v":q&&bf("Avoid \\v.",c,a),h=" ";break;case"x":q&&bf("Avoid \\x-.",c,a),k(2);break;default:bf("Bad escapement.",c,a)}}j+=h,a+=1,i+=1}}function s(c){var e=c.exec(d),f;if(e){n=e[0].length,f=e[1],h=f.charAt(0),d=d.substr(n),b=a+n-f.length,a+=n;return f}}var g,h,i,j,k,l,m,n,o,p,r;for(;;){if(!d)return f(e()?"(endline)":"(end)","");r=s(U);if(!r){r="",h="";while(d&&d<"!")d=d.substr(1);d&&bh("Unexpected '{a}'.",c,a,d.substr(0,1))}else{if(h.isAlpha()||h==="_"||h==="$")return f("(identifier)",r);if(h.isDigit()){isFinite(Number(r))||bf("Bad number '{a}'.",c,a,r),d.substr(0,1).isAlpha()&&bf("Missing space after '{a}'.",c,a,r),h==="0"&&(j=r.substr(1,1),j.isDigit()?O.id!=="."&&bf("Don't use extra leading zeros '{a}'.",c,a,r):q&&(j==="x"||j==="X")&&bf("Avoid 0x-. '{a}'.",c,a,r)),r.substr(r.length-1)==="."&&bf("A trailing decimal point can be confused with a dot '{a}'.",c,a,r);return f("(number)",r)}switch(r){case'"':case"'":return t(r);case"//":H&&bf("Unexpected comment.",c,a),d="",O.comment=!0;break;case"/*":H&&bf("Unexpected comment.",c,a);for(;;){m=d.search(X);if(m>=0)break;e()||bh("Unclosed comment.",c,a)}a+=m+2,d.substr(m,1)==="/"&&bh("Nested comment.",c,a),d=d.substr(m+2),O.comment=!0;break;case"/*members":case"/*member":case"/*jshint":case"/*jslint":case"/*global":case"*/":return{value:r,type:"special",line:c,character:a,from:b};case"":break;case"/":O.id==="/="&&bh("A regular expression literal can be confused with '/='.",c,b);if(C){k=0,i=0,n=0;for(;;){g=!0,h=d.charAt(n),n+=1;switch(h){case"":bh("Unclosed regular expression.",c,b);return;case"/":k>0&&bf("Unescaped '{a}'.",c,b+n,"/"),h=d.substr(0,n-1),p={g:!0,i:!0,m:!0};while(p[d.charAt(n)]===!0)p[d.charAt(n)]=!1,n+=1;a+=n,d=d.substr(n),p=d.charAt(0),(p==="/"||p==="*")&&bh("Confusing regular expression.",c,b);return f("(regexp)",h);case"\\":h=d.charAt(n),h<" "?bf("Unexpected control character in regular expression.",c,b+n):h==="<"&&bf("Unexpected escaped character '{a}' in regular expression.",c,b+n,h),n+=1;break;case"(":k+=1,g=!1;if(d.charAt(n)==="?"){n+=1;switch(d.charAt(n)){case":":case"=":case"!":n+=1;break;default:bf("Expected '{a}' and instead saw '{b}'.",c,b+n,":",d.charAt(n))}}else i+=1;break;case"|":g=!1;break;case")":k===0?bf("Unescaped '{a}'.",c,b+n,")"):k-=1;break;case" ":p=1;while(d.charAt(n)===" ")n+=1,p+=1;p>1&&bf("Spaces are hard to count. Use {{a}}.",c,b+n,p);break;case"[":h=d.charAt(n),h==="^"&&(n+=1,A.regexp?bf("Insecure '{a}'.",c,b+n,h):d.charAt(n)==="]"&&bh("Unescaped '{a}'.",c,b+n,"^")),p=!1,h==="]"&&(bf("Empty class.",c,b+n-1),p=!0);klass:do{h=d.charAt(n),n+=1;switch(h){case"[":case"^":bf("Unescaped '{a}'.",c,b+n,h),p=!0;break;case"-":p?p=!1:(bf("Unescaped '{a}'.",c,b+n,"-"),p=!0);break;case"]":!p&&!A.regexdash&&bf("Unescaped '{a}'.",c,b+n-1,"-");break klass;case"\\":h=d.charAt(n),h<" "?bf("Unexpected control character in regular expression.",c,b+n):h==="<"&&bf("Unexpected escaped character '{a}' in regular expression.",c,b+n,h),n+=1,p=!0;break;case"/":bf("Unescaped '{a}'.",c,b+n-1,"/"),p=!0;break;case"<":p=!0;break;default:p=!0}}while(h);break;case".":A.regexp&&bf("Insecure '{a}'.",c,b+n,h);break;case"]":case"?":case"{":case"}":case"+":case"*":bf("Unescaped '{a}'.",c,b+n,h)}if(g)switch(d.charAt(n)){case"?":case"+":case"*":n+=1,d.charAt(n)==="?"&&(n+=1);break;case"{":n+=1,h=d.charAt(n),(h<"0"||h>"9")&&bf("Expected a number and instead saw '{a}'.",c,b+n,h),n+=1,o=+h;for(;;){h=d.charAt(n);if(h<"0"||h>"9")break;n+=1,o=+h+o*10}l=o;if(h===","){n+=1,l=Infinity,h=d.charAt(n);if(h>="0"&&h<="9"){n+=1,l=+h;for(;;){h=d.charAt(n);if(h<"0"||h>"9")break;n+=1,l=+h+l*10}}}d.charAt(n)!=="}"?bf("Expected '{a}' and instead saw '{b}'.",c,b+n,"}",h):n+=1,d.charAt(n)==="?"&&(n+=1),o>l&&bf("'{a}' should not be greater than '{b}'.",c,b+n,o,l)}}h=d.substr(0,n-1),a+=n,d=d.substr(n);return f("(regexp)",h)}return f("(punctuator)",r);case"#":return f("(punctuator)",r);default:return f("(punctuator)",r)}}}}}}();bC("(number)",function(){return this}),bC("(string)",function(){return this}),M["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var b=this.value,c=G[b],d;typeof c=="function"?c=undefined:typeof c=="boolean"&&(d=j,j=l[0],bj(b,"var"),c=j,j=d);if(j===c)switch(j[b]){case"unused":j[b]="var";break;case"unction":j[b]="function",this["function"]=!0;break;case"function":this["function"]=!0;break;case"label":be("'{a}' is a statement label.",O,b)}else if(j["(global)"])a!="typeof"&&a!="delete"&&A.undef&&typeof B[b]!="boolean"&&be("'{a}' is not defined.",O,b),bU(O);else switch(j[b]){case"closure":case"function":case"var":case"unused":be("'{a}' used out of scope.",O,b);break;case"label":be("'{a}' is a statement label.",O,b);break;case"outer":case"global":break;default:if(c===!0)j[b]=!0;else if(c===null)be("'{a}' is not allowed.",O,b),bU(O);else if(typeof c!="object")a!="typeof"&&a!="delete"&&A.undef?be("'{a}' is not defined.",O,b):j[b]=!0,bU(O);else switch(c[b]){case"function":case"unction":this["function"]=!0,c[b]="closure",j[b]=c["(global)"]?"global":"outer";break;case"var":case"unused":c[b]="closure",j[b]=c["(global)"]?"global":"outer";break;case"closure":case"parameter":j[b]=c["(global)"]?"global":"outer";break;case"label":be("'{a}' is a statement label.",O,b)}}return this},led:function(){bg("Expected an operator and instead saw '{a}'.",x,x.value)}},bC("(regexp)",function(){return this}),bx("(endline)"),bx("(begin)"),bx("(end)").reach=!0,bx(""),bx("(error)").reach=!0,bx("}").reach=!0,bx(")"),bx("]"),bx('"').reach=!0,bx("'").reach=!0,bx(";"),bx(":").reach=!0,bx(","),bx("#"),bx("@"),bD("else"),bD("case").reach=!0,bD("catch"),bD("default").reach=!0,bD("finally"),bE("arguments",function(a){L&&j["(global)"]&&be("Strict violation.",a)}),bE("eval"),bE("false"),bE("Infinity"),bE("NaN"),bE("null"),bE("this",function(a){L&&(j["(statement)"]&&j["(name)"].charAt(0)>"Z"||j["(global)"])&&be("Strict violation.",a)}),bE("true"),bE("undefined"),bI("=","assign",20),bI("+=","assignadd",20),bI("-=","assignsub",20),bI("*=","assignmult",20),bI("/=","assigndiv",20).nud=function(){bg("A regular expression literal can be confused with '/='.")},bI("%=","assignmod",20),bK("&=","assignbitand",20),bK("|=","assignbitor",20),bK("^=","assignbitxor",20),bK("<<=","assignshiftleft",20),bK(">>=","assignshiftright",20),bK(">>>=","assignshiftrightunsigned",20),bF("?",function(a,b){b.left=a,b.right=bn(10),bm(":"),b["else"]=bn(10);return b},30),bF("||","or",40),bF("&&","and",50),bJ("|","bitor",70),bJ("^","bitxor",80),bJ("&","bitand",90),bG("==",function(a,b){var c=A.eqnull&&(a.value=="null"||b.value=="null");!c&&A.eqeqeq?be("Expected '{a}' and instead saw '{b}'.",this,"===","=="):bH(a)?be("Use '{a}' to compare with '{b}'.",this,"===",a.value):bH(b)&&be("Use '{a}' to compare with '{b}'.",this,"===",b.value);return this}),bG("==="),bG("!=",function(a,b){var c=A.eqnull&&(a.value=="null"||b.value=="null");!c&&A.eqeqeq?be("Expected '{a}' and instead saw '{b}'.",this,"!==","!="):bH(a)?be("Use '{a}' to compare with '{b}'.",this,"!==",a.value):bH(b)&&be("Use '{a}' to compare with '{b}'.",this,"!==",b.value);return this}),bG("!=="),bG("<"),bG(">"),bG("<="),bG(">="),bJ("<<","shiftleft",120),bJ(">>","shiftright",120),bJ(">>>","shiftrightunsigned",120),bF("in","in",120),bF("instanceof","instanceof",120),bF("+",function(a,b){var c=bn(130);if(a&&c&&a.id==="(string)"&&c.id==="(string)"){a.value+=c.value,a.character=c.character,!A.scripturl&&Z.test(a.value)&&be("JavaScript URL.",a);return a}b.left=a,b.right=c;return b},130),bB("+","num"),bB("+++",function(){be("Confusing pluses."),this.right=bn(150),this.arity="unary";return this}),bF("+++",function(a){be("Confusing pluses."),this.left=a,this.right=bn(130);return this},130),bF("-","sub",130),bB("-","neg"),bB("---",function(){be("Confusing minuses."),this.right=bn(150),this.arity="unary";return this}),bF("---",function(a){be("Confusing minuses."),this.left=a,this.right=bn(130);return this},130),bF("*","mult",140),bF("/","div",140),bF("%","mod",140),bL("++","postinc"),bB("++","preinc"),M["++"].exps=!0,bL("--","postdec"),bB("--","predec"),M["--"].exps=!0,bB("delete",function(){var a=bn(0);(!a||a.id!=="."&&a.id!=="[")&&be("Variables should not be deleted."),this.first=a;return this}).exps=!0,bB("~",function(){A.bitwise&&be("Unexpected '{a}'.",this,"~"),bn(150);return this}),bB("!",function(){this.right=bn(150),this.arity="unary",b[this.right.id]===!0&&be("Confusing use of '{a}'.",this,"!");return this}),bB("typeof","typeof"),bB("new",function(){var a=bn(155),b;if(a&&a.id!=="function")if(a.identifier){a["new"]=!0;switch(a.value){case"Object":be("Use the object literal notation {}.",O);break;case"Number":case"String":case"Boolean":case"Math":case"JSON":be("Do not use {a} as a constructor.",O,a.value);break;case"Function":A.evil||be("The Function constructor is eval.");break;case"Date":case"RegExp":break;default:a.id!=="function"&&(b=a.value.substr(0,1),A.newcap&&(b<"A"||b>"Z")&&be("A constructor name should start with an uppercase letter.",O))}}else a.id!=="."&&a.id!=="["&&a.id!=="("&&be("Bad constructor.",O);else A.supernew||be("Weird construction. Delete 'new'.",this);bo(O,x),x.id!=="("&&!A.supernew&&be("Missing '()' invoking a constructor."),this.first=a;return this}),M["new"].exps=!0,bB("void").exps=!0,bF(".",function(a,b){bo(D,O),bp();var c=bN();typeof c=="string"&&bT(c),b.left=a,b.right=c,A.noarg&&a&&a.value==="arguments"&&(c==="callee"||c==="caller")?be("Avoid arguments.{a}.",a,c):!A.evil&&a&&a.value==="document"&&(c==="write"||c==="writeln")&&be("document.write can be a form of eval.",a),!A.evil&&(c==="eval"||c==="execScript")&&be("eval is evil.");return b},160,!0),bF("(",function(a,b){D.id!=="}"&&D.id!==")"&&bp(D,O),bq(),A.immed&&!a.immed&&a.id==="function"&&be("Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.");var c=0,d=[];a&&a.type==="(identifier)"&&a.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&a.value!=="Number"&&a.value!=="String"&&a.value!=="Boolean"&&a.value!=="Date"&&(a.value==="Math"?be("Math is not a function.",a):A.newcap&&be("Missing 'new' prefix when invoking a constructor.",a));if(x.id!==")")for(;;){d[d.length]=bn(10),c+=1;if(x.id!==",")break;bv()}bm(")"),bq(D,O),typeof a=="object"&&(a.value==="parseInt"&&c===1&&be("Missing radix parameter.",a),A.evil||(a.value==="eval"||a.value==="Function"||a.value==="execScript"?be("eval is evil.",a):d[0]&&d[0].id==="(string)"&&(a.value==="setTimeout"||a.value==="setInterval")&&be("Implied eval is evil. Pass a function instead of a string.",a)),!a.identifier&&a.id!=="."&&a.id!=="["&&a.id!=="("&&a.id!=="&&"&&a.id!=="||"&&a.id!=="?"&&be("Bad invocation.",a)),b.left=a;return b},155,!0).exps=!0,bB("(",function(){bq(),x.id==="function"&&(x.immed=!0);var a=bn(0);bm(")",this),bq(D,O),A.immed&&a.id==="function"&&(x.id==="("?be("Move the invocation into the parens that contain the function.",x):be("Do not wrap function literals in parens unless they are to be immediately invoked.",this));return a}),bF("[",function(a,b){bp(D,O),bq();var c=bn(0),d;c&&c.type==="(string)"&&(!A.evil&&(c.value==="eval"||c.value==="execScript")&&be("eval is evil.",b),bT(c.value),!A.sub&&Y.test(c.value)&&(d=M[c.value],(!d||!d.reserved)&&be("['{a}'] is better written in dot notation.",c,c.value))),bm("]",b),bq(D,O),b.left=a,b.right=c;return b},160,!0),bB("[",function(){var a=O.line!==x.line;this.first=[],a&&(p+=A.indent,x.from===p+A.indent&&(p+=A.indent));while(x.id!=="(end)"){while(x.id===",")be("Extra comma."),bm(",");if(x.id==="]")break;a&&O.line!==x.line&&bt(),this.first.push(bn(10));if(x.id!==",")break;bv();if(x.id==="]"&&!A.es5){be("Extra comma.",O);break}}a&&(p-=A.indent,bt()),bm("]",this);return this},160),function(a){a.nud=function(){var a,b,c,d,e,f={},g;a=O.line!==x.line,a&&(p+=A.indent,x.from===p+A.indent&&(p+=A.indent));for(;;){if(x.id==="}")break;a&&bt();if(x.value==="get"&&bl().id!==":")bm("get"),A.es5||bg("get/set are ES5 features."),c=bV(),c||bg("Missing property name."),g=x,bo(O,x),b=bX(),!A.loopfunc&&j["(loopage)"]&&be("Don't make functions within a loop.",g),e=b["(params)"],e&&be("Unexpected parameter '{a}' in get {b} function.",g,e[0],c),bo(O,x),bm(","),bt(),bm("set"),d=bV(),c!==d&&bg("Expected {a} and instead saw {b}.",O,c,d),g=x,bo(O,x),b=bX(),e=b["(params)"],(!e||e.length!==1||e[0]!=="value")&&be("Expected (value) in set {a} function.",g,c);else{c=bV();if(typeof c!="string")break;bm(":"),br(O,x),bn(10)}f[c]===!0&&be("Duplicate member '{a}'.",x,c),f[c]=!0,bT(c);if(x.id===",")bv(),x.id===","?be("Extra comma.",O):x.id==="}"&&!A.es5&&be("Extra comma.",O);else break}a&&(p-=A.indent,bt()),bm("}",this);return this},a.fud=function(){bg("Expected to see a statement and instead saw a block.",O)}}(bx("{"));var bY=by("var",function(a){var b,c,d;j["(onevar)"]&&A.onevar?be("Too many var statements."):j["(global)"]||(j["(onevar)"]=!0),this.first=[];for(;;){br(O,x),b=bN(),j["(global)"]&&B[b]===!1&&be("Redefinition of '{a}'.",O,b),bj(b,"unused");if(a)break;c=O,this.first.push(O),x.id==="="&&(br(O,x),bm("="),br(O,x),x.id==="undefined"&&be("It is not necessary to initialize '{a}' to 'undefined'.",O,b),bl(0).id==="="&&x.identifier&&bg("Variable {a} was not declared correctly.",x,x.value),d=bn(0),c.first=d);if(x.id!==",")break;bv()}return this});bY.exps=!0,bz("function",function(){o&&be("Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.",O);var a=bN();bo(O,x),bj(a,"unction"),bX(a,!0),x.id==="("&&x.line===O.line&&bg("Function declarations are not invocable. Wrap the whole function invocation in parens.");return this}),bB("function",function(){var a=bM();a?bo(O,x):br(O,x),bX(a),!A.loopfunc&&j["(loopage)"]&&be("Don't make functions within a loop.");return this}),bz("if",function(){var a=x;bm("("),br(this,a),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),bS(!0,!0),x.id==="else"&&(br(O,x),bm("else"),x.id==="if"||x.id==="switch"?bP(!0):bS(!0,!0));return this}),bz("try",function(){var a,b,c;bS(!1),x.id==="catch"&&(bm("catch"),br(O,x),bm("("),c=G,G=Object.create(c),b=x.value,x.type!=="(identifier)"?be("Expected an identifier and instead saw '{a}'.",x,b):bj(b,"exception"),bm(),bm(")"),bS(!1),a=!0,G=c);if(x.id==="finally")bm("finally"),bS(!1);else{a||bg("Expected '{a}' and instead saw '{b}'.",x,"catch",x.value);return this}}),bz("while",function(){var a=x;j["(breakage)"]+=1,j["(loopage)"]+=1,bm("("),br(this,a),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),bS(!0,!0),j["(breakage)"]-=1,j["(loopage)"]-=1;return this}).labelled=!0,bD("with"),bz("switch",function(){var a=x,b=!1;j["(breakage)"]+=1,bm("("),br(this,a),bq(),this.condition=bn(20),bm(")",a),bq(D,O),br(O,x),a=x,bm("{"),br(O,x),p+=A.indent,this.cases=[];for(;;)switch(x.id){case"case":switch(j["(verb)"]){case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:$.test(s[x.line-2])||be("Expected a 'break' statement before 'case'.",O)}bt(-A.indent),bm("case"),this.cases.push(bn(20)),b=!0,bm(":"),j["(verb)"]="case";break;case"default":switch(j["(verb)"]){case"break":case"continue":case"return":case"throw":break;default:$.test(s[x.line-2])||be("Expected a 'break' statement before 'default'.",O)}bt(-A.indent),bm("default"),b=!0,bm(":");break;case"}":p-=A.indent,bt(),bm("}",a),(this.cases.length===1||this.condition.id==="true"||this.condition.id==="false")&&be("This 'switch' should be an 'if'.",this),j["(breakage)"]-=1,j["(verb)"]=undefined;return;case"(end)":bg("Missing '{a}'.",x,"}");return;default:if(b)switch(O.id){case",":bg("Each value should have its own case label.");return;case":":bR();break;default:bg("Missing ':' on a case clause.",O)}else bg("Expected '{a}' and instead saw '{b}'.",x,"case",x.value)}}).labelled=!0,by("debugger",function(){A.debug||be("All 'debugger' statements should be removed.");return this}).exps=!0,function(){var a=by("do",function(){j["(breakage)"]+=1,j["(loopage)"]+=1,this.first=bS(!0),bm("while");var a=x;br(O,a),bm("("),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),j["(breakage)"]-=1,j["(loopage)"]-=1;return this});a.labelled=!0,a.exps=!0}(),bz("for",function(){var a,b=x;j["(breakage)"]+=1,j["(loopage)"]+=1,bm("("),br(this,b),bq();if(bl(x.id==="var"?1:0).id==="in"){if(x.id==="var")bm("var"),bY.fud.call(bY,!0);else{switch(j[x.value]){case"unused":j[x.value]="var";break;case"var":break;default:be("Bad for in variable '{a}'.",x,x.value)}bm()}bm("in"),bn(20),bm(")",b),a=bS(!0,!0),A.forin&&(a.length>1||typeof a[0]!="object"||a[0].value!=="if")&&be("The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.",this),j["(breakage)"]-=1,j["(loopage)"]-=1;return this}if(x.id!==";")if(x.id==="var")bm("var"),bY.fud.call(bY);else for(;;){bn(0,"for");if(x.id!==",")break;bv()}bu(O),bm(";"),x.id!==";"&&(bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20))),bu(O),bm(";"),x.id===";"&&bg("Expected '{a}' and instead saw '{b}'.",x,")",";");if(x.id!==")")for(;;){bn(0,"for");if(x.id!==",")break;bv()}bm(")",b),bq(D,O),bS(!0,!0),j["(breakage)"]-=1,j["(loopage)"]-=1;return this}).labelled=!0,by("break",function(){var a=x.value;j["(breakage)"]===0&&be("Unexpected '{a}'.",x,this.value),bu(this),x.id!==";"&&O.line===x.line&&(j[a]!=="label"?be("'{a}' is not a statement label.",x,a):G[a]!==j&&be("'{a}' is out of scope.",x,a),this.first=x,bm()),bO("break");return this}).exps=!0,by("continue",function(){var a=x.value;j["(breakage)"]===0&&be("Unexpected '{a}'.",x,this.value),bu(this),x.id!==";"?O.line===x.line&&(j[a]!=="label"?be("'{a}' is not a statement label.",x,a):G[a]!==j&&be("'{a}' is out of scope.",x,a),this.first=x,bm()):j["(loopage)"]||be("Unexpected '{a}'.",x,this.value),bO("continue");return this}).exps=!0,by("return",function(){bu(this),x.id==="(regexp)"&&be("Wrap the /regexp/ literal in parens to disambiguate the slash operator."),x.id!==";"&&!x.reach&&(br(O,x),this.first=bn(20)),bO("return");return this}).exps=!0,by("throw",function(){bu(this),br(O,x),this.first=bn(20),bO("throw");return this}).exps=!0,bD("class"),bD("const"),bD("enum"),bD("export"),bD("extends"),bD("import"),bD("super"),bD("let"),bD("yield"),bD("implements"),bD("interface"),bD("package"),bD("private"),bD("protected"),bD("public"),bD("static");var b$=function(a,b,c){var e,f,g;d.errors=[],B=Object.create(J),bb(B,c||{});if(b){e=b.predef;if(e)if(Array.isArray(e))for(f=0;f0&&(a.implieds=d),P.length>0&&(a.urls=P),c=Object.keys(G),c.length>0&&(a.globals=c);for(f=1;f0&&(a.unused=j),h=[];for(i in u)if(typeof u[i]=="number"){a.member=u;break}return a},b$.report=function(a){function o(a,b){var c,d,e;if(b){m.push("
    "+a+" "),b=b.sort();for(d=0;d")}}var b=b$.data(),c=[],d,e,f,g,h,i,j,k="",l,m=[],n;if(b.errors||b.implieds||b.unused){f=!0,m.push("
    Error:");if(b.errors)for(h=0;hProblem"+(isFinite(d.line)?" at line "+d.line+" character "+d.character:"")+": "+d.reason.entityify()+"

    "+(e&&(e.length>80?e.slice(0,77)+"...":e).entityify())+"

    "));if(b.implieds){n=[];for(h=0;h"+b.implieds[h].name+" "+b.implieds[h].line+"";m.push("

    Implied global: "+n.join(", ")+"

    ")}if(b.unused){n=[];for(h=0;h"+b.unused[h].name+" "+b.unused[h].line+" "+b.unused[h]["function"]+"";m.push("

    Unused variable: "+n.join(", ")+"

    ")}b.json&&m.push("

    JSON: bad.

    "),m.push("
    ")}if(!a){m.push("
    "),b.urls&&o("URLs
    ",b.urls,"
    "),b.json&&!f?m.push("

    JSON: good.

    "):b.globals?m.push("
    Global "+b.globals.sort().join(", ")+"
    "):m.push("
    No new global variables introduced.
    ");for(h=0;h
    "+g.line+"-"+g.last+" "+(g.name||"")+"("+(g.param?g.param.join(", "):"")+")
    "),o("Unused",g.unused),o("Closure",g.closure),o("Variable",g["var"]),o("Exception",g.exception),o("Outer",g.outer),o("Global",g.global),o("Label",g.label);if(b.member){c=Object.keys(b.member);if(c.length){c=c.sort(),k="
    /*members ",j=10;for(h=0;h72&&(m.push(k+"
    "),k=" ",j=1),j+=l.length+2,b.member[i]===1&&(l=""+l+""),h*/
    ")}m.push("
    ")}}return m.join("")},b$.jshint=b$,b$.edition="2011-04-16";return b$}();typeof b=="object"&&b&&(b.JSHINT=d)}),define("ace/narcissus/jsparse",["require","exports","module","ace/narcissus/jslex","ace/narcissus/jsdefs"],function(require,exports,module){function parseStdin(a,b){for(;;)try{var c=new lexer.Tokenizer(a,"stdin",b.value),d=Script(c,!1);b.value=c.lineno;return d}catch(e){if(!c.unexpectedEOF)throw e;var f=readline();if(!f)throw e;a+="\n"+f}}function parse(a,b,c){var d=new lexer.Tokenizer(a,b,c),e=Script(d,!1);if(!d.done)throw d.newSyntaxError("Syntax error");return e}function PrimaryExpression(a,b){var c,d,e=a.get(!0);switch(e){case FUNCTION:c=FunctionDefinition(a,b,!1,EXPRESSED_FORM);break;case LEFT_BRACKET:c=new Node(a,{type:ARRAY_INIT});while((e=a.peek(!0))!==RIGHT_BRACKET){if(e===COMMA){a.get(),c.push(null);continue}c.push(AssignExpression(a,b));if(e!==COMMA&&!a.match(COMMA))break}c.children.length===1&&a.match(FOR)&&(d=new Node(a,{type:ARRAY_COMP,expression:c.children[0],tail:ComprehensionTail(a,b)}),c=d),a.mustMatch(RIGHT_BRACKET);break;case LEFT_CURLY:var f,g;c=new Node(a,{type:OBJECT_INIT});object_init:if(!a.match(RIGHT_CURLY)){do{e=a.get();if(a.token.value!=="get"&&a.token.value!=="set"||a.peek()!==IDENTIFIER){switch(e){case IDENTIFIER:case NUMBER:case STRING:f=new Node(a,{type:IDENTIFIER});break;case RIGHT_CURLY:if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal trailing ,");break object_init;default:if(a.token.value in definitions.keywords){f=new Node(a,{type:IDENTIFIER});break}throw a.newSyntaxError("Invalid property name")}if(a.match(COLON))d=new Node(a,{type:PROPERTY_INIT}),d.push(f),d.push(AssignExpression(a,b)),c.push(d);else{if(a.peek()!==COMMA&&a.peek()!==RIGHT_CURLY)throw a.newSyntaxError("missing : after property");c.push(f)}}else{if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal property accessor");c.push(FunctionDefinition(a,b,!0,EXPRESSED_FORM))}}while(a.match(COMMA));a.mustMatch(RIGHT_CURLY)}break;case LEFT_PAREN:c=ParenExpression(a,b),a.mustMatch(RIGHT_PAREN),c.parenthesized=!0;break;case LET:c=LetBlock(a,b,!1);break;case NULL:case THIS:case TRUE:case FALSE:case IDENTIFIER:case NUMBER:case STRING:case REGEXP:c=new Node(a);break;default:throw a.newSyntaxError("missing operand")}return c}function ArgumentList(a,b){var c,d;c=new Node(a,{type:LIST});if(a.match(RIGHT_PAREN,!0))return c;do{d=AssignExpression(a,b);if(d.type===YIELD&&!d.parenthesized&&a.peek()===COMMA)throw a.newSyntaxError("Yield expression must be parenthesized");if(a.match(FOR)){d=GeneratorExpression(a,b,d);if(c.children.length>1||a.peek(!0)===COMMA)throw a.newSyntaxError("Generator expression must be parenthesized")}c.push(d)}while(a.match(COMMA));a.mustMatch(RIGHT_PAREN);return c}function MemberExpression(a,b,c){var d,e,f,g;a.match(NEW)?(d=new Node(a),d.push(MemberExpression(a,b,!1)),a.match(LEFT_PAREN)&&(d.type=NEW_WITH_ARGS,d.push(ArgumentList(a,b)))):d=PrimaryExpression(a,b);while((g=a.get())!==END){switch(g){case DOT:e=new Node(a),e.push(d),a.mustMatch(IDENTIFIER),e.push(new Node(a));break;case LEFT_BRACKET:e=new Node(a,{type:INDEX}),e.push(d),e.push(Expression(a,b)),a.mustMatch(RIGHT_BRACKET);break;case LEFT_PAREN:if(c){e=new Node(a,{type:CALL}),e.push(d),e.push(ArgumentList(a,b));break};default:a.unget();return d}d=e}return d}function UnaryExpression(a,b){var c,d,e;switch(e=a.get(!0)){case DELETE:case VOID:case TYPEOF:case NOT:case BITWISE_NOT:case PLUS:case MINUS:e===PLUS?c=new Node(a,{type:UNARY_PLUS}):e===MINUS?c=new Node(a,{type:UNARY_MINUS}):c=new Node(a),c.push(UnaryExpression(a,b));break;case INCREMENT:case DECREMENT:c=new Node(a),c.push(MemberExpression(a,b,!0));break;default:a.unget(),c=MemberExpression(a,b,!0),a.tokens[a.tokenIndex+a.lookahead-1&3].lineno===a.lineno&&(a.match(INCREMENT)||a.match(DECREMENT))&&(d=new Node(a,{postfix:!0}),d.push(c),c=d)}return c}function MultiplyExpression(a,b){var c,d;c=UnaryExpression(a,b);while(a.match(MUL)||a.match(DIV)||a.match(MOD))d=new Node(a),d.push(c),d.push(UnaryExpression(a,b)),c=d;return c}function AddExpression(a,b){var c,d;c=MultiplyExpression(a,b);while(a.match(PLUS)||a.match(MINUS))d=new Node(a),d.push(c),d.push(MultiplyExpression(a,b)),c=d;return c}function ShiftExpression(a,b){var c,d;c=AddExpression(a,b);while(a.match(LSH)||a.match(RSH)||a.match(URSH))d=new Node(a),d.push(c),d.push(AddExpression(a,b)),c=d;return c}function RelationalExpression(a,b){var c,d,e=b.update({inForLoopInit:!1});c=ShiftExpression(a,e);while(a.match(LT)||a.match(LE)||a.match(GE)||a.match(GT)||!b.inForLoopInit&&a.match(IN)||a.match(INSTANCEOF))d=new Node(a),d.push(c),d.push(ShiftExpression(a,e)),c=d;return c}function EqualityExpression(a,b){var c,d;c=RelationalExpression(a,b);while(a.match(EQ)||a.match(NE)||a.match(STRICT_EQ)||a.match(STRICT_NE))d=new Node(a),d.push(c),d.push(RelationalExpression(a,b)),c=d;return c}function BitwiseAndExpression(a,b){var c,d;c=EqualityExpression(a,b);while(a.match(BITWISE_AND))d=new Node(a),d.push(c),d.push(EqualityExpression(a,b)),c=d;return c}function BitwiseXorExpression(a,b){var c,d;c=BitwiseAndExpression(a,b);while(a.match(BITWISE_XOR))d=new Node(a),d.push(c),d.push(BitwiseAndExpression(a,b)),c=d;return c}function BitwiseOrExpression(a,b){var c,d;c=BitwiseXorExpression(a,b);while(a.match(BITWISE_OR))d=new Node(a),d.push(c),d.push(BitwiseXorExpression(a,b)),c=d;return c}function AndExpression(a,b){var c,d;c=BitwiseOrExpression(a,b);while(a.match(AND))d=new Node(a),d.push(c),d.push(BitwiseOrExpression(a,b)),c=d;return c}function OrExpression(a,b){var c,d;c=AndExpression(a,b);while(a.match(OR))d=new Node(a),d.push(c),d.push(AndExpression(a,b)),c=d;return c}function ConditionalExpression(a,b){var c,d;c=OrExpression(a,b);if(a.match(HOOK)){d=c,c=new Node(a,{type:HOOK}),c.push(d),c.push(AssignExpression(a,b.update({inForLoopInit:!1})));if(!a.match(COLON))throw a.newSyntaxError("missing : after ?");c.push(AssignExpression(a,b))}return c}function AssignExpression(a,b){var c,d;if(a.match(YIELD,!0))return ReturnOrYield(a,b);c=new Node(a,{type:ASSIGN}),d=ConditionalExpression(a,b);if(!a.match(ASSIGN))return d;switch(d.type){case OBJECT_INIT:case ARRAY_INIT:d.destructuredNames=checkDestructuring(a,b,d);case IDENTIFIER:case DOT:case INDEX:case CALL:break;default:throw a.newSyntaxError("Bad left-hand side of assignment")}c.assignOp=a.token.assignOp,c.push(d),c.push(AssignExpression(a,b));return c}function Expression(a,b){var c,d;c=AssignExpression(a,b);if(a.match(COMMA)){d=new Node(a,{type:COMMA}),d.push(c),c=d;do{d=c.children[c.children.length-1];if(d.type===YIELD&&!d.parenthesized)throw a.newSyntaxError("Yield expression must be parenthesized");c.push(AssignExpression(a,b))}while(a.match(COMMA))}return c}function ParenExpression(a,b){var c=Expression(a,b.update({inForLoopInit:b.inForLoopInit&&a.token.type===LEFT_PAREN}));if(a.match(FOR)){if(c.type===YIELD&&!c.parenthesized)throw a.newSyntaxError("Yield expression must be parenthesized");if(c.type===COMMA&&!c.parenthesized)throw a.newSyntaxError("Generator expression must be parenthesized");c=GeneratorExpression(a,b,c)}return c}function HeadExpression(a,b){var c=MaybeLeftParen(a,b),d=ParenExpression(a,b);MaybeRightParen(a,c);if(c===END&&!d.parenthesized){var e=a.peek();if(e!==LEFT_CURLY&&!definitions.isStatementStartCode[e])throw a.newSyntaxError("Unparenthesized head followed by unbraced body")}return d}function ComprehensionTail(a,b){var c,d,e,f,g;c=new Node(a,{type:COMP_TAIL});do{d=new Node(a,{type:FOR_IN,isLoop:!0}),a.match(IDENTIFIER)&&(a.token.value==="each"?d.isEach=!0:a.unget()),g=MaybeLeftParen(a,b);switch(a.get()){case LEFT_BRACKET:case LEFT_CURLY:a.unget(),d.iterator=DestructuringExpression(a,b);break;case IDENTIFIER:d.iterator=f=new Node(a,{type:IDENTIFIER}),f.name=f.value,d.varDecl=e=new Node(a,{type:VAR}),e.push(f),b.parentScript.varDecls.push(f);break;default:throw a.newSyntaxError("missing identifier")}a.mustMatch(IN),d.object=Expression(a,b),MaybeRightParen(a,g),c.push(d)}while(a.match(FOR));a.match(IF)&&(c.guard=HeadExpression(a,b));return c}function GeneratorExpression(a,b,c){return new Node(a,{type:GENERATOR,expression:c,tail:ComprehensionTail(a,b)})}function DestructuringExpression(a,b,c){var d=PrimaryExpression(a,b);d.destructuredNames=checkDestructuring(a,b,d,c);return d}function checkDestructuring(a,b,c,d){if(c.type===ARRAY_COMP)throw a.newSyntaxError("Invalid array comprehension left-hand side");if(c.type===ARRAY_INIT||c.type===OBJECT_INIT){var e={},f,g,h,i,j,k=c.children;for(var l=0,m=k.length;l=0)throw a.newSyntaxError("More than one switch default");case CASE:f=new Node(a),j===DEFAULT?e.defaultIndex=e.cases.length:f.caseLabel=Expression(a,l,COLON);break;default:throw a.newSyntaxError("Invalid switch case")}a.mustMatch(COLON),f.statements=new Node(a,blockInit());while((j=a.peek(!0))!==CASE&&j!==DEFAULT&&j!==RIGHT_CURLY)f.statements.push(Statement(a,l));e.cases.push(f)}return e;case FOR:e=new Node(a,LOOP_INIT),a.match(IDENTIFIER)&&(a.token.value==="each"?e.isEach=!0:a.unget()),b.parenFreeMode||a.mustMatch(LEFT_PAREN),l=b.pushTarget(e).nest(NESTING_DEEP),m=b.update({inForLoopInit:!0}),(j=a.peek())!==SEMICOLON&&(j===VAR||j===CONST?(a.get(),f=Variables(a,m)):j===LET?(a.get(),a.peek()===LEFT_PAREN?f=LetBlock(a,m,!1):(m.parentBlock=e,e.varDecls=[],f=Variables(a,m))):f=Expression(a,m));if(f&&a.match(IN)){e.type=FOR_IN,e.object=Expression(a,m);if(f.type===VAR||f.type===LET){h=f.children;if(h.length!==1&&f.destructurings.length!==1)throw new SyntaxError("Invalid for..in left-hand side",a.filename,f.lineno);f.destructurings.length>0?e.iterator=f.destructurings[0]:e.iterator=h[0],e.varDecl=f}else{if(f.type===ARRAY_INIT||f.type===OBJECT_INIT)f.destructuredNames=checkDestructuring(a,m,f);e.iterator=f}}else{e.setup=f,a.mustMatch(SEMICOLON);if(e.isEach)throw a.newSyntaxError("Invalid for each..in loop");e.condition=a.peek()===SEMICOLON?null:Expression(a,m),a.mustMatch(SEMICOLON),k=a.peek(),e.update=(b.parenFreeMode?k===LEFT_CURLY||definitions.isStatementStartCode[k]:k===RIGHT_PAREN)?null:Expression(a,m)}b.parenFreeMode||a.mustMatch(RIGHT_PAREN),e.body=Statement(a,l);return e;case WHILE:e=new Node(a,{isLoop:!0}),e.condition=HeadExpression(a,b),e.body=Statement(a,b.pushTarget(e).nest(NESTING_DEEP));return e;case DO:e=new Node(a,{isLoop:!0}),e.body=Statement(a,b.pushTarget(e).nest(NESTING_DEEP)),a.mustMatch(WHILE),e.condition=HeadExpression(a,b);if(!b.ecmaStrictMode){a.match(SEMICOLON);return e}break;case BREAK:case CONTINUE:e=new Node(a),l=b.pushTarget(e),a.peekOnSameLine()===IDENTIFIER&&(a.get(),e.label=a.token.value),e.target=e.label?l.labeledTargets.find(function(a){return a.labels.has(e.label)}):l.defaultTarget;if(!e.target)throw a.newSyntaxError("Invalid "+(j===BREAK?"break":"continue"));if(!e.target.isLoop&&j===CONTINUE)throw a.newSyntaxError("Invalid continue");break;case TRY:e=new Node(a,{catchClauses:[]}),e.tryBlock=Block(a,b);while(a.match(CATCH)){f=new Node(a),g=MaybeLeftParen(a,b);switch(a.get()){case LEFT_BRACKET:case LEFT_CURLY:a.unget(),f.varName=DestructuringExpression(a,b,!0);break;case IDENTIFIER:f.varName=a.token.value;break;default:throw a.newSyntaxError("missing identifier in catch")}if(a.match(IF)){if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal catch guard");if(e.catchClauses.length&&!e.catchClauses.top().guard)throw a.newSyntaxError("Guarded catch after unguarded");f.guard=Expression(a,b)}MaybeRightParen(a,g),f.block=Block(a,b),e.catchClauses.push(f)}a.match(FINALLY)&&(e.finallyBlock=Block(a,b));if(!e.catchClauses.length&&!e.finallyBlock)throw a.newSyntaxError("Invalid try statement");return e;case CATCH:case FINALLY:throw a.newSyntaxError(definitions.tokens[j]+" without preceding try");case THROW:e=new Node(a),e.exception=Expression(a,b);break;case RETURN:e=ReturnOrYield(a,b);break;case WITH:e=new Node(a),e.object=HeadExpression(a,b),e.body=Statement(a,b.pushTarget(e).nest(NESTING_DEEP));return e;case VAR:case CONST:e=Variables(a,b);break;case LET:a.peek()===LEFT_PAREN?e=LetBlock(a,b,!0):e=Variables(a,b);break;case DEBUGGER:e=new Node(a);break;case NEWLINE:case SEMICOLON:e=new Node(a,{type:SEMICOLON}),e.expression=null;return e;default:if(j===IDENTIFIER){j=a.peek();if(j===COLON){d=a.token.value;if(b.allLabels.has(d))throw a.newSyntaxError("Duplicate label");a.get(),e=new Node(a,{type:LABEL,label:d}),e.statement=Statement(a,b.pushLabel(d).nest(NESTING_SHALLOW)),e.target=e.statement.type===LABEL?e.statement.target:e.statement;return e}}e=new Node(a,{type:SEMICOLON}),a.unget(),e.expression=Expression(a,b),e.end=e.expression.end}MagicalSemicolon(a);return e}function Block(a,b){a.mustMatch(LEFT_CURLY);var c=new Node(a,blockInit());Statements(a,b.update({parentBlock:c}).pushTarget(c),c),a.mustMatch(RIGHT_CURLY);return c}function Statements(a,b,c){try{while(!a.done&&a.peek(!0)!==RIGHT_CURLY)c.push(Statement(a,b))}catch(d){a.done&&(a.unexpectedEOF=!0);throw d}}function MaybeRightParen(a,b){b===LEFT_PAREN&&a.mustMatch(RIGHT_PAREN)}function MaybeLeftParen(a,b){return b.parenFreeMode?a.match(LEFT_PAREN)?LEFT_PAREN:END:a.mustMatch(LEFT_PAREN).type}function scriptInit(){return{type:SCRIPT,funDecls:[],varDecls:[],modDecls:[],impDecls:[],expDecls:[],loadDeps:[],hasEmptyReturn:!1,hasReturnWithValue:!1,isGenerator:!1}}function blockInit(){return{type:BLOCK,varDecls:[]}}function tokenString(a){var b=definitions.tokens[a];return/^\W/.test(b)?definitions.opTypeNames[b]:b.toUpperCase()}function Node(a,b){var c=a.token;c?(this.type=c.type,this.value=c.value,this.lineno=c.lineno,this.start=c.start,this.end=c.end):this.lineno=a.lineno,this.tokenizer=a,this.children=[];for(var d in b)this[d]=b[d]}function Script(a,b){var c=new Node(a,scriptInit()),d=new StaticContext(c,c,b,!1,NESTING_TOP);Statements(a,d,c);return c}function StaticContext(a,b,c,d,e){this.parentScript=a,this.parentBlock=b,this.inFunction=c,this.inForLoopInit=d,this.nesting=e,this.allLabels=new Stack,this.currentLabels=new Stack,this.labeledTargets=new Stack,this.defaultTarget=null,definitions.options.ecma3OnlyMode&&(this.ecma3OnlyMode=!0),definitions.options.parenFreeMode&&(this.parenFreeMode=!0)}function pushDestructuringVarDecls(a,b){for(var c in a){var d=a[c];d.type===IDENTIFIER?b.varDecls.push(d):pushDestructuringVarDecls(d,b)}}var lexer=require("ace/narcissus/jslex"),definitions=require("ace/narcissus/jsdefs");const StringMap=definitions.StringMap,Stack=definitions.Stack;eval(definitions.consts);const NESTING_TOP=0,NESTING_SHALLOW=1,NESTING_DEEP=2;StaticContext.prototype={ecma3OnlyMode:!1,parenFreeMode:!1,update:function(a){var b={};for(var c in a)b[c]={value:a[c],writable:!0,enumerable:!0,configurable:!0};return Object.create(this,b)},pushLabel:function(a){return this.update({currentLabels:this.currentLabels.push(a),allLabels:this.allLabels.push(a)})},pushTarget:function(a){var b=a.isLoop||a.type===SWITCH;if(this.currentLabels.isEmpty())return b?this.update({defaultTarget:a}):this;a.labels=new StringMap,this.currentLabels.forEach(function(b){a.labels.set(b,!0)});return this.update({currentLabels:new Stack,labeledTargets:this.labeledTargets.push(a),defaultTarget:b?a:this.defaultTarget})},nest:function(a){var b=Math.max(this.nesting,a);return b!==this.nesting?this.update({nesting:b}):this}},definitions.defineProperty(Array.prototype,"top",function(){return this.length&&this[this.length-1]},!1,!1,!0);var Np=Node.prototype={};Np.constructor=Node,Np.toSource=Object.prototype.toSource,Np.push=function(a){a!==null&&(a.start=0)b+=c;return b},!1,!1,!0);const DECLARED_FORM=0,EXPRESSED_FORM=1,STATEMENT_FORM=2;exports.parse=parse,exports.parseStdin=parseStdin,exports.Node=Node,exports.DECLARED_FORM=DECLARED_FORM,exports.EXPRESSED_FORM=EXPRESSED_FORM,exports.STATEMENT_FORM=STATEMENT_FORM,exports.Tokenizer=lexer.Tokenizer,exports.FunctionDefinition=FunctionDefinition}),define("ace/narcissus/jslex",["require","exports","module","ace/narcissus/jsdefs"],function(require,exports,module){function Tokenizer(a,b,c){this.cursor=0,this.source=String(a),this.tokens=[],this.tokenIndex=0,this.lookahead=0,this.scanNewlines=!1,this.unexpectedEOF=!1,this.filename=b||"",this.lineno=c||1}var definitions=require("ace/narcissus/jsdefs");eval(definitions.consts);var opTokens={};for(var op in definitions.opTypeNames){if(op==="\n"||op===".")continue;var node=opTokens;for(var i=0;i"9")throw this.newSyntaxError("Missing exponent");do ch=a[this.cursor++];while(ch>="0"&&ch<="9");this.cursor--;return!0}return!1},lexZeroNumber:function(a){var b=this.token,c=this.source;b.type=NUMBER,a=c[this.cursor++];if(a==="."){do a=c[this.cursor++];while(a>="0"&&a<="9");this.cursor--,this.lexExponent(),b.value=parseFloat(b.start,this.cursor)}else if(a==="x"||a==="X"){do a=c[this.cursor++];while(a>="0"&&a<="9"||a>="a"&&a<="f"||a>="A"&&a<="F");this.cursor--,b.value=parseInt(c.substring(b.start,this.cursor))}else if(a>="0"&&a<="7"){do a=c[this.cursor++];while(a>="0"&&a<="7");this.cursor--,b.value=parseInt(c.substring(b.start,this.cursor))}else this.cursor--,this.lexExponent(),b.value=0},lexNumber:function(a){var b=this.token,c=this.source;b.type=NUMBER;var d=!1;do a=c[this.cursor++],a==="."&&!d&&(d=!0,a=c[this.cursor++]);while(a>="0"&&a<="9");this.cursor--;var e=this.lexExponent();d=d||e;var f=c.substring(b.start,this.cursor);b.value=d?parseFloat(f):parseInt(f)},lexDot:function(a){var b=this.token,c=this.source,d=c[this.cursor];if(d>="0"&&d<="9"){do a=c[this.cursor++];while(a>="0"&&a<="9");this.cursor--,this.lexExponent(),b.type=NUMBER,b.value=parseFloat(b.start,this.cursor)}else b.type=DOT,b.assignOp=null,b.value="."},lexString:function(ch){var token=this.token,input=this.source;token.type=STRING;var hasEscapes=!1,delim=ch;if(input.length<=this.cursor)throw this.newSyntaxError("Unterminated string literal");while((ch=input[this.cursor++])!==delim){if(this.cursor==input.length)throw this.newSyntaxError("Unterminated string literal");if(ch==="\\"){hasEscapes=!0;if(++this.cursor==input.length)throw this.newSyntaxError("Unterminated string literal")}}token.value=hasEscapes?eval(input.substring(token.start,this.cursor)):input.substring(token.start+1,this.cursor-1)},lexRegExp:function(ch){var token=this.token,input=this.source;token.type=REGEXP;do{ch=input[this.cursor++];if(ch==="\\")this.cursor++;else if(ch==="["){do{if(ch===undefined)throw this.newSyntaxError("Unterminated character class");ch==="\\"&&this.cursor++,ch=input[this.cursor++]}while(ch!=="]")}else if(ch===undefined)throw this.newSyntaxError("Unterminated regex")}while(ch!=="/");do ch=input[this.cursor++];while(ch>="a"&&ch<="z");this.cursor--,token.value=eval(input.substring(token.start,this.cursor))},lexOp:function(a){var b=this.token,c=this.source,d=opTokens[a],e=c[this.cursor];e in d&&(d=d[e],this.cursor++,e=c[this.cursor],e in d&&(d=d[e],this.cursor++,e=c[this.cursor]));var f=d.op;definitions.assignOps[f]&&c[this.cursor]==="="?(this.cursor++,b.type=ASSIGN,b.assignOp=definitions.tokenIds[definitions.opTypeNames[f]],f+="="):(b.type=definitions.tokenIds[definitions.opTypeNames[f]],b.assignOp=null),b.value=f},lexIdent:function(a){var b=this.token,c=this.source;do a=c[this.cursor++];while(a>="a"&&a<="z"||a>="A"&&a<="Z"||a>="0"&&a<="9"||a==="$"||a==="_");this.cursor--;var d=c.substring(b.start,this.cursor);b.type=definitions.keywords[d]||IDENTIFIER,b.value=d},get:function(a){var b;while(this.lookahead){--this.lookahead,this.tokenIndex=this.tokenIndex+1&3,b=this.tokens[this.tokenIndex];if(b.type!==NEWLINE||this.scanNewlines)return b.type}this.skip(),this.tokenIndex=this.tokenIndex+1&3,b=this.tokens[this.tokenIndex],b||(this.tokens[this.tokenIndex]=b={});var c=this.source;if(this.cursor===c.length)return b.type=END;b.start=this.cursor,b.lineno=this.lineno;var d=c[this.cursor++];if(d>="a"&&d<="z"||d>="A"&&d<="Z"||d==="$"||d==="_")this.lexIdent(d);else if(a&&d==="/")this.lexRegExp(d);else if(d in opTokens)this.lexOp(d);else if(d===".")this.lexDot(d);else if(d>="1"&&d<="9")this.lexNumber(d);else if(d==="0")this.lexZeroNumber(d);else if(d==='"'||d==="'")this.lexString(d);else if(this.scanNewlines&&d==="\n")b.type=NEWLINE,b.value="\n",this.lineno++;else throw this.newSyntaxError("Illegal token");b.end=this.cursor;return b.type},unget:function(){if(++this.lookahead===4)throw"PANIC: too much lookahead!";this.tokenIndex=this.tokenIndex-1&3},newSyntaxError:function(a){var b=new SyntaxError(a,this.filename,this.lineno);b.source=this.source,b.lineno=this.lineno,b.cursor=this.lookahead?this.tokens[this.tokenIndex+this.lookahead&3].start:this.cursor;return b}},exports.Tokenizer=Tokenizer}),define("ace/narcissus/jsdefs",["require","exports","module"],function(a,b,c){function y(a){this.elts=a||null}function x(){this.table=Object.create(null,{}),this.size=0}function v(){return undefined}function u(a){return{getOwnPropertyDescriptor:function(b){var c=Object.getOwnPropertyDescriptor(a,b);c.configurable=!0;return c},getPropertyDescriptor:function(b){var c=s(a,b);c.configurable=!0;return c},getOwnPropertyNames:function(){return Object.getOwnPropertyNames(a)},defineProperty:function(b,c){Object.defineProperty(a,b,c)},"delete":function(b){return delete a[b]},fix:function(){return Object.isFrozen(a)?t(a):undefined},has:function(b){return b in a},hasOwn:function(b){return{}.hasOwnProperty.call(a,b)},get:function(b,c){return a[c]},set:function(b,c,d){a[c]=d;return!0},enumerate:function(){var b=[];for(m in a)b.push(m);return b},keys:function(){return Object.keys(a)}}}function t(a){var b={};for(var c in Object.getOwnPropertyNames(a))b[c]=Object.getOwnPropertyDescriptor(a,c);return b}function s(a,b){while(a){if({}.hasOwnProperty.call(a,b))return Object.getOwnPropertyDescriptor(a,b);a=Object.getPrototypeOf(a)}}function r(a){return typeof a=="function"&&a.toString().match(/\[native code\]/)}function q(a,b,c,d,e,f){Object.defineProperty(a,b,{value:c,writable:!e,configurable:!d,enumerable:!f})}function p(a,b,c,d,e){Object.defineProperty(a,b,{get:c,configurable:!d,enumerable:!e})}b.options={version:185},function(){b.hostGlobal=this}();var d=["END","\n",";",",","=","?",":","CONDITIONAL","||","&&","|","^","&","==","!=","===","!==","<","<=",">=",">","<<",">>",">>>","+","-","*","/","%","!","~","UNARY_PLUS","UNARY_MINUS","++","--",".","[","]","{","}","(",")","SCRIPT","BLOCK","LABEL","FOR_IN","CALL","NEW_WITH_ARGS","INDEX","ARRAY_INIT","OBJECT_INIT","PROPERTY_INIT","GETTER","SETTER","GROUP","LIST","LET_BLOCK","ARRAY_COMP","GENERATOR","COMP_TAIL","IDENTIFIER","NUMBER","STRING","REGEXP","break","case","catch","const","continue","debugger","default","delete","do","else","false","finally","for","function","if","in","instanceof","let","new","null","return","switch","this","throw","true","try","typeof","var","void","yield","while","with"],e=["break","const","continue","debugger","do","for","if","return","switch","throw","try","var","yield","while","with"],f={"\n":"NEWLINE",";":"SEMICOLON",",":"COMMA","?":"HOOK",":":"COLON","||":"OR","&&":"AND","|":"BITWISE_OR","^":"BITWISE_XOR","&":"BITWISE_AND","===":"STRICT_EQ","==":"EQ","=":"ASSIGN","!==":"STRICT_NE","!=":"NE","<<":"LSH","<=":"LE","<":"LT",">>>":"URSH",">>":"RSH",">=":"GE",">":"GT","++":"INCREMENT","--":"DECREMENT","+":"PLUS","-":"MINUS","*":"MUL","/":"DIV","%":"MOD","!":"NOT","~":"BITWISE_NOT",".":"DOT","[":"LEFT_BRACKET","]":"RIGHT_BRACKET","{":"LEFT_CURLY","}":"RIGHT_CURLY","(":"LEFT_PAREN",")":"RIGHT_PAREN"},g={"__proto__":null},h={},i="const ";for(var j=0,k=d.length;j0&&(i+=", ");var l=d[j],m;/^[a-z]/.test(l)?(m=l.toUpperCase(),g[l]=j):m=/^\W/.test(l)?f[l]:l,i+=m+" = "+j,h[m]=j,d[l]=j}i+=";";var n={"__proto__":null};for(j=0,k=e.length;j>",">>>","+","-","*","/","%"];for(j=0,k=o.length;j + * Provides an augmented, extensible, cross-browser implementation of regular expressions, + * including support for additional syntax, flags, and methods + */ + +define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + + //--------------------------------- + // Private variables + //--------------------------------- + + var real = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + real.test.call(x, ""); + return !x.lastIndex; + }(); + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match = real.exec.apply(this, arguments), + name, r2; + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + + // Don't override `test` if it won't change anything + if (!compliantLastIndexIncrement) { + // Fix browser bug in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the overriden + // `exec` would take care of the `lastIndex` fix + var match = real.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + //--------------------------------- + // Private helper functions + //--------------------------------- + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + }; + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + }; + +});// vim: ts=4 sts=4 sw=4 expandtab +// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License +// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project) +// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA +// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License +// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License +// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License +// -- kossnocorp Sasha Koss XXX TODO License or CLA +// -- bryanforbes Bryan Forbes XXX TODO License or CLA +// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence +// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License +// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License +// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain) +// -- iwyg XXX TODO License or CLA +// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License +// -- xavierm02 Montillet Xavier XXX TODO License or CLA +// -- Raynos Raynos XXX TODO License or CLA +// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License +// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License +// -- lexer Alexey Zakharov XXX TODO License or CLA + +/*! + Copyright (c) 2009, 280 North Inc. http://280north.com/ + MIT License. http://github.com/280north/narwhal/blob/master/README.md +*/ + +define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { + +/** + * Brings an environment as close to ECMAScript 5 compliance + * as is possible with the facilities of erstwhile engines. + * + * Annotated ES5: http://es5.github.com/ (specific links below) + * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf + * + * @module + */ + +/*whatsupdoc*/ + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (typeof target != "function") + throw new TypeError(); // TODO message + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var bound = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var F = function(){}; + F.prototype = target.prototype; + var self = new F; + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (result !== null && Object(result) === result) + return result; + return self; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + // XXX bound.length is never writable, so don't even try + // + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + }; +} + +// Shortcut to an often accessed properties, in order to avoid multiple +// dereference that costs universally. +// _Please note: Shortcuts are defined after `Function.prototype.bind` as we +// us it in defining shortcuts. +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); + +// If JS engine supports accessors creating shortcuts. +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} + +// +// Array +// ===== +// + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return toString(obj) == "[object Array]"; + }; +} + +// The IsCallable() check in the Array functions +// has been replaced with a strict check on the +// internal class of the object to trap cases where +// the provided function was actually a regular +// expression literal, which in V8 and +// JavaScriptCore is a typeof "function". Only in +// V8 are regular expression literals permitted as +// reduce parameters, so it is desirable in the +// general case for the shim to match the more +// strict and common behavior of rejecting regular +// expressions. + +// ES5 15.4.4.18 +// http://es5.github.com/#x15.4.4.18 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var self = toObject(this), + thisp = arguments[1], + i = 0, + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object context + fun.call(thisp, self[i], i, self); + } + i++; + } + }; +} + +// ES5 15.4.4.19 +// http://es5.github.com/#x15.4.4.19 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var self = toObject(this), + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, self); + } + return result; + }; +} + +// ES5 15.4.4.20 +// http://es5.github.com/#x15.4.4.20 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + result = [], + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + result.push(self[i]); + } + return result; + }; +} + +// ES5 15.4.4.16 +// http://es5.github.com/#x15.4.4.16 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, self)) + return false; + } + return true; + }; +} + +// ES5 15.4.4.17 +// http://es5.github.com/#x15.4.4.17 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var self = toObject(this), + length = self.length >>> 0, + thisp = arguments[1]; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, self)) + return true; + } + return false; + }; +} + +// ES5 15.4.4.21 +// http://es5.github.com/#x15.4.4.21 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value and an empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + + // if array contains no values, no initial value to return + if (++i >= length) + throw new TypeError(); // TODO message + } while (true); + } + + for (; i < length; i++) { + if (i in self) + result = fun.call(void 0, result, self[i], i, self); + } + + return result; + }; +} + +// ES5 15.4.4.22 +// http://es5.github.com/#x15.4.4.22 +// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var self = toObject(this), + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + // no value to return if no initial value, empty array + if (!length && arguments.length == 1) + throw new TypeError(); // TODO message + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + + // if array contains no values, no initial value to return + if (--i < 0) + throw new TypeError(); // TODO message + } while (true); + } + + do { + if (i in this) + result = fun.call(void 0, result, self[i], i, self); + } while (i--); + + return result; + }; +} + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + + var i = 0; + if (arguments.length > 1) + i = toInteger(arguments[1]); + + // handle negative indices + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} + +// ES5 15.4.4.15 +// http://es5.github.com/#x15.4.4.15 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf +if (!Array.prototype.lastIndexOf) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = toObject(this), + length = self.length >>> 0; + + if (!length) + return -1; + var i = length - 1; + if (arguments.length > 1) + i = Math.min(i, toInteger(arguments[1])); + // handle negative indices + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) + return i; + } + return -1; + }; +} + +// +// Object +// ====== +// + +// ES5 15.2.3.2 +// http://es5.github.com/#x15.2.3.2 +if (!Object.getPrototypeOf) { + // https://github.com/kriskowal/es5-shim/issues#issue/2 + // http://ejohn.org/blog/objectgetprototypeof/ + // recommended by fschaefer on github + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} + +// ES5 15.2.3.3 +// http://es5.github.com/#x15.2.3.3 +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + // If object does not owns property return undefined immediately. + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + + // If object has a property then it's for sure both `enumerable` and + // `configurable`. + descriptor = { enumerable: true, configurable: true }; + + // If JS engine supports accessor properties then property may be a + // getter or setter. + if (supportsAccessors) { + // Unfortunately `__lookupGetter__` will return a getter even + // if object has own non getter property along with a same named + // inherited getter. To avoid misbehavior we temporary remove + // `__proto__` so that `__lookupGetter__` will return getter only + // if it's owned by an object. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + + // Once we have getter and setter we can put values back. + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + + // If it was accessor property we're done and return here + // in order to avoid adding `value` to the descriptor. + return descriptor; + } + } + + // If we got this far we know that object has an own property that is + // not an accessor so we set it as a value and return descriptor. + descriptor.value = object[property]; + return descriptor; + }; +} + +// ES5 15.2.3.4 +// http://es5.github.com/#x15.2.3.4 +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} + +// ES5 15.2.3.5 +// http://es5.github.com/#x15.2.3.5 +if (!Object.create) { + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = { "__proto__": null }; + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + // IE has no built-in implementation of `Object.getPrototypeOf` + // neither `__proto__`, but this manually setting `__proto__` will + // guarantee that `Object.getPrototypeOf` will work as expected with + // objects created using `Object.create` + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +// ES5 15.2.3.6 +// http://es5.github.com/#x15.2.3.6 + +// Patch for WebKit and IE8 standard mode +// Designed by hax +// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5 +// IE8 Reference: +// http://msdn.microsoft.com/en-us/library/dd282900.aspx +// http://msdn.microsoft.com/en-us/library/dd229916.aspx +// WebKit Bugs: +// https://bugs.webkit.org/show_bug.cgi?id=36423 + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + // returns falsy + } +} + +// check whether defineProperty works if it's given. Otherwise, +// shim partially. +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + + // make a valiant attempt to use the real defineProperty + // for I8's DOM elements. + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + // try the shim if the real one doesn't work + } + } + + // If it's a data property. + if (owns(descriptor, "value")) { + // fail silently if "writable", "enumerable", or "configurable" + // are requested but not supported + /* + // alternate approach: + if ( // can't implement these features; allow false but not true + !(owns(descriptor, "writable") ? descriptor.writable : true) || + !(owns(descriptor, "enumerable") ? descriptor.enumerable : true) || + !(owns(descriptor, "configurable") ? descriptor.configurable : true) + ) + throw new RangeError( + "This implementation of Object.defineProperty does not " + + "support configurable, enumerable, or writable." + ); + */ + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + // As accessors are supported only on engines implementing + // `__proto__` we can safely override `__proto__` while defining + // a property to make sure that we don't hit an inherited + // accessor. + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + // Deleting a property anyway since getter / setter may be + // defined on object itself. + delete object[property]; + object[property] = descriptor.value; + // Setting original `__proto__` back now. + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + // If we got that far then getters and setters can be defined !! + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} + +// ES5 15.2.3.7 +// http://es5.github.com/#x15.2.3.7 +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} + +// ES5 15.2.3.8 +// http://es5.github.com/#x15.2.3.8 +if (!Object.seal) { + Object.seal = function seal(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.9 +// http://es5.github.com/#x15.2.3.9 +if (!Object.freeze) { + Object.freeze = function freeze(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// detect a Rhino bug and patch it +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} + +// ES5 15.2.3.10 +// http://es5.github.com/#x15.2.3.10 +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + // this is misleading and breaks feature-detection, but + // allows "securable" code to "gracefully" degrade to working + // but insecure code. + return object; + }; +} + +// ES5 15.2.3.11 +// http://es5.github.com/#x15.2.3.11 +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} + +// ES5 15.2.3.12 +// http://es5.github.com/#x15.2.3.12 +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} + +// ES5 15.2.3.13 +// http://es5.github.com/#x15.2.3.13 +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + // 1. If Type(O) is not Object throw a TypeError exception. + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + // 2. Return the Boolean value of the [[Extensible]] internal property of O. + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} + +// ES5 15.2.3.14 +// http://es5.github.com/#x15.2.3.14 +if (!Object.keys) { + // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) + hasDontEnumBug = false; + + Object.keys = function keys(object) { + + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError("Object.keys called on a non-object"); + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + + return keys; + }; + +} + +// +// Date +// ==== +// + +// ES5 15.9.5.43 +// http://es5.github.com/#x15.9.5.43 +// This function returns a String value represent the instance in time +// represented by this Date object. The format of the String is the Date Time +// string format defined in 15.9.1.15. All fields are present in the String. +// The time zone is always UTC, denoted by the suffix Z. If the time value of +// this object is not a finite Number a RangeError exception is thrown. +if (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) { + Date.prototype.toISOString = function toISOString() { + var result, length, value, year; + if (!isFinite(this)) + throw new RangeError; + + // the date time string format is specified in 15.9.1.15. + result = [this.getUTCMonth() + 1, this.getUTCDate(), + this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; + year = this.getUTCFullYear(); + year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6); + + length = result.length; + while (length--) { + value = result[length]; + // pad months, days, hours, minutes, and seconds to have two digits. + if (value < 10) + result[length] = "0" + value; + } + // pad milliseconds to have three digits. + return year + "-" + result.slice(0, 2).join("-") + "T" + result.slice(2).join(":") + "." + + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"; + } +} + +// ES5 15.9.4.4 +// http://es5.github.com/#x15.9.4.4 +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} + +// ES5 15.9.5.44 +// http://es5.github.com/#x15.9.5.44 +// This function provides a String representation of a Date object for use by +// JSON.stringify (15.12.3). +if (!Date.prototype.toJSON) { + Date.prototype.toJSON = function toJSON(key) { + // When the toJSON method is called with argument key, the following + // steps are taken: + + // 1. Let O be the result of calling ToObject, giving it the this + // value as its argument. + // 2. Let tv be ToPrimitive(O, hint Number). + // 3. If tv is a Number and is not finite, return null. + // XXX + // 4. Let toISO be the result of calling the [[Get]] internal method of + // O with argument "toISOString". + // 5. If IsCallable(toISO) is false, throw a TypeError exception. + if (typeof this.toISOString != "function") + throw new TypeError(); // TODO message + // 6. Return the result of calling the [[Call]] internal method of + // toISO with O as the this value and an empty argument list. + return this.toISOString(); + + // NOTE 1 The argument is ignored. + + // NOTE 2 The toJSON function is intentionally generic; it does not + // require that its this value be a Date object. Therefore, it can be + // transferred to other kinds of objects for use as a method. However, + // it does require that any such object have a toISOString method. An + // object is free to use the argument key to filter its + // stringification. + }; +} + +// ES5 15.9.4.2 +// http://es5.github.com/#x15.9.4.2 +// based on work shared by Daniel Friesen (dantman) +// http://gist.github.com/303249 +if (Date.parse("+275760-09-13T00:00:00.000Z") !== 8.64e15) { + // XXX global assignment won't work in embeddings that use + // an alternate object for the context. + Date = (function(NativeDate) { + + // Date.length === 7 + var Date = function Date(Y, M, D, h, m, s, ms) { + var length = arguments.length; + if (this instanceof NativeDate) { + var date = length == 1 && String(Y) === Y ? // isString(Y) + // We explicitly pass it through parse: + new NativeDate(Date.parse(Y)) : + // We have to manually make calls depending on argument + // length here + length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) : + length >= 6 ? new NativeDate(Y, M, D, h, m, s) : + length >= 5 ? new NativeDate(Y, M, D, h, m) : + length >= 4 ? new NativeDate(Y, M, D, h) : + length >= 3 ? new NativeDate(Y, M, D) : + length >= 2 ? new NativeDate(Y, M) : + length >= 1 ? new NativeDate(Y) : + new NativeDate(); + // Prevent mixups with unfixed Date object + date.constructor = Date; + return date; + } + return NativeDate.apply(this, arguments); + }; + + // 15.9.1.15 Date Time String Format. + var isoDateExpression = new RegExp("^" + + "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + 6-digit extended year + "(?:-(\\d{2})" + // optional month capture + "(?:-(\\d{2})" + // optional day capture + "(?:" + // capture hours:minutes:seconds.milliseconds + "T(\\d{2})" + // hours capture + ":(\\d{2})" + // minutes capture + "(?:" + // optional :seconds.milliseconds + ":(\\d{2})" + // seconds capture + "(?:\\.(\\d{3}))?" + // milliseconds capture + ")?" + + "(?:" + // capture UTC offset component + "Z|" + // UTC capture + "(?:" + // offset specifier +/-hours:minutes + "([-+])" + // sign capture + "(\\d{2})" + // hours offset capture + ":(\\d{2})" + // minutes offset capture + ")" + + ")?)?)?)?" + + "$"); + + // Copy any custom methods a 3rd party library may have added + for (var key in NativeDate) + Date[key] = NativeDate[key]; + + // Copy "native" methods explicitly; they may be non-enumerable + Date.now = NativeDate.now; + Date.UTC = NativeDate.UTC; + Date.prototype = NativeDate.prototype; + Date.prototype.constructor = Date; + + // Upgrade Date.parse to handle simplified ISO 8601 strings + Date.parse = function parse(string) { + var match = isoDateExpression.exec(string); + if (match) { + match.shift(); // kill match[0], the full match + // parse months, days, hours, minutes, seconds, and milliseconds + for (var i = 1; i < 7; i++) { + // provide default values if necessary + match[i] = +(match[i] || (i < 3 ? 1 : 0)); + // match[1] is the month. Months are 0-11 in JavaScript + // `Date` objects, but 1-12 in ISO notation, so we + // decrement. + if (i == 1) + match[i]--; + } + + // parse the UTC offset component + var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop(); + + // compute the explicit time zone offset if specified + var offset = 0; + if (sign) { + // detect invalid offsets and return early + if (hourOffset > 23 || minuteOffset > 59) + return NaN; + + // express the provided time zone offset in minutes. The offset is + // negative for time zones west of UTC; positive otherwise. + offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == "+" ? -1 : 1); + } + + // Date.UTC for years between 0 and 99 converts year to 1900 + year + // The Gregorian calendar has a 400-year cycle, so + // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...), + // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years + var year = +match[0]; + if (0 <= year && year <= 99) { + match[0] = year + 400; + return NativeDate.UTC.apply(this, match) + offset - 12622780800000; + } + + // compute a new UTC date value, accounting for the optional offset + return NativeDate.UTC.apply(this, match) + offset; + } + return NativeDate.parse.apply(this, arguments); + }; + + return Date; + })(Date); +} + +// +// String +// ====== +// + +// ES5 15.5.4.20 +// http://es5.github.com/#x15.5.4.20 +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + // http://blog.stevenlevithan.com/archives/faster-trim-javascript + // http://perfectionkills.com/whitespace-deviations/ + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer +var toInteger = function (n) { + n = +n; + if (n !== n) // isNaN + n = 0; + else if (n !== 0 && n !== (1/0) && n !== -(1/0)) + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + return n; +}; + +var prepareString = "a"[0] != "a", + // ES5 9.9 + // http://es5.github.com/#x9.9 + toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError(); // TODO message + } + // If the implementation doesn't support by-index access of + // string characters (ex. IE < 7), split the string + if (prepareString && typeof o == "string" && o) { + return o.split(""); + } + return Object(o); + }; +});/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * Irakli Gozalishvili (http://jeditoolkit.com) + * Mike de Boer + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry = this._eventRegistry || {}; + this._defaultHandlers = this._defaultHandlers || {}; + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + e = e || {}; + e.type = eventName; + + if (!e.stopPropagation) { + e.stopPropagation = function() { + this.propagationStopped = true; + }; + } + + if (!e.preventDefault) { + e.preventDefault = function() { + this.defaultPrevented = true; + }; + } + + for (var i=0; i + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.inherits = (function() { + var tempCtor = function() {}; + return function(ctor, superCtor) { + tempCtor.prototype = superCtor.prototype; + ctor.super_ = superCtor.prototype; + ctor.prototype = new tempCtor(); + ctor.prototype.constructor = ctor; + }; +}()); + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/mode/javascript_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/worker/jshint', 'ace/narcissus/jsparse'], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var lint = require("../worker/jshint").JSHINT; + +var JavaScriptWorker = exports.JavaScriptWorker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(500); +}; + +oop.inherits(JavaScriptWorker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + value = value.replace(/^#!.*\n/, "\n"); + +// var start = new Date(); + var parser = require("../narcissus/jsparse"); + try { + parser.parse(value); + } catch(e) { +// console.log("narcissus") +// console.log(e); + var chunks = e.message.split(":") + var message = chunks.pop().trim(); + var lineNumber = parseInt(chunks.pop().trim()) - 1; + this.sender.emit("narcissus", { + row: lineNumber, + column: null, // TODO convert e.cursor + text: message, + type: "error" + }); + return; + } finally { +// console.log("parse time: " + (new Date() - start)); + } + +// var start = new Date(); +// console.log("jslint") + lint(value, {undef: false, onevar: false, passfail: false}); + this.sender.emit("jslint", lint.errors); +// console.log("lint time: " + (new Date() - start)); + } + +}).call(JavaScriptWorker.prototype); + +});define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) { +"use strict"; + +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + doc.applyDeltas([e.data]); + deferredUpdate.schedule(_self.$timeout); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + // abstract method + }; + +}).call(Mirror.prototype); + +});/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(text) { + this.$lines = []; + + if (Array.isArray(text)) { + this.insertLines(0, text); + } + // There has to be one line at least in the document. If you pass an empty + // string to the insert function, nothing will happen. Workaround. + else if (text.length == 0) { + this.$lines = [""]; + } else { + this.insert({row: 0, column:0}, text); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setValue = function(text) { + var len = this.getLength(); + this.remove(new Range(0, 0, len, this.getLine(len-1).length)); + this.insert({row: 0, column:0}, text); + }; + + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + + // check for IE split bug + if ("aaa".split(/a/).length == 0) + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + } + else + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + if (match) { + this.$autoNewLine = match[1]; + } else { + this.$autoNewLine = "\n"; + } + }; + + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + + case "unix": + return "\n"; + + case "auto": + return this.$autoNewLine; + } + }; + + this.$autoNewLine = "\n"; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + }; + + this.getNewLineMode = function() { + return this.$newLineMode; + }; + + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + + /** + * Get a verbatim copy of the given line as it is in the document + */ + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + + /** + * Returns all lines in the document as string array. Warning: The caller + * should not modify this array! + */ + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + + this.getLength = function() { + return this.$lines.length; + }; + + this.getTextRange = function(range) { + if (range.start.row == range.end.row) { + return this.$lines[range.start.row].substring(range.start.column, + range.end.column); + } + else { + var lines = []; + lines.push(this.$lines[range.start.row].substring(range.start.column)); + lines.push.apply(lines, this.getLines(range.start.row+1, range.end.row-1)); + lines.push(this.$lines[range.end.row].substring(0, range.end.column)); + return lines.join(this.getNewLineCharacter()); + } + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length-1).length; + } + return position; + }; + + this.insert = function(position, text) { + if (text.length == 0) + return position; + + position = this.$clipPosition(position); + + if (this.getLength() <= 1) + this.$detectNewLine(text); + + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; + + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this.insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); + } + return position; + }; + + this.insertLines = function(row, lines) { + if (lines.length == 0) + return {row: row, column: 0}; + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return range.end; + }; + + this.insertNewLine = function(position) { + position = this.$clipPosition(position); + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column); + this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); + + var end = { + row : position.row + 1, + column : 0 + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.insertInLine = function(position, text) { + if (text.length == 0) + return position; + + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column) + text + + line.substring(position.column); + + var end = { + row : position.row, + column : position.column + text.length + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: text + }; + this._emit("change", { data: delta }); + + return end; + }; + + this.remove = function(range) { + // clip to document + range.start = this.$clipPosition(range.start); + range.end = this.$clipPosition(range.end); + + if (range.isEmpty()) + return range.start; + + var firstRow = range.start.row; + var lastRow = range.end.row; + + if (range.isMultiLine()) { + var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; + var lastFullRow = lastRow - 1; + + if (range.end.column > 0) + this.removeInLine(lastRow, 0, range.end.column); + + if (lastFullRow >= firstFullRow) + this.removeLines(firstFullRow, lastFullRow); + + if (firstFullRow != firstRow) { + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); + this.removeNewLine(range.start.row); + } + } + else { + this.removeInLine(firstRow, range.start.column, range.end.column); + } + return range.start; + }; + + this.removeInLine = function(row, startColumn, endColumn) { + if (startColumn == endColumn) + return; + + var range = new Range(row, startColumn, row, endColumn); + var line = this.getLine(row); + var removed = line.substring(startColumn, endColumn); + var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); + this.$lines.splice(row, 1, newLine); + + var delta = { + action: "removeText", + range: range, + text: removed + }; + this._emit("change", { data: delta }); + return range.start; + }; + + /** + * Removes a range of full lines + * + * @param firstRow {Integer} The first row to be removed + * @param lastRow {Integer} The last row to be removed + * @return {String[]} The removed lines + */ + this.removeLines = function(firstRow, lastRow) { + var range = new Range(firstRow, 0, lastRow + 1, 0); + var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); + + var delta = { + action: "removeLines", + range: range, + nl: this.getNewLineCharacter(), + lines: removed + }; + this._emit("change", { data: delta }); + return removed; + }; + + this.removeNewLine = function(row) { + var firstLine = this.getLine(row); + var secondLine = this.getLine(row+1); + + var range = new Range(row, firstLine.length, row+1, 0); + var line = firstLine + secondLine; + + this.$lines.splice(row, 2, line); + + var delta = { + action: "removeText", + range: range, + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + }; + + this.replace = function(range, text) { + if (text.length == 0 && range.isEmpty()) + return range.start; + + // Shortcut: If the text we want to insert is the same as it is already + // in the document, we don't have to replace anything. + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + if (text) { + var end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + var delta = deltas[i]; + + var range = Range.fromPoints(delta.range.start, delta.range.end); + + if (delta.action == "insertLines") + this.removeLines(range.start.row, range.end.row - 1); + else if (delta.action == "insertText") + this.remove(range); + else if (delta.action == "removeLines") + this.insertLines(range.start.row, delta.lines); + else if (delta.action == "removeText") + this.insert(range.start, delta.text); + } + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEequal = function(range) { + return this.start.row == range.start.row && + this.end.row == range.end.row && + this.start.column == range.start.column && + this.end.column == range.end.column + }; + + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + + /** + * Compares this range (A) with another range (B), where B is the passed in + * range. + * + * Return values: + * -2: (B) is infront of (A) and doesn't intersect with (A) + * -1: (B) begins before (A) but ends inside of (A) + * 0: (B) is completly inside of (A) OR (A) is complety inside of (B) + * +1: (B) begins inside of (A) but ends outside of (A) + * +2: (B) is after (A) and doesn't intersect with (A) + * + * 42: FTW state: (B) ends in (A) but starts outside of (A) + */ + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + } + + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + } + + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + } + + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + } + + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + } + + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + } + + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + } + + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + } + + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + }; + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + + /** + * Like .compare(), but if isStart is true, return -1; + */ + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + /** + * Like .compare(), but if isEnd is true, return 1; + */ + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + } + + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + } + + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) { + var end = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row > lastRow) { + var start = { + row: lastRow+1, + column: 0 + }; + } + + if (this.start.row < firstRow) { + var start = { + row: firstRow, + column: 0 + }; + } + + if (this.end.row < firstRow) { + var end = { + row: firstRow, + column: 0 + }; + } + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row == this.end.row && this.start.column == this.end.column); + }; + + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + + this.toScreenRange = function(session) { + var screenPosStart = + session.documentToScreenPosition(this.start); + var screenPosEnd = + session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + +}).call(Range.prototype); + + +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; + +exports.Range = Range; +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +/** + * An Anchor is a floating pointer in the document. Whenever text is inserted or + * deleted before the cursor, the position of the cursor is updated + */ +var Anchor = exports.Anchor = function(doc, row, column) { + this.document = doc; + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + + this.$onChange = this.onChange.bind(this); + doc.on("change", this.$onChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + + this.getDocument = function() { + return this.document; + }; + + this.onChange = function(e) { + var delta = e.data; + var range = delta.range; + + if (range.start.row == range.end.row && range.start.row != this.row) + return; + + if (range.start.row > this.row) + return; + + if (range.start.row == this.row && range.start.column > this.column) + return; + + var row = this.row; + var column = this.column; + + if (delta.action === "insertText") { + if (range.start.row === row && range.start.column <= column) { + if (range.start.row === range.end.row) { + column += range.end.column - range.start.column; + } + else { + column -= range.start.column; + row += range.end.row - range.start.row; + } + } + else if (range.start.row !== range.end.row && range.start.row < row) { + row += range.end.row - range.start.row; + } + } else if (delta.action === "insertLines") { + if (range.start.row <= row) { + row += range.end.row - range.start.row; + } + } + else if (delta.action == "removeText") { + if (range.start.row == row && range.start.column < column) { + if (range.end.column >= column) + column = range.start.column; + else + column = Math.max(0, column - (range.end.column - range.start.column)); + + } else if (range.start.row !== range.end.row && range.start.row < row) { + if (range.end.row == row) { + column = Math.max(0, column - range.end.column) + range.start.column; + } + row -= (range.end.row - range.start.row); + } + else if (range.end.row == row) { + row -= range.end.row - range.start.row; + column = Math.max(0, column - range.end.column) + range.start.column; + } + } else if (delta.action == "removeLines") { + if (range.start.row <= row) { + if (range.end.row <= row) + row -= range.end.row - range.start.row; + else { + row = range.start.row; + column = 0; + } + } + } + + this.setPosition(row, column, true); + }; + + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._emit("change", { + old: old, + value: pos + }); + }; + + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { +"use strict"; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + return new Array(count + 1).join(string); +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i. + + var myReport = JSHINT.report(limited); + + If limited is true, then the report will be limited to only errors. + + You can request a data structure which contains JSHint's results. + + var myData = JSHINT.data(); + + It returns a structure with this form: + + { + errors: [ + { + line: NUMBER, + character: NUMBER, + reason: STRING, + evidence: STRING + } + ], + functions: [ + name: STRING, + line: NUMBER, + last: NUMBER, + param: [ + STRING + ], + closure: [ + STRING + ], + var: [ + STRING + ], + exception: [ + STRING + ], + outer: [ + STRING + ], + unused: [ + STRING + ], + global: [ + STRING + ], + label: [ + STRING + ] + ], + globals: [ + STRING + ], + member: { + STRING: NUMBER + }, + unuseds: [ + { + name: STRING, + line: NUMBER + } + ], + implieds: [ + { + name: STRING, + line: NUMBER + } + ], + urls: [ + STRING + ], + json: BOOLEAN + } + + Empty arrays will not be included. + +*/ + +/*jshint + evil: true, nomen: false, onevar: false, regexp: false, strict: true, boss: true, + undef: true, maxlen: 100 +*/ + +/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%", "(begin)", + "(breakage)", "(context)", "(error)", "(global)", "(identifier)", "(last)", + "(line)", "(loopage)", "(name)", "(onevar)", "(params)", "(scope)", + "(statement)", "(verb)", "*", "+", "++", "-", "--", "\/", "<", "<=", "==", + "===", ">", ">=", $, $$, $A, $F, $H, $R, $break, $continue, $w, Abstract, Ajax, + __filename, __dirname, ActiveXObject, Array, ArrayBuffer, ArrayBufferView, + Autocompleter, Assets, Boolean, Builder, Buffer, Browser, COM, CScript, Canvas, + CustomAnimation, Class, Control, Chain, Color, Cookie, Core, DataView, Date, + Debug, Draggable, Draggables, Droppables, Document, DomReady, DOMReady, Drag, + E, Enumerator, Enumerable, Element, Elements, Error, Effect, EvalError, Event, + Events, FadeAnimation, Field, Flash, Float32Array, Float64Array, Form, + FormField, Frame, Function, Fx, GetObject, Group, Hash, HotKey, HTMLElement, + HtmlTable, Iframe, IframeShim, Image, Int16Array, Int32Array, Int8Array, + Insertion, InputValidator, JSON, Keyboard, Locale, LN10, LN2, LOG10E, LOG2E, + MAX_VALUE, MIN_VALUE, Mask, Math, MenuItem, MoveAnimation, MooTools, Native, + NEGATIVE_INFINITY, Number, Object, ObjectRange, Option, Options, OverText, PI, + POSITIVE_INFINITY, PeriodicalExecuter, Point, Position, Prototype, RangeError, + Rectangle, ReferenceError, RegExp, ResizeAnimation, Request, RotateAnimation, + SQRT1_2, SQRT2, ScrollBar, ScriptEngine, ScriptEngineBuildVersion, + ScriptEngineMajorVersion, ScriptEngineMinorVersion, Scriptaculous, Scroller, + Slick, Slider, Selector, String, Style, SyntaxError, Sortable, Sortables, + SortableObserver, Sound, Spinner, System, Swiff, Text, TextArea, Template, + Timer, Tips, Type, TypeError, Toggle, Try, URI, URIError, URL, VBArray, WSH, + WScript, Web, Window, XMLDOM, XMLHttpRequest, XPathEvaluator, XPathException, + XPathExpression, XPathNamespace, XPathNSResolver, XPathResult, "\\", a, + addEventListener, address, alert, apply, applicationCache, arguments, arity, + asi, b, bitwise, block, blur, boolOptions, boss, browser, c, call, callee, + caller, cases, charAt, charCodeAt, character, clearInterval, clearTimeout, + close, closed, closure, comment, condition, confirm, console, constructor, + content, couch, create, css, curly, d, data, datalist, dd, debug, decodeURI, + decodeURIComponent, defaultStatus, defineClass, deserialize, devel, document, + dojo, dijit, dojox, define, edition, else, emit, encodeURI, encodeURIComponent, + entityify, eqeqeq, eqnull, errors, es5, escape, eval, event, evidence, evil, + ex, exception, exec, exps, expr, exports, FileReader, first, floor, focus, + forin, fragment, frames, from, fromCharCode, fud, funct, function, functions, + g, gc, getComputedStyle, getRow, GLOBAL, global, globals, globalstrict, + hasOwnProperty, help, history, i, id, identifier, immed, implieds, include, + indent, indexOf, init, ins, instanceOf, isAlpha, isApplicationRunning, isArray, + isDigit, isFinite, isNaN, iterator, join, jshint, + JSHINT, json, jquery, jQuery, keys, label, labelled, last, lastsemic, laxbreak, + latedef, lbp, led, left, length, line, load, loadClass, localStorage, location, + log, loopfunc, m, match, maxerr, maxlen, member,message, meta, module, moveBy, + moveTo, mootools, name, navigator, new, newcap, noarg, node, noempty, nomen, + nonew, nud, onbeforeunload, onblur, onerror, onevar, onfocus, onload, onresize, + onunload, open, openDatabase, openURL, opener, opera, outer, param, parent, + parseFloat, parseInt, passfail, plusplus, predef, print, process, prompt, + proto, prototype, prototypejs, push, quit, range, raw, reach, reason, regexp, + readFile, readUrl, regexdash, removeEventListener, replace, report, require, + reserved, resizeBy, resizeTo, resolvePath, resumeUpdates, respond, rhino, right, + runCommand, scroll, screen, scripturl, scrollBy, scrollTo, scrollbar, search, seal, send, + serialize, setInterval, setTimeout, shift, slice, sort,spawn, split, stack, + status, start, strict, sub, substr, supernew, shadow, supplant, sum, sync, + test, toLowerCase, toString, toUpperCase, toint32, token, top, trailing, type, + typeOf, Uint16Array, Uint32Array, Uint8Array, undef, unused, urls, value, valueOf, + var, version, WebSocket, white, window, Worker, wsh*/ + +/*global exports: false */ + +// We build the application inside a function so that we produce only a single +// global variable. That function will be invoked immediately, and its return +// value is the JSHINT function itself. + +var JSHINT = (function () { + "use strict"; + + var anonname, // The guessed name for anonymous functions. + +// These are operators that should not be used with the ! operator. + + bang = { + '<' : true, + '<=' : true, + '==' : true, + '===': true, + '!==': true, + '!=' : true, + '>' : true, + '>=' : true, + '+' : true, + '-' : true, + '*' : true, + '/' : true, + '%' : true + }, + +// These are the JSHint boolean options. + + boolOptions = { + asi : true, // if automatic semicolon insertion should be tolerated + bitwise : true, // if bitwise operators should not be allowed + boss : true, // if advanced usage of assignments should be allowed + browser : true, // if the standard browser globals should be predefined + couch : true, // if CouchDB globals should be predefined + curly : true, // if curly braces around all blocks should be required + debug : true, // if debugger statements should be allowed + devel : true, // if logging globals should be predefined (console, alert, etc.) + dojo : true, // if Dojo Toolkit globals should be predefined + eqeqeq : true, // if === should be required + eqnull : true, // if == null comparisons should be tolerated + es5 : true, // if ES5 syntax should be allowed + evil : true, // if eval should be allowed + expr : true, // if ExpressionStatement should be allowed as Programs + forin : true, // if for in statements must filter + globalstrict: true, // if global "use strict"; should be allowed (also enables 'strict') + immed : true, // if immediate invocations must be wrapped in parens + iterator : true, // if the `__iterator__` property should be disallowed + jquery : true, // if jQuery globals should be predefined + latedef : true, // if the use before definition should not be tolerated + laxbreak : true, // if line breaks should not be checked + loopfunc : true, // if functions should be allowed to be defined within loops + mootools : true, // if MooTools globals should be predefined + newcap : true, // if constructor names must be capitalized + noarg : true, // if arguments.caller and arguments.callee should be disallowed + node : true, // if the Node.js environment globals should be predefined + noempty : true, // if empty blocks should be disallowed + nonew : true, // if using `new` for side-effects should be disallowed + nomen : true, // if names should be checked + onevar : true, // if only one var statement per function should be allowed + passfail : true, // if the scan should stop on first error + plusplus : true, // if increment/decrement should not be allowed + proto : true, // if the `__proto__` property should be disallowed + prototypejs : true, // if Prototype and Scriptaculous globals should be predefined + regexdash : true, // if unescaped last dash (-) inside brackets should be tolerated + regexp : true, // if the . should not be allowed in regexp literals + rhino : true, // if the Rhino environment globals should be predefined + undef : true, // if variables should be declared before used + scripturl : true, // if script-targeted URLs should be tolerated + shadow : true, // if variable shadowing should be tolerated + strict : true, // require the "use strict"; pragma + sub : true, // if all forms of subscript notation are tolerated + supernew : true, // if `new function () { ... };` and `new Object;` + // should be tolerated + trailing : true, // if trailing whitespace rules apply + white : true, // if strict whitespace rules apply + wsh : true // if the Windows Scripting Host environment globals should + // be predefined + }, + +// browser contains a set of global names which are commonly provided by a +// web browser environment. + + browser = { + ArrayBuffer : false, + ArrayBufferView : false, + addEventListener: false, + applicationCache: false, + blur : false, + clearInterval : false, + clearTimeout : false, + close : false, + closed : false, + DataView : false, + defaultStatus : false, + document : false, + event : false, + FileReader : false, + Float32Array : false, + Float64Array : false, + focus : false, + frames : false, + getComputedStyle: false, + HTMLElement : false, + history : false, + Int16Array : false, + Int32Array : false, + Int8Array : false, + Image : false, + length : false, + localStorage : false, + location : false, + moveBy : false, + moveTo : false, + name : false, + navigator : false, + onbeforeunload : true, + onblur : true, + onerror : true, + onfocus : true, + onload : true, + onresize : true, + onunload : true, + open : false, + openDatabase : false, + opener : false, + Option : false, + parent : false, + print : false, + removeEventListener: false, + resizeBy : false, + resizeTo : false, + screen : false, + scroll : false, + scrollBy : false, + scrollTo : false, + setInterval : false, + setTimeout : false, + status : false, + top : false, + Uint16Array : false, + Uint32Array : false, + Uint8Array : false, + WebSocket : false, + window : false, + Worker : false, + XMLHttpRequest : false, + XPathEvaluator : false, + XPathException : false, + XPathExpression : false, + XPathNamespace : false, + XPathNSResolver : false, + XPathResult : false + }, + + couch = { + "require" : false, + respond : false, + getRow : false, + emit : false, + send : false, + start : false, + sum : false, + log : false, + exports : false, + module : false + }, + + devel = { + alert : false, + confirm : false, + console : false, + Debug : false, + opera : false, + prompt : false + }, + + dojo = { + dojo : false, + dijit : false, + dojox : false, + define : false, + "require" : false + }, + + escapes = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '/' : '\\/', + '\\': '\\\\' + }, + + funct, // The current function + + functionicity = [ + 'closure', 'exception', 'global', 'label', + 'outer', 'unused', 'var' + ], + + functions, // All of the functions + + global, // The global scope + implied, // Implied globals + inblock, + indent, + jsonmode, + + jquery = { + '$' : false, + jQuery : false + }, + + lines, + lookahead, + member, + membersOnly, + + mootools = { + '$' : false, + '$$' : false, + Assets : false, + Browser : false, + Chain : false, + Class : false, + Color : false, + Cookie : false, + Core : false, + Document : false, + DomReady : false, + DOMReady : false, + Drag : false, + Element : false, + Elements : false, + Event : false, + Events : false, + Fx : false, + Group : false, + Hash : false, + HtmlTable : false, + Iframe : false, + IframeShim : false, + InputValidator : false, + instanceOf : false, + Keyboard : false, + Locale : false, + Mask : false, + MooTools : false, + Native : false, + Options : false, + OverText : false, + Request : false, + Scroller : false, + Slick : false, + Slider : false, + Sortables : false, + Spinner : false, + Swiff : false, + Tips : false, + Type : false, + typeOf : false, + URI : false, + Window : false + }, + + nexttoken, + + node = { + __filename : false, + __dirname : false, + exports : false, + Buffer : false, + GLOBAL : false, + global : false, + module : false, + process : false, + require : false + }, + + noreach, + option, + predefined, // Global variables defined by option + prereg, + prevtoken, + + prototypejs = { + '$' : false, + '$$' : false, + '$A' : false, + '$F' : false, + '$H' : false, + '$R' : false, + '$break' : false, + '$continue' : false, + '$w' : false, + Abstract : false, + Ajax : false, + Class : false, + Enumerable : false, + Element : false, + Event : false, + Field : false, + Form : false, + Hash : false, + Insertion : false, + ObjectRange : false, + PeriodicalExecuter: false, + Position : false, + Prototype : false, + Selector : false, + Template : false, + Toggle : false, + Try : false, + Autocompleter : false, + Builder : false, + Control : false, + Draggable : false, + Draggables : false, + Droppables : false, + Effect : false, + Sortable : false, + SortableObserver : false, + Sound : false, + Scriptaculous : false + }, + + rhino = { + defineClass : false, + deserialize : false, + gc : false, + help : false, + load : false, + loadClass : false, + print : false, + quit : false, + readFile : false, + readUrl : false, + runCommand : false, + seal : false, + serialize : false, + spawn : false, + sync : false, + toint32 : false, + version : false + }, + + scope, // The current scope + src, + stack, + +// standard contains the global names that are provided by the +// ECMAScript standard. + + standard = { + Array : false, + Boolean : false, + Date : false, + decodeURI : false, + decodeURIComponent : false, + encodeURI : false, + encodeURIComponent : false, + Error : false, + 'eval' : false, + EvalError : false, + Function : false, + hasOwnProperty : false, + isFinite : false, + isNaN : false, + JSON : false, + Math : false, + Number : false, + Object : false, + parseInt : false, + parseFloat : false, + RangeError : false, + ReferenceError : false, + RegExp : false, + String : false, + SyntaxError : false, + TypeError : false, + URIError : false + }, + + standard_member = { + E : true, + LN2 : true, + LN10 : true, + LOG2E : true, + LOG10E : true, + MAX_VALUE : true, + MIN_VALUE : true, + NEGATIVE_INFINITY : true, + PI : true, + POSITIVE_INFINITY : true, + SQRT1_2 : true, + SQRT2 : true + }, + + strict_mode, + syntax = {}, + tab, + token, + urls, + warnings, + + wsh = { + ActiveXObject : true, + Enumerator : true, + GetObject : true, + ScriptEngine : true, + ScriptEngineBuildVersion : true, + ScriptEngineMajorVersion : true, + ScriptEngineMinorVersion : true, + VBArray : true, + WSH : true, + WScript : true + }; + + // Regular expressions. Some of these are stupidly long. + var ax, cx, tx, nx, nxg, lx, ix, jx, ft; + (function () { + /*jshint maxlen:300 */ + + // unsafe comment or string + ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i; + + // unsafe characters that are silently deleted by one or more browsers + cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + + // token + tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jshint|jslint|members?|global)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/; + + // characters in strings that need escapement + nx = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + nxg = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + // star slash + lx = /\*\/|\/\*/; + + // identifier + ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; + + // javascript url + jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; + + // catches /* falls through */ comments + ft = /^\s*\/\*\s*falls\sthrough\s*\*\/\s*$/; + }()); + + function F() {} // Used by Object.create + + function is_own(object, name) { + +// The object.hasOwnProperty method fails when the property under consideration +// is named 'hasOwnProperty'. So we have to use this more convoluted form. + + return Object.prototype.hasOwnProperty.call(object, name); + } + +// Provide critical ES5 functions to ES3. + + if (typeof Array.isArray !== 'function') { + Array.isArray = function (o) { + return Object.prototype.toString.apply(o) === '[object Array]'; + }; + } + + if (typeof Object.create !== 'function') { + Object.create = function (o) { + F.prototype = o; + return new F(); + }; + } + + if (typeof Object.keys !== 'function') { + Object.keys = function (o) { + var a = [], k; + for (k in o) { + if (is_own(o, k)) { + a.push(k); + } + } + return a; + }; + } + +// Non standard methods + + if (typeof String.prototype.entityify !== 'function') { + String.prototype.entityify = function () { + return this + .replace(/&/g, '&') + .replace(//g, '>'); + }; + } + + if (typeof String.prototype.isAlpha !== 'function') { + String.prototype.isAlpha = function () { + return (this >= 'a' && this <= 'z\uffff') || + (this >= 'A' && this <= 'Z\uffff'); + }; + } + + if (typeof String.prototype.isDigit !== 'function') { + String.prototype.isDigit = function () { + return (this >= '0' && this <= '9'); + }; + } + + if (typeof String.prototype.supplant !== 'function') { + String.prototype.supplant = function (o) { + return this.replace(/\{([^{}]*)\}/g, function (a, b) { + var r = o[b]; + return typeof r === 'string' || typeof r === 'number' ? r : a; + }); + }; + } + + if (typeof String.prototype.name !== 'function') { + String.prototype.name = function () { + +// If the string looks like an identifier, then we can return it as is. +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can simply slap some quotes around it. +// Otherwise we must also replace the offending characters with safe +// sequences. + + if (ix.test(this)) { + return this; + } + if (nx.test(this)) { + return '"' + this.replace(nxg, function (a) { + var c = escapes[a]; + if (c) { + return c; + } + return '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4); + }) + '"'; + } + return '"' + this + '"'; + }; + } + + + function combine(t, o) { + var n; + for (n in o) { + if (is_own(o, n)) { + t[n] = o[n]; + } + } + } + + function assume() { + if (option.couch) + combine(predefined, couch); + + if (option.rhino) + combine(predefined, rhino); + + if (option.prototypejs) + combine(predefined, prototypejs); + + if (option.node) + combine(predefined, node); + + if (option.devel) + combine(predefined, devel); + + if (option.dojo) + combine(predefined, dojo); + + if (option.browser) + combine(predefined, browser); + + if (option.jquery) + combine(predefined, jquery); + + if (option.mootools) + combine(predefined, mootools); + + if (option.wsh) + combine(predefined, wsh); + + if (option.globalstrict && option.strict !== false) + option.strict = true; + } + + +// Produce an error warning. + + function quit(message, line, chr) { + var percentage = Math.floor((line / lines.length) * 100); + + throw { + name: 'JSHintError', + line: line, + character: chr, + message: message + " (" + percentage + "% scanned)." + }; + } + + function warning(m, t, a, b, c, d) { + var ch, l, w; + t = t || nexttoken; + if (t.id === '(end)') { // `~ + t = token; + } + l = t.line || 0; + ch = t.from || 0; + w = { + id: '(error)', + raw: m, + evidence: lines[l - 1] || '', + line: l, + character: ch, + a: a, + b: b, + c: c, + d: d + }; + w.reason = m.supplant(w); + JSHINT.errors.push(w); + if (option.passfail) { + quit('Stopping. ', l, ch); + } + warnings += 1; + if (warnings >= option.maxerr) { + quit("Too many errors.", l, ch); + } + return w; + } + + function warningAt(m, l, ch, a, b, c, d) { + return warning(m, { + line: l, + from: ch + }, a, b, c, d); + } + + function error(m, t, a, b, c, d) { + var w = warning(m, t, a, b, c, d); + quit("Stopping, unable to continue.", w.line, w.character); + } + + function errorAt(m, l, ch, a, b, c, d) { + return error(m, { + line: l, + from: ch + }, a, b, c, d); + } + + + +// lexical analysis and token construction + + var lex = (function lex() { + var character, from, line, s; + +// Private lex methods + + function nextLine() { + var at, + tw; // trailing whitespace check + + if (line >= lines.length) + return false; + + character = 1; + s = lines[line]; + line += 1; + at = s.search(/ \t/); + + if (at >= 0) + warningAt("Mixed spaces and tabs.", line, at + 1); + + s = s.replace(/\t/g, tab); + at = s.search(cx); + + if (at >= 0) + warningAt("Unsafe character.", line, at); + + if (option.maxlen && option.maxlen < s.length) + warningAt("Line too long.", line, s.length); + + // Check for trailing whitespaces + tw = s.search(/\s+$/); + if (option.trailing && ~tw && !~s.search(/^\s+$/)) + warningAt("Trailing whitespace.", line, tw); + + return true; + } + +// Produce a token object. The token inherits from a syntax symbol. + + function it(type, value) { + var i, t; + if (type === '(color)' || type === '(range)') { + t = {type: type}; + } else if (type === '(punctuator)' || + (type === '(identifier)' && is_own(syntax, value))) { + t = syntax[value] || syntax['(error)']; + } else { + t = syntax[type]; + } + t = Object.create(t); + if (type === '(string)' || type === '(range)') { + if (!option.scripturl && jx.test(value)) { + warningAt("Script URL.", line, from); + } + } + if (type === '(identifier)') { + t.identifier = true; + if (value === '__proto__' && !option.proto) { + warningAt("The '{a}' property is deprecated.", + line, from, value); + } else if (value === '__iterator__' && !option.iterator) { + warningAt("'{a}' is only available in JavaScript 1.7.", + line, from, value); + } else if (option.nomen && (value.charAt(0) === '_' || + value.charAt(value.length - 1) === '_')) { + warningAt("Unexpected {a} in '{b}'.", line, from, + "dangling '_'", value); + } + } + t.value = value; + t.line = line; + t.character = character; + t.from = from; + i = t.id; + if (i !== '(endline)') { + prereg = i && + (('(,=:[!&|?{};'.indexOf(i.charAt(i.length - 1)) >= 0) || + i === 'return'); + } + return t; + } + +// Public lex methods + + return { + init: function (source) { + if (typeof source === 'string') { + lines = source + .replace(/\r\n/g, '\n') + .replace(/\r/g, '\n') + .split('\n'); + } else { + lines = source; + } + + // If the first line is a shebang (#!), make it a blank and move on. + // Shebangs are used by Node scripts. + if (lines[0] && lines[0].substr(0, 2) == '#!') + lines[0] = ''; + + line = 0; + nextLine(); + from = 1; + }, + + range: function (begin, end) { + var c, value = ''; + from = character; + if (s.charAt(0) !== begin) { + errorAt("Expected '{a}' and instead saw '{b}'.", + line, character, begin, s.charAt(0)); + } + for (;;) { + s = s.slice(1); + character += 1; + c = s.charAt(0); + switch (c) { + case '': + errorAt("Missing '{a}'.", line, character, c); + break; + case end: + s = s.slice(1); + character += 1; + return it('(range)', value); + case '\\': + warningAt("Unexpected '{a}'.", line, character, c); + } + value += c; + } + + }, + +// token -- this is called by advance to get the next token. + + token: function () { + var b, c, captures, d, depth, high, i, l, low, q, t; + + function match(x) { + var r = x.exec(s), r1; + if (r) { + l = r[0].length; + r1 = r[1]; + c = r1.charAt(0); + s = s.substr(l); + from = character + l - r1.length; + character += l; + return r1; + } + } + + function string(x) { + var c, j, r = ''; + + if (jsonmode && x !== '"') { + warningAt("Strings must use doublequote.", + line, character); + } + + function esc(n) { + var i = parseInt(s.substr(j + 1, n), 16); + j += n; + if (i >= 32 && i <= 126 && + i !== 34 && i !== 92 && i !== 39) { + warningAt("Unnecessary escapement.", line, character); + } + character += n; + c = String.fromCharCode(i); + } + j = 0; + for (;;) { + while (j >= s.length) { + j = 0; + if (!nextLine()) { + errorAt("Unclosed string.", line, from); + } + } + c = s.charAt(j); + if (c === x) { + character += 1; + s = s.substr(j + 1); + return it('(string)', r, x); + } + if (c < ' ') { + if (c === '\n' || c === '\r') { + break; + } + warningAt("Control character in string: {a}.", + line, character + j, s.slice(0, j)); + } else if (c === '\\') { + j += 1; + character += 1; + c = s.charAt(j); + switch (c) { + case '\\': + case '"': + case '/': + break; + case '\'': + if (jsonmode) { + warningAt("Avoid \\'.", line, character); + } + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'u': + esc(4); + break; + case 'v': + if (jsonmode) { + warningAt("Avoid \\v.", line, character); + } + c = '\v'; + break; + case 'x': + if (jsonmode) { + warningAt("Avoid \\x-.", line, character); + } + esc(2); + break; + default: + warningAt("Bad escapement.", line, character); + } + } + r += c; + character += 1; + j += 1; + } + } + + for (;;) { + if (!s) { + return it(nextLine() ? '(endline)' : '(end)', ''); + } + t = match(tx); + if (!t) { + t = ''; + c = ''; + while (s && s < '!') { + s = s.substr(1); + } + if (s) { + errorAt("Unexpected '{a}'.", line, character, s.substr(0, 1)); + } + } else { + + // identifier + + if (c.isAlpha() || c === '_' || c === '$') { + return it('(identifier)', t); + } + + // number + + if (c.isDigit()) { + if (!isFinite(Number(t))) { + warningAt("Bad number '{a}'.", + line, character, t); + } + if (s.substr(0, 1).isAlpha()) { + warningAt("Missing space after '{a}'.", + line, character, t); + } + if (c === '0') { + d = t.substr(1, 1); + if (d.isDigit()) { + if (token.id !== '.') { + warningAt("Don't use extra leading zeros '{a}'.", + line, character, t); + } + } else if (jsonmode && (d === 'x' || d === 'X')) { + warningAt("Avoid 0x-. '{a}'.", + line, character, t); + } + } + if (t.substr(t.length - 1) === '.') { + warningAt( +"A trailing decimal point can be confused with a dot '{a}'.", line, character, t); + } + return it('(number)', t); + } + switch (t) { + + // string + + case '"': + case "'": + return string(t); + + // // comment + + case '//': + if (src) { + warningAt("Unexpected comment.", line, character); + } + s = ''; + token.comment = true; + break; + + // /* comment + + case '/*': + if (src) { + warningAt("Unexpected comment.", line, character); + } + for (;;) { + i = s.search(lx); + if (i >= 0) { + break; + } + if (!nextLine()) { + errorAt("Unclosed comment.", line, character); + } + } + character += i + 2; + if (s.substr(i, 1) === '/') { + errorAt("Nested comment.", line, character); + } + s = s.substr(i + 2); + token.comment = true; + break; + + // /*members /*jshint /*global + + case '/*members': + case '/*member': + case '/*jshint': + case '/*jslint': + case '/*global': + case '*/': + return { + value: t, + type: 'special', + line: line, + character: character, + from: from + }; + + case '': + break; + // / + case '/': + if (token.id === '/=') { + errorAt( +"A regular expression literal can be confused with '/='.", line, from); + } + if (prereg) { + depth = 0; + captures = 0; + l = 0; + for (;;) { + b = true; + c = s.charAt(l); + l += 1; + switch (c) { + case '': + errorAt("Unclosed regular expression.", + line, from); + return; + case '/': + if (depth > 0) { + warningAt("Unescaped '{a}'.", + line, from + l, '/'); + } + c = s.substr(0, l - 1); + q = { + g: true, + i: true, + m: true + }; + while (q[s.charAt(l)] === true) { + q[s.charAt(l)] = false; + l += 1; + } + character += l; + s = s.substr(l); + q = s.charAt(0); + if (q === '/' || q === '*') { + errorAt("Confusing regular expression.", + line, from); + } + return it('(regexp)', c); + case '\\': + c = s.charAt(l); + if (c < ' ') { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === '<') { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + break; + case '(': + depth += 1; + b = false; + if (s.charAt(l) === '?') { + l += 1; + switch (s.charAt(l)) { + case ':': + case '=': + case '!': + l += 1; + break; + default: + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, ':', s.charAt(l)); + } + } else { + captures += 1; + } + break; + case '|': + b = false; + break; + case ')': + if (depth === 0) { + warningAt("Unescaped '{a}'.", + line, from + l, ')'); + } else { + depth -= 1; + } + break; + case ' ': + q = 1; + while (s.charAt(l) === ' ') { + l += 1; + q += 1; + } + if (q > 1) { + warningAt( +"Spaces are hard to count. Use {{a}}.", line, from + l, q); + } + break; + case '[': + c = s.charAt(l); + if (c === '^') { + l += 1; + if (option.regexp) { + warningAt("Insecure '{a}'.", + line, from + l, c); + } else if (s.charAt(l) === ']') { + errorAt("Unescaped '{a}'.", + line, from + l, '^'); + } + } + q = false; + if (c === ']') { + warningAt("Empty class.", line, + from + l - 1); + q = true; + } +klass: do { + c = s.charAt(l); + l += 1; + switch (c) { + case '[': + case '^': + warningAt("Unescaped '{a}'.", + line, from + l, c); + q = true; + break; + case '-': + if (q) { + q = false; + } else { + warningAt("Unescaped '{a}'.", + line, from + l, '-'); + q = true; + } + break; + case ']': + if (!q && !option.regexdash) { + warningAt("Unescaped '{a}'.", + line, from + l - 1, '-'); + } + break klass; + case '\\': + c = s.charAt(l); + if (c < ' ') { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === '<') { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + q = true; + break; + case '/': + warningAt("Unescaped '{a}'.", + line, from + l - 1, '/'); + q = true; + break; + case '<': + q = true; + break; + default: + q = true; + } + } while (c); + break; + case '.': + if (option.regexp) { + warningAt("Insecure '{a}'.", line, + from + l, c); + } + break; + case ']': + case '?': + case '{': + case '}': + case '+': + case '*': + warningAt("Unescaped '{a}'.", line, + from + l, c); + } + if (b) { + switch (s.charAt(l)) { + case '?': + case '+': + case '*': + l += 1; + if (s.charAt(l) === '?') { + l += 1; + } + break; + case '{': + l += 1; + c = s.charAt(l); + if (c < '0' || c > '9') { + warningAt( +"Expected a number and instead saw '{a}'.", line, from + l, c); + } + l += 1; + low = +c; + for (;;) { + c = s.charAt(l); + if (c < '0' || c > '9') { + break; + } + l += 1; + low = +c + (low * 10); + } + high = low; + if (c === ',') { + l += 1; + high = Infinity; + c = s.charAt(l); + if (c >= '0' && c <= '9') { + l += 1; + high = +c; + for (;;) { + c = s.charAt(l); + if (c < '0' || c > '9') { + break; + } + l += 1; + high = +c + (high * 10); + } + } + } + if (s.charAt(l) !== '}') { + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, '}', c); + } else { + l += 1; + } + if (s.charAt(l) === '?') { + l += 1; + } + if (low > high) { + warningAt( +"'{a}' should not be greater than '{b}'.", line, from + l, low, high); + } + } + } + } + c = s.substr(0, l - 1); + character += l; + s = s.substr(l); + return it('(regexp)', c); + } + return it('(punctuator)', t); + + // punctuator + + case '#': + return it('(punctuator)', t); + default: + return it('(punctuator)', t); + } + } + } + } + }; + }()); + + + function addlabel(t, type) { + + if (t === 'hasOwnProperty') { + warning("'hasOwnProperty' is a really bad name."); + } + +// Define t in the current function in the current scope. + + if (is_own(funct, t) && !funct['(global)']) { + if (funct[t] === true) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + } else { + if (!option.shadow) + warning("'{a}' is already defined.", nexttoken, t); + } + } + + funct[t] = type; + if (funct['(global)']) { + global[t] = funct; + if (is_own(implied, t)) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + delete implied[t]; + } + } else { + scope[t] = funct; + } + } + + + function doOption() { + var b, obj, filter, o = nexttoken.value, t, v; + switch (o) { + case '*/': + error("Unbegun comment."); + break; + case '/*members': + case '/*member': + o = '/*members'; + if (!membersOnly) { + membersOnly = {}; + } + obj = membersOnly; + break; + case '/*jshint': + case '/*jslint': + obj = option; + filter = boolOptions; + break; + case '/*global': + obj = predefined; + break; + default: + error("What?"); + } + t = lex.token(); +loop: for (;;) { + for (;;) { + if (t.type === 'special' && t.value === '*/') { + break loop; + } + if (t.id !== '(endline)' && t.id !== ',') { + break; + } + t = lex.token(); + } + if (t.type !== '(string)' && t.type !== '(identifier)' && + o !== '/*members') { + error("Bad option.", t); + } + v = lex.token(); + if (v.id === ':') { + v = lex.token(); + if (obj === membersOnly) { + error("Expected '{a}' and instead saw '{b}'.", + t, '*/', ':'); + } + if (t.value === 'indent' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.white = true; + obj.indent = b; + } else if (t.value === 'maxerr' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.maxerr = b; + } else if (t.value === 'maxlen' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.maxlen = b; + } else if (v.value === 'true') { + obj[t.value] = true; + } else if (v.value === 'false') { + obj[t.value] = false; + } else { + error("Bad option value.", v); + } + t = lex.token(); + } else { + if (o === '/*jshint' || o === '/*jslint') { + error("Missing option value.", t); + } + obj[t.value] = false; + t = v; + } + } + if (filter) { + assume(); + } + } + + +// We need a peek function. If it has an argument, it peeks that much farther +// ahead. It is used to distinguish +// for ( var i in ... +// from +// for ( var i = ... + + function peek(p) { + var i = p || 0, j = 0, t; + + while (j <= i) { + t = lookahead[j]; + if (!t) { + t = lookahead[j] = lex.token(); + } + j += 1; + } + return t; + } + + + +// Produce the next token. It looks for programming errors. + + function advance(id, t) { + switch (token.id) { + case '(number)': + if (nexttoken.id === '.') { + warning("A dot following a number can be confused with a decimal point.", token); + } + break; + case '-': + if (nexttoken.id === '-' || nexttoken.id === '--') { + warning("Confusing minusses."); + } + break; + case '+': + if (nexttoken.id === '+' || nexttoken.id === '++') { + warning("Confusing plusses."); + } + break; + } + if (token.type === '(string)' || token.identifier) { + anonname = token.value; + } + + if (id && nexttoken.id !== id) { + if (t) { + if (nexttoken.id === '(end)') { + warning("Unmatched '{a}'.", t, t.id); + } else { + warning("Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", + nexttoken, id, t.id, t.line, nexttoken.value); + } + } else if (nexttoken.type !== '(identifier)' || + nexttoken.value !== id) { + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, id, nexttoken.value); + } + } + prevtoken = token; + token = nexttoken; + for (;;) { + nexttoken = lookahead.shift() || lex.token(); + if (nexttoken.id === '(end)' || nexttoken.id === '(error)') { + return; + } + if (nexttoken.type === 'special') { + doOption(); + } else { + if (nexttoken.id !== '(endline)') { + break; + } + } + } + } + + +// This is the heart of JSHINT, the Pratt parser. In addition to parsing, it +// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is +// like .nud except that it is only used on the first token of a statement. +// Having .fud makes it much easier to define statement-oriented languages like +// JavaScript. I retained Pratt's nomenclature. + +// .nud Null denotation +// .fud First null denotation +// .led Left denotation +// lbp Left binding power +// rbp Right binding power + +// They are elements of the parsing method called Top Down Operator Precedence. + + function expression(rbp, initial) { + var left, isArray = false; + + if (nexttoken.id === '(end)') + error("Unexpected early end of program.", token); + + advance(); + if (initial) { + anonname = 'anonymous'; + funct['(verb)'] = token.value; + } + if (initial === true && token.fud) { + left = token.fud(); + } else { + if (token.nud) { + left = token.nud(); + } else { + if (nexttoken.type === '(number)' && token.id === '.') { + warning("A leading decimal point can be confused with a dot: '.{a}'.", + token, nexttoken.value); + advance(); + return token; + } else { + error("Expected an identifier and instead saw '{a}'.", + token, token.id); + } + } + while (rbp < nexttoken.lbp) { + isArray = token.value == 'Array'; + advance(); + if (isArray && token.id == '(' && nexttoken.id == ')') + warning("Use the array literal notation [].", token); + if (token.led) { + left = token.led(left); + } else { + error("Expected an operator and instead saw '{a}'.", + token, token.id); + } + } + } + return left; + } + + +// Functions for conformance of style. + + function adjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white) { + if (left.character !== right.from && left.line === right.line) { + warning("Unexpected space after '{a}'.", right, left.value); + } + } + } + + function nobreak(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && (left.character !== right.from || left.line !== right.line)) { + warning("Unexpected space before '{a}'.", right, right.value); + } + } + + function nospace(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && !left.comment) { + if (left.line === right.line) { + adjacent(left, right); + } + } + } + + function nonadjacent(left, right) { + if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.line === right.line && left.character === right.from) { + warning("Missing space after '{a}'.", + nexttoken, left.value); + } + } + } + + function nobreaknonadjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (!option.laxbreak && left.line !== right.line) { + warning("Bad line breaking before '{a}'.", right, right.id); + } else if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.character === right.from) { + warning("Missing space after '{a}'.", + nexttoken, left.value); + } + } + } + + function indentation(bias) { + var i; + if (option.white && nexttoken.id !== '(end)') { + i = indent + (bias || 0); + if (nexttoken.from !== i) { + warning( +"Expected '{a}' to have an indentation at {b} instead at {c}.", + nexttoken, nexttoken.value, i, nexttoken.from); + } + } + } + + function nolinebreak(t) { + t = t || token; + if (t.line !== nexttoken.line) { + warning("Line breaking error '{a}'.", t, t.value); + } + } + + + function comma() { + if (token.line !== nexttoken.line) { + if (!option.laxbreak) { + warning("Bad line breaking before '{a}'.", token, nexttoken.id); + } + } else if (token.character !== nexttoken.from && option.white) { + warning("Unexpected space after '{a}'.", nexttoken, token.value); + } + advance(','); + nonadjacent(token, nexttoken); + } + + +// Functional constructors for making the symbols that will be inherited by +// tokens. + + function symbol(s, p) { + var x = syntax[s]; + if (!x || typeof x !== 'object') { + syntax[s] = x = { + id: s, + lbp: p, + value: s + }; + } + return x; + } + + + function delim(s) { + return symbol(s, 0); + } + + + function stmt(s, f) { + var x = delim(s); + x.identifier = x.reserved = true; + x.fud = f; + return x; + } + + + function blockstmt(s, f) { + var x = stmt(s, f); + x.block = true; + return x; + } + + + function reserveName(x) { + var c = x.id.charAt(0); + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + x.identifier = x.reserved = true; + } + return x; + } + + + function prefix(s, f) { + var x = symbol(s, 150); + reserveName(x); + x.nud = (typeof f === 'function') ? f : function () { + this.right = expression(150); + this.arity = 'unary'; + if (this.id === '++' || this.id === '--') { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!this.right.identifier || this.right.reserved) && + this.right.id !== '.' && this.right.id !== '[') { + warning("Bad operand.", this); + } + } + return this; + }; + return x; + } + + + function type(s, f) { + var x = delim(s); + x.type = s; + x.nud = f; + return x; + } + + + function reserve(s, f) { + var x = type(s, f); + x.identifier = x.reserved = true; + return x; + } + + + function reservevar(s, v) { + return reserve(s, function () { + if (typeof v === 'function') { + v(this); + } + return this; + }); + } + + + function infix(s, f, p, w) { + var x = symbol(s, p); + reserveName(x); + x.led = function (left) { + if (!w) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + } + if (typeof f === 'function') { + return f(left, this); + } else { + this.left = left; + this.right = expression(p); + return this; + } + }; + return x; + } + + + function relation(s, f) { + var x = symbol(s, 100); + x.led = function (left) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + var right = expression(100); + if ((left && left.id === 'NaN') || (right && right.id === 'NaN')) { + warning("Use the isNaN function to compare with NaN.", this); + } else if (f) { + f.apply(this, [left, right]); + } + if (left.id === '!') { + warning("Confusing use of '{a}'.", left, '!'); + } + if (right.id === '!') { + warning("Confusing use of '{a}'.", left, '!'); + } + this.left = left; + this.right = right; + return this; + }; + return x; + } + + + function isPoorRelation(node) { + return node && + ((node.type === '(number)' && +node.value === 0) || + (node.type === '(string)' && node.value === '') || + (node.type === 'null' && !option.eqnull) || + node.type === 'true' || + node.type === 'false' || + node.type === 'undefined'); + } + + + function assignop(s, f) { + symbol(s, 20).exps = true; + return infix(s, function (left, that) { + var l; + that.left = left; + if (predefined[left.value] === false && + scope[left.value]['(global)'] === true) { + warning("Read only.", left); + } else if (left['function']) { + warning("'{a}' is a function.", left, left.value); + } + if (left) { + if (left.id === '.' || left.id === '[') { + if (!left.left || left.left.value === 'arguments') { + warning('Bad assignment.', that); + } + that.right = expression(19); + return that; + } else if (left.identifier && !left.reserved) { + if (funct[left.value] === 'exception') { + warning("Do not assign to the exception parameter.", left); + } + that.right = expression(19); + return that; + } + if (left === syntax['function']) { + warning( +"Expected an identifier in an assignment and instead saw a function invocation.", + token); + } + } + error("Bad assignment.", that); + }, 20); + } + + + function bitwise(s, f, p) { + var x = symbol(s, p); + reserveName(x); + x.led = (typeof f === 'function') ? f : function (left) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", this, this.id); + } + this.left = left; + this.right = expression(p); + return this; + }; + return x; + } + + + function bitwiseassignop(s) { + symbol(s, 20).exps = true; + return infix(s, function (left, that) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", that, that.id); + } + nonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + if (left) { + if (left.id === '.' || left.id === '[' || + (left.identifier && !left.reserved)) { + expression(19); + return that; + } + if (left === syntax['function']) { + warning( +"Expected an identifier in an assignment, and instead saw a function invocation.", + token); + } + return that; + } + error("Bad assignment.", that); + }, 20); + } + + + function suffix(s, f) { + var x = symbol(s, 150); + x.led = function (left) { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!left.identifier || left.reserved) && + left.id !== '.' && left.id !== '[') { + warning("Bad operand.", this); + } + this.left = left; + return this; + }; + return x; + } + + + // fnparam means that this identifier is being defined as a function + // argument (see identifier()) + function optionalidentifier(fnparam) { + if (nexttoken.identifier) { + advance(); + if (token.reserved && !option.es5) { + // `undefined` as a function param is a common pattern to protect + // against the case when somebody does `undefined = true` and + // help with minification. More info: https://gist.github.com/315916 + if (!fnparam || token.value != 'undefined') { + warning("Expected an identifier and instead saw '{a}' (a reserved word).", + token, token.id); + } + } + return token.value; + } + } + + // fnparam means that this identifier is being defined as a function + // argument + function identifier(fnparam) { + var i = optionalidentifier(fnparam); + if (i) { + return i; + } + if (token.id === 'function' && nexttoken.id === '(') { + warning("Missing name in function declaration."); + } else { + error("Expected an identifier and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + } + + + function reachable(s) { + var i = 0, t; + if (nexttoken.id !== ';' || noreach) { + return; + } + for (;;) { + t = peek(i); + if (t.reach) { + return; + } + if (t.id !== '(endline)') { + if (t.id === 'function') { + warning( +"Inner functions should be listed at the top of the outer function.", t); + break; + } + warning("Unreachable '{a}' after '{b}'.", t, t.value, s); + break; + } + i += 1; + } + } + + + function statement(noindent) { + var i = indent, r, s = scope, t = nexttoken; + +// We don't like the empty statement. + + if (t.id === ';') { + warning("Unnecessary semicolon.", t); + advance(';'); + return; + } + +// Is this a labelled statement? + + if (t.identifier && !t.reserved && peek().id === ':') { + advance(); + advance(':'); + scope = Object.create(s); + addlabel(t.value, 'label'); + if (!nexttoken.labelled) { + warning("Label '{a}' on {b} statement.", + nexttoken, t.value, nexttoken.value); + } + if (jx.test(t.value + ':')) { + warning("Label '{a}' looks like a javascript url.", + t, t.value); + } + nexttoken.label = t.value; + t = nexttoken; + } + +// Parse the statement. + + if (!noindent) { + indentation(); + } + r = expression(0, true); + +// Look for the final semicolon. + + if (!t.block) { + if (!option.expr && (!r || !r.exps)) { + warning("Expected an assignment or function call and instead saw an expression.", + token); + } else if (option.nonew && r.id === '(' && r.left.id === 'new') { + warning("Do not use 'new' for side effects."); + } + if (nexttoken.id !== ';') { + if (!option.asi && !(option.lastsemic && nexttoken.id == '}' && + nexttoken.line == token.line)) { + warningAt("Missing semicolon.", token.line, token.from + token.value.length); + } + } else { + adjacent(token, nexttoken); + advance(';'); + nonadjacent(token, nexttoken); + } + } + +// Restore the indentation. + + indent = i; + scope = s; + return r; + } + + + function use_strict() { + if (nexttoken.value === 'use strict') { + if (strict_mode) { + warning("Unnecessary \"use strict\"."); + } + advance(); + advance(';'); + strict_mode = true; + option.newcap = true; + option.undef = true; + return true; + } else { + return false; + } + } + + + function statements(begin) { + var a = [], f, p; + + while (!nexttoken.reach && nexttoken.id !== '(end)') { + if (nexttoken.id === ';') { + warning("Unnecessary semicolon."); + advance(';'); + } else { + a.push(statement()); + } + } + return a; + } + + + /* + * Parses a single block. A block is a sequence of statements wrapped in + * braces. + * + * ordinary - true for everything but function bodies and try blocks. + * stmt - true if block can be a single statement (e.g. in if/for/while). + */ + function block(ordinary, stmt) { + var a, + b = inblock, + old_indent = indent, + m = strict_mode, + s = scope, + t; + + inblock = ordinary; + scope = Object.create(scope); + nonadjacent(token, nexttoken); + t = nexttoken; + + if (nexttoken.id === '{') { + advance('{'); + if (nexttoken.id !== '}' || token.line !== nexttoken.line) { + indent += option.indent; + while (!ordinary && nexttoken.from > indent) { + indent += option.indent; + } + if (!ordinary && !use_strict() && !m && option.strict && + funct['(context)']['(global)']) { + warning("Missing \"use strict\" statement."); + } + a = statements(); + strict_mode = m; + indent -= option.indent; + indentation(); + } + advance('}', t); + indent = old_indent; + } else if (!ordinary) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, '{', nexttoken.value); + } else { + if (!stmt || option.curly) + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, '{', nexttoken.value); + + noreach = true; + a = [statement()]; + noreach = false; + } + funct['(verb)'] = null; + scope = s; + inblock = b; + if (ordinary && option.noempty && (!a || a.length === 0)) { + warning("Empty block."); + } + return a; + } + + + function countMember(m) { + if (membersOnly && typeof membersOnly[m] !== 'boolean') { + warning("Unexpected /*member '{a}'.", token, m); + } + if (typeof member[m] === 'number') { + member[m] += 1; + } else { + member[m] = 1; + } + } + + + function note_implied(token) { + var name = token.value, line = token.line, a = implied[name]; + if (typeof a === 'function') { + a = false; + } + if (!a) { + a = [line]; + implied[name] = a; + } else if (a[a.length - 1] !== line) { + a.push(line); + } + } + +// Build the syntax table by declaring the syntactic elements of the language. + + type('(number)', function () { + return this; + }); + type('(string)', function () { + return this; + }); + + syntax['(identifier)'] = { + type: '(identifier)', + lbp: 0, + identifier: true, + nud: function () { + var v = this.value, + s = scope[v], + f; + if (typeof s === 'function') { + +// Protection against accidental inheritance. + + s = undefined; + } else if (typeof s === 'boolean') { + f = funct; + funct = functions[0]; + addlabel(v, 'var'); + s = funct; + funct = f; + } + +// The name is in scope and defined in the current function. + + if (funct === s) { + +// Change 'unused' to 'var', and reject labels. + + switch (funct[v]) { + case 'unused': + funct[v] = 'var'; + break; + case 'unction': + funct[v] = 'function'; + this['function'] = true; + break; + case 'function': + this['function'] = true; + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + break; + } + +// The name is not defined in the function. If we are in the global scope, +// then we have an undefined variable. +// +// Operators typeof and delete do not raise runtime errors even if the base +// object of a reference is null so no need to display warning if we're +// inside of typeof or delete. + + } else if (funct['(global)']) { + if (anonname != 'typeof' && anonname != 'delete' && + option.undef && typeof predefined[v] !== 'boolean') { + warning("'{a}' is not defined.", token, v); + } + note_implied(token); + +// If the name is already defined in the current +// function, but not as outer, then there is a scope error. + + } else { + switch (funct[v]) { + case 'closure': + case 'function': + case 'var': + case 'unused': + warning("'{a}' used out of scope.", token, v); + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + break; + case 'outer': + case 'global': + break; + default: + +// If the name is defined in an outer function, make an outer entry, and if +// it was unused, make it var. + + if (s === true) { + funct[v] = true; + } else if (s === null) { + warning("'{a}' is not allowed.", token, v); + note_implied(token); + } else if (typeof s !== 'object') { + +// Operators typeof and delete do not raise runtime errors even if the base object of +// a reference is null so no need to display warning if we're inside of typeof or delete. + + if (anonname != 'typeof' && anonname != 'delete' && option.undef) { + warning("'{a}' is not defined.", token, v); + } else { + funct[v] = true; + } + note_implied(token); + } else { + switch (s[v]) { + case 'function': + case 'unction': + this['function'] = true; + s[v] = 'closure'; + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'var': + case 'unused': + s[v] = 'closure'; + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'closure': + case 'parameter': + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + } + } + } + } + return this; + }, + led: function () { + error("Expected an operator and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + }; + + type('(regexp)', function () { + return this; + }); + + +// ECMAScript parser + + delim('(endline)'); + delim('(begin)'); + delim('(end)').reach = true; + delim(''); + delim('(error)').reach = true; + delim('}').reach = true; + delim(')'); + delim(']'); + delim('"').reach = true; + delim("'").reach = true; + delim(';'); + delim(':').reach = true; + delim(','); + delim('#'); + delim('@'); + reserve('else'); + reserve('case').reach = true; + reserve('catch'); + reserve('default').reach = true; + reserve('finally'); + reservevar('arguments', function (x) { + if (strict_mode && funct['(global)']) { + warning("Strict violation.", x); + } + }); + reservevar('eval'); + reservevar('false'); + reservevar('Infinity'); + reservevar('NaN'); + reservevar('null'); + reservevar('this', function (x) { + if (strict_mode && ((funct['(statement)'] && + funct['(name)'].charAt(0) > 'Z') || funct['(global)'])) { + warning("Strict violation.", x); + } + }); + reservevar('true'); + reservevar('undefined'); + assignop('=', 'assign', 20); + assignop('+=', 'assignadd', 20); + assignop('-=', 'assignsub', 20); + assignop('*=', 'assignmult', 20); + assignop('/=', 'assigndiv', 20).nud = function () { + error("A regular expression literal can be confused with '/='."); + }; + assignop('%=', 'assignmod', 20); + bitwiseassignop('&=', 'assignbitand', 20); + bitwiseassignop('|=', 'assignbitor', 20); + bitwiseassignop('^=', 'assignbitxor', 20); + bitwiseassignop('<<=', 'assignshiftleft', 20); + bitwiseassignop('>>=', 'assignshiftright', 20); + bitwiseassignop('>>>=', 'assignshiftrightunsigned', 20); + infix('?', function (left, that) { + that.left = left; + that.right = expression(10); + advance(':'); + that['else'] = expression(10); + return that; + }, 30); + + infix('||', 'or', 40); + infix('&&', 'and', 50); + bitwise('|', 'bitor', 70); + bitwise('^', 'bitxor', 80); + bitwise('&', 'bitand', 90); + relation('==', function (left, right) { + var eqnull = option.eqnull && + (left.value == 'null' || right.value == 'null'); + + if (!eqnull && option.eqeqeq) { + warning("Expected '{a}' and instead saw '{b}'.", + this, '===', '=='); + } else if (isPoorRelation(left)) { + warning("Use '{a}' to compare with '{b}'.", + this, '===', left.value); + } else if (isPoorRelation(right)) { + warning("Use '{a}' to compare with '{b}'.", + this, '===', right.value); + } + return this; + }); + relation('==='); + relation('!=', function (left, right) { + var eqnull = option.eqnull && + (left.value == 'null' || right.value == 'null'); + + if (!eqnull && option.eqeqeq) { + warning("Expected '{a}' and instead saw '{b}'.", + this, '!==', '!='); + } else if (isPoorRelation(left)) { + warning("Use '{a}' to compare with '{b}'.", + this, '!==', left.value); + } else if (isPoorRelation(right)) { + warning("Use '{a}' to compare with '{b}'.", + this, '!==', right.value); + } + return this; + }); + relation('!=='); + relation('<'); + relation('>'); + relation('<='); + relation('>='); + bitwise('<<', 'shiftleft', 120); + bitwise('>>', 'shiftright', 120); + bitwise('>>>', 'shiftrightunsigned', 120); + infix('in', 'in', 120); + infix('instanceof', 'instanceof', 120); + infix('+', function (left, that) { + var right = expression(130); + if (left && right && left.id === '(string)' && right.id === '(string)') { + left.value += right.value; + left.character = right.character; + if (!option.scripturl && jx.test(left.value)) { + warning("JavaScript URL.", left); + } + return left; + } + that.left = left; + that.right = right; + return that; + }, 130); + prefix('+', 'num'); + prefix('+++', function () { + warning("Confusing pluses."); + this.right = expression(150); + this.arity = 'unary'; + return this; + }); + infix('+++', function (left) { + warning("Confusing pluses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix('-', 'sub', 130); + prefix('-', 'neg'); + prefix('---', function () { + warning("Confusing minuses."); + this.right = expression(150); + this.arity = 'unary'; + return this; + }); + infix('---', function (left) { + warning("Confusing minuses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix('*', 'mult', 140); + infix('/', 'div', 140); + infix('%', 'mod', 140); + + suffix('++', 'postinc'); + prefix('++', 'preinc'); + syntax['++'].exps = true; + + suffix('--', 'postdec'); + prefix('--', 'predec'); + syntax['--'].exps = true; + prefix('delete', function () { + var p = expression(0); + if (!p || (p.id !== '.' && p.id !== '[')) { + warning("Variables should not be deleted."); + } + this.first = p; + return this; + }).exps = true; + + prefix('~', function () { + if (option.bitwise) { + warning("Unexpected '{a}'.", this, '~'); + } + expression(150); + return this; + }); + + prefix('!', function () { + this.right = expression(150); + this.arity = 'unary'; + if (bang[this.right.id] === true) { + warning("Confusing use of '{a}'.", this, '!'); + } + return this; + }); + prefix('typeof', 'typeof'); + prefix('new', function () { + var c = expression(155), i; + if (c && c.id !== 'function') { + if (c.identifier) { + c['new'] = true; + switch (c.value) { + case 'Object': + warning("Use the object literal notation {}.", token); + break; + case 'Number': + case 'String': + case 'Boolean': + case 'Math': + case 'JSON': + warning("Do not use {a} as a constructor.", token, c.value); + break; + case 'Function': + if (!option.evil) { + warning("The Function constructor is eval."); + } + break; + case 'Date': + case 'RegExp': + break; + default: + if (c.id !== 'function') { + i = c.value.substr(0, 1); + if (option.newcap && (i < 'A' || i > 'Z')) { + warning("A constructor name should start with "+ + "an uppercase letter.", token); + } + } + } + } else { + if (c.id !== '.' && c.id !== '[' && c.id !== '(') { + warning("Bad constructor.", token); + } + } + } else { + if (!option.supernew) + warning("Weird construction. Delete 'new'.", this); + } + adjacent(token, nexttoken); + if (nexttoken.id !== '(' && !option.supernew) { + warning("Missing '()' invoking a constructor."); + } + this.first = c; + return this; + }); + syntax['new'].exps = true; + + prefix('void').exps = true; + + infix('.', function (left, that) { + adjacent(prevtoken, token); + nobreak(); + var m = identifier(); + if (typeof m === 'string') { + countMember(m); + } + that.left = left; + that.right = m; + if (option.noarg && left && left.value === 'arguments' && + (m === 'callee' || m === 'caller')) { + warning("Avoid arguments.{a}.", left, m); + } else if (!option.evil && left && left.value === 'document' && + (m === 'write' || m === 'writeln')) { + warning("document.write can be a form of eval.", left); + } + if (!option.evil && (m === 'eval' || m === 'execScript')) { + warning('eval is evil.'); + } + return that; + }, 160, true); + + infix('(', function (left, that) { + if (prevtoken.id !== '}' && prevtoken.id !== ')') { + nobreak(prevtoken, token); + } + nospace(); + if (option.immed && !left.immed && left.id === 'function') { + warning("Wrap an immediate function invocation in parentheses " + + "to assist the reader in understanding that the expression " + + "is the result of a function, and not the function itself."); + } + var n = 0, + p = []; + if (left) { + if (left.type === '(identifier)') { + if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { + if (left.value !== 'Number' && left.value !== 'String' && + left.value !== 'Boolean' && + left.value !== 'Date') { + if (left.value === 'Math') { + warning("Math is not a function.", left); + } else if (option.newcap) { + warning( +"Missing 'new' prefix when invoking a constructor.", left); + } + } + } + } + } + if (nexttoken.id !== ')') { + for (;;) { + p[p.length] = expression(10); + n += 1; + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + advance(')'); + nospace(prevtoken, token); + if (typeof left === 'object') { + if (left.value === 'parseInt' && n === 1) { + warning("Missing radix parameter.", left); + } + if (!option.evil) { + if (left.value === 'eval' || left.value === 'Function' || + left.value === 'execScript') { + warning("eval is evil.", left); + } else if (p[0] && p[0].id === '(string)' && + (left.value === 'setTimeout' || + left.value === 'setInterval')) { + warning( + "Implied eval is evil. Pass a function instead of a string.", left); + } + } + if (!left.identifier && left.id !== '.' && left.id !== '[' && + left.id !== '(' && left.id !== '&&' && left.id !== '||' && + left.id !== '?') { + warning("Bad invocation.", left); + } + } + that.left = left; + return that; + }, 155, true).exps = true; + + prefix('(', function () { + nospace(); + if (nexttoken.id === 'function') { + nexttoken.immed = true; + } + var v = expression(0); + advance(')', this); + nospace(prevtoken, token); + if (option.immed && v.id === 'function') { + if (nexttoken.id === '(') { + warning( +"Move the invocation into the parens that contain the function.", nexttoken); + } else { + warning( +"Do not wrap function literals in parens unless they are to be immediately invoked.", + this); + } + } + return v; + }); + + infix('[', function (left, that) { + nobreak(prevtoken, token); + nospace(); + var e = expression(0), s; + if (e && e.type === '(string)') { + if (!option.evil && (e.value === 'eval' || e.value === 'execScript')) { + warning("eval is evil.", that); + } + countMember(e.value); + if (!option.sub && ix.test(e.value)) { + s = syntax[e.value]; + if (!s || !s.reserved) { + warning("['{a}'] is better written in dot notation.", + e, e.value); + } + } + } + advance(']', that); + nospace(prevtoken, token); + that.left = left; + that.right = e; + return that; + }, 160, true); + + prefix('[', function () { + var b = token.line !== nexttoken.line; + this.first = []; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + while (nexttoken.id !== '(end)') { + while (nexttoken.id === ',') { + warning("Extra comma."); + advance(','); + } + if (nexttoken.id === ']') { + break; + } + if (b && token.line !== nexttoken.line) { + indentation(); + } + this.first.push(expression(10)); + if (nexttoken.id === ',') { + comma(); + if (nexttoken.id === ']' && !option.es5) { + warning("Extra comma.", token); + break; + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance(']', this); + return this; + }, 160); + + + function property_name() { + var id = optionalidentifier(true); + if (!id) { + if (nexttoken.id === '(string)') { + id = nexttoken.value; + advance(); + } else if (nexttoken.id === '(number)') { + id = nexttoken.value.toString(); + advance(); + } + } + return id; + } + + + function functionparams() { + var i, t = nexttoken, p = []; + advance('('); + nospace(); + if (nexttoken.id === ')') { + advance(')'); + nospace(prevtoken, token); + return; + } + for (;;) { + i = identifier(true); + p.push(i); + addlabel(i, 'parameter'); + if (nexttoken.id === ',') { + comma(); + } else { + advance(')', t); + nospace(prevtoken, token); + return p; + } + } + } + + + function doFunction(i, statement) { + var f, + oldOption = option, + oldScope = scope; + + option = Object.create(option); + scope = Object.create(scope); + + funct = { + '(name)' : i || '"' + anonname + '"', + '(line)' : nexttoken.line, + '(context)' : funct, + '(breakage)' : 0, + '(loopage)' : 0, + '(scope)' : scope, + '(statement)': statement + }; + f = funct; + token.funct = funct; + functions.push(funct); + if (i) { + addlabel(i, 'function'); + } + funct['(params)'] = functionparams(); + + block(false); + scope = oldScope; + option = oldOption; + funct['(last)'] = token.line; + funct = funct['(context)']; + return f; + } + + + (function (x) { + x.nud = function () { + var b, f, i, j, p, seen = {}, t; + + b = token.line !== nexttoken.line; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + for (;;) { + if (nexttoken.id === '}') { + break; + } + if (b) { + indentation(); + } + if (nexttoken.value === 'get' && peek().id !== ':') { + advance('get'); + if (!option.es5) { + error("get/set are ES5 features."); + } + i = property_name(); + if (!i) { + error("Missing property name."); + } + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + if (!option.loopfunc && funct['(loopage)']) { + warning("Don't make functions within a loop.", t); + } + p = f['(params)']; + if (p) { + warning("Unexpected parameter '{a}' in get {b} function.", t, p[0], i); + } + adjacent(token, nexttoken); + advance(','); + indentation(); + advance('set'); + j = property_name(); + if (i !== j) { + error("Expected {a} and instead saw {b}.", token, i, j); + } + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + p = f['(params)']; + if (!p || p.length !== 1 || p[0] !== 'value') { + warning("Expected (value) in set {a} function.", t, i); + } + } else { + i = property_name(); + if (typeof i !== 'string') { + break; + } + advance(':'); + nonadjacent(token, nexttoken); + expression(10); + } + if (seen[i] === true) { + warning("Duplicate member '{a}'.", nexttoken, i); + } + seen[i] = true; + countMember(i); + if (nexttoken.id === ',') { + comma(); + if (nexttoken.id === ',') { + warning("Extra comma.", token); + } else if (nexttoken.id === '}' && !option.es5) { + warning("Extra comma.", token); + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance('}', this); + return this; + }; + x.fud = function () { + error("Expected to see a statement and instead saw a block.", token); + }; + }(delim('{'))); + + var varstatement = stmt('var', function (prefix) { + // JavaScript does not have block scope. It only has function scope. So, + // declaring a variable in a block can have unexpected consequences. + var id, name, value; + + if (funct['(onevar)'] && option.onevar) { + warning("Too many var statements."); + } else if (!funct['(global)']) { + funct['(onevar)'] = true; + } + this.first = []; + for (;;) { + nonadjacent(token, nexttoken); + id = identifier(); + if (funct['(global)'] && predefined[id] === false) { + warning("Redefinition of '{a}'.", token, id); + } + addlabel(id, 'unused'); + if (prefix) { + break; + } + name = token; + this.first.push(token); + if (nexttoken.id === '=') { + nonadjacent(token, nexttoken); + advance('='); + nonadjacent(token, nexttoken); + if (nexttoken.id === 'undefined') { + warning("It is not necessary to initialize '{a}' to 'undefined'.", token, id); + } + if (peek(0).id === '=' && nexttoken.identifier) { + error("Variable {a} was not declared correctly.", + nexttoken, nexttoken.value); + } + value = expression(0); + name.first = value; + } + if (nexttoken.id !== ',') { + break; + } + comma(); + } + return this; + }); + varstatement.exps = true; + + blockstmt('function', function () { + if (inblock) { + warning("Function declarations should not be placed in blocks. " + + "Use a function expression or move the statement to the top of " + + "the outer function.", token); + + } + var i = identifier(); + adjacent(token, nexttoken); + addlabel(i, 'unction'); + doFunction(i, true); + if (nexttoken.id === '(' && nexttoken.line === token.line) { + error( +"Function declarations are not invocable. Wrap the whole function invocation in parens."); + } + return this; + }); + + prefix('function', function () { + var i = optionalidentifier(); + if (i) { + adjacent(token, nexttoken); + } else { + nonadjacent(token, nexttoken); + } + doFunction(i); + if (!option.loopfunc && funct['(loopage)']) { + warning("Don't make functions within a loop."); + } + return this; + }); + + blockstmt('if', function () { + var t = nexttoken; + advance('('); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + if (nexttoken.id === 'else') { + nonadjacent(token, nexttoken); + advance('else'); + if (nexttoken.id === 'if' || nexttoken.id === 'switch') { + statement(true); + } else { + block(true, true); + } + } + return this; + }); + + blockstmt('try', function () { + var b, e, s; + + block(false); + if (nexttoken.id === 'catch') { + advance('catch'); + nonadjacent(token, nexttoken); + advance('('); + s = scope; + scope = Object.create(s); + e = nexttoken.value; + if (nexttoken.type !== '(identifier)') { + warning("Expected an identifier and instead saw '{a}'.", + nexttoken, e); + } else { + addlabel(e, 'exception'); + } + advance(); + advance(')'); + block(false); + b = true; + scope = s; + } + if (nexttoken.id === 'finally') { + advance('finally'); + block(false); + return; + } else if (!b) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, 'catch', nexttoken.value); + } + return this; + }); + + blockstmt('while', function () { + var t = nexttoken; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }).labelled = true; + + reserve('with'); + + blockstmt('switch', function () { + var t = nexttoken, + g = false; + funct['(breakage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + this.condition = expression(20); + advance(')', t); + nospace(prevtoken, token); + nonadjacent(token, nexttoken); + t = nexttoken; + advance('{'); + nonadjacent(token, nexttoken); + indent += option.indent; + this.cases = []; + for (;;) { + switch (nexttoken.id) { + case 'case': + switch (funct['(verb)']) { + case 'break': + case 'case': + case 'continue': + case 'return': + case 'switch': + case 'throw': + break; + default: + // You can tell JSHint that you don't use break intentionally by + // adding a comment /* falls through */ on a line just before + // the next `case`. + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'case'.", + token); + } + } + indentation(-option.indent); + advance('case'); + this.cases.push(expression(20)); + g = true; + advance(':'); + funct['(verb)'] = 'case'; + break; + case 'default': + switch (funct['(verb)']) { + case 'break': + case 'continue': + case 'return': + case 'throw': + break; + default: + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'default'.", + token); + } + } + indentation(-option.indent); + advance('default'); + g = true; + advance(':'); + break; + case '}': + indent -= option.indent; + indentation(); + advance('}', t); + if (this.cases.length === 1 || this.condition.id === 'true' || + this.condition.id === 'false') { + warning("This 'switch' should be an 'if'.", this); + } + funct['(breakage)'] -= 1; + funct['(verb)'] = undefined; + return; + case '(end)': + error("Missing '{a}'.", nexttoken, '}'); + return; + default: + if (g) { + switch (token.id) { + case ',': + error("Each value should have its own case label."); + return; + case ':': + statements(); + break; + default: + error("Missing ':' on a case clause.", token); + } + } else { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, 'case', nexttoken.value); + } + } + } + }).labelled = true; + + stmt('debugger', function () { + if (!option.debug) { + warning("All 'debugger' statements should be removed."); + } + return this; + }).exps = true; + + (function () { + var x = stmt('do', function () { + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + this.first = block(true); + advance('while'); + var t = nexttoken; + nonadjacent(token, t); + advance('('); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }); + x.labelled = true; + x.exps = true; + }()); + + blockstmt('for', function () { + var s, t = nexttoken; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + if (peek(nexttoken.id === 'var' ? 1 : 0).id === 'in') { + if (nexttoken.id === 'var') { + advance('var'); + varstatement.fud.call(varstatement, true); + } else { + switch (funct[nexttoken.value]) { + case 'unused': + funct[nexttoken.value] = 'var'; + break; + case 'var': + break; + default: + warning("Bad for in variable '{a}'.", + nexttoken, nexttoken.value); + } + advance(); + } + advance('in'); + expression(20); + advance(')', t); + s = block(true, true); + if (option.forin && (s.length > 1 || typeof s[0] !== 'object' || + s[0].value !== 'if')) { + warning("The body of a for in should be wrapped in an if statement to filter " + + "unwanted properties from the prototype.", this); + } + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + } else { + if (nexttoken.id !== ';') { + if (nexttoken.id === 'var') { + advance('var'); + varstatement.fud.call(varstatement); + } else { + for (;;) { + expression(0, 'for'); + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + } + nolinebreak(token); + advance(';'); + if (nexttoken.id !== ';') { + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + } + nolinebreak(token); + advance(';'); + if (nexttoken.id === ';') { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, ')', ';'); + } + if (nexttoken.id !== ')') { + for (;;) { + expression(0, 'for'); + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + } + }).labelled = true; + + + stmt('break', function () { + var v = nexttoken.value; + if (funct['(breakage)'] === 0) { + warning("Unexpected '{a}'.", nexttoken, this.value); + } + nolinebreak(this); + if (nexttoken.id !== ';') { + if (token.line === nexttoken.line) { + if (funct[v] !== 'label') { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } + reachable('break'); + return this; + }).exps = true; + + + stmt('continue', function () { + var v = nexttoken.value; + if (funct['(breakage)'] === 0) { + warning("Unexpected '{a}'.", nexttoken, this.value); + } + nolinebreak(this); + if (nexttoken.id !== ';') { + if (token.line === nexttoken.line) { + if (funct[v] !== 'label') { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } else if (!funct['(loopage)']) { + warning("Unexpected '{a}'.", nexttoken, this.value); + } + reachable('continue'); + return this; + }).exps = true; + + + stmt('return', function () { + nolinebreak(this); + if (nexttoken.id === '(regexp)') { + warning("Wrap the /regexp/ literal in parens to disambiguate the slash operator."); + } + if (nexttoken.id !== ';' && !nexttoken.reach) { + nonadjacent(token, nexttoken); + this.first = expression(20); + } + reachable('return'); + return this; + }).exps = true; + + + stmt('throw', function () { + nolinebreak(this); + nonadjacent(token, nexttoken); + this.first = expression(20); + reachable('throw'); + return this; + }).exps = true; + +// Superfluous reserved words + + reserve('class'); + reserve('const'); + reserve('enum'); + reserve('export'); + reserve('extends'); + reserve('import'); + reserve('super'); + + reserve('let'); + reserve('yield'); + reserve('implements'); + reserve('interface'); + reserve('package'); + reserve('private'); + reserve('protected'); + reserve('public'); + reserve('static'); + + +// Parse JSON + + function jsonValue() { + + function jsonObject() { + var o = {}, t = nexttoken; + advance('{'); + if (nexttoken.id !== '}') { + for (;;) { + if (nexttoken.id === '(end)') { + error("Missing '}' to match '{' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === '}') { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ',') { + error("Unexpected comma.", nexttoken); + } else if (nexttoken.id !== '(string)') { + warning("Expected a string and instead saw {a}.", + nexttoken, nexttoken.value); + } + if (o[nexttoken.value] === true) { + warning("Duplicate key '{a}'.", + nexttoken, nexttoken.value); + } else if ((nexttoken.value === '__proto__' && + !option.proto) || (nexttoken.value === '__iterator__' && + !option.iterator)) { + warning("The '{a}' key may produce unexpected results.", + nexttoken, nexttoken.value); + } else { + o[nexttoken.value] = true; + } + advance(); + advance(':'); + jsonValue(); + if (nexttoken.id !== ',') { + break; + } + advance(','); + } + } + advance('}'); + } + + function jsonArray() { + var t = nexttoken; + advance('['); + if (nexttoken.id !== ']') { + for (;;) { + if (nexttoken.id === '(end)') { + error("Missing ']' to match '[' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === ']') { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ',') { + error("Unexpected comma.", nexttoken); + } + jsonValue(); + if (nexttoken.id !== ',') { + break; + } + advance(','); + } + } + advance(']'); + } + + switch (nexttoken.id) { + case '{': + jsonObject(); + break; + case '[': + jsonArray(); + break; + case 'true': + case 'false': + case 'null': + case '(number)': + case '(string)': + advance(); + break; + case '-': + advance('-'); + if (token.character !== nexttoken.from) { + warning("Unexpected space after '-'.", token); + } + adjacent(token, nexttoken); + advance('(number)'); + break; + default: + error("Expected a JSON value.", nexttoken); + } + } + + +// The actual JSHINT function itself. + + var itself = function (s, o, g) { + var a, i, k; + JSHINT.errors = []; + predefined = Object.create(standard); + combine(predefined, g || {}); + if (o) { + a = o.predef; + if (a) { + if (Array.isArray(a)) { + for (i = 0; i < a.length; i += 1) { + predefined[a[i]] = true; + } + } else if (typeof a === 'object') { + k = Object.keys(a); + for (i = 0; i < k.length; i += 1) { + predefined[k[i]] = !!a[k[i]]; + } + } + } + option = o; + } else { + option = {}; + } + option.indent = option.indent || 4; + option.maxerr = option.maxerr || 50; + + tab = ''; + for (i = 0; i < option.indent; i += 1) { + tab += ' '; + } + indent = 1; + global = Object.create(predefined); + scope = global; + funct = { + '(global)': true, + '(name)': '(global)', + '(scope)': scope, + '(breakage)': 0, + '(loopage)': 0 + }; + functions = [funct]; + urls = []; + src = false; + stack = null; + member = {}; + membersOnly = null; + implied = {}; + inblock = false; + lookahead = []; + jsonmode = false; + warnings = 0; + lex.init(s); + prereg = true; + strict_mode = false; + + prevtoken = token = nexttoken = syntax['(begin)']; + assume(); + + try { + advance(); + switch (nexttoken.id) { + case '{': + case '[': + option.laxbreak = true; + jsonmode = true; + jsonValue(); + break; + default: + if (nexttoken.value === 'use strict') { + if (!option.globalstrict) + warning("Use the function form of \"use strict\"."); + use_strict(); + } + statements('lib'); + } + advance('(end)'); + } catch (e) { + if (e) { + JSHINT.errors.push({ + reason : e.message, + line : e.line || nexttoken.line, + character : e.character || nexttoken.from + }, null); + } + } + return JSHINT.errors.length === 0; + }; + + +// Data summary. + + itself.data = function () { + + var data = {functions: []}, fu, globals, implieds = [], f, i, j, + members = [], n, unused = [], v; + if (itself.errors.length) { + data.errors = itself.errors; + } + + if (jsonmode) { + data.json = true; + } + + for (n in implied) { + if (is_own(implied, n)) { + implieds.push({ + name: n, + line: implied[n] + }); + } + } + if (implieds.length > 0) { + data.implieds = implieds; + } + + if (urls.length > 0) { + data.urls = urls; + } + + globals = Object.keys(scope); + if (globals.length > 0) { + data.globals = globals; + } + + for (i = 1; i < functions.length; i += 1) { + f = functions[i]; + fu = {}; + for (j = 0; j < functionicity.length; j += 1) { + fu[functionicity[j]] = []; + } + for (n in f) { + if (is_own(f, n) && n.charAt(0) !== '(') { + v = f[n]; + if (v === 'unction') { + v = 'unused'; + } + if (Array.isArray(fu[v])) { + fu[v].push(n); + if (v === 'unused') { + unused.push({ + name: n, + line: f['(line)'], + 'function': f['(name)'] + }); + } + } + } + } + for (j = 0; j < functionicity.length; j += 1) { + if (fu[functionicity[j]].length === 0) { + delete fu[functionicity[j]]; + } + } + fu.name = f['(name)']; + fu.param = f['(params)']; + fu.line = f['(line)']; + fu.last = f['(last)']; + data.functions.push(fu); + } + + if (unused.length > 0) { + data.unused = unused; + } + + members = []; + for (n in member) { + if (typeof member[n] === 'number') { + data.member = member; + break; + } + } + + return data; + }; + + itself.report = function (option) { + var data = itself.data(); + + var a = [], c, e, err, f, i, k, l, m = '', n, o = [], s; + + function detail(h, array) { + var b, i, singularity; + if (array) { + o.push('
    ' + h + ' '); + array = array.sort(); + for (i = 0; i < array.length; i += 1) { + if (array[i] !== singularity) { + singularity = array[i]; + o.push((b ? ', ' : '') + singularity); + b = true; + } + } + o.push('
    '); + } + } + + + if (data.errors || data.implieds || data.unused) { + err = true; + o.push('
    Error:'); + if (data.errors) { + for (i = 0; i < data.errors.length; i += 1) { + c = data.errors[i]; + if (c) { + e = c.evidence || ''; + o.push('

    Problem' + (isFinite(c.line) ? ' at line ' + + c.line + ' character ' + c.character : '') + + ': ' + c.reason.entityify() + + '

    ' + + (e && (e.length > 80 ? e.slice(0, 77) + '...' : + e).entityify()) + '

    '); + } + } + } + + if (data.implieds) { + s = []; + for (i = 0; i < data.implieds.length; i += 1) { + s[i] = '' + data.implieds[i].name + ' ' + + data.implieds[i].line + ''; + } + o.push('

    Implied global: ' + s.join(', ') + '

    '); + } + + if (data.unused) { + s = []; + for (i = 0; i < data.unused.length; i += 1) { + s[i] = '' + data.unused[i].name + ' ' + + data.unused[i].line + ' ' + + data.unused[i]['function'] + ''; + } + o.push('

    Unused variable: ' + s.join(', ') + '

    '); + } + if (data.json) { + o.push('

    JSON: bad.

    '); + } + o.push('
    '); + } + + if (!option) { + + o.push('
    '); + + if (data.urls) { + detail("URLs
    ", data.urls, '
    '); + } + + if (data.json && !err) { + o.push('

    JSON: good.

    '); + } else if (data.globals) { + o.push('
    Global ' + + data.globals.sort().join(', ') + '
    '); + } else { + o.push('
    No new global variables introduced.
    '); + } + + for (i = 0; i < data.functions.length; i += 1) { + f = data.functions[i]; + + o.push('
    ' + f.line + '-' + + f.last + ' ' + (f.name || '') + '(' + + (f.param ? f.param.join(', ') : '') + ')
    '); + detail('Unused', f.unused); + detail('Closure', f.closure); + detail('Variable', f['var']); + detail('Exception', f.exception); + detail('Outer', f.outer); + detail('Global', f.global); + detail('Label', f.label); + } + + if (data.member) { + a = Object.keys(data.member); + if (a.length) { + a = a.sort(); + m = '
    /*members ';
    +                    l = 10;
    +                    for (i = 0; i < a.length; i += 1) {
    +                        k = a[i];
    +                        n = k.name();
    +                        if (l + n.length > 72) {
    +                            o.push(m + '
    '); + m = ' '; + l = 1; + } + l += n.length + 2; + if (data.member[k] === 1) { + n = '' + n + ''; + } + if (i < a.length - 1) { + n += ', '; + } + m += n; + } + o.push(m + '
    */
    '); + } + o.push('
    '); + } + } + return o.join(''); + }; + itself.jshint = itself; + + itself.edition = '2011-04-16'; + + return itself; + +}()); + +// Make JSHINT a Node module, if possible. +if (typeof exports == 'object' && exports) + exports.JSHINT = JSHINT; + +});/* -*- Mode: JS; tab-width: 4; indent-tabs-mode: nil; -*- + * vim: set sw=4 ts=4 et tw=78: + * ***** BEGIN LICENSE BLOCK ***** + * + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Narcissus JavaScript engine. + * + * The Initial Developer of the Original Code is + * Brendan Eich . + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Tom Austin + * Brendan Eich + * Shu-Yu Guo + * Dave Herman + * Dimitris Vardoulakis + * Patrick Walton + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* + * Narcissus - JS implemented in JS. + * + * Parser. + */ + +define('ace/narcissus/jsparse', ['require', 'exports', 'module' , 'ace/narcissus/jslex', 'ace/narcissus/jsdefs'], function(require, exports, module) { + + var lexer = require("./jslex"); + var definitions = require("./jsdefs"); + + const StringMap = definitions.StringMap; + const Stack = definitions.Stack; + + // Set constants in the local scope. + eval(definitions.consts); + + // Banned statement types by language version. + const blackLists = { 160: {}, 185: {}, harmony: {} }; + blackLists[160][IMPORT] = true; + blackLists[160][EXPORT] = true; + blackLists[160][LET] = true; + blackLists[160][MODULE] = true; + blackLists[160][YIELD] = true; + blackLists[185][IMPORT] = true; + blackLists[185][EXPORT] = true; + blackLists[185][MODULE] = true; + blackLists.harmony[WITH] = true; + + /* + * pushDestructuringVarDecls :: (node, hoisting node) -> void + * + * Recursively add all destructured declarations to varDecls. + */ + function pushDestructuringVarDecls(n, s) { + for (var i in n) { + var sub = n[i]; + if (sub.type === IDENTIFIER) { + s.varDecls.push(sub); + } else { + pushDestructuringVarDecls(sub, s); + } + } + } + + function StaticContext(parentScript, parentBlock, inModule, inFunction) { + this.parentScript = parentScript; + this.parentBlock = parentBlock || parentScript; + this.inModule = inModule || false; + this.inFunction = inFunction || false; + this.inForLoopInit = false; + this.topLevel = true; + this.allLabels = new Stack(); + this.currentLabels = new Stack(); + this.labeledTargets = new Stack(); + this.defaultLoopTarget = null; + this.defaultTarget = null; + this.blackList = blackLists[Narcissus.options.version]; + Narcissus.options.ecma3OnlyMode && (this.ecma3OnlyMode = true); + Narcissus.options.parenFreeMode && (this.parenFreeMode = true); + } + + StaticContext.prototype = { + ecma3OnlyMode: false, + parenFreeMode: false, + // non-destructive update via prototype extension + update: function(ext) { + var desc = {}; + for (var key in ext) { + desc[key] = { + value: ext[key], + writable: true, + enumerable: true, + configurable: true + } + } + return Object.create(this, desc); + }, + pushLabel: function(label) { + return this.update({ currentLabels: this.currentLabels.push(label), + allLabels: this.allLabels.push(label) }); + }, + pushTarget: function(target) { + var isDefaultLoopTarget = target.isLoop; + var isDefaultTarget = isDefaultLoopTarget || target.type === SWITCH; + + if (this.currentLabels.isEmpty()) { + if (isDefaultLoopTarget) this.update({ defaultLoopTarget: target }); + if (isDefaultTarget) this.update({ defaultTarget: target }); + return this; + } + + target.labels = new StringMap(); + this.currentLabels.forEach(function(label) { + target.labels.set(label, true); + }); + return this.update({ currentLabels: new Stack(), + labeledTargets: this.labeledTargets.push(target), + defaultLoopTarget: isDefaultLoopTarget + ? target + : this.defaultLoopTarget, + defaultTarget: isDefaultTarget + ? target + : this.defaultTarget }); + }, + nest: function() { + return this.topLevel ? this.update({ topLevel: false }) : this; + }, + allow: function(type) { + switch (type) { + case EXPORT: + if (!this.inModule || this.inFunction || !this.topLevel) + return false; + // FALL THROUGH + + case IMPORT: + return !this.inFunction && this.topLevel; + + case MODULE: + return !this.inFunction && this.topLevel; + + default: + return true; + } + } + }; + + /* + * Script :: (tokenizer, boolean, boolean) -> node + * + * Parses the toplevel and module/function bodies. + */ + function Script(t, inModule, inFunction) { + var n = new Node(t, scriptInit()); + Statements(t, new StaticContext(n, n, inModule, inFunction), n); + return n; + } + + // We extend Array slightly with a top-of-stack method. + definitions.defineProperty(Array.prototype, "top", + function() { + return this.length && this[this.length-1]; + }, false, false, true); + + /* + * Node :: (tokenizer, optional init object) -> node + */ + function Node(t, init) { + var token = t.token; + if (token) { + // If init.type exists it will override token.type. + this.type = token.type; + this.value = token.value; + this.lineno = token.lineno; + + // Start and end are file positions for error handling. + this.start = token.start; + this.end = token.end; + } else { + this.lineno = t.lineno; + } + + // Node uses a tokenizer for debugging (getSource, filename getter). + this.tokenizer = t; + this.children = []; + + for (var prop in init) + this[prop] = init[prop]; + } + + /* + * SyntheticNode :: (tokenizer, optional init object) -> node + */ + function SyntheticNode(t, init) { + // print("SYNTHETIC NODE"); + // if (init.type === COMMA) { + // print("SYNTHETIC COMMA"); + // print(init); + // } + this.tokenizer = t; + this.children = []; + for (var prop in init) + this[prop] = init[prop]; + this.synthetic = true; + } + + var Np = Node.prototype = SyntheticNode.prototype = {}; + Np.constructor = Node; + + const TO_SOURCE_SKIP = { + type: true, + value: true, + lineno: true, + start: true, + end: true, + tokenizer: true, + assignOp: true + }; + function unevalableConst(code) { + var token = definitions.tokens[code]; + var constName = definitions.opTypeNames.hasOwnProperty(token) + ? definitions.opTypeNames[token] + : token in definitions.keywords + ? token.toUpperCase() + : token; + return { toSource: function() { return constName } }; + } + Np.toSource = function toSource() { + var mock = {}; + var self = this; + mock.type = unevalableConst(this.type); + if ("value" in this) + mock.value = this.value; + if ("lineno" in this) + mock.lineno = this.lineno; + if ("start" in this) + mock.start = this.start; + if ("end" in this) + mock.end = this.end; + if (this.assignOp) + mock.assignOp = unevalableConst(this.assignOp); + for (var key in this) { + if (this.hasOwnProperty(key) && !(key in TO_SOURCE_SKIP)) + mock[key] = this[key]; + } + return mock.toSource(); + }; + + // Always use push to add operands to an expression, to update start and end. + Np.push = function (kid) { + // kid can be null e.g. [1, , 2]. + if (kid !== null) { + if (kid.start < this.start) + this.start = kid.start; + if (this.end < kid.end) + this.end = kid.end; + } + return this.children.push(kid); + } + + Node.indentLevel = 0; + + function tokenString(tt) { + var t = definitions.tokens[tt]; + return /^\W/.test(t) ? definitions.opTypeNames[t] : t.toUpperCase(); + } + + Np.toString = function () { + var a = []; + for (var i in this) { + if (this.hasOwnProperty(i) && i !== 'type' && i !== 'target') + a.push({id: i, value: this[i]}); + } + a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; }); + const INDENTATION = " "; + var n = ++Node.indentLevel; + var s = "{\n" + INDENTATION.repeat(n) + "type: " + tokenString(this.type); + for (i = 0; i < a.length; i++) + s += ",\n" + INDENTATION.repeat(n) + a[i].id + ": " + a[i].value; + n = --Node.indentLevel; + s += "\n" + INDENTATION.repeat(n) + "}"; + return s; + } + + Np.getSource = function () { + return this.tokenizer.source.slice(this.start, this.end); + }; + + /* + * Helper init objects for common nodes. + */ + + const LOOP_INIT = { isLoop: true }; + + function blockInit() { + return { type: BLOCK, varDecls: [] }; + } + + function scriptInit() { + return { type: SCRIPT, + funDecls: [], + varDecls: [], + modDefns: new StringMap(), + modAssns: new StringMap(), + modDecls: new StringMap(), + modLoads: new StringMap(), + impDecls: [], + expDecls: [], + exports: new StringMap(), + hasEmptyReturn: false, + hasReturnWithValue: false, + isGenerator: false }; + } + + definitions.defineGetter(Np, "filename", + function() { + return this.tokenizer.filename; + }); + + definitions.defineGetter(Np, "length", + function() { + throw new Error("Node.prototype.length is gone; " + + "use n.children.length instead"); + }); + + definitions.defineProperty(String.prototype, "repeat", + function(n) { + var s = "", t = this + s; + while (--n >= 0) + s += t; + return s; + }, false, false, true); + + function MaybeLeftParen(t, x) { + if (x.parenFreeMode) + return t.match(LEFT_PAREN) ? LEFT_PAREN : END; + return t.mustMatch(LEFT_PAREN).type; + } + + function MaybeRightParen(t, p) { + if (p === LEFT_PAREN) + t.mustMatch(RIGHT_PAREN); + } + + /* + * Statements :: (tokenizer, compiler context, node) -> void + * + * Parses a sequence of Statements. + */ + function Statements(t, x, n) { + try { + while (!t.done && t.peek(true) !== RIGHT_CURLY) + n.push(Statement(t, x)); + } catch (e) { + if (t.done) + t.unexpectedEOF = true; + throw e; + } + } + + function Block(t, x) { + t.mustMatch(LEFT_CURLY); + var n = new Node(t, blockInit()); + Statements(t, x.update({ parentBlock: n }).pushTarget(n), n); + t.mustMatch(RIGHT_CURLY); + return n; + } + + const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2; + + /* + * Export :: (binding node, boolean) -> Export + * + * Static semantic representation of a module export. + */ + function Export(node, isDefinition) { + this.node = node; // the AST node declaring this individual export + this.isDefinition = isDefinition; // is the node an 'export'-annotated definition? + this.resolved = null; // resolved pointer to the target of this export + } + + /* + * registerExport :: (StringMap, EXPORT node) -> void + */ + function registerExport(exports, decl) { + function register(name, exp) { + if (exports.has(name)) + throw new SyntaxError("multiple exports of " + name); + exports.set(name, exp); + } + + switch (decl.type) { + case MODULE: + case FUNCTION: + register(decl.name, new Export(decl, true)); + break; + + case VAR: + for (var i = 0; i < decl.children.length; i++) + register(decl.children[i].name, new Export(decl.children[i], true)); + break; + + case LET: + case CONST: + throw new Error("NYI: " + definitions.tokens[decl.type]); + + case EXPORT: + for (var i = 0; i < decl.pathList.length; i++) { + var path = decl.pathList[i]; + switch (path.type) { + case OBJECT_INIT: + for (var j = 0; j < path.children.length; j++) { + // init :: IDENTIFIER | PROPERTY_INIT + var init = path.children[j]; + if (init.type === IDENTIFIER) + register(init.value, new Export(init, false)); + else + register(init.children[0].value, new Export(init.children[1], false)); + } + break; + + case DOT: + register(path.children[1].value, new Export(path, false)); + break; + + case IDENTIFIER: + register(path.value, new Export(path, false)); + break; + + default: + throw new Error("unexpected export path: " + definitions.tokens[path.type]); + } + } + break; + + default: + throw new Error("unexpected export decl: " + definitions.tokens[exp.type]); + } + } + + /* + * Module :: (node) -> Module + * + * Static semantic representation of a module. + */ + function Module(node) { + var exports = node.body.exports; + var modDefns = node.body.modDefns; + + var exportedModules = new StringMap(); + + exports.forEach(function(name, exp) { + var node = exp.node; + if (node.type === MODULE) { + exportedModules.set(name, node); + } else if (!exp.isDefinition && node.type === IDENTIFIER && modDefns.has(node.value)) { + var mod = modDefns.get(node.value); + exportedModules.set(name, mod); + } + }); + + this.node = node; + this.exports = exports; + this.exportedModules = exportedModules; + } + + /* + * Statement :: (tokenizer, compiler context) -> node + * + * Parses a Statement. + */ + function Statement(t, x) { + var i, label, n, n2, p, c, ss, tt = t.get(true), tt2, x2, x3; + + var comments = t.blockComments; + + if (x.blackList[tt]) + throw t.newSyntaxError(definitions.tokens[tt] + " statements only allowed in Harmony"); + if (!x.allow(tt)) + throw t.newSyntaxError(definitions.tokens[tt] + " statement in illegal context"); + + // Cases for statements ending in a right curly return early, avoiding the + // common semicolon insertion magic after this switch. + switch (tt) { + case IMPORT: + n = new Node(t); + n.pathList = ImportPathList(t, x); + x.parentScript.impDecls.push(n); + break; + + case EXPORT: + switch (t.peek()) { + case MODULE: + case FUNCTION: + case LET: + case VAR: + case CONST: + n = Statement(t, x); + n.blockComments = comments; + n.exported = true; + x.parentScript.expDecls.push(n); + registerExport(x.parentScript.exports, n); + return n; + + default: + n = new Node(t); + n.pathList = ExportPathList(t, x); + break; + } + x.parentScript.expDecls.push(n); + registerExport(x.parentScript.exports, n); + break; + + case MODULE: + n = new Node(t); + n.blockComments = comments; + t.mustMatch(IDENTIFIER); + label = t.token.value; + + if (t.match(LEFT_CURLY)) { + n.name = label; + n.body = Script(t, true, false); + n.module = new Module(n); + t.mustMatch(RIGHT_CURLY); + x.parentScript.modDefns.set(n.name, n); + return n; + } + + t.unget(); + ModuleVariables(t, x, n); + return n; + + case FUNCTION: + // DECLARED_FORM extends funDecls of x, STATEMENT_FORM doesn't. + return FunctionDefinition(t, x, true, x.topLevel ? DECLARED_FORM : STATEMENT_FORM, comments); + + case LEFT_CURLY: + n = new Node(t, blockInit()); + Statements(t, x.update({ parentBlock: n }).pushTarget(n).nest(), n); + t.mustMatch(RIGHT_CURLY); + return n; + + case IF: + n = new Node(t); + n.condition = HeadExpression(t, x); + x2 = x.pushTarget(n).nest(); + n.thenPart = Statement(t, x2); + n.elsePart = t.match(ELSE, true) ? Statement(t, x2) : null; + return n; + + case SWITCH: + // This allows CASEs after a DEFAULT, which is in the standard. + n = new Node(t, { cases: [], defaultIndex: -1 }); + n.discriminant = HeadExpression(t, x); + x2 = x.pushTarget(n).nest(); + t.mustMatch(LEFT_CURLY); + while ((tt = t.get()) !== RIGHT_CURLY) { + switch (tt) { + case DEFAULT: + if (n.defaultIndex >= 0) + throw t.newSyntaxError("More than one switch default"); + // FALL THROUGH + case CASE: + n2 = new Node(t); + if (tt === DEFAULT) + n.defaultIndex = n.cases.length; + else + n2.caseLabel = Expression(t, x2, COLON); + break; + + default: + throw t.newSyntaxError("Invalid switch case"); + } + t.mustMatch(COLON); + n2.statements = new Node(t, blockInit()); + while ((tt=t.peek(true)) !== CASE && tt !== DEFAULT && + tt !== RIGHT_CURLY) + n2.statements.push(Statement(t, x2)); + n.cases.push(n2); + } + return n; + + case FOR: + n = new Node(t, LOOP_INIT); + n.blockComments = comments; + if (t.match(IDENTIFIER)) { + if (t.token.value === "each") + n.isEach = true; + else + t.unget(); + } + if (!x.parenFreeMode) + t.mustMatch(LEFT_PAREN); + x2 = x.pushTarget(n).nest(); + x3 = x.update({ inForLoopInit: true }); + n2 = null; + if ((tt = t.peek(true)) !== SEMICOLON) { + if (tt === VAR || tt === CONST) { + t.get(); + n2 = Variables(t, x3); + } else if (tt === LET) { + t.get(); + if (t.peek() === LEFT_PAREN) { + n2 = LetBlock(t, x3, false); + } else { + // Let in for head, we need to add an implicit block + // around the rest of the for. + x3.parentBlock = n; + n.varDecls = []; + n2 = Variables(t, x3); + } + } else { + n2 = Expression(t, x3); + } + } + if (n2 && t.match(IN)) { + n.type = FOR_IN; + n.object = Expression(t, x3); + if (n2.type === VAR || n2.type === LET) { + c = n2.children; + + // Destructuring turns one decl into multiples, so either + // there must be only one destructuring or only one + // decl. + if (c.length !== 1 && n2.destructurings.length !== 1) { + throw new SyntaxError("Invalid for..in left-hand side", + t.filename, n2.lineno); + } + if (n2.destructurings.length > 0) { + n.iterator = n2.destructurings[0]; + } else { + n.iterator = c[0]; + } + n.varDecl = n2; + } else { + if (n2.type === ARRAY_INIT || n2.type === OBJECT_INIT) { + n2.destructuredNames = checkDestructuring(t, x3, n2); + } + n.iterator = n2; + } + } else { + x3.inForLoopInit = false; + n.setup = n2; + t.mustMatch(SEMICOLON); + if (n.isEach) + throw t.newSyntaxError("Invalid for each..in loop"); + n.condition = (t.peek(true) === SEMICOLON) + ? null + : Expression(t, x3); + t.mustMatch(SEMICOLON); + tt2 = t.peek(true); + n.update = (x.parenFreeMode + ? tt2 === LEFT_CURLY || definitions.isStatementStartCode[tt2] + : tt2 === RIGHT_PAREN) + ? null + : Expression(t, x3); + } + if (!x.parenFreeMode) + t.mustMatch(RIGHT_PAREN); + n.body = Statement(t, x2); + return n; + + case WHILE: + n = new Node(t, { isLoop: true }); + n.blockComments = comments; + n.condition = HeadExpression(t, x); + n.body = Statement(t, x.pushTarget(n).nest()); + return n; + + case DO: + n = new Node(t, { isLoop: true }); + n.blockComments = comments; + n.body = Statement(t, x.pushTarget(n).nest()); + t.mustMatch(WHILE); + n.condition = HeadExpression(t, x); + if (!x.ecmaStrictMode) { + // '); +} OC_JSON::checkAppEnabled('calendar'); $id = $_GET['id']; diff --git a/apps/calendar/ajax/importdialog.php b/apps/calendar/ajax/importdialog.php index 8d8430da7aa..983a3d95a84 100644 --- a/apps/calendar/ajax/importdialog.php +++ b/apps/calendar/ajax/importdialog.php @@ -10,7 +10,9 @@ require_once('../../../lib/base.php'); $l10n = new OC_L10N('calendar'); -OC_JSON::checkLoggedIn(); +if(!OC_USER::isLoggedIn()) { + die(''); +} OC_JSON::checkAppEnabled('calendar'); $tmpl = new OC_Template('calendar', 'part.import'); diff --git a/apps/calendar/ajax/neweventform.php b/apps/calendar/ajax/neweventform.php index 88468dd3dbf..3870c879b0e 100644 --- a/apps/calendar/ajax/neweventform.php +++ b/apps/calendar/ajax/neweventform.php @@ -8,7 +8,9 @@ require_once('../../../lib/base.php'); -OC_JSON::checkLoggedIn(); +if(!OC_USER::isLoggedIn()) { + die(''); +} OC_JSON::checkAppEnabled('calendar'); if (!isset($_POST['start'])){ -- GitLab From f18e866a1e152a1fb13cb883d89d8efde413cea9 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 6 Jan 2012 14:36:24 +0100 Subject: [PATCH 155/546] improve search function --- apps/calendar/index.php | 3 +++ apps/calendar/lib/search.php | 27 ++++++++++++++++++++++++--- apps/calendar/templates/calendar.php | 10 ++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/calendar/index.php b/apps/calendar/index.php index a2042afddf1..e8e214c0b75 100644 --- a/apps/calendar/index.php +++ b/apps/calendar/index.php @@ -42,4 +42,7 @@ OC_Util::addStyle('', 'jquery.multiselect'); OC_App::setActiveNavigationEntry('calendar_index'); $tmpl = new OC_Template('calendar', 'calendar', 'user'); $tmpl->assign('eventSources', $eventSources); +if(array_key_exists('showevent', $_GET)){ + $tmpl->assign('showevent', $_GET['showevent']); +} $tmpl->printPage(); diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php index 41faf49a519..425c93c7338 100644 --- a/apps/calendar/lib/search.php +++ b/apps/calendar/lib/search.php @@ -12,15 +12,36 @@ class OC_Search_Provider_Calendar extends OC_Search_Provider{ }else{ $searchquery[] = $query; } + $user_timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', date_default_timezone_get()); + $l = new OC_l10n('calendar'); foreach($calendars as $calendar){ $objects = OC_Calendar_Object::all($calendar['id']); foreach($objects as $object){ - if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){//$name,$text,$link,$type - $results[]=new OC_Search_Result($object['summary'],'','#','Cal.'); + if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){ + $calendardata = OC_VObject::parse($object['calendardata']); + $vevent = $calendardata->VEVENT; + $dtstart = $vevent->DTSTART; + $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); + $start_dt = $dtstart->getDateTime(); + $start_dt->setTimezone(new DateTimeZone($user_timezone)); + $end_dt = $dtend->getDateTime(); + $end_dt->setTimezone(new DateTimeZone($user_timezone)); + if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){ + $end_dt->modify('-1 sec'); + if($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')){ + $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y'); + }else{ + $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); + } + }else{ + $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); + } + $link = OC_Helper::linkTo('apps/calendar', 'index.php?showevent='.urlencode($object['id'])); + $results[]=new OC_Search_Result($object['summary'],$info, $link,$l->t('Cal.'));//$name,$text,$link,$type } } } return $results; } } -new OC_Search_Provider_Calendar(); \ No newline at end of file +new OC_Search_Provider_Calendar(); diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 13bc8bc1bb1..92c1b8a778a 100755 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -18,6 +18,16 @@ var missing_field_startsbeforeends = 't('The event ends before it starts') ?>'; var missing_field_dberror = 't('There was a database fail') ?>'; var totalurl = '/calendars'; + $(document).ready(function() { + + });
    -- GitLab From f9db4249a3a7b73f6c712cfa32b029e6d09595f5 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Fri, 6 Jan 2012 17:21:24 +0100 Subject: [PATCH 156/546] add a formfactor session variable which is autodetected but can also manually overwritten via a get variable. currently we have: * default -> the normal desktop browser interface * mobile -> interface for smartphones * tablet -> interface for tablets * standalone -> the default interface but without header, footer and sidebar. just the application. useful to use just a specific app on the desktop in a standalone window. In the future we should adapt the userinterface to the specific formfactor. --- lib/base.php | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/base.php b/lib/base.php index 700236c96c6..0954e3615bd 100644 --- a/lib/base.php +++ b/lib/base.php @@ -70,6 +70,31 @@ class OC{ } } + /** + * autodetects the formfactor of the used device + * default -> the normal desktop browser interface + * mobile -> interface for smartphones + * tablet -> interface for tablets + * standalone -> the default interface but without header, footer and sidebar. just the application. useful to ue just a specific app on the desktop in a standalone window. + */ + public static function detectFormfactor(){ + // please add more useragent strings for other devices + if(isset($_SERVER['HTTP_USER_AGENT'])){ + if(stripos($_SERVER['HTTP_USER_AGENT'],'ipad')>0) { + $mode='tablet'; + }elseif(stripos($_SERVER['HTTP_USER_AGENT'],'iphone')>0){ + $mode='mobile'; + }elseif((stripos($_SERVER['HTTP_USER_AGENT'],'N9')>0) and (stripos($_SERVER['HTTP_USER_AGENT'],'nokia')>0)){ + $mode='mobile'; + }else{ + $mode='default'; + } + }else{ + $mode='default'; + } + return($mode); + } + public static function init(){ // register autoloader spl_autoload_register(array('OC','autoload')); @@ -130,6 +155,16 @@ class OC{ ini_set('session.cookie_httponly','1;'); session_start(); + // if the formfactor is not yet autodetected do the autodetection now. For possible forfactors check the detectFormfactor documentation + if(!isset($_SESSION['formfactor'])){ + $_SESSION['formfactor']=OC::detectFormfactor(); + } + // allow manual override via GET parameter + if(isset($_GET['formfactor'])){ + $_SESSION['formfactor']=$_GET['formfactor']; + } + + // Add the stuff we need always OC_Util::addScript( "jquery-1.6.4.min" ); OC_Util::addScript( "jquery-ui-1.8.14.custom.min" ); @@ -214,5 +249,7 @@ if(!function_exists('get_temp_dir')) { require_once('fakedirstream.php'); + + // FROM search.php new OC_Search_Provider_File(); -- GitLab From 47a275f3897bef9bb766f5b19c017f5072afef78 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Fri, 6 Jan 2012 18:04:24 +0000 Subject: [PATCH 157/546] Use parameter --- lib/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/db.php b/lib/db.php index bcfe320665f..c7085a975ef 100644 --- a/lib/db.php +++ b/lib/db.php @@ -279,7 +279,7 @@ class OC_DB { 'output' => $file, 'end_of_line' => "\n" ); - self::$schema->dumpDatabase( $definition, $dump_options, MDB2_SCHEMA_DUMP_STRUCTURE ); + self::$schema->dumpDatabase( $definition, $dump_options, $mode ); return true; } -- GitLab From d485a70e7df602e85506ad94103df00f8bb3f765 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Fri, 6 Jan 2012 19:08:35 +0100 Subject: [PATCH 158/546] finish the application store feature so that users can download and install ownCloud apps from our website. there is still a small problem with write permissions. will look into this later --- lib/app.php | 11 ++++++++++- lib/ocsclient.php | 27 +++++++++++++++++++++++++++ settings/apps.php | 32 ++++++++++++++++---------------- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/lib/app.php b/lib/app.php index b1aa8ba354d..1873e1136cd 100644 --- a/lib/app.php +++ b/lib/app.php @@ -94,7 +94,15 @@ class OC_App{ */ public static function enable( $app ){ if(!OC_Installer::isInstalled($app)){ - OC_Installer::installShippedApp($app); + // check if app is a shipped app or not. OCS apps have an integer as id, shipped apps use a string + if(!is_numeric($app)){ + OC_Installer::installShippedApp($app); + }else{ + $download=OC_OCSClient::getApplicationDownload($app,1); + if(isset($download['downloadlink']) and $download['downloadlink']<>'') { + OC_Installer::installApp(array('source'=>'http','href'=>$download['downloadlink'])); + } + } } OC_Appconfig::setValue( $app, 'enabled', 'yes' ); } @@ -107,6 +115,7 @@ class OC_App{ * This function set an app as disabled in appconfig. */ public static function disable( $app ){ + // check if app is a shiped app or not. if not delete OC_Appconfig::setValue( $app, 'enabled', 'no' ); } diff --git a/lib/ocsclient.php b/lib/ocsclient.php index 072fd236fee..9d5932fb720 100644 --- a/lib/ocsclient.php +++ b/lib/ocsclient.php @@ -130,6 +130,33 @@ class OC_OCSClient{ return $app; } + /** + * @brief Get the download url for an application from the OCS server + * @returns array with application data + * + * This function returns an download url for an applications from the OCS server + */ + public static function getApplicationDownload($id,$item){ + $url='http://api.apps.owncloud.com/v1/content/download/'.urlencode($id).'/'.urlencode($item); + + $xml=@file_get_contents($url); + if($xml==FALSE){ + OC_Log::write('core','Unable to parse OCS content',OC_Log::FATAL); + return NULL; + } + $data=simplexml_load_string($xml); + + $tmp=$data->data->content; + $app=array(); + if(isset($tmp->downloadlink)) { + $app['downloadlink']=$tmp->downloadlink; + }else{ + $app['downloadlink']=''; + } + return $app; + } + + /** * @brief Get all the knowledgebase entries from the OCS server * @returns array with q and a data diff --git a/settings/apps.php b/settings/apps.php index 12a7bf77202..40b72639cd6 100644 --- a/settings/apps.php +++ b/settings/apps.php @@ -51,22 +51,22 @@ function app_sort($a, $b){ } usort($apps, 'app_sort'); -// dissabled for now -// $catagoryNames=OC_OCSClient::getCategories(); -// if(is_array($catagoryNames)){ -// $categories=array_keys($catagoryNames); -// $externalApps=OC_OCSClient::getApplications($categories); -// foreach($externalApps as $app){ -// $apps[]=array( -// 'name'=>$app['name'], -// 'id'=>$app['id'], -// 'active'=>false, -// 'description'=>$app['description'], -// 'author'=>$app['personid'], -// 'license'=>$app['license'], -// ); -// } -// } +// apps from external repo via OCS + $catagoryNames=OC_OCSClient::getCategories(); + if(is_array($catagoryNames)){ + $categories=array_keys($catagoryNames); + $externalApps=OC_OCSClient::getApplications($categories); + foreach($externalApps as $app){ + $apps[]=array( + 'name'=>$app['name'], + 'id'=>$app['id'], + 'active'=>false, + 'description'=>$app['description'], + 'author'=>$app['personid'], + 'license'=>$app['license'], + ); + } + } -- GitLab From 064d6b8a2cbb4d1c25f5c762eac2d8cf373b526e Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 6 Jan 2012 21:56:47 +0100 Subject: [PATCH 159/546] update calendar pot file --- l10n/templates/calendar.pot | 312 +++++++++++++++++++++++++++++------- 1 file changed, 250 insertions(+), 62 deletions(-) diff --git a/l10n/templates/calendar.pot b/l10n/templates/calendar.pot index 56fce2285ec..ce255816ed5 100644 --- a/l10n/templates/calendar.pot +++ b/l10n/templates/calendar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-22 13:05+0200\n" +"POT-Creation-Date: 2012-01-06 21:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,8 +17,8 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/editeventform.php:26 -msgid "Wrong calendar" +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" msgstr "" #: ajax/settimezone.php:22 @@ -29,168 +29,312 @@ msgstr "" msgid "Invalid request" msgstr "" -#: appinfo/app.php:21 templates/calendar.php:11 -#: templates/part.eventform.php:21 +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 msgid "Calendar" msgstr "" -#: js/calendar.js:153 -msgid "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}" -msgstr "" - -#: js/calendar.js:155 -msgid "ddd d MMMM[ yyyy] HH:mm{ -[ ddd d MMMM yyyy] HH:mm}" +#: lib/app.php:19 +msgid "Wrong calendar" msgstr "" -#: lib/object.php:344 +#: lib/app.php:60 lib/object.php:332 msgid "Birthday" msgstr "" -#: lib/object.php:345 +#: lib/app.php:61 lib/object.php:333 msgid "Business" msgstr "" -#: lib/object.php:346 +#: lib/app.php:62 lib/object.php:334 msgid "Call" msgstr "" -#: lib/object.php:347 +#: lib/app.php:63 lib/object.php:335 msgid "Clients" msgstr "" -#: lib/object.php:348 +#: lib/app.php:64 lib/object.php:336 msgid "Deliverer" msgstr "" -#: lib/object.php:349 +#: lib/app.php:65 lib/object.php:337 msgid "Holidays" msgstr "" -#: lib/object.php:350 +#: lib/app.php:66 lib/object.php:338 msgid "Ideas" msgstr "" -#: lib/object.php:351 +#: lib/app.php:67 lib/object.php:339 msgid "Journey" msgstr "" -#: lib/object.php:352 +#: lib/app.php:68 lib/object.php:340 msgid "Jubilee" msgstr "" -#: lib/object.php:353 +#: lib/app.php:69 lib/object.php:341 msgid "Meeting" msgstr "" -#: lib/object.php:354 +#: lib/app.php:70 lib/object.php:342 msgid "Other" msgstr "" -#: lib/object.php:355 +#: lib/app.php:71 lib/object.php:343 msgid "Personal" msgstr "" -#: lib/object.php:356 +#: lib/app.php:72 lib/object.php:344 msgid "Projects" msgstr "" -#: lib/object.php:357 +#: lib/app.php:73 lib/object.php:345 msgid "Questions" msgstr "" -#: lib/object.php:358 +#: lib/app.php:74 lib/object.php:346 msgid "Work" msgstr "" -#: lib/object.php:365 +#: lib/object.php:353 msgid "Does not repeat" msgstr "" -#: lib/object.php:366 +#: lib/object.php:354 msgid "Daily" msgstr "" -#: lib/object.php:367 +#: lib/object.php:355 msgid "Weekly" msgstr "" -#: lib/object.php:368 +#: lib/object.php:356 msgid "Every Weekday" msgstr "" -#: lib/object.php:369 +#: lib/object.php:357 msgid "Bi-Weekly" msgstr "" -#: lib/object.php:370 +#: lib/object.php:358 msgid "Monthly" msgstr "" -#: lib/object.php:371 +#: lib/object.php:359 msgid "Yearly" msgstr "" +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 +msgid "Saturday" +msgstr "" + #: lib/object.php:389 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 +msgid "January" +msgstr "" + +#: lib/object.php:425 +msgid "February" +msgstr "" + +#: lib/object.php:426 +msgid "March" +msgstr "" + +#: lib/object.php:427 +msgid "April" +msgstr "" + +#: lib/object.php:428 +msgid "May" +msgstr "" + +#: lib/object.php:429 +msgid "June" +msgstr "" + +#: lib/object.php:430 +msgid "July" +msgstr "" + +#: lib/object.php:431 +msgid "August" +msgstr "" + +#: lib/object.php:432 +msgid "September" +msgstr "" + +#: lib/object.php:433 +msgid "October" +msgstr "" + +#: lib/object.php:434 +msgid "November" +msgstr "" + +#: lib/object.php:435 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 msgid "Not an array" msgstr "" -#: templates/calendar.php:8 +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 msgid "All day" msgstr "" -#: templates/calendar.php:9 +#: templates/calendar.php:11 msgid "Missing fields" msgstr "" -#: templates/calendar.php:10 templates/part.eventform.php:3 +#: templates/calendar.php:12 templates/part.eventform.php:3 msgid "Title" msgstr "" -#: templates/calendar.php:12 +#: templates/calendar.php:14 msgid "From Date" msgstr "" -#: templates/calendar.php:13 +#: templates/calendar.php:15 msgid "From Time" msgstr "" -#: templates/calendar.php:14 +#: templates/calendar.php:16 msgid "To Date" msgstr "" -#: templates/calendar.php:15 +#: templates/calendar.php:17 msgid "To Time" msgstr "" -#: templates/calendar.php:16 +#: templates/calendar.php:18 msgid "The event ends before it starts" msgstr "" -#: templates/calendar.php:17 +#: templates/calendar.php:19 msgid "There was a database fail" msgstr "" -#: templates/calendar.php:23 +#: templates/calendar.php:37 msgid "Week" msgstr "" -#: templates/calendar.php:24 +#: templates/calendar.php:38 msgid "Month" msgstr "" -#: templates/calendar.php:25 +#: templates/calendar.php:39 msgid "List" msgstr "" -#: templates/calendar.php:30 +#: templates/calendar.php:44 msgid "Today" msgstr "" -#: templates/calendar.php:31 +#: templates/calendar.php:45 msgid "Calendars" msgstr "" -#: templates/calendar.php:48 +#: templates/calendar.php:63 msgid "There was a fail, while parsing the file." msgstr "" @@ -216,7 +360,7 @@ msgid "Edit" msgstr "" #: templates/part.choosecalendar.rowfields.php:4 -#: templates/part.editevent.php:8 +#: templates/part.editevent.php:9 msgid "Delete" msgstr "" @@ -244,7 +388,7 @@ msgstr "" msgid "Save" msgstr "" -#: templates/part.editcalendar.php:42 templates/part.editevent.php:7 +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 #: templates/part.newevent.php:6 msgid "Submit" msgstr "" @@ -257,7 +401,7 @@ msgstr "" msgid "Edit an event" msgstr "" -#: templates/part.editevent.php:9 +#: templates/part.editevent.php:10 msgid "Export" msgstr "" @@ -273,43 +417,83 @@ msgstr "" msgid "Select category" msgstr "" -#: templates/part.eventform.php:39 +#: templates/part.eventform.php:37 msgid "All Day Event" msgstr "" -#: templates/part.eventform.php:43 +#: templates/part.eventform.php:41 msgid "From" msgstr "" -#: templates/part.eventform.php:51 +#: templates/part.eventform.php:49 msgid "To" msgstr "" -#: templates/part.eventform.php:59 +#: templates/part.eventform.php:57 msgid "Advanced options" msgstr "" -#: templates/part.eventform.php:64 +#: templates/part.eventform.php:61 msgid "Repeat" msgstr "" -#: templates/part.eventform.php:80 -msgid "Attendees" +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." msgstr "" -#: templates/part.eventform.php:87 +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 msgid "Location" msgstr "" -#: templates/part.eventform.php:89 +#: templates/part.eventform.php:210 msgid "Location of the Event" msgstr "" -#: templates/part.eventform.php:95 +#: templates/part.eventform.php:216 msgid "Description" msgstr "" -#: templates/part.eventform.php:96 +#: templates/part.eventform.php:218 msgid "Description of the Event" msgstr "" @@ -353,6 +537,10 @@ msgstr "" msgid "Timezone" msgstr "" +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + #: templates/settings.php:32 msgid "Timeformat" msgstr "" -- GitLab From 33847dd1018bc21ac5b3b2b646e10c2a549828fc Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 7 Jan 2012 13:33:53 +0100 Subject: [PATCH 160/546] enable gallery and admin_export by default at least for the alpha and beta. --- apps/admin_export/appinfo/info.xml | 1 + apps/gallery/appinfo/info.xml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/admin_export/appinfo/info.xml b/apps/admin_export/appinfo/info.xml index c4a2a9b398c..df8a07c2f5b 100644 --- a/apps/admin_export/appinfo/info.xml +++ b/apps/admin_export/appinfo/info.xml @@ -7,4 +7,5 @@ AGPL Thomas Schmidt 2 + diff --git a/apps/gallery/appinfo/info.xml b/apps/gallery/appinfo/info.xml index 054ddb6f139..154b5fcf7ae 100644 --- a/apps/gallery/appinfo/info.xml +++ b/apps/gallery/appinfo/info.xml @@ -7,4 +7,5 @@ Bartosz Przybylski 2 - \ No newline at end of file + + -- GitLab From 67a8ae084a6d755d27b8b936bee572c91dd84ac4 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sat, 7 Jan 2012 14:31:47 +0100 Subject: [PATCH 161/546] fix search function --- apps/calendar/templates/calendar.php | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 92c1b8a778a..50d3d70347a 100755 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -25,6 +25,7 @@ $date = substr($data['startdate'], 0, 10); list($year, $month, $day) = explode('-', $date); echo '$(\'#calendar_holder\').fullCalendar(\'gotoDate\', ' . $year . ', ' . --$month . ', ' . $day . ');'; + echo '$(\'#dialog_holder\').load(OC.filePath(\'calendar\', \'ajax\', \'editeventform.php\') + \'?id=\' + ' . $_['showevent'] . ' , Calendar.UI.startEventDialog);'; } ?> }); -- GitLab From c3cda81577a396960fa69b651f27bad2828e0c30 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sat, 7 Jan 2012 18:30:32 +0100 Subject: [PATCH 162/546] update calendar pot file --- apps/calendar/l10n/xgettextfiles | 3 +- apps/calendar/templates/lAfix.php | 39 +++++++++ l10n/templates/calendar.pot | 128 ++++++++++++++++++++++++------ 3 files changed, 143 insertions(+), 27 deletions(-) create mode 100644 apps/calendar/templates/lAfix.php diff --git a/apps/calendar/l10n/xgettextfiles b/apps/calendar/l10n/xgettextfiles index 27b8e457193..a8c2601045f 100644 --- a/apps/calendar/l10n/xgettextfiles +++ b/apps/calendar/l10n/xgettextfiles @@ -8,4 +8,5 @@ ../templates/part.eventform.php ../templates/part.import.php ../templates/part.newevent.php -../templates/settings.php \ No newline at end of file +../templates/settings.php +../templates/lAfix.php \ No newline at end of file diff --git a/apps/calendar/templates/lAfix.php b/apps/calendar/templates/lAfix.php new file mode 100644 index 00000000000..61025ae6dea --- /dev/null +++ b/apps/calendar/templates/lAfix.php @@ -0,0 +1,39 @@ +t('Sunday'); +$l->t('Monday'); +$l->t('Tuesday'); +$l->t('Wednesday'); +$l->t('Thursday'); +$l->t('Friday'); +$l->t('Saturday'); +$l->t('Sun.'); +$l->t('Mon.'); +$l->t('Tue.'); +$l->t('Wed.'); +$l->t('Thu.'); +$l->t('Fri.'); +$l->t('Sat.'); +$l->t('January'); +$l->t('February'); +$l->t('March'); +$l->t('April'); +$l->t('May'); +$l->t('June'); +$l->t('July'); +$l->t('August'); +$l->t('September'); +$l->t('October'); +$l->t('November'); +$l->t('December'); +$l->t('Jan.'); +$l->t('Feb.'); +$l->t('Mar.'); +$l->t('Apr.'); +$l->t('May.'); +$l->t('Jun.'); +$l->t('Jul.'); +$l->t('Aug.'); +$l->t('Sep.'); +$l->t('Oct.'); +$l->t('Nov.'); +$l->t('Dec.'); \ No newline at end of file diff --git a/l10n/templates/calendar.pot b/l10n/templates/calendar.pot index ce255816ed5..7941082926b 100644 --- a/l10n/templates/calendar.pot +++ b/l10n/templates/calendar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-06 21:55+0100\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -146,31 +146,31 @@ msgstr "" msgid "by weekday" msgstr "" -#: lib/object.php:383 +#: lib/object.php:383 templates/lAfix.php:3 msgid "Monday" msgstr "" -#: lib/object.php:384 +#: lib/object.php:384 templates/lAfix.php:4 msgid "Tuesday" msgstr "" -#: lib/object.php:385 +#: lib/object.php:385 templates/lAfix.php:5 msgid "Wednesday" msgstr "" -#: lib/object.php:386 +#: lib/object.php:386 templates/lAfix.php:6 msgid "Thursday" msgstr "" -#: lib/object.php:387 +#: lib/object.php:387 templates/lAfix.php:7 msgid "Friday" msgstr "" -#: lib/object.php:388 +#: lib/object.php:388 templates/lAfix.php:8 msgid "Saturday" msgstr "" -#: lib/object.php:389 +#: lib/object.php:389 templates/lAfix.php:2 msgid "Sunday" msgstr "" @@ -202,51 +202,51 @@ msgstr "" msgid "last" msgstr "" -#: lib/object.php:424 +#: lib/object.php:424 templates/lAfix.php:16 msgid "January" msgstr "" -#: lib/object.php:425 +#: lib/object.php:425 templates/lAfix.php:17 msgid "February" msgstr "" -#: lib/object.php:426 +#: lib/object.php:426 templates/lAfix.php:18 msgid "March" msgstr "" -#: lib/object.php:427 +#: lib/object.php:427 templates/lAfix.php:19 msgid "April" msgstr "" -#: lib/object.php:428 +#: lib/object.php:428 templates/lAfix.php:20 msgid "May" msgstr "" -#: lib/object.php:429 +#: lib/object.php:429 templates/lAfix.php:21 msgid "June" msgstr "" -#: lib/object.php:430 +#: lib/object.php:430 templates/lAfix.php:22 msgid "July" msgstr "" -#: lib/object.php:431 +#: lib/object.php:431 templates/lAfix.php:23 msgid "August" msgstr "" -#: lib/object.php:432 +#: lib/object.php:432 templates/lAfix.php:24 msgid "September" msgstr "" -#: lib/object.php:433 +#: lib/object.php:433 templates/lAfix.php:25 msgid "October" msgstr "" -#: lib/object.php:434 +#: lib/object.php:434 templates/lAfix.php:26 msgid "November" msgstr "" -#: lib/object.php:435 +#: lib/object.php:435 templates/lAfix.php:27 msgid "December" msgstr "" @@ -314,30 +314,106 @@ msgstr "" msgid "There was a database fail" msgstr "" -#: templates/calendar.php:37 +#: templates/calendar.php:38 msgid "Week" msgstr "" -#: templates/calendar.php:38 +#: templates/calendar.php:39 msgid "Month" msgstr "" -#: templates/calendar.php:39 +#: templates/calendar.php:40 msgid "List" msgstr "" -#: templates/calendar.php:44 +#: templates/calendar.php:45 msgid "Today" msgstr "" -#: templates/calendar.php:45 +#: templates/calendar.php:46 msgid "Calendars" msgstr "" -#: templates/calendar.php:63 +#: templates/calendar.php:64 msgid "There was a fail, while parsing the file." msgstr "" +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + #: templates/part.choosecalendar.php:1 msgid "Choose active calendars" msgstr "" -- GitLab From 9ed3c31fc99fbd33576363a79d51f5be66dc2969 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sun, 8 Jan 2012 00:14:34 +0100 Subject: [PATCH 163/546] automatic adding of photo to album, feedback for user while scanning, general cleanup --- apps/gallery/ajax/galleryOp.php | 4 +- apps/gallery/ajax/scanForAlbums.php | 2 +- apps/gallery/appinfo/app.php | 3 ++ apps/gallery/appinfo/database.xml | 6 +++ apps/gallery/css/styles.css | 69 +++++------------------------ apps/gallery/js/album_cover.js | 4 ++ apps/gallery/lib/album.php | 17 ++++--- apps/gallery/lib/hooks_handlers.php | 36 +++++++++++++++ apps/gallery/lib/photo.php | 2 + apps/gallery/lib/scanner.php | 6 +-- apps/gallery/templates/index.php | 5 ++- 11 files changed, 82 insertions(+), 72 deletions(-) create mode 100644 apps/gallery/lib/hooks_handlers.php diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index cd7cab202b1..8a006dda637 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -1,6 +1,6 @@ "Unknown operation")); } } -?> \ No newline at end of file +?> diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php index f603cbb4971..b1f0a433a42 100644 --- a/apps/gallery/ajax/scanForAlbums.php +++ b/apps/gallery/ajax/scanForAlbums.php @@ -5,6 +5,6 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); OC_Gallery_Scanner::cleanUp(); -OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan(''))); +OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan('/'))); ?> diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php index 2b1ab857afc..3a2dbcb43ad 100644 --- a/apps/gallery/appinfo/app.php +++ b/apps/gallery/appinfo/app.php @@ -2,6 +2,7 @@ OC::$CLASSPATH['OC_Gallery_Album'] = 'apps/gallery/lib/album.php'; OC::$CLASSPATH['OC_Gallery_Photo'] = 'apps/gallery/lib/photo.php'; OC::$CLASSPATH['OC_Gallery_Scanner'] = 'apps/gallery/lib/scanner.php'; +OC::$CLASSPATH['OC_Gallery_Hooks_Handlers'] = 'apps/gallery/lib/hooks_handlers.php'; OC_App::register(array( 'order' => 20, @@ -28,4 +29,6 @@ OC_App::addNavigationEntry( array( } new OC_GallerySearchProvider(); + +require_once('apps/gallery/lib/hooks_handlers.php'); ?> diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml index fd55b3a6fb4..db88e4c1b5a 100644 --- a/apps/gallery/appinfo/database.xml +++ b/apps/gallery/appinfo/database.xml @@ -27,6 +27,12 @@ true 100 + + album_path + text + true + 100 + diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css index 53c3c0901d9..cc343ba0d08 100644 --- a/apps/gallery/css/styles.css +++ b/apps/gallery/css/styles.css @@ -1,60 +1,11 @@ -div#gallery_list { - margin: 90pt 20pt; -} -div#gallery_list.leftcontent { - padding-top: 15px; - margin: 0; - text-align: center; -} +div#gallery_list { margin: 90pt 20pt; } +div#gallery_list.leftcontent { padding-top: 15px; margin: 0; text-align: center; } +div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; border: solid 1px black; position: relative; overflow: hidden; color: #999; } +div#gallery_album_box:hover { color: black; } +.leftcontent div#gallery_album_box { margin: 5px; } +div#gallery_album_box h1 { font-size: 12pt; font-family: Verdana; } +div#gallery_album_cover { width: 199px; height: 199px; border: solid 1pt #999; padding: 0; } +div#gallery_control_overlay { border: 0; position:absolute; right: 10pt; background-color: #333; opacity: 0.5; visibility:hidden; padding: 0 5pt; } +div#gallery_control_overlay a { color:white; } +#gallery_images { padding:10px 5px; } -div#gallery_album_box { - width: 200px; - text-align: center; - border: 0; - display: inline-block; - margin: 5pt; - vertical-align: top; - padding: 10px; - border: solid 1px black; - position: relative; - overflow: hidden; - color: #999; -} - -div#gallery_album_box:hover { - color: black; -} - -.leftcontent div#gallery_album_box { - margin: 5px; -} - -div#gallery_album_box h1 { - font-size: 12pt; - font-family: Verdana; -} - -div#gallery_album_cover { - width: 199px; - height: 199px; - border: solid 1pt #999; - padding: 0; -} - -div#gallery_control_overlay { - border: 0; - position:absolute; - right: 10pt; - background-color: #333; - opacity: 0.5; - visibility:hidden; - padding: 0 5pt; -} - -div#gallery_control_overlay a { - color:white; -} - -#gallery_images { -padding:10px 5px; -} diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js index 619aa391c56..f6cb2da3103 100644 --- a/apps/gallery/js/album_cover.js +++ b/apps/gallery/js/album_cover.js @@ -31,7 +31,11 @@ function createNewAlbum() { } function scanForAlbums() { + $("#notification").fadeIn(); + $("#notification").slideDown(); $.getJSON('ajax/scanForAlbums.php', function(r) { + $("#notification").fadeOut(); + $("#notification").slideUp(); if (r.status == 'success') { window.location.reload(true); } else { diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index 0999429c5d5..98876b891c5 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -1,9 +1,9 @@ execute(array($owner, $name)); + public static function create($owner, $name, $path){ + $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (uid_owner, album_name, album_path) VALUES (?, ?, ?)'); + $stmt->execute(array($owner, $name, $path)); } public static function rename($oldname, $newname, $owner) { @@ -22,14 +22,21 @@ class OC_Gallery_Album { return $stmt->execute($args); } - public static function find($owner, $name=null){ + public static function find($owner, $name=null, $path=null){ $sql = 'SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?'; $args = array($owner); if (!is_null($name)){ $sql .= ' AND album_name = ?'; $args[] = $name; - } + } + if (!is_null($path)){ + $sql .= ' AND album_path = ?'; + $args[] = $path; + } $stmt = OC_DB::prepare($sql); return $stmt->execute($args); } + } + +?> diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php new file mode 100644 index 00000000000..5d1e7502aa3 --- /dev/null +++ b/apps/gallery/lib/hooks_handlers.php @@ -0,0 +1,36 @@ +numRows() == 0) { + $new_album_name = trim(str_replace('/', '.', $fullpath)); + if ($new_album_name == '.') $new_album_name = 'main'; + OC_Gallery_Album::create(OC_User::getUser(), $new_album_name, $path); + $album = OC_Gallery_Album::find(OC_User::getUser(), null, $path); + } + $album = $album->fetchRow(); + $albumId = $album['album_id']; + OC_Gallery_Photo::create($albumId, $fullpath); + + } +} + +?> diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php index 97d159935f5..a89a56981f5 100644 --- a/apps/gallery/lib/photo.php +++ b/apps/gallery/lib/photo.php @@ -25,4 +25,6 @@ class OC_Gallery_Photo{ .' AND photos.album_id = albums.album_id'); return $stmt->execute(array($owner, $album_name)); } + } + diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php index 59c34b8e69a..f754f913001 100644 --- a/apps/gallery/lib/scanner.php +++ b/apps/gallery/lib/scanner.php @@ -21,13 +21,13 @@ class OC_Gallery_Scanner { public static function scanDir($path, &$albums) { $current_album = array('name'=> $path, 'imagesCount' => 0, 'images' => array()); $current_album['name'] = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $current_album['name'])); - $current_album['name'] = ($current_album['name']==='') ? + $current_album['name'] = ($current_album['name']==='.') ? 'main' : trim($current_album['name'],'.'); if ($dh = OC_Filesystem::opendir($path)) { while (($filename = readdir($dh)) !== false) { - $filepath = $path.'/'.$filename; + $filepath = ($path[strlen($path)-1]=='/'?$path:$path.'/').$filename; if (substr($filename, 0, 1) == '.') continue; if (OC_Filesystem::is_dir($filepath)) { self::scanDir($filepath, $albums); @@ -41,7 +41,7 @@ class OC_Gallery_Scanner { $result = OC_Gallery_Album::find(OC_User::getUser(), $current_album['name']); if ($result->numRows() == 0 && count($current_album['images'])) { - OC_Gallery_Album::create(OC_User::getUser(), $current_album['name']); + OC_Gallery_Album::create(OC_User::getUser(), $current_album['name'], $path); $result = OC_Gallery_Album::find(OC_User::getUser(), $current_album['name']); } $albumId = $result->fetchRow(); diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php index 0e89e448768..7c6e91a468e 100644 --- a/apps/gallery/templates/index.php +++ b/apps/gallery/templates/index.php @@ -4,9 +4,10 @@ OC_Util::addScript('gallery', 'albums'); OC_Util::addScript('gallery', 'album_cover'); ?> +
    - -
    + +
    -- GitLab From e51957b4ded8f538180e55581f4c757d2688aaa5 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sun, 8 Jan 2012 00:22:28 +0100 Subject: [PATCH 164/546] gallery version bump to force db update --- apps/gallery/appinfo/info.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gallery/appinfo/info.xml b/apps/gallery/appinfo/info.xml index 154b5fcf7ae..ba51bf0bd55 100644 --- a/apps/gallery/appinfo/info.xml +++ b/apps/gallery/appinfo/info.xml @@ -2,9 +2,9 @@ gallery Gallery - 0.1 + 0.2 AGPL - Bartosz Przybylski + Bartek Przybylski 2 -- GitLab From 6b95d7427a7d29dd60bc8f464a04b2a004de9eaf Mon Sep 17 00:00:00 2001 From: Cloud Dumper Date: Fri, 6 Jan 2012 11:01:32 +0100 Subject: [PATCH 165/546] Sort results from music collection getters. Albums and artists are now ordered by name, song by track number and name. --- apps/media/lib_collection.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php index caa3ac3f479..1240f1de2f0 100644 --- a/apps/media/lib_collection.php +++ b/apps/media/lib_collection.php @@ -127,7 +127,7 @@ class OC_MEDIA_COLLECTION{ $search='%'; } $query=OC_DB::prepare("SELECT DISTINCT *PREFIX*media_artists.artist_name AS artist_name , *PREFIX*media_artists.artist_id AS artist_id FROM *PREFIX*media_artists - INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=?"); + INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=? ORDER BY artist_name"); return $query->execute(array($search,self::$uid))->fetchAll(); } @@ -160,7 +160,7 @@ class OC_MEDIA_COLLECTION{ */ static public function getAlbums($artist=0,$search='%',$exact=false){ $cmd="SELECT DISTINCT *PREFIX*media_albums.album_name AS album_name , *PREFIX*media_albums.album_artist AS album_artist , *PREFIX*media_albums.album_id AS album_id - FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? "; + FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? ORDER BY album_name"; $params=array(self::$uid); if($artist!=0){ $cmd.="AND *PREFIX*media_albums.album_artist = ? "; @@ -233,7 +233,7 @@ class OC_MEDIA_COLLECTION{ }else{ $searchString=''; } - $query=OC_DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString"); + $query=OC_DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString ORDER BY song_track, song_name"); return $query->execute($params)->fetchAll(); } @@ -378,4 +378,4 @@ class OC_MEDIA_COLLECTION{ } } -?> \ No newline at end of file +?> -- GitLab From 5b57cd310e08b00c7bfc3821a3c2d6d8b48405b5 Mon Sep 17 00:00:00 2001 From: Cloud Dumper Date: Fri, 6 Jan 2012 11:29:15 +0100 Subject: [PATCH 166/546] Also use track_number to retrieve song track. This adds support for id3v2 tags such as TRACK/TOTAL. --- apps/media/lib_scanner.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php index c2bea2d836d..320b1f79199 100644 --- a/apps/media/lib_scanner.php +++ b/apps/media/lib_scanner.php @@ -120,7 +120,20 @@ class OC_MEDIA_SCANNER{ $title=stripslashes($data['comments']['title'][0]); } $size=$data['filesize']; - $track=(isset($data['comments']['track']))?$data['comments']['track'][0]:0; + if (isset($data['comments']['track'])) + { + $track = $data['comments']['track'][0]; + } + else if (isset($data['comments']['track_number'])) + { + $track = $data['comments']['track_number'][0]; + $track = explode('/',$track); + $track = $track[0]; + } + else + { + $track = 0; + } $length=isset($data['playtime_seconds'])?round($data['playtime_seconds']):0; } if(!isset(self::$artists[$artist])){ -- GitLab From 2de3b4bd1738cfce48d7c003316e13e988819898 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sun, 8 Jan 2012 01:32:11 +0100 Subject: [PATCH 167/546] rename and delete hooks --- apps/gallery/lib/hooks_handlers.php | 65 ++++++++++++++++++++++++++--- apps/gallery/lib/photo.php | 15 ++++++- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 5d1e7502aa3..1bddaf363e3 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -1,6 +1,8 @@ numRows() == 0) { - $new_album_name = trim(str_replace('/', '.', $fullpath)); - if ($new_album_name == '.') $new_album_name = 'main'; - OC_Gallery_Album::create(OC_User::getUser(), $new_album_name, $path); - $album = OC_Gallery_Album::find(OC_User::getUser(), null, $path); + $album = self::createAlbum($path); } $album = $album->fetchRow(); $albumId = $album['album_id']; - OC_Gallery_Photo::create($albumId, $fullpath); + $photo = OC_Gallery_Photo::find($albumId, $fullpath); + if ($photo->numRows() == 0) { // don't duplicate photo entries + OC_Log::write(self::$APP_TAG, 'Adding new photo to album', OC_Log::DEBUG); + OC_Gallery_Photo::create($albumId, $fullpath); + } } + + public static function removePhoto($params) { + $path = $params['path']; + if (!self::isPhoto($path)) return; + OC_Gallery_Photo::removeByPath($path); + } + + public static function renamePhoto($params) { + $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); + $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); + if (!self::isPhoto($params['newpath'])) return; + $album; + $newAlbumId; + $oldAlbumId; + if ($olddir == $newdir) { + // album changing is not needed + $album = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); + if ($album->numRows() == 0) { + $album = self::createAlbum($newdir); + } + $album = $album->fetchRow(); + $newAlbumId = $oldAlbumId = $album['album_id']; + } else { + $newalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $newdir); + $oldalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); + + if ($newalbum->numRows() == 0) { + $newalbum = self::createAlbum($newdir); + } + $newalbum = $newalbum->fetchRow(); + if ($oldalbum->numRows() == 0) { + OC_Gallery_Photo::create($newalbum['album_id'], $params['newpath']); + return; + } + $oldalbum = $oldalbum->fetchRow(); + $newAlbumId = $newalbum['album_id']; + $oldAlbumId = $oldalbum['album_id']; + + } + OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $params['oldpath'], $params['newpath']); + } } ?> diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php index a89a56981f5..f8a640819a1 100644 --- a/apps/gallery/lib/photo.php +++ b/apps/gallery/lib/photo.php @@ -8,7 +8,6 @@ class OC_Gallery_Photo{ public static function find($albumId, $img=null){ $sql = 'SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ?'; $args = array($albumId); - $args = array($albumId); if (!is_null($img)){ $sql .= ' AND file_path = ?'; $args[] = $img; @@ -26,5 +25,19 @@ class OC_Gallery_Photo{ return $stmt->execute(array($owner, $album_name)); } + public static function removeByPath($path) { + $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE file_path = ?'); + $stmt->execute(array($path)); + } + + public static function removeById($id) { + $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE photo_id = ?'); + $stmt->execute(array($id)); + } + + public static function changePath($oldAlbumId, $newAlbumId, $oldpath, $newpath) { + $stmt = OC_DB::prepare("UPDATE *PREFIX*gallery_photos SET file_path = ?, album_id = ? WHERE album_id = ? and file_path = ?"); + $stmt->execute(array($newpath, $newAlbumId, $oldAlbumId, $oldpath)); + } } -- GitLab From 6c09d9e0f8a22c77ff6ebf83e4e44de3aeb6be3e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 12 Nov 2011 18:06:07 +0100 Subject: [PATCH 168/546] some fixes in the sqlite3 driver --- lib/MDB2/Driver/Manager/sqlite3.php | 2 +- lib/MDB2/Driver/Reverse/sqlite3.php | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index c5c19a90fb5..7e30755fc3a 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -798,7 +798,7 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return $db; } - $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name"; + $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL AND name!='sqlite_sequence' ORDER BY name"; $table_names = $db->queryCol($query); if (PEAR::isError($table_names)) { return $table_names; diff --git a/lib/MDB2/Driver/Reverse/sqlite3.php b/lib/MDB2/Driver/Reverse/sqlite3.php index d5595da84c5..33e5b590268 100644 --- a/lib/MDB2/Driver/Reverse/sqlite3.php +++ b/lib/MDB2/Driver/Reverse/sqlite3.php @@ -69,7 +69,7 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, 'unexpected empty table column definition list', __FUNCTION__); } - $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i'; + $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( AUTOINCREMENT)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i'; $regexp2 = '/^\s*([^ ]+) +(PRIMARY|UNIQUE|CHECK)$/i'; for ($i=0, $j=0; $i<$count; ++$i) { if (!preg_match($regexp, trim($column_sql[$i]), $matches)) { @@ -90,11 +90,16 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common if (isset($matches[8]) && strlen($matches[8])) { $columns[$j]['unsigned'] = true; } - if (isset($matches[9]) && strlen($matches[9])) { + if (isset($matches[10]) && strlen($matches[10])) { $columns[$j]['autoincrement'] = true; + $columns[$j]['notnull']=true; } - if (isset($matches[12]) && strlen($matches[12])) { - $default = $matches[12]; + if (isset($matches[10]) && strlen($matches[10])) { + $columns[$j]['autoincrement'] = true; + $columns[$j]['notnull']=true; + } + if (isset($matches[13]) && strlen($matches[13])) { + $default = $matches[13]; if (strlen($default) && $default[0]=="'") { $default = str_replace("''", "'", substr($default, 1, strlen($default)-2)); } @@ -107,8 +112,8 @@ class MDB2_Driver_Reverse_sqlite3 extends MDB2_Driver_Reverse_Common $columns[$j]['notnull'] = ($matches[7] === ' NOT NULL'); } else if (isset($matches[9]) && strlen($matches[9])) { $columns[$j]['notnull'] = ($matches[9] === ' NOT NULL'); - } else if (isset($matches[13]) && strlen($matches[13])) { - $columns[$j]['notnull'] = ($matches[13] === ' NOT NULL'); + } else if (isset($matches[14]) && strlen($matches[14])) { + $columns[$j]['notnull'] = ($matches[14] === ' NOT NULL'); } ++$j; } -- GitLab From 91a9688d0742b5c1af7d0b52da7a57e49e1e3e45 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:06:29 +0100 Subject: [PATCH 169/546] minor changes to mysql setup --- lib/setup.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index b53c626c9a7..d454c17599d 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -160,8 +160,8 @@ class OC_Setup { //add prefix to the postgresql user name to prevent collissions $dbusername='oc_'.$username; - //hash the password so we don't need to store the admin config in the config file - $dbpassword=md5(time().$password); + //create a new password so we don't need to store the admin config in the config file + $dbpassword=md5(time()); self::pg_createDBUser($dbusername, $dbpassword, $connection); @@ -221,7 +221,7 @@ class OC_Setup { } public static function createDatabase($name,$user,$connection) { - //we cant user OC_BD functions here because we need to connect as the administrative user. + //we cant use OC_BD functions here because we need to connect as the administrative user. $query = "CREATE DATABASE IF NOT EXISTS `$name`"; $result = mysql_query($query, $connection); if(!$result) { @@ -243,7 +243,7 @@ class OC_Setup { } public static function pg_createDatabase($name,$user,$connection) { - //we cant user OC_BD functions here because we need to connect as the administrative user. + //we cant use OC_BD functions here because we need to connect as the administrative user. $query = "CREATE DATABASE $name OWNER $user"; $result = pg_query($connection, $query); if(!$result) { -- GitLab From 9a4e37483b9c6d7c6e287a9c95a408fc0249e8f9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:08:47 +0100 Subject: [PATCH 170/546] small fix in sqlite3 driver --- lib/MDB2/Driver/Manager/sqlite3.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index 7e30755fc3a..71b9597d202 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -168,9 +168,6 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common if (PEAR::isError($query_fields)) { return $query_fields; } - if (!empty($options['primary'])) { - $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')'; - } if (!empty($options['foreign_keys'])) { foreach ($options['foreign_keys'] as $fkname => $fkdef) { if (empty($fkdef)) { -- GitLab From ecf6f2ca2f74abbfdc72788c502ef5a015dc890a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 13 Nov 2011 16:16:21 +0100 Subject: [PATCH 171/546] automatically upgrade the main database on version number increase (doesnt work with sqlite for now) --- lib/base.php | 10 ++++++++-- lib/db.php | 9 ++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/base.php b/lib/base.php index 0954e3615bd..803c0118e20 100644 --- a/lib/base.php +++ b/lib/base.php @@ -152,6 +152,12 @@ class OC{ } } + $installedVersion=OC_Config::getValue('version','0.0.0'); + $currentVersion=implode('.',OC_Util::getVersion()); + if (version_compare($currentVersion, $installedVersion, '>')) { + OC_DB::updateDbFromStructure('../db_structure.xml'); + } + ini_set('session.cookie_httponly','1;'); session_start(); @@ -230,8 +236,6 @@ if( !isset( $RUNTIME_NOAPPS )){ $RUNTIME_NOAPPS = false; } -OC::init(); - if(!function_exists('get_temp_dir')) { function get_temp_dir() { if( $temp=ini_get('upload_tmp_dir') ) return $temp; @@ -247,6 +251,8 @@ if(!function_exists('get_temp_dir')) { } } +OC::init(); + require_once('fakedirstream.php'); diff --git a/lib/db.php b/lib/db.php index c7085a975ef..05ed8398b7b 100644 --- a/lib/db.php +++ b/lib/db.php @@ -338,7 +338,6 @@ class OC_DB { * @param $file file to read structure from */ public static function updateDbFromStructure($file){ - $CONFIG_DBNAME = OC_Config::getValue( "dbname", "owncloud" ); $CONFIG_DBTABLEPREFIX = OC_Config::getValue( "dbtableprefix", "oc_" ); $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); @@ -347,17 +346,17 @@ class OC_DB { // read file $content = file_get_contents( $file ); + $previousSchema = self::$schema->getDefinitionFromDatabase(); + // Make changes and save them to a temporary file $file2 = tempnam( get_temp_dir(), 'oc_db_scheme_' ); - $content = str_replace( '*dbname*', $CONFIG_DBNAME, $content ); + $content = str_replace( '*dbname*', $previousSchema['name'], $content ); $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content ); if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); } file_put_contents( $file2, $content ); - $previousSchema = self::$schema->getDefinitionFromDatabase(); - $op = $schema->updateDatabase($file2, $previousSchema, array(), false); - + $op = self::$schema->updateDatabase($file2, $previousSchema, array(), false); if (PEAR::isError($op)) { $error = $op->getMessage(); OC_Log::write('core','Failed to update database structure ('.$error.')',OC_Log::FATAL); -- GitLab From 09a53170a309677b344b25d9820ef038a0e87929 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 15:58:12 +0100 Subject: [PATCH 172/546] fixes in the sqlite manager driver --- lib/MDB2/Driver/Manager/sqlite3.php | 72 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index 71b9597d202..a6fde69d6c4 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -531,9 +531,26 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return MDB2_OK; } + if (empty($changes['remove']) and empty($changes['rename']) and empty($changes['change']) ){//if only rename or add changes are required, we can use ALTER TABLE + $query = ''; + if (!empty($changes['name'])) { + $change_name = $db->quoteIdentifier($changes['name'], true); + $query = 'RENAME TO ' . $change_name; + $db->exec("ALTER TABLE $name $query"); + } + + if (!empty($changes['add']) && is_array($changes['add'])) { + foreach ($changes['add'] as $field_name => $field) { + $query= 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field); + $db->exec("ALTER TABLE $name $query"); + } + } + return MDB2_OK; + } + $db->loadModule('Reverse', null, true); - // actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it + // for other operations we need to emulate them with sqlite3 $fields = $db->manager->listTableFields($name); if (PEAR::isError($fields)) { return $fields; @@ -633,16 +650,10 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common } } + //rename the old table so we can create the new one + $db->exec("ALTER TABLE $name RENAME TO __$name"); $data = null; - if (!empty($select_fields)) { - $query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true); - $data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED); - } - $result = $this->dropTable($name); - if (PEAR::isError($result)) { - return $result; - } $result = $this->createTable($name_new, $fields, $options); if (PEAR::isError($result)) { @@ -657,20 +668,35 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common $this->createConstraint($name_new, $constraint, $definition); } - if (!empty($select_fields) && !empty($data)) { - $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); - $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; - $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; - $stmt =$db->prepare($query, null, MDB2_PREPARE_MANIP); - if (PEAR::isError($stmt)) { - return $stmt; - } - foreach ($data as $row) { - $result = $stmt->execute($row); - if (PEAR::isError($result)) { - return $result; - } - } + //fill the new table with data from the old one + if (!empty($select_fields)) { + $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); + $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; + $query .= ' SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier('__'.$name, true); + $db->exec($query); + } + +// if (!empty($select_fields) && !empty($data)) { +// $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); +// $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; +// $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; +// $stmt =$db->prepare($query, null, MDB2_PREPARE_MANIP); +// if (PEAR::isError($stmt)) { +// return $stmt; +// } +// foreach ($data as $row) { +// $result = $stmt->execute($row); +// if (PEAR::isError($result)) { +// return $result; +// } +// } +// } + echo "changes $name"; + + //remove the old table + $result = $this->dropTable('__'.$name); + if (PEAR::isError($result)) { + return $result; } return MDB2_OK; } -- GitLab From c6aa0f9854a2e598c6bb2cd2d0b6ffce7a9c6e64 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 15:59:01 +0100 Subject: [PATCH 173/546] set the installed version after updating the database --- lib/base.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/base.php b/lib/base.php index 803c0118e20..7b42d56f522 100644 --- a/lib/base.php +++ b/lib/base.php @@ -156,6 +156,7 @@ class OC{ $currentVersion=implode('.',OC_Util::getVersion()); if (version_compare($currentVersion, $installedVersion, '>')) { OC_DB::updateDbFromStructure('../db_structure.xml'); + OC_Config::setValue('version',implode('.',OC_Util::getVersion())); } ini_set('session.cookie_httponly','1;'); -- GitLab From 001d06f2ff4a641ff76b4d67a3a33cbdbf5b2bb5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Nov 2011 16:08:08 +0100 Subject: [PATCH 174/546] fix errors during database migration --- lib/MDB2/Driver/Manager/sqlite3.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/MDB2/Driver/Manager/sqlite3.php b/lib/MDB2/Driver/Manager/sqlite3.php index a6fde69d6c4..8f4e1312eb8 100644 --- a/lib/MDB2/Driver/Manager/sqlite3.php +++ b/lib/MDB2/Driver/Manager/sqlite3.php @@ -660,13 +660,15 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common return $result; } - foreach ($indexes as $index => $definition) { - $this->createIndex($name_new, $index, $definition); - } + //these seem to only give errors - foreach ($constraints as $constraint => $definition) { - $this->createConstraint($name_new, $constraint, $definition); - } +// foreach ($indexes as $index => $definition) { +// $this->createIndex($name_new, $index, $definition); +// } + +// foreach ($constraints as $constraint => $definition) { +// $this->createConstraint($name_new, $constraint, $definition); +// } //fill the new table with data from the old one if (!empty($select_fields)) { @@ -691,7 +693,6 @@ class MDB2_Driver_Manager_sqlite3 extends MDB2_Driver_Manager_Common // } // } // } - echo "changes $name"; //remove the old table $result = $this->dropTable('__'.$name); -- GitLab From fea68e08b4f0aa52ebd051e4428ff5abd8284f5c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 11 Dec 2011 22:08:01 +0100 Subject: [PATCH 175/546] update apps when their version number increases --- lib/app.php | 29 +++++++++++++++++++++++++++++ lib/base.php | 2 ++ 2 files changed, 31 insertions(+) diff --git a/lib/app.php b/lib/app.php index 1873e1136cd..6b35cdffec9 100644 --- a/lib/app.php +++ b/lib/app.php @@ -371,4 +371,33 @@ class OC_App{ } return $apps; } + + /** + * check if any apps need updating and update those + */ + public static function updateApps(){ + // The rest comes here + $apps = OC_Appconfig::getApps(); + foreach( $apps as $app ){ + $installedVersion=OC_Appconfig::getValue($app,'installed_version'); + $appInfo=OC_App::getAppInfo($app); + $currentVersion=$appInfo['version']; + if (version_compare($currentVersion, $installedVersion, '>')) { + OC_App::updateApp($app); + } + } + } + + /** + * update the database for the app and call the update script + * @param string appid + */ + public static function updateApp($appid){ + if(file_exists(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/database.xml')){ + OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/database.xml'); + } + if(file_exists(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/update.php')){ + include OC::$SERVERROOT.'/apps/'.$file.'/appinfo/update.php'; + } + } } diff --git a/lib/base.php b/lib/base.php index 7b42d56f522..c3965c9cd39 100644 --- a/lib/base.php +++ b/lib/base.php @@ -159,6 +159,8 @@ class OC{ OC_Config::setValue('version',implode('.',OC_Util::getVersion())); } + OC_App::updateApps(); + ini_set('session.cookie_httponly','1;'); session_start(); -- GitLab From 010bfa11e363928f4c3a6d8518cbab0e79e28149 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Sun, 1 Jan 2012 16:58:51 -0500 Subject: [PATCH 176/546] Fix updateApp() and add extra check to updateApps() --- lib/app.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/app.php b/lib/app.php index 6b35cdffec9..13c4cef32b4 100644 --- a/lib/app.php +++ b/lib/app.php @@ -381,9 +381,11 @@ class OC_App{ foreach( $apps as $app ){ $installedVersion=OC_Appconfig::getValue($app,'installed_version'); $appInfo=OC_App::getAppInfo($app); - $currentVersion=$appInfo['version']; - if (version_compare($currentVersion, $installedVersion, '>')) { - OC_App::updateApp($app); + if (isset($appInfo['version'])) { + $currentVersion=$appInfo['version']; + if (version_compare($currentVersion, $installedVersion, '>')) { + OC_App::updateApp($app); + } } } } @@ -393,11 +395,11 @@ class OC_App{ * @param string appid */ public static function updateApp($appid){ - if(file_exists(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/database.xml')){ - OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/database.xml'); + if(file_exists(OC::$SERVERROOT.'/apps/'.$appid.'/appinfo/database.xml')){ + OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/apps/'.$appid.'/appinfo/database.xml'); } - if(file_exists(OC::$SERVERROOT.'/apps/'.$file.'/appinfo/update.php')){ - include OC::$SERVERROOT.'/apps/'.$file.'/appinfo/update.php'; + if(file_exists(OC::$SERVERROOT.'/apps/'.$appid.'/appinfo/update.php')){ + include OC::$SERVERROOT.'/apps/'.$appid.'/appinfo/update.php'; } } } -- GitLab From 034cf19159c828d242fbb3128fda6db815a75ca6 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 02:57:52 +0100 Subject: [PATCH 177/546] allow changing database backends between PDO and MDB2 --- lib/db.php | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/db.php b/lib/db.php index 05ed8398b7b..58a478ba0c0 100644 --- a/lib/db.php +++ b/lib/db.php @@ -71,7 +71,14 @@ class OC_DB { /** * connect to the database using pdo */ - private static function connectPDO(){ + public static function connectPDO(){ + if(self::$connection){ + if(self::$backend==self::BACKEND_MDB2){ + self::disconnect(); + }else{ + return; + } + } // The global data we need $name = OC_Config::getValue( "dbname", "owncloud" ); $host = OC_Config::getValue( "dbhost", "" ); @@ -113,7 +120,14 @@ class OC_DB { /** * connect to the database using mdb2 */ - static private function connectMDB2(){ + public static function connectMDB2(){ + if(self::$connection){ + if(self::$backend==self::BACKEND_PDO){ + self::disconnect(); + }else{ + return; + } + } // The global data we need $name = OC_Config::getValue( "dbname", "owncloud" ); $host = OC_Config::getValue( "dbhost", "" ); @@ -255,8 +269,8 @@ class OC_DB { self::$connection->disconnect(); } self::$connection=false; - self::$mdb2=false; - self::$pdo=false; + self::$MDB2=false; + self::$PDO=false; } return true; @@ -374,6 +388,7 @@ class OC_DB { private static function connectScheme(){ // We need a mdb2 database connection self::connectMDB2(); + self::$MDB2->loadModule('Manager'); // Connect if this did not happen before if(!self::$schema){ -- GitLab From 21c4515465748f4ed38a4dc14382d22649711c08 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sun, 8 Jan 2012 11:01:25 +0100 Subject: [PATCH 178/546] rename fix, licence header added --- apps/gallery/ajax/cover.php | 22 ++++++++++++++++++++++ apps/gallery/ajax/createAlbum.php | 22 ++++++++++++++++++++++ apps/gallery/ajax/galleryOp.php | 22 ++++++++++++++++++++++ apps/gallery/ajax/getAlbums.php | 22 ++++++++++++++++++++++ apps/gallery/ajax/getCovers.php | 22 ++++++++++++++++++++++ apps/gallery/ajax/scanForAlbums.php | 21 +++++++++++++++++++++ apps/gallery/ajax/thumbnail.php | 22 ++++++++++++++++++++++ apps/gallery/appinfo/app.php | 22 ++++++++++++++++++++++ apps/gallery/appinfo/info.xml | 2 +- apps/gallery/index.php | 22 ++++++++++++++++++++++ apps/gallery/lib/album.php | 21 +++++++++++++++++++++ apps/gallery/lib/hooks_handlers.php | 28 +++++++++++++++++++++++++--- apps/gallery/lib/images_utils.php | 22 ++++++++++++++++++++++ apps/gallery/lib/photo.php | 21 +++++++++++++++++++++ apps/gallery/lib/scanner.php | 21 +++++++++++++++++++++ 15 files changed, 308 insertions(+), 4 deletions(-) diff --git a/apps/gallery/ajax/cover.php b/apps/gallery/ajax/cover.php index d83f4daaa52..181a919375d 100644 --- a/apps/gallery/ajax/cover.php +++ b/apps/gallery/ajax/cover.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/ajax/createAlbum.php b/apps/gallery/ajax/createAlbum.php index 9413b54718a..152f5834bcb 100644 --- a/apps/gallery/ajax/createAlbum.php +++ b/apps/gallery/ajax/createAlbum.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 8a006dda637..3d1ed1f33cb 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); require_once(OC::$CLASSPATH['OC_Gallery_Album']); OC_JSON::checkLoggedIn(); diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php index e4736076fed..9e9c6ef496c 100644 --- a/apps/gallery/ajax/getAlbums.php +++ b/apps/gallery/ajax/getAlbums.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/ajax/getCovers.php b/apps/gallery/ajax/getCovers.php index db7c8e9fcde..4db73d0fbf3 100644 --- a/apps/gallery/ajax/getCovers.php +++ b/apps/gallery/ajax/getCovers.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php index b1f0a433a42..b8ed639d9dc 100644 --- a/apps/gallery/ajax/scanForAlbums.php +++ b/apps/gallery/ajax/scanForAlbums.php @@ -1,5 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php index d937691fa03..6d25c7a2536 100644 --- a/apps/gallery/ajax/thumbnail.php +++ b/apps/gallery/ajax/thumbnail.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php index 3a2dbcb43ad..9c665fd3500 100644 --- a/apps/gallery/appinfo/app.php +++ b/apps/gallery/appinfo/app.php @@ -1,4 +1,26 @@ . +* +*/ + OC::$CLASSPATH['OC_Gallery_Album'] = 'apps/gallery/lib/album.php'; OC::$CLASSPATH['OC_Gallery_Photo'] = 'apps/gallery/lib/photo.php'; OC::$CLASSPATH['OC_Gallery_Scanner'] = 'apps/gallery/lib/scanner.php'; diff --git a/apps/gallery/appinfo/info.xml b/apps/gallery/appinfo/info.xml index ba51bf0bd55..c275f39bb25 100644 --- a/apps/gallery/appinfo/info.xml +++ b/apps/gallery/appinfo/info.xml @@ -6,6 +6,6 @@ AGPL Bartek Przybylski 2 - + Gallery application for ownCloud diff --git a/apps/gallery/index.php b/apps/gallery/index.php index 0cd795bac01..822a5b8e143 100644 --- a/apps/gallery/index.php +++ b/apps/gallery/index.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../lib/base.php'); OC_Util::checkLoggedIn(); diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index 98876b891c5..a94eff3acd7 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -1,5 +1,26 @@ . +* +*/ + class OC_Gallery_Album { public static function create($owner, $name, $path){ $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums (uid_owner, album_name, album_path) VALUES (?, ?, ?)'); diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 1bddaf363e3..b6aa8a400cf 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -1,5 +1,26 @@ . +* +*/ + OC_Hook::connect("OC_Filesystem", "post_write", "OC_Gallery_Hooks_Handlers", "addPhotoFromPath"); OC_Hook::connect("OC_Filesystem", "delete", "OC_Gallery_Hooks_Handlers", "removePhoto"); OC_Hook::connect("OC_Filesystem", "post_rename", "OC_Gallery_Hooks_Handlers", "renamePhoto"); @@ -18,7 +39,8 @@ class OC_Gallery_Hooks_Handlers { private static function createAlbum($path) { $new_album_name = trim(str_replace('/', '.', $path), '.'); - if ($new_album_name == '') $new_album_name = 'main'; + if ($new_album_name == '') + $new_album_name = 'main'; OC_Log::write(self::$APP_TAG, 'Creating new album '.$new_album_name, OC_Log::DEBUG); OC_Gallery_Album::create(OC_User::getUser(), $new_album_name, $path); @@ -53,8 +75,8 @@ class OC_Gallery_Hooks_Handlers { } public static function renamePhoto($params) { - $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); - $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); + $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')+1); + $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')+1); if (!self::isPhoto($params['newpath'])) return; $album; $newAlbumId; diff --git a/apps/gallery/lib/images_utils.php b/apps/gallery/lib/images_utils.php index cb46bf3f160..0cfa52eb564 100644 --- a/apps/gallery/lib/images_utils.php +++ b/apps/gallery/lib/images_utils.php @@ -1,4 +1,26 @@ . +* +*/ + require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('gallery'); diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php index f8a640819a1..23887098e0f 100644 --- a/apps/gallery/lib/photo.php +++ b/apps/gallery/lib/photo.php @@ -1,5 +1,26 @@ . +* +*/ + class OC_Gallery_Photo{ public static function create($albumId, $img){ $stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_photos (album_id, file_path) VALUES (?, ?)'); diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php index f754f913001..3eba9260ac7 100644 --- a/apps/gallery/lib/scanner.php +++ b/apps/gallery/lib/scanner.php @@ -1,5 +1,26 @@ . +* +*/ + require_once('base.php'); // base lib require_once('images_utils.php'); -- GitLab From c2392bbace7511dfa424513ba88a8d76f3ee620c Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sun, 8 Jan 2012 11:25:08 +0100 Subject: [PATCH 179/546] db overwriting, gallery creating fix --- apps/gallery/appinfo/database.xml | 2 +- apps/gallery/lib/hooks_handlers.php | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml index db88e4c1b5a..ccdfad9433a 100644 --- a/apps/gallery/appinfo/database.xml +++ b/apps/gallery/appinfo/database.xml @@ -2,7 +2,7 @@ *dbname* true - false + true latin1
    *dbprefix*gallery_albums diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index b6aa8a400cf..65f3faaeeaf 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -32,6 +32,7 @@ class OC_Gallery_Hooks_Handlers { private static $APP_TAG = "Gallery"; private static function isPhoto($filename) { + OC_Log::write(self::$APP_TAG, "Checking file ".$filename." with mimetype ".OC_Filesystem::getMimeType($filename), OC_Log::DEBUG); if (substr(OC_Filesystem::getMimeType($filename), 0, 6) == "image/") return 1; return 0; @@ -53,6 +54,7 @@ class OC_Gallery_Hooks_Handlers { $fullpath = $params['path']; OC_Log::write(self::$APP_TAG, 'Adding file with path '. $fullpath, OC_Log::DEBUG); $path = substr($fullpath, 0, strrpos($fullpath, '/')); + if ($path == '') $path = '/'; $album = OC_Gallery_Album::find(OC_User::getUser(), null, $path); if ($album->numRows() == 0) { @@ -75,9 +77,12 @@ class OC_Gallery_Hooks_Handlers { } public static function renamePhoto($params) { - $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')+1); - $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')+1); + $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); + $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); + if ($olddir == '') $olddir = '/'; + if ($newdir == '') $newdir = '/'; if (!self::isPhoto($params['newpath'])) return; + OC_Log::write(self::$APP_TAG, 'Moving photo from '.$params['oldpath'].' to '.$params['newpath'], OC_Log::DEBUG); $album; $newAlbumId; $oldAlbumId; -- GitLab From 76b193c69818187b5d52fdcd3d07873c343aa5d9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 13:01:41 +0100 Subject: [PATCH 180/546] don't try to upgrade what isn't installed --- lib/base.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/base.php b/lib/base.php index c3965c9cd39..854b91b0c1d 100644 --- a/lib/base.php +++ b/lib/base.php @@ -152,14 +152,16 @@ class OC{ } } - $installedVersion=OC_Config::getValue('version','0.0.0'); - $currentVersion=implode('.',OC_Util::getVersion()); - if (version_compare($currentVersion, $installedVersion, '>')) { - OC_DB::updateDbFromStructure('../db_structure.xml'); - OC_Config::setValue('version',implode('.',OC_Util::getVersion())); - } + if(OC_Config::getValue('installed', false)){ + $installedVersion=OC_Config::getValue('version','0.0.0'); + $currentVersion=implode('.',OC_Util::getVersion()); + if (version_compare($currentVersion, $installedVersion, '>')) { + OC_DB::updateDbFromStructure('../db_structure.xml'); + OC_Config::setValue('version',implode('.',OC_Util::getVersion())); + } - OC_App::updateApps(); + OC_App::updateApps(); + } ini_set('session.cookie_httponly','1;'); session_start(); -- GitLab From a4e14b49b14b2215037806ded362b2ded0e61465 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 13:16:11 +0100 Subject: [PATCH 181/546] load reverse driver when updating database --- lib/db.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/db.php b/lib/db.php index 58a478ba0c0..b901cc8b513 100644 --- a/lib/db.php +++ b/lib/db.php @@ -389,6 +389,7 @@ class OC_DB { // We need a mdb2 database connection self::connectMDB2(); self::$MDB2->loadModule('Manager'); + self::$MDB2->loadModule('Reverse'); // Connect if this did not happen before if(!self::$schema){ -- GitLab From 4d1ed7e05f5efc589b7fb6031661ccda496cee76 Mon Sep 17 00:00:00 2001 From: Cloud Dumper Date: Sat, 7 Jan 2012 23:41:51 +0100 Subject: [PATCH 182/546] Improve music playlist rendering. This change: * bolds currently playing song in playlist; * forces song names in playlist to one line, ellipsize after (...); * adds jQuery tipsies to get the whole song name, along with the artist name, and the album the song is coming from. No need to split this changeset into three different ones for the sake of atomicity. Two first elements were on the priorities / bug list available there: http://gitorious.org/owncloud/pages/Home --- apps/media/css/music.css | 4 ++-- apps/media/js/playlist.js | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/media/css/music.css b/apps/media/css/music.css index a6738058be3..41ade44a66f 100644 --- a/apps/media/css/music.css +++ b/apps/media/css/music.css @@ -22,11 +22,11 @@ div.jp-volume-bar-value { background:#ccc; width:0; height:0.4em; } #collection li.album,#collection li.song { margin-left:3em; } #leftcontent img.remove { display:none; float:right; cursor:pointer; } #leftcontent li:hover img.remove { display:inline; } -#leftcontent li {white-space: normal; } +#leftcontent li div.label { float: left; width: 200px; overflow: hidden; text-overflow: ellipsis; } #collection li button { float:right; } #collection li,#playlist li { list-style-type:none; } .template { display:none; } -.collection_playing { background:#eee; } +.collection_playing { background:#eee; font-weight: bold; } #collection li { padding-right:10px; } #searchresults input.play, #searchresults input.add { float:left; height:1em; width:1em; } diff --git a/apps/media/js/playlist.js b/apps/media/js/playlist.js index 57180b3be7b..089065989ae 100644 --- a/apps/media/js/playlist.js +++ b/apps/media/js/playlist.js @@ -1,11 +1,23 @@ PlayList.render=function(){ $('#playlist').show(); + + /* + * We should not empty() PlayList.parent() but thorougly manage its + * elements instead because some code might be attached to those. + * JQuery tipsies are one of them. The following line make sure they + * are all removed before we delete the associated
  • . + */ + $(".tipsy").remove(); + PlayList.parent.empty(); for(var i=0;i'); - li.append(item.name); - li.attr('class', 'jp-playlist-' + i); + li.attr('class', 'jp-playlist-' + i); + li.attr('title', item.artist + ' - ' + item.name + '
    (' + item.album + ')'); + var div = $('
    ' + item.name + '
    '); + li.append(div); + $('.jp-playlist-' + i).tipsy({gravity:'w', fade:true, live:true, html:true}); var img=$(''); img.click(function(event){ event.stopPropagation(); -- GitLab From ae711168c3308e013c0d24cc7f832ff91077e911 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 14:07:12 +0100 Subject: [PATCH 183/546] improve detection for mysql databases --- lib/setup.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index d454c17599d..a65dc9453c2 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -103,7 +103,7 @@ class OC_Setup { //use the admin login data for the new database user //add prefix to the mysql user name to prevent collissions - $dbusername=substr('oc_mysql_'.$username,0,16); + $dbusername=substr('oc_'.$username,0,16); //hash the password so we don't need to store the admin config in the config file $dbpassword=md5(time().$password); @@ -124,9 +124,12 @@ class OC_Setup { } //fill the database if needed - $query="SELECT * FROM $dbname.{$dbtableprefix}users"; + $query="select count(*) from information_schema.tables where table_schema='$dbname' AND table_name = '{$dbtableprefix}users';"; $result = mysql_query($query,$connection); - if(!$result) { + if($result){ + $row=mysql_fetch_row($result); + } + if(!$result or $row[0]==0) { OC_DB::createDbFromStructure('db_structure.xml'); } mysql_close($connection); -- GitLab From 49337e0ad1db8ecf8244f057f729241d923ac2ff Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 14:25:38 +0100 Subject: [PATCH 184/546] dont create a new user when it already exists --- lib/setup.php | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index a65dc9453c2..ebe7a45a1f6 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -98,26 +98,33 @@ class OC_Setup { ); } else { + $oldUser=OC_Config::getValue('dbuser', false); + $oldPassword=OC_Config::getValue('dbpassword', false); + $query="SELECT user FROM mysql.user WHERE user='$dbuser'"; //this should be enough to check for admin rights in mysql if(mysql_query($query, $connection)) { //use the admin login data for the new database user //add prefix to the mysql user name to prevent collissions $dbusername=substr('oc_'.$username,0,16); - //hash the password so we don't need to store the admin config in the config file - $dbpassword=md5(time().$password); - - self::createDBUser($dbusername, $dbpassword, $connection); - - OC_Config::setValue('dbuser', $dbusername); - OC_Config::setValue('dbpassword', $dbpassword); + if($dbusername!=$oldUser){ + //hash the password so we don't need to store the admin config in the config file + $dbpassword=md5(time().$password); + + self::createDBUser($dbusername, $dbpassword, $connection); + + OC_Config::setValue('dbuser', $dbusername); + OC_Config::setValue('dbpassword', $dbpassword); + } //create the database self::createDatabase($dbname, $dbusername, $connection); } else { - OC_Config::setValue('dbuser', $dbuser); - OC_Config::setValue('dbpassword', $dbpass); + if($dbuser!=$oldUser){ + OC_Config::setValue('dbuser', $dbuser); + OC_Config::setValue('dbpassword', $dbpass); + } //create the database self::createDatabase($dbname, $dbuser, $connection); -- GitLab From 9c6248443adf4be29cf9e85a8f7baca846bcb1d9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 14:35:23 +0100 Subject: [PATCH 185/546] dont overwrite the database with the gallery database --- apps/gallery/appinfo/database.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml index ccdfad9433a..db88e4c1b5a 100644 --- a/apps/gallery/appinfo/database.xml +++ b/apps/gallery/appinfo/database.xml @@ -2,7 +2,7 @@ *dbname* true - true + false latin1
  • *dbprefix*gallery_albums -- GitLab From a9aabd1c8d8acce429a66779d1fe69025a317a83 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sun, 8 Jan 2012 16:41:36 +0100 Subject: [PATCH 186/546] 3rdparty: fix bug in when --- 3rdparty/when/When.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/3rdparty/when/When.php b/3rdparty/when/When.php index f8bb9db0f67..5eaf3dec69d 100755 --- a/3rdparty/when/When.php +++ b/3rdparty/when/When.php @@ -621,7 +621,19 @@ class When if($interval == "month") { - $this->try_date->modify('+1 month'); + + $this->try_date->modify('first day of next month'); + if((int) date('t', $this->try_date->format('U')) > (int) $this->start_date->format('j')){ + $this->try_date->modify('+' . (int) $this->start_date->format('j') - 1 . ' day'); + }else{ + $this->try_date->modify('+' . (int) date('t', $this->try_date->format('U')) - 1 . ' day'); + } + //$this->try_date->setDate(date('y/n/j', mktime(0,0,0,$this->try_date->format('j'), $this->try_date->format('n') + 1, $year = $this->try_date->format('Y')))); + //echo date('t', $this->try_date->format('U')) . '-' . $this->try_date->format('U') . ' '; + /*$month_day = $this->try_date->format('j'); + $month = $this->try_date->format('n'); + $year = $this->try_date->format('Y');*/ + } else { -- GitLab From 9e105d9bd756ef079c407772cba4d67f1a5193fe Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sun, 8 Jan 2012 16:44:15 +0100 Subject: [PATCH 187/546] remove old code in comments --- 3rdparty/when/When.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/3rdparty/when/When.php b/3rdparty/when/When.php index 5eaf3dec69d..d54f296ed61 100755 --- a/3rdparty/when/When.php +++ b/3rdparty/when/When.php @@ -628,12 +628,6 @@ class When }else{ $this->try_date->modify('+' . (int) date('t', $this->try_date->format('U')) - 1 . ' day'); } - //$this->try_date->setDate(date('y/n/j', mktime(0,0,0,$this->try_date->format('j'), $this->try_date->format('n') + 1, $year = $this->try_date->format('Y')))); - //echo date('t', $this->try_date->format('U')) . '-' . $this->try_date->format('U') . ' '; - /*$month_day = $this->try_date->format('j'); - $month = $this->try_date->format('n'); - $year = $this->try_date->format('Y');*/ - } else { -- GitLab From 041e3575d157e1ac0886473c962af10726ae7e67 Mon Sep 17 00:00:00 2001 From: Kshitij Parajuli Date: Sun, 8 Jan 2012 11:00:30 -0500 Subject: [PATCH 188/546] When a music file is playing, the page title gets modified. --- apps/media/js/player.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 3c022e9f8c4..1f76356fd97 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -93,9 +93,11 @@ var PlayList={ ended:PlayList.next, pause:function(){ localStorage.setItem(oc_current_user+'oc_playlist_playing','false'); + document.title = "ownCloud"; }, - play:function(){ + play:function(event){ localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); + document.title = "\u25b8 " + event.jPlayer.status.media.name + " - " + event.jPlayer.status.media.artist + " - ownCloud"; }, supplied:type, ready:function(){ -- GitLab From 13784bee18ace83adc10d869e949420b797ac03f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 17:29:35 +0100 Subject: [PATCH 189/546] mp3info is giving to much trouble, get rid of it --- apps/media/lib_scanner.php | 110 ++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 64 deletions(-) diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php index 320b1f79199..4039cce09ee 100644 --- a/apps/media/lib_scanner.php +++ b/apps/media/lib_scanner.php @@ -30,7 +30,6 @@ class OC_MEDIA_SCANNER{ //these are used to store which artists and albums we found, it can save a lot of addArtist/addAlbum calls static private $artists=array(); static private $albums=array();//stored as "$artist/$album" to allow albums with the same name from different artists - static private $useMp3Info=null; /** * scan a folder for music @@ -70,72 +69,55 @@ class OC_MEDIA_SCANNER{ * @return boolean */ public static function scanFile($path){ - if(is_null(self::$useMp3Info)){ - self::$useMp3Info=OC_Helper::canExecute("mp3info"); - } $file=OC_Filesystem::getLocalFile($path); - if(substr($path,-3)=='mp3' and self::$useMp3Info){//use the command line tool id3info if possible - $output=array(); - $size=filesize($file); - exec('mp3info -p "%a\n%l\n%t\n%n\n%S" "'.$file.'"',$output); - if(count($output)>4){ - $artist=$output[0]; - $album=$output[1]; - $title=$output[2]; - $track=$output[3]; - $length=$output[4]; - }else{ - return; //invalid mp3 file - } + if(!self::isMusic($path)){ + return; + } + if(!self::$getID3){ + self::$getID3=@new getID3(); + self::$getID3->encoding='UTF-8'; + } + $data=@self::$getID3->analyze($file); + getid3_lib::CopyTagsToComments($data); + if(!isset($data['comments'])){ + OC_Log::write('media',"error reading id3 tags in '$file'",OC_Log::WARN); + return; + } + if(!isset($data['comments']['artist'])){ + OC_Log::write('media',"error reading artist tag in '$file'",OC_Log::WARN); + $artist='unknown'; }else{ - if(!self::isMusic($path)){ - return; - } - if(!self::$getID3){ - self::$getID3=@new getID3(); - self::$getID3->encoding='UTF-8'; - } - $data=@self::$getID3->analyze($file); - getid3_lib::CopyTagsToComments($data); - if(!isset($data['comments'])){ - OC_Log::write('media',"error reading id3 tags in '$file'",OC_Log::WARN); - return; - } - if(!isset($data['comments']['artist'])){ - OC_Log::write('media',"error reading artist tag in '$file'",OC_Log::WARN); - $artist='unknown'; - }else{ - $artist=stripslashes($data['comments']['artist'][0]); - } - if(!isset($data['comments']['album'])){ - OC_Log::write('media',"error reading album tag in '$file'",OC_Log::WARN); - $album='unknown'; - }else{ - $album=stripslashes($data['comments']['album'][0]); - } - if(!isset($data['comments']['title'])){ - OC_Log::write('media',"error reading title tag in '$file'",OC_Log::WARN); - $title='unknown'; - }else{ - $title=stripslashes($data['comments']['title'][0]); - } - $size=$data['filesize']; - if (isset($data['comments']['track'])) - { - $track = $data['comments']['track'][0]; - } - else if (isset($data['comments']['track_number'])) - { - $track = $data['comments']['track_number'][0]; - $track = explode('/',$track); - $track = $track[0]; - } - else - { - $track = 0; - } - $length=isset($data['playtime_seconds'])?round($data['playtime_seconds']):0; + $artist=stripslashes($data['comments']['artist'][0]); } + if(!isset($data['comments']['album'])){ + OC_Log::write('media',"error reading album tag in '$file'",OC_Log::WARN); + $album='unknown'; + }else{ + $album=stripslashes($data['comments']['album'][0]); + } + if(!isset($data['comments']['title'])){ + OC_Log::write('media',"error reading title tag in '$file'",OC_Log::WARN); + $title='unknown'; + }else{ + $title=stripslashes($data['comments']['title'][0]); + } + $size=$data['filesize']; + if (isset($data['comments']['track'])) + { + $track = $data['comments']['track'][0]; + } + else if (isset($data['comments']['track_number'])) + { + $track = $data['comments']['track_number'][0]; + $track = explode('/',$track); + $track = $track[0]; + } + else + { + $track = 0; + } + $length=isset($data['playtime_seconds'])?round($data['playtime_seconds']):0; + if(!isset(self::$artists[$artist])){ $artistId=OC_MEDIA_COLLECTION::addArtist($artist); self::$artists[$artist]=$artistId; -- GitLab From ed5fb902bd1391d2fc2adb3c4e5cb25fcb16b93e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 17:30:33 +0100 Subject: [PATCH 190/546] remove mp3info from dependency check --- apps/admin_dependencies_chk/settings.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/admin_dependencies_chk/settings.php b/apps/admin_dependencies_chk/settings.php index 34028056dbe..ce90dd604ca 100644 --- a/apps/admin_dependencies_chk/settings.php +++ b/apps/admin_dependencies_chk/settings.php @@ -44,12 +44,6 @@ $modules[] =array( 'modules'=> array('gallery'), 'message'=> $l->t('The php-gd module is needed to create thumbnails of your images')); -$modules[] =array( - 'status' => OC_Helper::canExecute("mp3info") ? 'ok' : 'warning', - 'part'=> 'mp3info', - 'modules'=> array('media'), - 'message'=> $l->t('The program mp3info is useful to discover ID3 tags of your music files')); - $modules[] =array( 'status' => function_exists("ldap_bind") ? 'ok' : 'error', 'part'=> 'php-ldap', -- GitLab From 37f5a8cdb4d2486982117c5d5984a253c2192e0b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 17:49:53 +0100 Subject: [PATCH 191/546] improve pgsql database detection --- lib/setup.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index ebe7a45a1f6..1b74e945196 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -190,9 +190,12 @@ class OC_Setup { } //fill the database if needed - $query = "SELECT relname FROM pg_class WHERE relname='{$dbtableprefix}users' limit 1"; + $query = "select count(*) FROM pg_class WHERE relname='{$dbtableprefix}users' limit 1"; $result = pg_query($connection, $query); - if(!$result) { + if($result){ + $row = pg_fetch_row($result); + } + if(!$result or $row[0]==0) { OC_DB::createDbFromStructure('db_structure.xml'); } pg_close($connection); -- GitLab From fbb126cdd9c2fd790ed23be3b370b1ae3efb8ba8 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 8 Jan 2012 19:58:08 +0100 Subject: [PATCH 192/546] save updated version number of apps after updating --- lib/app.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/app.php b/lib/app.php index 13c4cef32b4..de7d82ce959 100644 --- a/lib/app.php +++ b/lib/app.php @@ -385,6 +385,7 @@ class OC_App{ $currentVersion=$appInfo['version']; if (version_compare($currentVersion, $installedVersion, '>')) { OC_App::updateApp($app); + OC_Appconfig::setValue($app,'installed_version',$appInfo['version']); } } } -- GitLab From 5e40653713eed01d96841dc93e11534b46a443ee Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 8 Jan 2012 21:18:21 +0000 Subject: [PATCH 193/546] Missing line return --- lib/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/setup.php b/lib/setup.php index 1b74e945196..9a40c36f62c 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -288,7 +288,7 @@ class OC_Setup { $content.= "php_value post_max_size 512M\n"; $content.= "SetEnv htaccessWorking true\n"; $content.= "\n"; - $content.= ""; + $content.= "\n"; $content.= "RewriteEngine on\n"; $content.= "RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]\n"; $content.= "\n"; -- GitLab From f7f19af8164aa78c3d1a143c40098e48f00145b8 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sun, 8 Jan 2012 23:30:50 +0000 Subject: [PATCH 194/546] Handles file permissions. Protect against overwriting changes. --- apps/files_texteditor/ajax/loadfile.php | 28 +++-- apps/files_texteditor/ajax/mtime.php | 49 ++++++++ apps/files_texteditor/ajax/savefile.php | 67 +++++------ apps/files_texteditor/js/editor.js | 145 ++++++++++-------------- 4 files changed, 154 insertions(+), 135 deletions(-) create mode 100644 apps/files_texteditor/ajax/mtime.php diff --git a/apps/files_texteditor/ajax/loadfile.php b/apps/files_texteditor/ajax/loadfile.php index b06b0fa83d2..64e016be8c2 100644 --- a/apps/files_texteditor/ajax/loadfile.php +++ b/apps/files_texteditor/ajax/loadfile.php @@ -28,13 +28,23 @@ require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); // Set the session key for the file we are about to edit. -$path = isset($_GET['path']) ? $_GET['path'] : false; - -if($path){ - $sessionname = md5('oc_file_hash_'.$path); - $filecontents = OC_Filesystem::file_get_contents($path); - OC_Filesystem::update_session_file_hash($sessionname,sha1(htmlspecialchars($filecontents))); - OC_JSON::success(); +$dir = isset($_GET['dir']) ? $_GET['dir'] : ''; +$filename = isset($_GET['file']) ? $_GET['file'] : ''; +if(!empty($filename)) +{ + $path = $dir.'/'.$filename; + if(OC_Filesystem::is_writeable($path)) + { + $mtime = OC_Filesystem::filemtime($path); + $filecontents = OC_Filesystem::file_get_contents($path); + OC_JSON::success(array('data' => array('filecontents' => $filecontents, 'write' => 'true', 'mtime' => $mtime))); + } + else + { + $mtime = OC_Filesystem::filemtime($path); + $filecontents = OC_Filesystem::file_get_contents($path); + OC_JSON::success(array('data' => array('filecontents' => $filecontents, 'write' => 'false', 'mtime' => $mtime))); + } } else { - OC_JSON::error(); -} \ No newline at end of file + OC_JSON::error(array('data' => array( 'message' => 'Invalid file path supplied.'))); +} \ No newline at end of file diff --git a/apps/files_texteditor/ajax/mtime.php b/apps/files_texteditor/ajax/mtime.php new file mode 100644 index 00000000000..df90a68ca7a --- /dev/null +++ b/apps/files_texteditor/ajax/mtime.php @@ -0,0 +1,49 @@ +. + * + */ + +// Init owncloud +require_once('../../../lib/base.php'); + + +// Check if we are a user +OC_JSON::checkLoggedIn(); + +// Get the path from GET +$path = isset($_GEt['path']) ? $_GET['path'] : ''; + +if($path != '') +{ + // Find the mtime + $mtime = OC_Filesystem::filemtime($path); + if($mtime) + { + OC_JSON::success(array('data' => array('path' => $path, 'mtime' => $mtime))); + } + else + { + OC_JSON::error(); + } +} +else +{ + OC_JSON::error(); +} \ No newline at end of file diff --git a/apps/files_texteditor/ajax/savefile.php b/apps/files_texteditor/ajax/savefile.php index f1a2bafc12b..1e073f3ba24 100644 --- a/apps/files_texteditor/ajax/savefile.php +++ b/apps/files_texteditor/ajax/savefile.php @@ -27,47 +27,36 @@ require_once('../../../lib/base.php'); // Check if we are a user OC_JSON::checkLoggedIn(); -// Save the file data +// Get paramteres $filecontents = htmlspecialchars_decode($_POST['filecontents']); -$file = $_POST['file']; -$dir = $_POST['dir']; -$path = $dir.'/'.$file; -$force = isset($_POST['force']) ? $_POST['force'] : false; -$sessionname = sha1('oc_file_hash_'.$path); +$path = isset($_POST['path']) ? $_POST['path'] : ''; +$mtime = isset($_POST['mtime']) ? $_POST['mtime'] : ''; -function do_save($path,$filecontents){ - $sessionname = md5('oc_file_hash_'.$path); - OC_Filesystem::update_session_file_hash($sessionname,sha1(htmlspecialchars($filecontents))); - OC_Filesystem::file_put_contents($path, $filecontents); -} -// Check if file modified whilst editing? -if(isset($_SESSION[$sessionname])){ - if(!empty($_SESSION[$sessionname])){ - // Compare to current hash of file. - $savedfilecontents = htmlspecialchars(OC_Filesystem::file_get_contents($path)); - $hash = md5($savedfilecontents); - $originalhash = $_SESSION[$sessionname]; - // Compare with hash taken when file was opened - if($hash != $originalhash){ - // Someone has played with the file while you were editing - // Force save? - if($force){ - do_save($path, $filecontents); - OC_JSON::success(); - } else { - // No force - OC_JSON::error(array('data' => array( 'message' => $l10n->t('The file has been edited since you opened it. Overwrite the file?')))); - } - } else { - // No body has edited it whilst you were, so save the file - // Update the session hash. - do_save($path,$filecontents); - OC_JSON::success(); - } +if($path != '' && $mtime != '') +{ + // Get file mtime + $filemtime = OC_Filesystem::filemtime($path); + if($mtime != $filemtime) + { + // Then the file has changed since opening + OC_JSON::error(); + } + else + { + // File same as when opened + // Save file + if(OC_Filesystem::is_writeable($path)) + { + OC_Filesystem::file_put_contents($path, $filecontents); + OC_JSON::success(); + } + else + { + // Not writeable! + OC_JSON::error(array('data' => array( 'message' => 'Insufficient permissions'))); + } } } else { - // No session value set for soem reason, just save the file. - do_save($path,$filecontents); - OC_JSON::success(); -} \ No newline at end of file + OC_JSON::error(array('data' => array( 'message' => 'File path or mtime not supplied'))); +} diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 63e67460a3b..060c76705a1 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -77,81 +77,42 @@ function editorIsShown(){ return is_editor_shown; } -function updateSessionFileHash(path){ - $.get(OC.filePath('files_texteditor','ajax','loadfile.php'), - { path: path }, - function(jsondata){ - if(jsondata.status=='failure'){ - alert('Failed to update session file hash.'); - } - }, "json");} - function doFileSave(){ if(editorIsShown()){ + // Get file path + var path = $('#editor').attr('data-dir')+'/'+$('#editor').attr('data-filename'); + // Get original mtime + var mtime = $('#editor').attr('data-mtime'); + // Show saving spinner $("#editor_save").die('click',doFileSave); $('#editor_save').after(''); - var filecontents = window.aceEditor.getSession().getValue(); - var dir = $('#editor').attr('data-dir'); - var file = $('#editor').attr('data-filename'); - $.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, file: file, dir: dir },function(jsondata){ - - if(jsondata.status == 'failure'){ - var answer = confirm(jsondata.data.message); - if(answer){ - $.post(OC.filePath('files_texteditor','ajax','savefile.php'),{ filecontents: filecontents, file: file, dir: dir, force: 'true' },function(jsondata){ - if(jsondata.status =='success'){ - $('#saving_icon').remove(); - $('#editor_save').after('

    Saved!

    ') - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); - } - else { - // Save error - $('#saving_icon').remove(); - $('#editor_save').after('

    Failed!

    '); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); - } - }, 'json'); - } - else { - // Don't save! - $('#saving_icon').remove(); - // Temporary measure until we get a tick icon - $('#editor_save').after('

    Saved!

    '); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); - } - } - else if(jsondata.status == 'success'){ - // Success - $('#saving_icon').remove(); - // Temporary measure until we get a tick icon - $('#editor_save').after('

    Saved!

    '); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); - } - }, 'json'); - giveEditorFocus(); - } else { - return; - } + // Get the data + var filecontents = window.aceEditor.getSession().getValue(); + // Send the data + $.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, path: path, mtime: mtime },function(jsondata){ + if(jsondata.status!='success'){ + // Save failed + $('#saving_icon').remove(); + $('#editor_save').after('

    Failed to save file

    '); + setTimeout(function() { + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + $("#editor_save").live('click',doFileSave); + }); + }, 2000); + } else { + // Save OK + $('#saving_icon').remove(); + $('#editor_save').after('

    Saved

    ') + setTimeout(function() { + $('#save_result').fadeOut('slow',function(){ + $(this).remove(); + $("#editor_save").live('click',doFileSave); + }); + }, 2000); + } + },'json'); + } }; function giveEditorFocus(){ @@ -162,24 +123,34 @@ function showFileEditor(dir,filename){ if(!editorIsShown()){ // Loads the file editor and display it. var data = $.ajax({ - url: OC.filePath('files','ajax','download.php')+'?files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent(dir), + url: OC.filePath('files_texteditor','ajax','loadfile.php'), + data: 'file='+encodeURIComponent(filename)+'&dir='+encodeURIComponent(dir), complete: function(data){ - // Initialise the editor - updateSessionFileHash(dir+'/'+filename); - showControls(filename); - $('table').fadeOut('slow', function() { - $('#editor').text(data.responseText); - // encodeURIComponenet? - $('#editor').attr('data-dir', dir); - $('#editor').attr('data-filename', filename); - window.aceEditor = ace.edit("editor"); - aceEditor.setShowPrintMargin(false); - setEditorSize(); - setSyntaxMode(getFileExtension(filename)); - OC.addScript('files_texteditor','aceeditor/theme-clouds', function(){ - window.aceEditor.setTheme("ace/theme/clouds"); + result = jQuery.parseJSON(data.responseText); + if(result.status == 'success'){ + // Save mtime + $('#editor').attr('data-mtime', result.data.mtime); + // Initialise the editor + showControls(filename); + $('table').fadeOut('slow', function() { + $('#editor').text(result.data.filecontents); + $('#editor').attr('data-dir', dir); + $('#editor').attr('data-filename', filename); + window.aceEditor = ace.edit("editor"); + aceEditor.setShowPrintMargin(false); + if(result.data.write=='false'){ + aceEditor.setReadOnly(true); + } + setEditorSize(); + setSyntaxMode(getFileExtension(filename)); + OC.addScript('files_texteditor','aceeditor/theme-clouds', function(){ + window.aceEditor.setTheme("ace/theme/clouds"); + }); }); - }); + } else { + // Failed to get the file. + alert(result.data.message); + } // End success } // End ajax -- GitLab From 18b8dc1c2120b7d7ab6e4a7f23c33a6019e1587b Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 17:03:19 +0000 Subject: [PATCH 195/546] fixed saving bug --- apps/files_texteditor/ajax/savefile.php | 13 ++++++++++--- apps/files_texteditor/js/editor.js | 3 +++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/files_texteditor/ajax/savefile.php b/apps/files_texteditor/ajax/savefile.php index 1e073f3ba24..3d0771ea983 100644 --- a/apps/files_texteditor/ajax/savefile.php +++ b/apps/files_texteditor/ajax/savefile.php @@ -40,7 +40,8 @@ if($path != '' && $mtime != '') if($mtime != $filemtime) { // Then the file has changed since opening - OC_JSON::error(); + OC_JSON::error(); + OC_Log::write('files_texteditor',"File: ".$path." modified since opening.",OC_Log::ERROR); } else { @@ -49,14 +50,20 @@ if($path != '' && $mtime != '') if(OC_Filesystem::is_writeable($path)) { OC_Filesystem::file_put_contents($path, $filecontents); - OC_JSON::success(); + // Clear statcache + clearstatcache(); + // Get new mtime + $newmtime = OC_Filesystem::filemtime($path); + OC_JSON::success(array('data' => array('mtime' => $newmtime))); } else { // Not writeable! OC_JSON::error(array('data' => array( 'message' => 'Insufficient permissions'))); + OC_Log::write('files_texteditor',"User does not have permission to write to file: ".$path,OC_Log::ERROR); } } } else { - OC_JSON::error(array('data' => array( 'message' => 'File path or mtime not supplied'))); + OC_JSON::error(array('data' => array( 'message' => 'File path or mtime not supplied'))); + OC_Log::write('files_texteditor',"Invalid path supplied:".$path,OC_Log::ERROR); } diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 060c76705a1..3c1e1542806 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -102,6 +102,9 @@ function doFileSave(){ }, 2000); } else { // Save OK + // Update mtime + $('#editor').attr('data-mtime',jsondata.data.mtime); + // Show result $('#saving_icon').remove(); $('#editor_save').after('

    Saved

    ') setTimeout(function() { -- GitLab From 19186bf37b131c76146b27f15c337c49e54d42cd Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 17:22:51 +0000 Subject: [PATCH 196/546] hide save button for read-only files --- apps/files_texteditor/js/editor.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 3c1e1542806..664dd0f1e6e 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -54,11 +54,14 @@ function setSyntaxMode(ext){ } } -function showControls(filename){ +function showControls(filename,writeperms){ // Loads the control bar at the top. $('.actions,#file_action_panel').fadeOut('slow').promise().done(function() { // Load the new toolbar. - var savebtnhtml = ''; + var savebtnhtml; + if(writeperms=="true"){ + var savebtnhtml = ''; + } var html = ''; $('#controls').append(html); $('#editorbar').fadeIn('slow'); @@ -134,7 +137,7 @@ function showFileEditor(dir,filename){ // Save mtime $('#editor').attr('data-mtime', result.data.mtime); // Initialise the editor - showControls(filename); + showControls(filename,result.data.write); $('table').fadeOut('slow', function() { $('#editor').text(result.data.filecontents); $('#editor').attr('data-dir', dir); -- GitLab From 3be056404049d8a567c174a72d2864deeb81b39c Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 18:17:26 +0000 Subject: [PATCH 197/546] improved ui and save button action --- apps/files_texteditor/css/style.css | 2 +- apps/files_texteditor/js/editor.js | 27 ++++++++------------------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/apps/files_texteditor/css/style.css b/apps/files_texteditor/css/style.css index 9ad6eeaa814..6d730af7262 100644 --- a/apps/files_texteditor/css/style.css +++ b/apps/files_texteditor/css/style.css @@ -14,7 +14,7 @@ } #editor_close{ margin-left: auto; - margin-right: 167px; + margin-right: 170px; display: block; } #editor_save{ diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 664dd0f1e6e..2934dcf8bb3 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -60,9 +60,9 @@ function showControls(filename,writeperms){ // Load the new toolbar. var savebtnhtml; if(writeperms=="true"){ - var savebtnhtml = ''; + var savebtnhtml = ''; } - var html = ''; + var html = ''; $('#controls').append(html); $('#editorbar').fadeIn('slow'); var breadcrumbhtml = ''; @@ -88,34 +88,23 @@ function doFileSave(){ var mtime = $('#editor').attr('data-mtime'); // Show saving spinner $("#editor_save").die('click',doFileSave); - $('#editor_save').after(''); + $('#save_result').remove(); + $('#editor_save').text(t('files_texteditor','Saving...'));//after(''); // Get the data var filecontents = window.aceEditor.getSession().getValue(); // Send the data $.post(OC.filePath('files_texteditor','ajax','savefile.php'), { filecontents: filecontents, path: path, mtime: mtime },function(jsondata){ if(jsondata.status!='success'){ // Save failed - $('#saving_icon').remove(); + $('#editor_save').text(t('files_texteditor','Save')); $('#editor_save').after('

    Failed to save file

    '); - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); + $("#editor_save").live('click',doFileSave); } else { // Save OK // Update mtime $('#editor').attr('data-mtime',jsondata.data.mtime); - // Show result - $('#saving_icon').remove(); - $('#editor_save').after('

    Saved

    ') - setTimeout(function() { - $('#save_result').fadeOut('slow',function(){ - $(this).remove(); - $("#editor_save").live('click',doFileSave); - }); - }, 2000); + $('#editor_save').text(t('files_texteditor','Save')); + $("#editor_save").live('click',doFileSave); } },'json'); } -- GitLab From 6c78cd2765cf7ee22ea988fe9ed70af6ad191073 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 18:39:09 +0000 Subject: [PATCH 198/546] Moved .separator to core css --- apps/files_pdfviewer/css/viewer.css | 9 --------- core/css/styles.css | 3 ++- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/files_pdfviewer/css/viewer.css b/apps/files_pdfviewer/css/viewer.css index cbab9e70dc2..b735dbfedfc 100755 --- a/apps/files_pdfviewer/css/viewer.css +++ b/apps/files_pdfviewer/css/viewer.css @@ -13,15 +13,6 @@ display: none; } -.separator { - display: inline; - border-left: 1px solid #d3d3d3; - border-right: 1px solid #fff; - height: 10px; - width:0px; - margin: 4px; -} - #controls2 > a > img { margin: 4px; height: 10px; diff --git a/core/css/styles.css b/core/css/styles.css index d1c648383c0..b0f83c9b065 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -125,4 +125,5 @@ div.jp-play-bar, div.jp-seek-bar { padding:0; } li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color: #FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow: hidden; text-overflow: ellipsis; } -.hint { background-image: url('/core/img/actions/info.png'); background-repeat:no-repeat; color: #777777; padding-left: 25px; background-position: 0 0.3em;} \ No newline at end of file +.hint { background-image: url('/core/img/actions/info.png'); background-repeat:no-repeat; color: #777777; padding-left: 25px; background-position: 0 0.3em;} +.separator { display: inline; border-left: 1px solid #d3d3d3; border-right: 1px solid #fff; height: 10px; width:0px; margin: 4px; } \ No newline at end of file -- GitLab From d91a4fcaf3ffc0783f7aef6767d7b15773808eb5 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 2 Jan 2012 20:24:05 +0100 Subject: [PATCH 199/546] Changed SQL queries for looking up contacts to only query once and sort at the same time. --- apps/contacts/ajax/addcard.php | 1 - apps/contacts/ajax/contacts.php | 15 --------------- apps/contacts/index.php | 17 ----------------- 3 files changed, 33 deletions(-) diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php index 54c455e515f..9d782246a0a 100644 --- a/apps/contacts/ajax/addcard.php +++ b/apps/contacts/ajax/addcard.php @@ -61,6 +61,5 @@ foreach( $add as $propname){ $vcard->addProperty($propname, $value, $prop_parameters); } $id = OC_Contacts_VCard::add($aid,$vcard->serialize()); -OC_Log::write('contacts','ajax/addcard.php - adding id: '.$id,OC_Log::DEBUG); OC_Contacts_App::renderDetails($id, $vcard); diff --git a/apps/contacts/ajax/contacts.php b/apps/contacts/ajax/contacts.php index 54ad3e4c103..cf86764105f 100644 --- a/apps/contacts/ajax/contacts.php +++ b/apps/contacts/ajax/contacts.php @@ -12,21 +12,6 @@ OC_JSON::checkAppEnabled('contacts'); $ids = OC_Contacts_Addressbook::activeIds(OC_User::getUser()); $contacts = OC_Contacts_VCard::all($ids); -//OC_Log::write('contacts','contacts.php: '.count($contacts).' contacts.',OC_Log::DEBUG); -/* -$addressbooks = OC_Contacts_Addressbook::active(OC_User::getUser()); -$contacts = array(); -foreach( $addressbooks as $addressbook ){ - $addressbookcontacts = OC_Contacts_VCard::all($addressbook['id']); - foreach( $addressbookcontacts as $contact ){ - if(is_null($contact['fullname'])){ - continue; - } - $contacts[] = $contact; - } -} -usort($contacts,'contacts_namesort'); -*/ $tmpl = new OC_TEMPLATE("contacts", "part.contacts"); $tmpl->assign('contacts', $contacts); $page = $tmpl->fetchPage(); diff --git a/apps/contacts/index.php b/apps/contacts/index.php index 5ab6f293ab4..b392b195a9c 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -42,23 +42,6 @@ OC_App::setActiveNavigationEntry( 'contacts_index' ); // Load a specific user? $id = isset( $_GET['id'] ) ? $_GET['id'] : null; -/* -// sort addressbooks (use contactsort) -usort($addressbooks,'contacts_namesort'); - -$contacts = array(); -foreach( $addressbooks as $addressbook ){ - $addressbookcontacts = OC_Contacts_VCard::all($addressbook['id']); - foreach( $addressbookcontacts as $contact ){ - if(is_null($contact['fullname'])){ - continue; - } - $contacts[] = $contact; - } -} - -usort($contacts,'contacts_namesort'); -*/ $details = array(); // FIXME: This cannot work..? -- GitLab From 85ab3b3924b0e66f3cb3f4e84222b08dd3d882bc Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 2 Jan 2012 22:34:52 +0100 Subject: [PATCH 200/546] Modified thumbnail.php to use OC_Image. Cut out 50 loc ;-) --- apps/contacts/thumbnail.php | 104 +++++++++++------------------------- 1 file changed, 31 insertions(+), 73 deletions(-) diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php index bf0a6e96a5d..622718d65c6 100644 --- a/apps/contacts/thumbnail.php +++ b/apps/contacts/thumbnail.php @@ -2,8 +2,8 @@ /** * ownCloud - Addressbook * - * @author Jakob Sack - * @copyright 2011 Jakob Sack mail@jakobsack.de + * @author Thomas Tanghus + * @copyright 2011-2012 Thomas Tanghus * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -26,7 +26,7 @@ OC_Util::checkLoggedIn(); OC_Util::checkAppEnabled('contacts'); if(!function_exists('imagecreatefromjpeg')) { - OC_Log::write('contacts','GD module not installed',OC_Log::ERROR); + OC_Log::write('contacts','thumbnail.php. GD module not installed',OC_Log::DEBUG); header('Content-Type: image/png'); // TODO: Check if it works to read the file and echo the content. return 'img/person.png'; @@ -46,13 +46,16 @@ $l10n = new OC_L10N('contacts'); $card = OC_Contacts_VCard::find( $id ); if( $card === false ){ - echo $l10n->t('Contact could not be found.'); + OC_Log::write('contacts','thumbnail.php. Contact could not be found.',OC_Log::ERROR); + //echo $l10n->t('Contact could not be found.'); exit(); } +// FIXME: Is this check necessary? It just takes up CPU time. $addressbook = OC_Contacts_Addressbook::find( $card['addressbookid'] ); if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ - echo $l10n->t('This is not your contact.'); // This is a weird error, why would it come up? (Better feedback for users?) + OC_Log::write('contacts','thumbnail.php. Wrong contact/addressbook - WTF?',OC_Log::ERROR); + //echo $l10n->t('This is not your contact.'); // This is a weird error, why would it come up? (Better feedback for users?) exit(); } @@ -60,17 +63,14 @@ $content = OC_VObject::parse($card['carddata']); // invalid vcard if( is_null($content)){ - echo $l10n->t('This card is not RFC compatible.'); + OC_Log::write('contacts','thumbnail.php. The VCard for ID '.$id.' is not RFC compatible',OC_Log::ERROR); + getStandardImage(); exit(); } -// define the width and height for the thumbnail -// note that theese dimmensions are considered the maximum dimmension and are not fixed, -// because we have to keep the image ratio intact or it will be deformed -$thumbnail_width = 23; -$thumbnail_height = 23; +$thumbnail_size = 23; -// Photo :-) +// Finf the photo from VCard. foreach($content->children as $child){ if($child->name == 'PHOTO'){ foreach($child->parameters as $parameter){ @@ -78,73 +78,31 @@ foreach($content->children as $child){ $mime = $parameter->value; } } - $data = base64_decode($child->value); - $src_img = imagecreatefromstring($data); - if ($src_img !== false) { - //gets the dimmensions of the image - $width_orig=imageSX($src_img); - $height_orig=imageSY($src_img); - $ratio_orig = $width_orig/$height_orig; - - if ($thumbnail_width/$thumbnail_height > $ratio_orig) { - $new_height = $thumbnail_width/$ratio_orig; - $new_width = $thumbnail_width; - } else { - $new_width = $thumbnail_height*$ratio_orig; - $new_height = $thumbnail_height; - } - - $x_mid = $new_width/2; //horizontal middle - $y_mid = $new_height/2; //vertical middle - - $process = imagecreatetruecolor(round($new_width), round($new_height)); - if ($process == false) { - getStandardImage(); - //echo 'Error creating process image: '.$new_width.'x'.$new_height; - OC_Log::write('contacts','Error creating process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR); - imagedestroy($process); - imagedestroy($src_img); - exit(); - } - - imagecopyresampled($process, $src_img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); - if ($process == false) { - getStandardImage(); - //echo 'Error resampling process image: '.$new_width.'x'.$new_height; - OC_Log::write('contacts','Error resampling process image for '.$id.' '.$new_width.'x'.$new_height,OC_Log::ERROR); - imagedestroy($process); - imagedestroy($src_img); - exit(); - } - $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height); - if ($process == false) { + $image = new OC_Image(); + if($image->loadFromBase64($child->value)) { + if($image->centerCrop()) { + if($image->resize($thumbnail_size)) { + if(!$image()) { + OC_Log::write('contacts','thumbnail.php. Couldn\'t display thumbnail for ID '.$id,OC_Log::ERROR); + getStandardImage(); + exit(); + } + } else { + OC_Log::write('contacts','thumbnail.php. Couldn\'t resize thumbnail for ID '.$id,OC_Log::ERROR); + getStandardImage(); + exit(); + } + }else{ + OC_Log::write('contacts','thumbnail.php. Couldn\'t crop thumbnail for ID '.$id,OC_Log::ERROR); getStandardImage(); - //echo 'Error creating thumb image: '.$thumbnail_width.'x'.$thumbnail_height; - OC_Log::write('contacts','Error creating thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR); - imagedestroy($process); - imagedestroy($src_img); exit(); } - imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); - if ($thumb !== false) { - header('Content-Type: image/png'); - imagepng($thumb); - } else { - getStandardImage(); - OC_Log::write('contacts','Error resampling thumb image for '.$id.' '.$thumbnail_width.'x'.$thumbnail_height,OC_Log::ERROR); - //echo 'An error occurred resampling thumb.'; - } - imagedestroy($thumb); - imagedestroy($process); - imagedestroy($src_img); - } - else { + } else { + OC_Log::write('contacts','thumbnail.php. Couldn\'t load image string for ID '.$id,OC_Log::ERROR); getStandardImage(); + exit(); } exit(); } } getStandardImage(); - -// Not found :-( -//echo $l10n->t('This card does not contain a photo.'); -- GitLab From 47548fb8c612b5a61b00b03b525fd168fe940451 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 2 Jan 2012 23:14:58 +0100 Subject: [PATCH 201/546] Fixed showing first contact if non is selected. --- apps/contacts/index.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/contacts/index.php b/apps/contacts/index.php index b392b195a9c..b7c88236a80 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -45,11 +45,17 @@ $id = isset( $_GET['id'] ) ? $_GET['id'] : null; $details = array(); // FIXME: This cannot work..? -if( !is_null($id)/* || count($contacts)*/){ - if(is_null($id)) $id = $contacts[0]['id']; - $vcard = OC_Contacts_App::getContactVCard($id); - $details = OC_Contacts_VCard::structureContact($vcard); +if(is_null($id) && count($contacts) > 0) { + $id = $contacts[0]['id']; } +$vcard = OC_Contacts_App::getContactVCard($id); +$details = OC_Contacts_VCard::structureContact($vcard); + +// if( !is_null($id)/* || count($contacts)*/){ +// if(is_null($id)) $id = $contacts[0]['id']; +// $vcard = OC_Contacts_App::getContactVCard($id); +// $details = OC_Contacts_VCard::structureContact($vcard); +// } // Include Style and Script OC_Util::addScript('contacts','interface'); -- GitLab From 604ca61d78881e3a1a0a41e4b50ef4cb7c1eeaf0 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 4 Jan 2012 22:36:34 +0100 Subject: [PATCH 202/546] Some cleanup, better error messages and such. --- apps/contacts/index.php | 7 ++++--- apps/contacts/js/interface.js | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/apps/contacts/index.php b/apps/contacts/index.php index b7c88236a80..0b705e71b5d 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -48,9 +48,10 @@ $details = array(); if(is_null($id) && count($contacts) > 0) { $id = $contacts[0]['id']; } -$vcard = OC_Contacts_App::getContactVCard($id); -$details = OC_Contacts_VCard::structureContact($vcard); - +if(!is_null($id)) { + $vcard = OC_Contacts_App::getContactVCard($id); + $details = OC_Contacts_VCard::structureContact($vcard); +} // if( !is_null($id)/* || count($contacts)*/){ // if(is_null($id)) $id = $contacts[0]['id']; // $vcard = OC_Contacts_App::getContactVCard($id); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 35639ef6cc7..b9f75bdf71a 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -1,3 +1,29 @@ +/** + * ownCloud - Addressbook + * + * @author Jakob Sack + * @copyright 2011 Jakob Sack mail@jakobsack.de + * @copyright 2011-2012 Thomas Tanghus + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + * TODO: + * If you add a contact, its thumbnail doesnt show in the list. But when you add another one it shows up, but not for the second contact added. + * Place a new contact in correct alphabetic order + */ + + Contacts={ UI:{ showCardDAVUrl:function(username, bookname){ -- GitLab From 978a08ab1c5e425210e8128e6d8efa432d593571 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 9 Jan 2012 01:17:04 +0100 Subject: [PATCH 203/546] Fixed Phone types not being saved correctly when adding them. --- apps/contacts/ajax/addproperty.php | 20 ++++++++++++++++++- apps/contacts/templates/part.property.php | 5 ++--- .../templates/part.setpropertyform.php | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index 98877805b46..0122cf019c7 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -34,13 +34,31 @@ $name = $_POST['name']; $value = $_POST['value']; $parameters = isset($_POST['parameters'])?$_POST['parameters']:array(); -$property = $vcard->addProperty($name, $value, $parameters); +$property = $vcard->addProperty($name, $value); //, $parameters); $line = count($vcard->children) - 1; +// Apparently Sabre_VObject_Parameter doesn't do well with multiple values or I don't know how to do it. Tanghus. +foreach ($parameters as $key=>$element) { + if(is_array($element) && strtoupper($key) == 'TYPE') { + // FIXME: Maybe this doesn't only apply for TYPE? + // And it probably shouldn't be done here anyways :-/ + foreach($element as $e){ + if($e != '' && !is_null($e)){ + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$e); + } + } + } +} + OC_Contacts_VCard::edit($id,$vcard->serialize()); +$adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); +$phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); + $tmpl = new OC_Template('contacts','part.property'); +$tmpl->assign('adr_types',$adr_types); +$tmpl->assign('phone_types',$phone_types); $tmpl->assign('property',OC_Contacts_VCard::structureProperty($property,$line)); $page = $tmpl->fetchPage(); diff --git a/apps/contacts/templates/part.property.php b/apps/contacts/templates/part.property.php index d930a9ca99d..e4010397500 100644 --- a/apps/contacts/templates/part.property.php +++ b/apps/contacts/templates/part.property.php @@ -25,15 +25,14 @@ t(ucwords(strtolower($type))); } - endforeach; + } $label = join(' ', $types); ?> () diff --git a/apps/contacts/templates/part.setpropertyform.php b/apps/contacts/templates/part.setpropertyform.php index 8635d7db1ce..3e0b8d49b52 100644 --- a/apps/contacts/templates/part.setpropertyform.php +++ b/apps/contacts/templates/part.setpropertyform.php @@ -45,7 +45,7 @@

    -- GitLab From 5f04b41ea6085ee8ab9cfc58ecfc4dd5290a57d6 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sun, 8 Jan 2012 15:35:29 +0100 Subject: [PATCH 204/546] Just a comment ;-) --- lib/image.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/image.php b/lib/image.php index 45b6ad3918d..bdfa1fefd7d 100644 --- a/lib/image.php +++ b/lib/image.php @@ -200,6 +200,7 @@ class OC_Image { } /** + * (I'm open for suggestions on better method name ;) * @brief Fixes orientation based on EXIF data. * @returns bool. */ -- GitLab From ac63afbd95b87475f9f6bf4eae76540cb70d05fb Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 9 Jan 2012 22:05:28 +0100 Subject: [PATCH 205/546] Insert new contacts alphabetically correct in the list. Added some tipsys to the editor. --- apps/contacts/css/styles.css | 2 +- apps/contacts/js/interface.js | 27 ++++++++++++++++++++---- apps/contacts/templates/part.details.php | 5 +++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css index c890be85824..7b56767bab0 100644 --- a/apps/contacts/css/styles.css +++ b/apps/contacts/css/styles.css @@ -4,7 +4,7 @@ #contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;} #contacts_details_photo { margin:.5em 0em .5em 25%; } -#contacts_deletecard {position:absolute;top:15px;right:0;} +#contacts_deletecard {position:absolute;top:15px;right:15px;} #contacts_details_list { list-style:none; } #contacts_details_list li { overflow:visible; } #contacts_details_list li p.contacts_property_name { width:25%; float:left;text-align:right;padding-right:0.3em;color:#666; } diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index b9f75bdf71a..187c8941dcf 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -236,7 +236,10 @@ $(document).ready(function(){ Contacts.UI.Addressbooks.overview(); return false; }); - + + /** + * Open blank form to add new contact. + */ $('#contacts_newcontact').click(function(){ $.getJSON('ajax/showaddcard.php',{},function(jsondata){ if(jsondata.status == 'success'){ @@ -250,14 +253,28 @@ $(document).ready(function(){ }); return false; }); - + + /** + * Add and insert a new contact into the list. + */ $('#contacts_addcardform input[type="submit"]').live('click',function(){ $.post('ajax/addcard.php',$('#contacts_addcardform').serialize(),function(jsondata){ if(jsondata.status == 'success'){ $('#rightcontent').data('id',jsondata.data.id); $('#rightcontent').html(jsondata.data.page); $('#leftcontent .active').removeClass('active'); - $('#leftcontent ul').append('
  • '+jsondata.data.name+'
  • '); + var item = '
  • '+jsondata.data.name+'
  • '; + var added = false; + $('#leftcontent ul li').each(function(){ + if ($(this).text().toLowerCase() > jsondata.data.name.toLowerCase()) { + $(this).before(item).fadeIn('fast'); + added = true; + return false; + } + }); + if(!added) { + $('#leftcontent ul').append(item); + } } else{ alert(jsondata.data.message); @@ -265,7 +282,6 @@ $(document).ready(function(){ }, 'json'); return false; }); - $('.contacts_property [data-use="edit"]').live('click',function(){ var id = $('#rightcontent').data('id'); var checksum = $(this).parents('.contacts_property').first().data('checksum'); @@ -338,4 +354,7 @@ $(document).ready(function(){ // element has gone out of viewport } }); + + $('.action').tipsy(); + $('.button').tipsy(); }); diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index afad0b7f64c..1482c063685 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -86,3 +86,8 @@ + -- GitLab From 27d9cbd8c0f53b1859716b32aa5ca33eee4749a5 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 21:16:41 +0000 Subject: [PATCH 206/546] Added 'Go to line' functionality --- apps/files_texteditor/css/style.css | 10 ++++------ apps/files_texteditor/js/editor.js | 28 ++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/files_texteditor/css/style.css b/apps/files_texteditor/css/style.css index 6d730af7262..cf24950232f 100644 --- a/apps/files_texteditor/css/style.css +++ b/apps/files_texteditor/css/style.css @@ -12,11 +12,6 @@ left: 160px; display: none; } -#editor_close{ - margin-left: auto; - margin-right: 170px; - display: block; -} #editor_save{ margin-left: 7px; float: left; @@ -24,4 +19,7 @@ #saving_icon{ margin-top: 3px; float: left; -} \ No newline at end of file +} +#gotolineval{ + width: 30px; +} diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 2934dcf8bb3..081ecb75a87 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -60,26 +60,36 @@ function showControls(filename,writeperms){ // Load the new toolbar. var savebtnhtml; if(writeperms=="true"){ - var savebtnhtml = ''; + var editorcontrols = '
    '; } var html = ''; $('#controls').append(html); $('#editorbar').fadeIn('slow'); var breadcrumbhtml = ''; - $('.actions').before(breadcrumbhtml).before(savebtnhtml); + $('.actions').before(breadcrumbhtml).before(editorcontrols); }); } function bindControlEvents(){ $("#editor_save").die('click',doFileSave).live('click',doFileSave); $('#editor_close').die('click',hideFileEditor).live('click',hideFileEditor); + $('#gotolinebtn').die('click', goToLine).live('click', goToLine); } +// returns true or false if the editor is in view or not function editorIsShown(){ // Not working as intended. Always returns true. return is_editor_shown; } +// Moves the editor view to the line number speificed in #gotolineval +function goToLine(){ + // Go to the line specified + window.aceEditor.gotoLine($('#gotolineval').val()); + +} + +// Tries to save the file. function doFileSave(){ if(editorIsShown()){ // Get file path @@ -110,10 +120,12 @@ function doFileSave(){ } }; +// Gives the editor focus function giveEditorFocus(){ window.aceEditor.focus(); }; +// Loads the file editor. Accepts two parameters, dir and filename. function showFileEditor(dir,filename){ if(!editorIsShown()){ // Loads the file editor and display it. @@ -154,11 +166,17 @@ function showFileEditor(dir,filename){ } } +// Fades out the editor. function hideFileEditor(){ // Fade out controls $('#editor_close').fadeOut('slow'); // Fade out the save button $('#editor_save').fadeOut('slow'); + // Goto line items + $('#gotolinebtn').fadeOut('slow'); + $('#gotolineval').fadeOut('slow'); + // Fade out separators + $('.separator').fadeOut('slow'); // Fade out breadcrumb $('#breadcrumb_file').fadeOut('slow', function(){ $(this).remove();}); // Fade out editor @@ -176,7 +194,8 @@ function hideFileEditor(){ // Keyboard Shortcuts var ctrlBtn = false; - + +// returns true if ctrl+s or cmd+s is being pressed function checkForSaveKeyPress(e){ if(e.which == 17 || e.which == 91) ctrlBtn=true; if(e.which == 83 && ctrlBtn == true) { @@ -187,6 +206,7 @@ function checkForSaveKeyPress(e){ } } +// resizes the editor window $(window).resize(function() { setEditorSize(); }); @@ -213,7 +233,7 @@ $(document).ready(function(){ showFileEditor(dir,file); }); } - // Binds the file save and close editor events + // Binds the file save and close editor events, and gotoline button bindControlEvents(); // Binds the save keyboard shortcut events -- GitLab From 9d9f254c789aa4ddced149e2d186131a7cf58c0f Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Mon, 9 Jan 2012 16:45:26 -0500 Subject: [PATCH 207/546] Quick fix for file actions inside Shared folder (or other readonly folder) --- files/templates/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/templates/index.php b/files/templates/index.php index c4acab25cc4..fd1158a0297 100644 --- a/files/templates/index.php +++ b/files/templates/index.php @@ -1,3 +1,4 @@ +
    @@ -16,7 +17,6 @@
    - -- GitLab From aadb81a32ac521058cb4bafe052f39f24ac9dc8e Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 9 Jan 2012 23:14:11 +0100 Subject: [PATCH 208/546] OC_DB::insertid was being called too late to get the correct result. --- apps/contacts/lib/vcard.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index beb291b481e..6a248ff59e4 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -130,10 +130,11 @@ class OC_Contacts_VCard{ $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + $newid = OC_DB::insertid('*PREFIX*contacts_cards'); OC_Contacts_Addressbook::touch($id); - return OC_DB::insertid('*PREFIX*contacts_cards'); + return $newid; } /** -- GitLab From 60653c05440121a149a2709d719060cf77c2c58d Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 9 Jan 2012 23:16:07 +0100 Subject: [PATCH 209/546] Return standard thumbnail even if contact couldn't be found as it could be because it was just added, --- apps/contacts/thumbnail.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php index 622718d65c6..e49098ce820 100644 --- a/apps/contacts/thumbnail.php +++ b/apps/contacts/thumbnail.php @@ -46,8 +46,8 @@ $l10n = new OC_L10N('contacts'); $card = OC_Contacts_VCard::find( $id ); if( $card === false ){ - OC_Log::write('contacts','thumbnail.php. Contact could not be found.',OC_Log::ERROR); - //echo $l10n->t('Contact could not be found.'); + OC_Log::write('contacts','thumbnail.php. Contact could not be found: '.$id,OC_Log::ERROR); + getStandardImage(); exit(); } @@ -55,7 +55,6 @@ if( $card === false ){ $addressbook = OC_Contacts_Addressbook::find( $card['addressbookid'] ); if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ OC_Log::write('contacts','thumbnail.php. Wrong contact/addressbook - WTF?',OC_Log::ERROR); - //echo $l10n->t('This is not your contact.'); // This is a weird error, why would it come up? (Better feedback for users?) exit(); } -- GitLab From 6d37c7d351200bef15c71bd44e2182d0f5b5ccec Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 22:22:12 +0000 Subject: [PATCH 210/546] Added live search --- apps/files_texteditor/js/editor.js | 68 +++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 081ecb75a87..cf6d8217c67 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -60,9 +60,9 @@ function showControls(filename,writeperms){ // Load the new toolbar. var savebtnhtml; if(writeperms=="true"){ - var editorcontrols = '
    '; + var editorcontrols = '
    '; } - var html = ''; + var html = '
    '; $('#controls').append(html); $('#editorbar').fadeIn('slow'); var breadcrumbhtml = ''; @@ -74,6 +74,9 @@ function bindControlEvents(){ $("#editor_save").die('click',doFileSave).live('click',doFileSave); $('#editor_close').die('click',hideFileEditor).live('click',hideFileEditor); $('#gotolinebtn').die('click', goToLine).live('click', goToLine); + $('#editorsearchval').die('keyup', doSearch).live('keyup', doSearch); + $('#clearsearchbtn').die('click', resetSearch).live('click', resetSearch); + $('#nextsearchbtn').die('click', nextSearchResult).live('click', nextSearchResult); } // returns true or false if the editor is in view or not @@ -89,6 +92,48 @@ function goToLine(){ } +//resets the search +function resetSearch(){ + $('#editorsearchval').val(''); + $('#nextsearchbtn').remove(); + $('#clearsearchbtn').remove(); + window.aceEditor.gotoLine(0); +} + +// moves the cursor to the next search resukt +function nextSearchResult(){ + window.aceEditor.findNext(); +} +// Performs the initial search +function doSearch(){ + // check if search box empty? + if($('#editorsearchval').val()==''){ + // Hide clear button + window.aceEditor.gotoLine(0); + $('#nextsearchbtn').remove(); + $('#clearsearchbtn').remove(); + } else { + // New search + // Reset cursor + window.aceEditor.gotoLine(0); + // Do search + window.aceEditor.find($('#editorsearchval').val(),{ + backwards: false, + wrap: false, + caseSensitive: false, + wholeWord: false, + regExp: false + }); + // Show next and clear buttons + // check if already there + if($('#nextsearchbtn').length==0){ + var nextbtnhtml = ''; + var clearbtnhtml = ''; + $('#editorsearchval').after(nextbtnhtml).after(clearbtnhtml); + } + } +} + // Tries to save the file. function doFileSave(){ if(editorIsShown()){ @@ -168,22 +213,13 @@ function showFileEditor(dir,filename){ // Fades out the editor. function hideFileEditor(){ - // Fade out controls - $('#editor_close').fadeOut('slow'); - // Fade out the save button - $('#editor_save').fadeOut('slow'); - // Goto line items - $('#gotolinebtn').fadeOut('slow'); - $('#gotolineval').fadeOut('slow'); - // Fade out separators - $('.separator').fadeOut('slow'); - // Fade out breadcrumb - $('#breadcrumb_file').fadeOut('slow', function(){ $(this).remove();}); + // Fades out editor controls + $('#controls > :not(.actions,#file_access_panel),#breadcrumb_file').fadeOut('slow',function(){ + $(this).remove(); + }); // Fade out editor $('#editor').fadeOut('slow', function(){ - $('#editor_close').remove(); - $('#editor_save').remove(); - $('#editor').remove(); + $(this).remove(); var editorhtml = '
    '; $('table').after(editorhtml); $('.actions,#file_access_panel').fadeIn('slow'); -- GitLab From 66020c5d44d456055215734c50bcc0b8d836d3f1 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 22:38:19 +0000 Subject: [PATCH 211/546] update page title --- apps/files_texteditor/js/editor.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index cf6d8217c67..ff5615518af 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -185,6 +185,8 @@ function showFileEditor(dir,filename){ // Initialise the editor showControls(filename,result.data.write); $('table').fadeOut('slow', function() { + // Update document title + document.title = filename; $('#editor').text(result.data.filecontents); $('#editor').attr('data-dir', dir); $('#editor').attr('data-filename', filename); @@ -220,6 +222,8 @@ function hideFileEditor(){ // Fade out editor $('#editor').fadeOut('slow', function(){ $(this).remove(); + // Reset document title + document.title = "ownCloud"; var editorhtml = '
    '; $('table').after(editorhtml); $('.actions,#file_access_panel').fadeIn('slow'); -- GitLab From 2a0ed930ef681a488d1b7f13e6f71b3d12318860 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Mon, 9 Jan 2012 22:42:28 +0000 Subject: [PATCH 212/546] improved ui for go to line button --- apps/files_texteditor/js/editor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index ff5615518af..54f781cd9b3 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -60,7 +60,7 @@ function showControls(filename,writeperms){ // Load the new toolbar. var savebtnhtml; if(writeperms=="true"){ - var editorcontrols = '
    '; + var editorcontrols = '
    '; } var html = '
    '; $('#controls').append(html); @@ -73,7 +73,7 @@ function showControls(filename,writeperms){ function bindControlEvents(){ $("#editor_save").die('click',doFileSave).live('click',doFileSave); $('#editor_close').die('click',hideFileEditor).live('click',hideFileEditor); - $('#gotolinebtn').die('click', goToLine).live('click', goToLine); + $('#gotolineval').die('keyup', goToLine).live('keyup', goToLine); $('#editorsearchval').die('keyup', doSearch).live('keyup', doSearch); $('#clearsearchbtn').die('click', resetSearch).live('click', resetSearch); $('#nextsearchbtn').die('click', nextSearchResult).live('click', nextSearchResult); -- GitLab From e316cddf650379b5b6cde600dd058d33169ddbb1 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 10 Jan 2012 14:59:31 +0100 Subject: [PATCH 213/546] More fixes on saving TYPE parameters. Use jQuery Dialog for error messages instead of alert() --- apps/contacts/ajax/addcard.php | 17 ++++++- apps/contacts/ajax/addproperty.php | 2 + apps/contacts/js/interface.js | 76 ++++++++++++++++++------------ apps/contacts/templates/index.php | 3 -- 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php index 9d782246a0a..54e4faa6ed9 100644 --- a/apps/contacts/ajax/addcard.php +++ b/apps/contacts/ajax/addcard.php @@ -54,11 +54,24 @@ foreach( $add as $propname){ $value = $values[$propname]; if( isset( $parameters[$propname] ) && count( $parameters[$propname] )){ $prop_parameters = $parameters[$propname]; - } else{ $prop_parameters = array(); } - $vcard->addProperty($propname, $value, $prop_parameters); + $vcard->addProperty($propname, $value); //, $prop_parameters); + $line = count($vcard->children) - 1; + foreach ($prop_parameters as $key=>$element) { + if(is_array($element) && strtoupper($key) == 'TYPE') { + // FIXME: Maybe this doesn't only apply for TYPE? + // And it probably shouldn't be done here anyways :-/ + foreach($element as $e){ + if($e != '' && !is_null($e)){ + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$e); + } + } + } else { + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$element); + } + } } $id = OC_Contacts_VCard::add($aid,$vcard->serialize()); diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index 0122cf019c7..0f76add3c9b 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -48,6 +48,8 @@ foreach ($parameters as $key=>$element) { $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$e); } } + } else { + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$element); } } diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 187c8941dcf..4a27073c156 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -18,9 +18,6 @@ * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * - * TODO: - * If you add a contact, its thumbnail doesnt show in the list. But when you add another one it shows up, but not for the second contact added. - * Place a new contact in correct alphabetic order */ @@ -31,6 +28,20 @@ Contacts={ $('#carddav_url').show(); $('#carddav_url_close').show(); }, + messageBox:function(title, msg) { + var $dialog = $('
    ') + .html(msg) + .dialog({ + autoOpen: true, + title: title,buttons: [ + { + text: "Ok", + click: function() { $(this).dialog("close"); } + } + ] + } + ); + }, Addressbooks:{ overview:function(){ if($('#chooseaddressbook_dialog').dialog('isOpen') == true){ @@ -85,7 +96,8 @@ Contacts={ Contacts.UI.Contacts.update(); Contacts.UI.Addressbooks.overview(); } else { - alert('Error: ' + data.message); + Contacts.UI.messageBox('Error', data.message); + //alert('Error: ' + data.message); } }); } @@ -114,37 +126,29 @@ Contacts={ } }, Contacts:{ + /** + * Reload the contacts list. + */ update:function(){ $.getJSON('ajax/contacts.php',{},function(jsondata){ if(jsondata.status == 'success'){ $('#contacts').html(jsondata.data.page); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error',jsondata.data.message); + //alert(jsondata.data.message); } }); - /* - var contactlist = $('#contacts'); - var contacts = contactlist.children('li').get(); - //alert(contacts); - contacts.sort(function(a, b) { - var compA = $(a).text().toUpperCase(); - var compB = $(b).text().toUpperCase(); - return (compA < compB) ? -1 : (compA > compB) ? 1 : 0; - }) - $.each(contacts, function(idx, itm) { contactlist.append(itm); }); - */ - setTimeout(Contacts.UI.Contacts.lazyupdate(), 500); + setTimeout(Contacts.UI.Contacts.lazyupdate, 500); }, + /** + * Add thumbnails to the contact list as they become visible in the viewport. + */ lazyupdate:function(){ - //alert('lazyupdate'); $('#contacts li').live('inview', function(){ if (!$(this).find('a').attr('style')) { - //alert($(this).data('id') + ' has background: ' + $(this).attr('style')); $(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat'); - }/* else { - alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url')); - }*/ + } }); } } @@ -168,7 +172,8 @@ $(document).ready(function(){ $('#leftcontent li[data-id="'+jsondata.data.id+'"]').addClass('active'); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -183,7 +188,8 @@ $(document).ready(function(){ $('#rightcontent').empty(); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -197,7 +203,8 @@ $(document).ready(function(){ $('#contacts_addproperty').hide(); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -226,7 +233,8 @@ $(document).ready(function(){ $('#contacts_addpropertyform').before(jsondata.data.page); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }, 'json'); return false; @@ -248,7 +256,8 @@ $(document).ready(function(){ .find('select').chosen(); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -277,7 +286,8 @@ $(document).ready(function(){ } } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }, 'json'); return false; @@ -291,7 +301,8 @@ $(document).ready(function(){ .find('select').chosen(); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -303,7 +314,8 @@ $(document).ready(function(){ $('.contacts_property[data-checksum="'+jsondata.data.oldchecksum+'"]').replaceWith(jsondata.data.page); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } },'json'); return false; @@ -317,7 +329,8 @@ $(document).ready(function(){ $('.contacts_property[data-checksum="'+checksum+'"]').remove(); } else{ - alert(jsondata.data.message); + Contacts.UI.messageBox('Error', jsondata.data.message); + //alert(jsondata.data.message); } }); return false; @@ -357,4 +370,5 @@ $(document).ready(function(){ $('.action').tipsy(); $('.button').tipsy(); + //Contacts.UI.messageBox('Hello','Sailor'); }); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php index 90143f25fa6..24484231af4 100644 --- a/apps/contacts/templates/index.php +++ b/apps/contacts/templates/index.php @@ -31,7 +31,4 @@ OC_Util::addStyle('contacts','formtastic');
    -
    - t("There was a fail, while parsing the file."); ?> -
    -- GitLab From fd4b63810d1276e4cc34dd18d5cf01eb0db63c98 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Tue, 10 Jan 2012 14:41:08 +0000 Subject: [PATCH 214/546] default table prefix to oc_ if not set --- lib/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/setup.php b/lib/setup.php index 9a40c36f62c..ce7ee24e134 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -84,7 +84,7 @@ class OC_Setup { $dbpass = $options['dbpass']; $dbname = $options['dbname']; $dbhost = $options['dbhost']; - $dbtableprefix = $options['dbtableprefix']; + $dbtableprefix = isset($options['dbtableprefix']) ? $options['dbtableprefix'] : 'oc_'; OC_Config::setValue('dbname', $dbname); OC_Config::setValue('dbhost', $dbhost); OC_Config::setValue('dbtableprefix', $dbtableprefix); -- GitLab From 125731cab092a724c52b60621a6ff42a5d0d8fdb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 10 Jan 2012 16:47:52 +0100 Subject: [PATCH 215/546] fix uploading to subfolders --- files/templates/index.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/templates/index.php b/files/templates/index.php index fd1158a0297..9ebfa41cef2 100644 --- a/files/templates/index.php +++ b/files/templates/index.php @@ -1,4 +1,3 @@ -
    @@ -17,6 +16,7 @@ + @@ -25,6 +25,8 @@
    + +
    -- GitLab From f67e5d18e7d1c363f4d3822afa6f3d4d06f23be8 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Jan 2012 01:06:59 +0100 Subject: [PATCH 216/546] update translations --- apps/calendar/l10n/ar.php | 86 +++++ apps/calendar/l10n/eo.php | 136 +++++++ apps/calendar/l10n/eu.php | 86 +++++ apps/calendar/l10n/he.php | 67 ++++ apps/calendar/l10n/hr.php | 86 +++++ apps/calendar/l10n/hu_HU.php | 84 +++++ apps/calendar/l10n/hy.php | 11 + apps/calendar/l10n/ia.php | 27 ++ apps/calendar/l10n/ja_JP.php | 86 +++++ apps/calendar/l10n/lt_LT.php | 77 ++++ apps/calendar/l10n/nl.php | 2 +- apps/calendar/l10n/nn_NO.php | 65 ++++ apps/calendar/l10n/sk_SK.php | 86 +++++ apps/calendar/l10n/sl.php | 86 +++++ apps/calendar/l10n/tr.php | 86 +++++ apps/contacts/l10n/ar.php | 36 ++ apps/contacts/l10n/ca.php | 36 ++ apps/contacts/l10n/cs_CZ.php | 36 ++ apps/contacts/l10n/da.php | 36 +- apps/contacts/l10n/de.php | 29 +- apps/contacts/l10n/el.php | 36 ++ apps/contacts/l10n/eo.php | 36 ++ apps/contacts/l10n/es.php | 36 ++ apps/contacts/l10n/et_EE.php | 36 ++ apps/contacts/l10n/eu.php | 36 ++ apps/contacts/l10n/fr.php | 36 ++ apps/contacts/l10n/he.php | 36 ++ apps/contacts/l10n/hr.php | 36 ++ apps/contacts/l10n/hu_HU.php | 36 ++ apps/contacts/l10n/ia.php | 32 ++ apps/contacts/l10n/it.php | 34 +- apps/contacts/l10n/ja_JP.php | 36 ++ apps/contacts/l10n/lb.php | 36 ++ apps/contacts/l10n/lt_LT.php | 33 ++ apps/contacts/l10n/nl.php | 53 +++ apps/contacts/l10n/nn_NO.php | 36 ++ apps/contacts/l10n/pl.php | 36 ++ apps/contacts/l10n/pt_BR.php | 36 ++ apps/contacts/l10n/pt_PT.php | 36 ++ apps/contacts/l10n/ro.php | 36 ++ apps/contacts/l10n/ru.php | 36 ++ apps/contacts/l10n/sk_SK.php | 36 ++ apps/contacts/l10n/sl.php | 36 ++ apps/contacts/l10n/sr.php | 36 ++ apps/contacts/l10n/sr@latin.php | 36 ++ apps/contacts/l10n/sv.php | 36 ++ apps/contacts/l10n/tr.php | 36 ++ apps/contacts/l10n/zh_CN.php | 36 ++ apps/media/l10n/ar.php | 13 + apps/media/l10n/bg_BG.php | 1 - apps/media/l10n/ca.php | 3 +- apps/media/l10n/cs_CZ.php | 3 +- apps/media/l10n/da.php | 6 +- apps/media/l10n/de.php | 8 +- apps/media/l10n/el.php | 1 - apps/media/l10n/eo.php | 13 + apps/media/l10n/es.php | 1 - apps/media/l10n/et_EE.php | 1 - apps/media/l10n/eu.php | 13 + apps/media/l10n/fr.php | 6 +- apps/media/l10n/he.php | 13 + apps/media/l10n/hr.php | 13 + apps/media/l10n/hu_HU.php | 13 + apps/media/l10n/ia.php | 13 + apps/media/l10n/id.php | 6 +- apps/media/l10n/it.php | 3 +- apps/media/l10n/ja_JP.php | 13 + apps/media/l10n/lb.php | 1 - apps/media/l10n/lt_LT.php | 13 + apps/media/l10n/ms_MY.php | 1 - apps/media/l10n/nb_NO.php | 1 - apps/media/l10n/nl.php | 8 +- apps/media/l10n/nn_NO.php | 13 + apps/media/l10n/pl.php | 6 +- apps/media/l10n/pt_BR.php | 1 - apps/media/l10n/ro.php | 1 - apps/media/l10n/ru.php | 1 - apps/media/l10n/sk_SK.php | 13 + apps/media/l10n/sl.php | 13 + apps/media/l10n/sr.php | 1 - apps/media/l10n/sr@latin.php | 1 - apps/media/l10n/sv.php | 1 - apps/media/l10n/tr.php | 13 + apps/media/l10n/zh_CN.php | 1 - core/l10n/ar.php | 34 ++ core/l10n/bg_BG.php | 24 +- core/l10n/ca.php | 24 +- core/l10n/cs_CZ.php | 16 +- core/l10n/da.php | 38 +- core/l10n/de.php | 24 +- core/l10n/el.php | 24 +- core/l10n/eo.php | 34 ++ core/l10n/es.php | 24 +- core/l10n/et_EE.php | 24 +- core/l10n/eu.php | 34 ++ core/l10n/fr.php | 24 +- core/l10n/he.php | 34 ++ core/l10n/hr.php | 34 ++ core/l10n/hu_HU.php | 33 ++ core/l10n/ia.php | 27 ++ core/l10n/id.php | 17 +- core/l10n/it.php | 26 +- core/l10n/ja_JP.php | 34 ++ core/l10n/lb.php | 24 +- core/l10n/lt_LT.php | 33 ++ core/l10n/ms_MY.php | 17 +- core/l10n/nb_NO.php | 7 +- core/l10n/nl.php | 24 +- core/l10n/nn_NO.php | 34 ++ core/l10n/pl.php | 24 +- core/l10n/pt_BR.php | 24 +- core/l10n/pt_PT.php | 3 + core/l10n/ro.php | 24 +- core/l10n/ru.php | 24 +- core/l10n/sk_SK.php | 34 ++ core/l10n/sl.php | 34 ++ core/l10n/sr.php | 24 +- core/l10n/sr@latin.php | 24 +- core/l10n/sv.php | 26 +- core/l10n/tr.php | 34 ++ core/l10n/zh_CN.php | 24 +- files/l10n/ar.php | 19 + files/l10n/bg_BG.php | 7 +- files/l10n/ca.php | 7 +- files/l10n/cs_CZ.php | 7 +- files/l10n/da.php | 9 +- files/l10n/de.php | 7 +- files/l10n/el.php | 7 +- files/l10n/eo.php | 19 + files/l10n/es.php | 7 +- files/l10n/et_EE.php | 7 +- files/l10n/eu.php | 19 + files/l10n/fr.php | 7 +- files/l10n/he.php | 19 + files/l10n/hr.php | 19 + files/l10n/hu_HU.php | 19 + files/l10n/ia.php | 14 + files/l10n/id.php | 1 - files/l10n/it.php | 7 +- files/l10n/ja_JP.php | 19 + files/l10n/lb.php | 7 +- files/l10n/lt_LT.php | 19 + files/l10n/ms_MY.php | 1 - files/l10n/nb_NO.php | 1 - files/l10n/nl.php | 7 +- files/l10n/nn_NO.php | 19 + files/l10n/pl.php | 7 +- files/l10n/pt_BR.php | 7 +- files/l10n/ro.php | 7 +- files/l10n/ru.php | 7 +- files/l10n/sk_SK.php | 19 + files/l10n/sl.php | 19 + files/l10n/sr.php | 7 +- files/l10n/sr@latin.php | 7 +- files/l10n/sv.php | 15 +- files/l10n/tr.php | 19 + files/l10n/zh_CN.php | 7 +- l10n/.tx/config | 33 ++ l10n/ar/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/ar/contacts.po | 239 ++++++++++++ l10n/ar/core.po | 171 +++++++++ l10n/ar/files.po | 112 ++++++ l10n/ar/media.po | 65 ++++ l10n/ar/settings.po | 153 ++++++++ l10n/bg_BG/contacts.po | 220 +++++++---- l10n/bg_BG/core.po | 133 ++++--- l10n/bg_BG/files.po | 68 ++-- l10n/bg_BG/media.po | 20 +- l10n/bg_BG/settings.po | 70 ++-- l10n/ca/contacts.po | 261 ++++++++----- l10n/ca/core.po | 133 ++++--- l10n/ca/files.po | 68 ++-- l10n/ca/media.po | 25 +- l10n/ca/settings.po | 77 ++-- l10n/cs_CZ/contacts.po | 262 ++++++++----- l10n/cs_CZ/core.po | 137 ++++--- l10n/cs_CZ/files.po | 67 ++-- l10n/cs_CZ/media.po | 26 +- l10n/cs_CZ/settings.po | 74 ++-- l10n/da/contacts.po | 254 ++++++++----- l10n/da/core.po | 148 ++++---- l10n/da/files.po | 72 ++-- l10n/da/media.po | 34 +- l10n/da/settings.po | 81 ++-- l10n/de/contacts.po | 273 ++++++++------ l10n/de/core.po | 135 ++++--- l10n/de/files.po | 69 ++-- l10n/de/media.po | 36 +- l10n/de/settings.po | 74 ++-- l10n/el/contacts.po | 262 ++++++++----- l10n/el/core.po | 137 +++---- l10n/el/files.po | 68 ++-- l10n/el/media.po | 23 +- l10n/el/settings.po | 75 ++-- l10n/eo/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/eo/contacts.po | 239 ++++++++++++ l10n/eo/core.po | 171 +++++++++ l10n/eo/files.po | 113 ++++++ l10n/eo/media.po | 65 ++++ l10n/eo/settings.po | 154 ++++++++ l10n/es/contacts.po | 262 ++++++++----- l10n/es/core.po | 135 ++++--- l10n/es/files.po | 68 ++-- l10n/es/media.po | 23 +- l10n/es/settings.po | 82 ++-- l10n/et_EE/contacts.po | 261 ++++++++----- l10n/et_EE/core.po | 134 ++++--- l10n/et_EE/files.po | 67 ++-- l10n/et_EE/media.po | 20 +- l10n/et_EE/settings.po | 70 ++-- l10n/eu/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/eu/contacts.po | 240 ++++++++++++ l10n/eu/core.po | 171 +++++++++ l10n/eu/files.po | 115 ++++++ l10n/eu/media.po | 65 ++++ l10n/eu/settings.po | 155 ++++++++ l10n/fr/contacts.po | 262 ++++++++----- l10n/fr/core.po | 137 +++---- l10n/fr/files.po | 68 ++-- l10n/fr/media.po | 33 +- l10n/fr/settings.po | 76 ++-- l10n/he/calendar.po | 639 ++++++++++++++++++++++++++++++++ l10n/he/contacts.po | 239 ++++++++++++ l10n/he/core.po | 172 +++++++++ l10n/he/files.po | 109 ++++++ l10n/he/media.po | 65 ++++ l10n/he/settings.po | 153 ++++++++ l10n/hr/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/hr/contacts.po | 239 ++++++++++++ l10n/hr/core.po | 172 +++++++++ l10n/hr/files.po | 115 ++++++ l10n/hr/media.po | 65 ++++ l10n/hr/settings.po | 154 ++++++++ l10n/hu_HU/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/hu_HU/contacts.po | 240 ++++++++++++ l10n/hu_HU/core.po | 171 +++++++++ l10n/hu_HU/files.po | 116 ++++++ l10n/hu_HU/media.po | 65 ++++ l10n/hu_HU/settings.po | 155 ++++++++ l10n/hy/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/hy/contacts.po | 238 ++++++++++++ l10n/hy/core.po | 170 +++++++++ l10n/hy/files.po | 108 ++++++ l10n/hy/media.po | 64 ++++ l10n/hy/settings.po | 152 ++++++++ l10n/ia/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/ia/contacts.po | 240 ++++++++++++ l10n/ia/core.po | 171 +++++++++ l10n/ia/files.po | 109 ++++++ l10n/ia/media.po | 65 ++++ l10n/ia/settings.po | 153 ++++++++ l10n/id/contacts.po | 220 +++++++---- l10n/id/core.po | 133 ++++--- l10n/id/files.po | 56 +-- l10n/id/media.po | 33 +- l10n/id/settings.po | 75 ++-- l10n/it/contacts.po | 251 ++++++++----- l10n/it/core.po | 136 ++++--- l10n/it/files.po | 68 ++-- l10n/it/media.po | 26 +- l10n/it/settings.po | 76 ++-- l10n/ja_JP/calendar.po | 636 +++++++++++++++++++++++++++++++ l10n/ja_JP/contacts.po | 238 ++++++++++++ l10n/ja_JP/core.po | 170 +++++++++ l10n/ja_JP/files.po | 108 ++++++ l10n/ja_JP/media.po | 64 ++++ l10n/ja_JP/settings.po | 152 ++++++++ l10n/lb/contacts.po | 261 ++++++++----- l10n/lb/core.po | 135 ++++--- l10n/lb/files.po | 68 ++-- l10n/lb/media.po | 23 +- l10n/lb/settings.po | 70 ++-- l10n/lt_LT/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/lt_LT/contacts.po | 239 ++++++++++++ l10n/lt_LT/core.po | 173 +++++++++ l10n/lt_LT/files.po | 112 ++++++ l10n/lt_LT/media.po | 65 ++++ l10n/lt_LT/settings.po | 154 ++++++++ l10n/ms_MY/contacts.po | 220 +++++++---- l10n/ms_MY/core.po | 135 +++---- l10n/ms_MY/files.po | 56 +-- l10n/ms_MY/media.po | 20 +- l10n/ms_MY/settings.po | 70 ++-- l10n/nb_NO/contacts.po | 220 +++++++---- l10n/nb_NO/core.po | 132 ++++--- l10n/nb_NO/files.po | 56 +-- l10n/nb_NO/media.po | 23 +- l10n/nb_NO/settings.po | 73 ++-- l10n/nl/contacts.po | 291 +++++++++------ l10n/nl/core.po | 134 ++++--- l10n/nl/files.po | 70 ++-- l10n/nl/media.po | 37 +- l10n/nl/settings.po | 91 +++-- l10n/nn_NO/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/nn_NO/contacts.po | 239 ++++++++++++ l10n/nn_NO/core.po | 171 +++++++++ l10n/nn_NO/files.po | 112 ++++++ l10n/nn_NO/media.po | 65 ++++ l10n/nn_NO/settings.po | 153 ++++++++ l10n/pl/contacts.po | 261 ++++++++----- l10n/pl/core.po | 133 ++++--- l10n/pl/files.po | 68 ++-- l10n/pl/media.po | 34 +- l10n/pl/settings.po | 78 ++-- l10n/pt_BR/contacts.po | 261 ++++++++----- l10n/pt_BR/core.po | 133 ++++--- l10n/pt_BR/files.po | 68 ++-- l10n/pt_BR/media.po | 25 +- l10n/pt_BR/settings.po | 70 ++-- l10n/pt_PT/contacts.po | 260 ++++++++----- l10n/pt_PT/core.po | 130 ++++--- l10n/pt_PT/files.po | 54 +-- l10n/pt_PT/media.po | 20 +- l10n/pt_PT/settings.po | 64 ++-- l10n/ro/contacts.po | 261 ++++++++----- l10n/ro/core.po | 134 ++++--- l10n/ro/files.po | 68 ++-- l10n/ro/media.po | 23 +- l10n/ro/settings.po | 73 ++-- l10n/ru/contacts.po | 261 ++++++++----- l10n/ru/core.po | 133 ++++--- l10n/ru/files.po | 68 ++-- l10n/ru/media.po | 23 +- l10n/ru/settings.po | 71 ++-- l10n/sk_SK/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/sk_SK/contacts.po | 238 ++++++++++++ l10n/sk_SK/core.po | 171 +++++++++ l10n/sk_SK/files.po | 112 ++++++ l10n/sk_SK/media.po | 64 ++++ l10n/sk_SK/settings.po | 153 ++++++++ l10n/sl/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/sl/contacts.po | 240 ++++++++++++ l10n/sl/core.po | 172 +++++++++ l10n/sl/files.po | 114 ++++++ l10n/sl/media.po | 65 ++++ l10n/sl/settings.po | 153 ++++++++ l10n/sr/contacts.po | 261 ++++++++----- l10n/sr/core.po | 133 ++++--- l10n/sr/files.po | 68 ++-- l10n/sr/media.po | 20 +- l10n/sr/settings.po | 70 ++-- l10n/sr@latin/contacts.po | 261 ++++++++----- l10n/sr@latin/core.po | 133 ++++--- l10n/sr@latin/files.po | 68 ++-- l10n/sr@latin/media.po | 20 +- l10n/sr@latin/settings.po | 70 ++-- l10n/sv/contacts.po | 261 ++++++++----- l10n/sv/core.po | 136 ++++--- l10n/sv/files.po | 76 ++-- l10n/sv/media.po | 21 +- l10n/sv/settings.po | 74 ++-- l10n/templates/calendar.pot | 2 +- l10n/templates/contacts.pot | 216 +++++++---- l10n/templates/core.pot | 125 ++++--- l10n/templates/files.pot | 50 ++- l10n/templates/media.pot | 16 +- l10n/templates/settings.pot | 60 ++- l10n/tr/calendar.po | 637 +++++++++++++++++++++++++++++++ l10n/tr/contacts.po | 239 ++++++++++++ l10n/tr/core.po | 171 +++++++++ l10n/tr/files.po | 112 ++++++ l10n/tr/media.po | 65 ++++ l10n/tr/settings.po | 153 ++++++++ l10n/zh_CN/contacts.po | 261 ++++++++----- l10n/zh_CN/core.po | 133 ++++--- l10n/zh_CN/files.po | 68 ++-- l10n/zh_CN/media.po | 23 +- l10n/zh_CN/settings.po | 73 ++-- settings/l10n/ar.php | 28 ++ settings/l10n/bg_BG.php | 4 +- settings/l10n/ca.php | 7 +- settings/l10n/cs_CZ.php | 4 +- settings/l10n/da.php | 9 +- settings/l10n/de.php | 5 +- settings/l10n/el.php | 6 +- settings/l10n/eo.php | 28 ++ settings/l10n/es.php | 7 +- settings/l10n/et_EE.php | 4 +- settings/l10n/eu.php | 28 ++ settings/l10n/fr.php | 6 +- settings/l10n/he.php | 28 ++ settings/l10n/hr.php | 28 ++ settings/l10n/hu_HU.php | 25 ++ settings/l10n/ia.php | 21 ++ settings/l10n/id.php | 5 +- settings/l10n/it.php | 6 +- settings/l10n/ja_JP.php | 28 ++ settings/l10n/lb.php | 4 +- settings/l10n/lt_LT.php | 26 ++ settings/l10n/ms_MY.php | 4 +- settings/l10n/nb_NO.php | 4 +- settings/l10n/nl.php | 16 +- settings/l10n/nn_NO.php | 28 ++ settings/l10n/pl.php | 5 +- settings/l10n/pt_BR.php | 4 +- settings/l10n/ro.php | 4 +- settings/l10n/ru.php | 4 +- settings/l10n/sk_SK.php | 28 ++ settings/l10n/sl.php | 28 ++ settings/l10n/sr.php | 4 +- settings/l10n/sr@latin.php | 4 +- settings/l10n/sv.php | 6 +- settings/l10n/tr.php | 28 ++ settings/l10n/zh_CN.php | 4 +- 404 files changed, 31418 insertions(+), 6043 deletions(-) create mode 100644 apps/calendar/l10n/ar.php create mode 100644 apps/calendar/l10n/eo.php create mode 100644 apps/calendar/l10n/eu.php create mode 100644 apps/calendar/l10n/he.php create mode 100644 apps/calendar/l10n/hr.php create mode 100644 apps/calendar/l10n/hu_HU.php create mode 100644 apps/calendar/l10n/hy.php create mode 100644 apps/calendar/l10n/ia.php create mode 100644 apps/calendar/l10n/ja_JP.php create mode 100644 apps/calendar/l10n/lt_LT.php create mode 100644 apps/calendar/l10n/nn_NO.php create mode 100644 apps/calendar/l10n/sk_SK.php create mode 100644 apps/calendar/l10n/sl.php create mode 100644 apps/calendar/l10n/tr.php create mode 100644 apps/contacts/l10n/ar.php create mode 100644 apps/contacts/l10n/ca.php create mode 100644 apps/contacts/l10n/cs_CZ.php create mode 100644 apps/contacts/l10n/el.php create mode 100644 apps/contacts/l10n/eo.php create mode 100644 apps/contacts/l10n/es.php create mode 100644 apps/contacts/l10n/et_EE.php create mode 100644 apps/contacts/l10n/eu.php create mode 100644 apps/contacts/l10n/fr.php create mode 100644 apps/contacts/l10n/he.php create mode 100644 apps/contacts/l10n/hr.php create mode 100644 apps/contacts/l10n/hu_HU.php create mode 100644 apps/contacts/l10n/ia.php create mode 100644 apps/contacts/l10n/ja_JP.php create mode 100644 apps/contacts/l10n/lb.php create mode 100644 apps/contacts/l10n/lt_LT.php create mode 100644 apps/contacts/l10n/nl.php create mode 100644 apps/contacts/l10n/nn_NO.php create mode 100644 apps/contacts/l10n/pl.php create mode 100644 apps/contacts/l10n/pt_BR.php create mode 100644 apps/contacts/l10n/pt_PT.php create mode 100644 apps/contacts/l10n/ro.php create mode 100644 apps/contacts/l10n/ru.php create mode 100644 apps/contacts/l10n/sk_SK.php create mode 100644 apps/contacts/l10n/sl.php create mode 100644 apps/contacts/l10n/sr.php create mode 100644 apps/contacts/l10n/sr@latin.php create mode 100644 apps/contacts/l10n/sv.php create mode 100644 apps/contacts/l10n/tr.php create mode 100644 apps/contacts/l10n/zh_CN.php create mode 100644 apps/media/l10n/ar.php create mode 100644 apps/media/l10n/eo.php create mode 100644 apps/media/l10n/eu.php create mode 100644 apps/media/l10n/he.php create mode 100644 apps/media/l10n/hr.php create mode 100644 apps/media/l10n/hu_HU.php create mode 100644 apps/media/l10n/ia.php create mode 100644 apps/media/l10n/ja_JP.php create mode 100644 apps/media/l10n/lt_LT.php create mode 100644 apps/media/l10n/nn_NO.php create mode 100644 apps/media/l10n/sk_SK.php create mode 100644 apps/media/l10n/sl.php create mode 100644 apps/media/l10n/tr.php create mode 100644 core/l10n/ar.php create mode 100644 core/l10n/eo.php create mode 100644 core/l10n/eu.php create mode 100644 core/l10n/he.php create mode 100644 core/l10n/hr.php create mode 100644 core/l10n/hu_HU.php create mode 100644 core/l10n/ia.php create mode 100644 core/l10n/ja_JP.php create mode 100644 core/l10n/lt_LT.php create mode 100644 core/l10n/nn_NO.php create mode 100644 core/l10n/pt_PT.php create mode 100644 core/l10n/sk_SK.php create mode 100644 core/l10n/sl.php create mode 100644 core/l10n/tr.php create mode 100644 files/l10n/ar.php create mode 100644 files/l10n/eo.php create mode 100644 files/l10n/eu.php create mode 100644 files/l10n/he.php create mode 100644 files/l10n/hr.php create mode 100644 files/l10n/hu_HU.php create mode 100644 files/l10n/ia.php create mode 100644 files/l10n/ja_JP.php create mode 100644 files/l10n/lt_LT.php create mode 100644 files/l10n/nn_NO.php create mode 100644 files/l10n/sk_SK.php create mode 100644 files/l10n/sl.php create mode 100644 files/l10n/tr.php create mode 100644 l10n/.tx/config create mode 100644 l10n/ar/calendar.po create mode 100644 l10n/ar/contacts.po create mode 100644 l10n/ar/core.po create mode 100644 l10n/ar/files.po create mode 100644 l10n/ar/media.po create mode 100644 l10n/ar/settings.po create mode 100644 l10n/eo/calendar.po create mode 100644 l10n/eo/contacts.po create mode 100644 l10n/eo/core.po create mode 100644 l10n/eo/files.po create mode 100644 l10n/eo/media.po create mode 100644 l10n/eo/settings.po create mode 100644 l10n/eu/calendar.po create mode 100644 l10n/eu/contacts.po create mode 100644 l10n/eu/core.po create mode 100644 l10n/eu/files.po create mode 100644 l10n/eu/media.po create mode 100644 l10n/eu/settings.po create mode 100644 l10n/he/calendar.po create mode 100644 l10n/he/contacts.po create mode 100644 l10n/he/core.po create mode 100644 l10n/he/files.po create mode 100644 l10n/he/media.po create mode 100644 l10n/he/settings.po create mode 100644 l10n/hr/calendar.po create mode 100644 l10n/hr/contacts.po create mode 100644 l10n/hr/core.po create mode 100644 l10n/hr/files.po create mode 100644 l10n/hr/media.po create mode 100644 l10n/hr/settings.po create mode 100644 l10n/hu_HU/calendar.po create mode 100644 l10n/hu_HU/contacts.po create mode 100644 l10n/hu_HU/core.po create mode 100644 l10n/hu_HU/files.po create mode 100644 l10n/hu_HU/media.po create mode 100644 l10n/hu_HU/settings.po create mode 100644 l10n/hy/calendar.po create mode 100644 l10n/hy/contacts.po create mode 100644 l10n/hy/core.po create mode 100644 l10n/hy/files.po create mode 100644 l10n/hy/media.po create mode 100644 l10n/hy/settings.po create mode 100644 l10n/ia/calendar.po create mode 100644 l10n/ia/contacts.po create mode 100644 l10n/ia/core.po create mode 100644 l10n/ia/files.po create mode 100644 l10n/ia/media.po create mode 100644 l10n/ia/settings.po create mode 100644 l10n/ja_JP/calendar.po create mode 100644 l10n/ja_JP/contacts.po create mode 100644 l10n/ja_JP/core.po create mode 100644 l10n/ja_JP/files.po create mode 100644 l10n/ja_JP/media.po create mode 100644 l10n/ja_JP/settings.po create mode 100644 l10n/lt_LT/calendar.po create mode 100644 l10n/lt_LT/contacts.po create mode 100644 l10n/lt_LT/core.po create mode 100644 l10n/lt_LT/files.po create mode 100644 l10n/lt_LT/media.po create mode 100644 l10n/lt_LT/settings.po create mode 100644 l10n/nn_NO/calendar.po create mode 100644 l10n/nn_NO/contacts.po create mode 100644 l10n/nn_NO/core.po create mode 100644 l10n/nn_NO/files.po create mode 100644 l10n/nn_NO/media.po create mode 100644 l10n/nn_NO/settings.po create mode 100644 l10n/sk_SK/calendar.po create mode 100644 l10n/sk_SK/contacts.po create mode 100644 l10n/sk_SK/core.po create mode 100644 l10n/sk_SK/files.po create mode 100644 l10n/sk_SK/media.po create mode 100644 l10n/sk_SK/settings.po create mode 100644 l10n/sl/calendar.po create mode 100644 l10n/sl/contacts.po create mode 100644 l10n/sl/core.po create mode 100644 l10n/sl/files.po create mode 100644 l10n/sl/media.po create mode 100644 l10n/sl/settings.po create mode 100644 l10n/tr/calendar.po create mode 100644 l10n/tr/contacts.po create mode 100644 l10n/tr/core.po create mode 100644 l10n/tr/files.po create mode 100644 l10n/tr/media.po create mode 100644 l10n/tr/settings.po create mode 100644 settings/l10n/ar.php create mode 100644 settings/l10n/eo.php create mode 100644 settings/l10n/eu.php create mode 100644 settings/l10n/he.php create mode 100644 settings/l10n/hr.php create mode 100644 settings/l10n/hu_HU.php create mode 100644 settings/l10n/ia.php create mode 100644 settings/l10n/ja_JP.php create mode 100644 settings/l10n/lt_LT.php create mode 100644 settings/l10n/nn_NO.php create mode 100644 settings/l10n/sk_SK.php create mode 100644 settings/l10n/sl.php create mode 100644 settings/l10n/tr.php diff --git a/apps/calendar/l10n/ar.php b/apps/calendar/l10n/ar.php new file mode 100644 index 00000000000..c22d816640b --- /dev/null +++ b/apps/calendar/l10n/ar.php @@ -0,0 +1,86 @@ + "تم تغيير المنطقة الزمنية", +"Invalid request" => "طلب غير Ù…Ùهوم", +"Calendar" => "الجدول الزمني", +"Wrong calendar" => "جدول زمني خاطئ", +"Birthday" => "عيد ميلاد", +"Business" => "عمل", +"Call" => "إتصال", +"Clients" => "الزبائن", +"Deliverer" => "المرسل", +"Holidays" => "عطلة", +"Ideas" => "Ø£Ùكار", +"Journey" => "رحلة", +"Jubilee" => "يوبيل", +"Meeting" => "إجتماع", +"Other" => "شيء آخر", +"Personal" => "شخصي", +"Projects" => "مشاريع", +"Questions" => "اسئلة", +"Work" => "العمل", +"Does not repeat" => "لا يعاد", +"Daily" => "يومي", +"Weekly" => "أسبوعي", +"Every Weekday" => "كل نهاية الأسبوع", +"Bi-Weekly" => "كل اسبوعين", +"Monthly" => "شهري", +"Yearly" => "سنوي", +"Not an array" => "ليس صÙÙŠÙ", +"All day" => "كل النهار", +"Missing fields" => "خانات خالية من المعلومات", +"Title" => "عنوان", +"From Date" => "من تاريخ", +"From Time" => "إلى تاريخ", +"To Date" => "إلى يوم", +"To Time" => "إلى وقت", +"The event ends before it starts" => "هذا الحدث ينتهي قبل أن يبدأ", +"There was a database fail" => "خطأ ÙÙŠ قاعدة البيانات", +"Week" => "إسبوع", +"Month" => "شهر", +"List" => "قائمة", +"Today" => "اليوم", +"Calendars" => "الجداول الزمنية", +"There was a fail, while parsing the file." => "لم يتم قراءة المل٠بنجاح.", +"Choose active calendars" => "إختر الجدول الزمني الرئيسي", +"New Calendar" => "جدول زمني جديد", +"CalDav Link" => "وصلة CalDav", +"Download" => "تحميل", +"Edit" => "تعديل", +"Delete" => "حذÙ", +"New calendar" => "جدول زمني جديد", +"Edit calendar" => "عادل الجدول الزمني", +"Displayname" => "الاسم المرئي", +"Active" => "حالي", +"Calendar color" => "لون الجدول الزمني", +"Save" => "إحÙظ", +"Submit" => "أرسل", +"Cancel" => "إلغاء", +"Edit an event" => "عادل حدث", +"Export" => "تصدير المعلومات", +"Title of the Event" => "عنوان الحدث", +"Category" => "Ùئة", +"Select category" => "اختر الÙئة", +"All Day Event" => "حدث ÙÙŠ يوم كامل", +"From" => "من", +"To" => "إلى", +"Advanced options" => "خيارات متقدمة", +"Repeat" => "إعادة", +"Location" => "مكان", +"Location of the Event" => "مكان الحدث", +"Description" => "مواصÙات", +"Description of the Event" => "وص٠الحدث", +"Import Ical File" => "إدخال مل٠Ical", +"How to import the new calendar?" => "كيÙية إدخال مل٠جدول زمني ØŸ", +"Import into an existing calendar" => "إدخال معلومات إلى جدول زمني حالي", +"Import into a new calendar" => "إدخال معلومات إلى جدول زمني جديد", +"Please choose the calendar" => "الرجاء إختر الجدول الزمني", +"Import" => "إدخال", +"Back" => "الرجوع", +"Please fill out the form" => "الرجاء إملء الخانات", +"Create a new event" => "إضاÙØ© حدث جديد", +"Timezone" => "المنطقة الزمنية", +"Timeformat" => "شكل الوقت", +"24h" => "24 ساعة", +"12h" => "12 ساعة", +"Calendar CalDAV syncing address:" => "عنوان لتحديث ال CalDAV الجدول الزمني" +); diff --git a/apps/calendar/l10n/eo.php b/apps/calendar/l10n/eo.php new file mode 100644 index 00000000000..ba4ec43d811 --- /dev/null +++ b/apps/calendar/l10n/eo.php @@ -0,0 +1,136 @@ + "Nova horzono:", +"Timezone changed" => "La horozono estas ÅanÄita", +"Invalid request" => "Nevalida peto", +"Calendar" => "Kalendaro", +"Wrong calendar" => "MalÄusta kalendaro", +"Birthday" => "NaskiÄotago", +"Business" => "Negoco", +"Call" => "Voko", +"Clients" => "Klientoj", +"Deliverer" => "Livero", +"Holidays" => "Ferioj", +"Ideas" => "Ideoj", +"Journey" => "VojaÄo", +"Jubilee" => "Jubileo", +"Meeting" => "Rendevuo", +"Other" => "Alia", +"Personal" => "Persona", +"Projects" => "Projektoj", +"Questions" => "Demandoj", +"Work" => "Laboro", +"Does not repeat" => "Ĉi tio ne ripetiÄas", +"Daily" => "Tage", +"Weekly" => "Semajne", +"Every Weekday" => "Tage", +"Bi-Weekly" => "Semajnduope", +"Monthly" => "Monate", +"Yearly" => "Jare", +"never" => "neniam", +"by occurrences" => "laÅ­ aperoj", +"by date" => "laÅ­ dato", +"by monthday" => "laÅ­ monattago", +"by weekday" => "laÅ­ semajntago", +"Monday" => "lundo", +"Tuesday" => "mardo", +"Wednesday" => "merkredo", +"Thursday" => "ĵaÅ­do", +"Friday" => "vendredo", +"Saturday" => "sabato", +"Sunday" => "dimanĉo", +"events week of month" => "la monatsemajno de la okazaĵo", +"first" => "unua", +"second" => "dua", +"third" => "tria", +"fourth" => "kvara", +"fifth" => "kvina", +"last" => "lasta", +"January" => "Januaro", +"February" => "Februaro", +"March" => "Marto", +"April" => "Aprilo", +"May" => "Majo", +"June" => "Junio", +"July" => "Julio", +"August" => "AÅ­gusto", +"September" => "Septembro", +"October" => "Oktobro", +"November" => "Novembro", +"December" => "Decembro", +"by events date" => "laÅ­ okazaĵdato", +"by yearday(s)" => "laÅ­ jartago(j)", +"by weeknumber(s)" => "laÅ­ semajnnumero(j)", +"by day and month" => "laÅ­ tago kaj monato", +"Not an array" => "Ĉi tio ne estas tabeltipa", +"Date" => "Dato", +"Cal." => "Kal.", +"All day" => "La tuta tago", +"Missing fields" => "Mankas iuj kampoj", +"Title" => "Titolo", +"From Date" => "ekde la dato", +"From Time" => "ekde la horo", +"To Date" => "Äis la dato", +"To Time" => "Äis la horo", +"The event ends before it starts" => "La okazaĵo finas antaÅ­ komenci", +"There was a database fail" => "Datumbaza malsukceso okazis", +"Week" => "Semajno", +"Month" => "Monato", +"List" => "Listo", +"Today" => "HodiaÅ­", +"Calendars" => "Kalendaroj", +"There was a fail, while parsing the file." => "Malsukceso okazis dum analizo de la dosiero.", +"Choose active calendars" => "Elektu aktivajn kalendarojn", +"New Calendar" => "Nova kalendaro", +"CalDav Link" => "CalDav-a ligilo", +"Download" => "ElÅuti", +"Edit" => "Redakti", +"Delete" => "Forigi", +"New calendar" => "Nova kalendaro", +"Edit calendar" => "Redakti la kalendaron", +"Displayname" => "Montrota nomo", +"Active" => "Aktiva", +"Calendar color" => "Kalendarokoloro", +"Save" => "Konservi", +"Submit" => "Sendi", +"Cancel" => "Nuligi", +"Edit an event" => "Redakti okazaĵon", +"Export" => "Elporti", +"Title of the Event" => "Okazaĵotitolo", +"Category" => "Kategorio", +"Select category" => "Elekti kategorion", +"All Day Event" => "La tuta tago", +"From" => "Ekde", +"To" => "Äœis", +"Advanced options" => "Altnivela agordo", +"Repeat" => "Ripeti", +"Advanced" => "Altnivelo", +"Select weekdays" => "Elekti semajntagojn", +"Select days" => "Elekti tagojn", +"and the events day of year." => "kaj la jartago de la okazaĵo.", +"and the events day of month." => "kaj la monattago de la okazaĵo.", +"Select months" => "Elekti monatojn", +"Select weeks" => "Elekti semajnojn", +"and the events week of year." => "kaj la jarsemajno de la okazaĵo.", +"Interval" => "Intervalo", +"End" => "Fino", +"occurrences" => "aperoj", +"Location" => "Loko", +"Location of the Event" => "Okazaĵoloko", +"Description" => "Priskribo", +"Description of the Event" => "Okazaĵopriskribo", +"Import Ical File" => "Enporti Ical-dosieron", +"How to import the new calendar?" => "Kiel enporti la novan kalendaron?", +"Import into an existing calendar" => "Enporti en estantan kalendaron", +"Import into a new calendar" => "Enporti en novan kalendaron", +"Please choose the calendar" => "Bonvolu elekti kalendaron", +"Import" => "Enporti", +"Back" => "AntaÅ­eniri", +"Please fill out the form" => "Bonvolu plenigi la formularon", +"Create a new event" => "Krei okazaĵon", +"Timezone" => "Horozono", +"Check always for changes of the timezone" => "Ĉiam kontroli ĉu la horzono ÅanÄiÄis", +"Timeformat" => "Tempoformo", +"24h" => "24h", +"12h" => "12h", +"Calendar CalDAV syncing address:" => "Adreso de kalendarosinkronigo per CalDAV:" +); diff --git a/apps/calendar/l10n/eu.php b/apps/calendar/l10n/eu.php new file mode 100644 index 00000000000..b7ac1e1b59d --- /dev/null +++ b/apps/calendar/l10n/eu.php @@ -0,0 +1,86 @@ + "Ordu-zona aldatuta", +"Invalid request" => "Baligabeko eskaera", +"Calendar" => "Egutegia", +"Wrong calendar" => "Egutegi okerra", +"Birthday" => "Jaioteguna", +"Business" => "Negozioa", +"Call" => "Deia", +"Clients" => "Bezeroak", +"Deliverer" => "Banatzailea", +"Holidays" => "Oporrak", +"Ideas" => "Ideiak", +"Journey" => "Bidaia", +"Jubilee" => "Urteurrena", +"Meeting" => "Bilera", +"Other" => "Bestelakoa", +"Personal" => "Pertsonala", +"Projects" => "Proiektuak", +"Questions" => "Galderak", +"Work" => "Lana", +"Does not repeat" => "Ez da errepikatzen", +"Daily" => "Egunero", +"Weekly" => "Astero", +"Every Weekday" => "Asteko egun guztietan", +"Bi-Weekly" => "Bi-Astero", +"Monthly" => "Hilabetero", +"Yearly" => "Urtero", +"Not an array" => "Ez da bektore bat", +"All day" => "Egun guztia", +"Missing fields" => "Eremuak faltan", +"Title" => "Izenburua", +"From Date" => "Hasierako Data", +"From Time" => "Hasierako Ordua", +"To Date" => "Bukaerako Data", +"To Time" => "Bukaerako Ordua", +"The event ends before it starts" => "Gertaera hasi baino lehen bukatzen da", +"There was a database fail" => "Datu baseak huts egin du", +"Week" => "Astea", +"Month" => "Hilabetea", +"List" => "Zerrenda", +"Today" => "Gaur", +"Calendars" => "Egutegiak", +"There was a fail, while parsing the file." => "Huts bat egon da, fitxategia aztertzen zen bitartea.", +"Choose active calendars" => "Aukeratu egutegi aktiboak", +"New Calendar" => "Egutegi berria", +"CalDav Link" => "CalDav Lotura", +"Download" => "Deskargatu", +"Edit" => "Editatu", +"Delete" => "Ezabatu", +"New calendar" => "Egutegi berria", +"Edit calendar" => "Editatu egutegia", +"Displayname" => "Bistaratzeko izena", +"Active" => "Aktiboa", +"Calendar color" => "Egutegiaren kolorea", +"Save" => "Gorde", +"Submit" => "Bidali", +"Cancel" => "Ezeztatu", +"Edit an event" => "Editatu gertaera", +"Export" => "Exportatu", +"Title of the Event" => "Gertaeraren izenburua", +"Category" => "Kategoria", +"Select category" => "Aukeratu kategoria", +"All Day Event" => "Egun osoko gertaera", +"From" => "Hasiera", +"To" => "Bukaera", +"Advanced options" => "Aukera aurreratuak", +"Repeat" => "Errepikatu", +"Location" => "Kokalekua", +"Location of the Event" => "Gertaeraren kokalekua", +"Description" => "Deskribapena", +"Description of the Event" => "Gertaeraren deskribapena", +"Import Ical File" => "inportatu ical fitxategia", +"How to import the new calendar?" => "Nola inportatu egutegi berria?", +"Import into an existing calendar" => "inportatu existitzen den egutegi batera", +"Import into a new calendar" => "inportatu egutegi berri batera", +"Please choose the calendar" => "Mesedez aukeratu egutegia", +"Import" => "Importatu", +"Back" => "Atzera", +"Please fill out the form" => "Mesedez inprimakia bete", +"Create a new event" => "Sortu gertaera berria", +"Timezone" => "Ordu-zona", +"Timeformat" => "Ordu formatua", +"24h" => "24h", +"12h" => "12h", +"Calendar CalDAV syncing address:" => "Egutegiaren CalDAV sinkronizazio helbidea" +); diff --git a/apps/calendar/l10n/he.php b/apps/calendar/l10n/he.php new file mode 100644 index 00000000000..a399a9ff676 --- /dev/null +++ b/apps/calendar/l10n/he.php @@ -0,0 +1,67 @@ + "×זור זמן השתנה", +"Invalid request" => "בקשה ×œ× ×—×•×§×™×ª", +"Calendar" => "×— שנה", +"Wrong calendar" => "לוח שנה ×œ× × ×›×•×Ÿ", +"Birthday" => "×™×•× ×”×•×œ×“×ª", +"Business" => "עסקי×", +"Call" => "שיחה", +"Clients" => "לקוחות", +"Deliverer" => "משלוח", +"Holidays" => "×—×’×™×", +"Ideas" => "רעיונות", +"Journey" => "מסע", +"Jubilee" => "יובל", +"Meeting" => "פגישה", +"Other" => "×חר", +"Personal" => "×ישי", +"Projects" => "פרוייקטי×", +"Questions" => "ש×לות", +"Work" => "עבודה", +"Does not repeat" => "×œ×œ× ×—×–×¨×”", +"Daily" => "יומי", +"Weekly" => "שבועי", +"Every Weekday" => "כל ×™×•× ×¢×‘×•×“×”", +"Bi-Weekly" => "דו שבועי", +"Monthly" => "חודשי", +"Yearly" => "שנתי", +"Not an array" => "×œ× ×ž×¢×¨×š", +"All day" => "היו×", +"Title" => "כותרת", +"Week" => "שבוע", +"Month" => "חודש", +"List" => "רשימה", +"Today" => "היו×", +"Calendars" => "לוחות שנה", +"There was a fail, while parsing the file." => "×ירעה שגי××” בעת פענוח הקובץ.", +"Choose active calendars" => "בחר לוחות שנה פעילי×", +"New Calendar" => "לוח שנה חדש", +"CalDav Link" => "קישור CalDav", +"Download" => "הורדה", +"Edit" => "עריכה", +"Delete" => "מחיקה", +"New calendar" => "לוח שנה חדש", +"Edit calendar" => "עריכת לוח שנה", +"Displayname" => "×©× ×ª×¦×•×’×”", +"Active" => "פעיל", +"Calendar color" => "צבע לוח שנה", +"Save" => "שמירה", +"Submit" => "שליחה", +"Cancel" => "ביטול", +"Edit an event" => "עריכת ×ירוע", +"Export" => "יצו×", +"Title of the Event" => "כותרת ×”×ירוע", +"Category" => "קטגוריה", +"Select category" => "בחר קטגוריה", +"All Day Event" => "×ירוע של כל היו×", +"From" => "מ×ת", +"To" => "עבור", +"Repeat" => "חזרה", +"Location" => "מיקו×", +"Location of the Event" => "×ž×™×§×•× ×”×ירוע", +"Description" => "תי×ור", +"Description of the Event" => "תי×ור ×”×ירוע", +"Import" => "יבו×", +"Create a new event" => "יצירת ×ירוע חדש", +"Timezone" => "×זור זמן" +); diff --git a/apps/calendar/l10n/hr.php b/apps/calendar/l10n/hr.php new file mode 100644 index 00000000000..7cdda27770a --- /dev/null +++ b/apps/calendar/l10n/hr.php @@ -0,0 +1,86 @@ + "Vremenska zona promijenjena", +"Invalid request" => "Neispravan zahtjev", +"Calendar" => "Kalendar", +"Wrong calendar" => "PogreÅ¡an kalendar", +"Birthday" => "RoÄ‘endan", +"Business" => "Poslovno", +"Call" => "Poziv", +"Clients" => "Klijenti", +"Deliverer" => "DostavljaÄ", +"Holidays" => "Odmori", +"Ideas" => "Ideje", +"Journey" => "Putovanje", +"Jubilee" => "Obljetnica", +"Meeting" => "Sastanak", +"Other" => "Ostalo", +"Personal" => "Osobno", +"Projects" => "Projekti", +"Questions" => "Pitanja", +"Work" => "Posao", +"Does not repeat" => "Ne ponavlja se", +"Daily" => "Dnevno", +"Weekly" => "Tjedno", +"Every Weekday" => "Svakog radnog dana", +"Bi-Weekly" => "Dvotjedno", +"Monthly" => "MjeseÄno", +"Yearly" => "GodiÅ¡nje", +"Not an array" => "Nije niz", +"All day" => "Cijeli dan", +"Missing fields" => "Nedostaju polja", +"Title" => "Naslov", +"From Date" => "Datum Od", +"From Time" => "Vrijeme Od", +"To Date" => "Datum Do", +"To Time" => "Vrijeme Do", +"The event ends before it starts" => "DogaÄ‘aj zavrÅ¡ava prije nego poÄinje", +"There was a database fail" => "PogreÅ¡ka u bazi podataka", +"Week" => "Tjedan", +"Month" => "Mjesec", +"List" => "Lista", +"Today" => "Danas", +"Calendars" => "Kalendari", +"There was a fail, while parsing the file." => "PogreÅ¡ka pri Äitanju datoteke.", +"Choose active calendars" => "Odaberite aktive kalendare", +"New Calendar" => "Novi Kalendar", +"CalDav Link" => "CalDav Poveznica", +"Download" => "Spremi lokalno", +"Edit" => "Uredi", +"Delete" => "BriÅ¡i", +"New calendar" => "Novi kalendar", +"Edit calendar" => "Uredi kalendar", +"Displayname" => "Naziv", +"Active" => "Aktivan", +"Calendar color" => "Boja kalendara", +"Save" => "Spremi", +"Submit" => "Potvrdi", +"Cancel" => "Odustani", +"Edit an event" => "Uredi dogaÄ‘aj", +"Export" => "Izvoz", +"Title of the Event" => "Naslov DogaÄ‘aja", +"Category" => "Kategorija", +"Select category" => "Odabir kategorije", +"All Day Event" => "Cjelodnevni dogaÄ‘aj", +"From" => "Od", +"To" => "Za", +"Advanced options" => "Napredne mogućnosti", +"Repeat" => "Ponavljanje", +"Location" => "Lokacija", +"Location of the Event" => "Lokacija DogaÄ‘aja", +"Description" => "Opis", +"Description of the Event" => "Opis dogaÄ‘aja", +"Import Ical File" => "Uvoz Ical datoteke", +"How to import the new calendar?" => "Kako uvesti novi kalendar?", +"Import into an existing calendar" => "Uvoz u postojeći kalendar", +"Import into a new calendar" => "Uvoz u novi kalendar", +"Please choose the calendar" => "Odaberite kalendar", +"Import" => "Uvoz", +"Back" => "Natrag", +"Please fill out the form" => "Molimo popunite obrazac", +"Create a new event" => "Unesi novi dogaÄ‘aj", +"Timezone" => "Vremenska zona", +"Timeformat" => "Format vremena", +"24h" => "24h", +"12h" => "12h", +"Calendar CalDAV syncing address:" => "Adresa za CalDAV sinkronizaciju kalendara" +); diff --git a/apps/calendar/l10n/hu_HU.php b/apps/calendar/l10n/hu_HU.php new file mode 100644 index 00000000000..0e61307794f --- /dev/null +++ b/apps/calendar/l10n/hu_HU.php @@ -0,0 +1,84 @@ + "IdÅ‘zóna megváltozott", +"Invalid request" => "Érvénytelen kérés", +"Calendar" => "Naptár", +"Wrong calendar" => "Hibás naptár", +"Birthday" => "Születésap", +"Business" => "Ãœzlet", +"Call" => "Hívás", +"Clients" => "Kliensek", +"Deliverer" => "Szállító", +"Holidays" => "Ãœnnepek", +"Ideas" => "Ötletek", +"Journey" => "Utazás", +"Jubilee" => "Évforduló", +"Meeting" => "Találkozó", +"Other" => "Egyéb", +"Personal" => "Személyes", +"Projects" => "Projektek", +"Questions" => "Kérdések", +"Work" => "Munka", +"Does not repeat" => "Nem ismétlÅ‘dik", +"Daily" => "Napi", +"Weekly" => "Heti", +"Every Weekday" => "Minden hétköznap", +"Bi-Weekly" => "Kéthetente", +"Monthly" => "Havi", +"Yearly" => "Évi", +"Not an array" => "Nem egy tömb", +"All day" => "Egész nap", +"Missing fields" => "Hiányzó mezÅ‘k", +"Title" => "Cím", +"From Date" => "Napjától", +"From Time" => "IdÅ‘tÅ‘l", +"To Date" => "Napig", +"To Time" => "Ideig", +"The event ends before it starts" => "Az esemény véget ér a kezdés elÅ‘tt.", +"There was a database fail" => "Adatbázis hiba történt", +"Week" => "Hét", +"Month" => "Hónap", +"List" => "Lista", +"Today" => "Ma", +"Calendars" => "Naptárak", +"There was a fail, while parsing the file." => "Probléma volt a fájl elemzése közben.", +"Choose active calendars" => "Aktív naptár kiválasztása", +"New Calendar" => "Új naptár", +"CalDav Link" => "CalDAV link", +"Download" => "Letöltés", +"Edit" => "Szerkesztés", +"Delete" => "Törlés", +"New calendar" => "Új naptár", +"Edit calendar" => "Naptár szerkesztése", +"Displayname" => "Megjelenítési név", +"Active" => "Aktív", +"Calendar color" => "Naptár szín", +"Save" => "Mentés", +"Submit" => "Beküldés", +"Cancel" => "Mégse", +"Edit an event" => "Esemény szerkesztése", +"Export" => "Export", +"Title of the Event" => "Az esemény címe", +"Category" => "Kategória", +"Select category" => "Kategória kiválasztása", +"All Day Event" => "Egész napos esemény", +"Advanced options" => "Haladó beállítások", +"Repeat" => "Ismétlés", +"Location" => "Hely", +"Location of the Event" => "Az esemény helyszíne", +"Description" => "Leírás", +"Description of the Event" => "Az esemény leírása", +"Import Ical File" => "Ical fájl importálása", +"How to import the new calendar?" => "Hogyan legyen importálva az új naptár?", +"Import into an existing calendar" => "LétezÅ‘ naptárba importálás", +"Import into a new calendar" => "Új naptárba importálás", +"Please choose the calendar" => "Válassz naptárat", +"Import" => "Importálás", +"Back" => "Vissza", +"Please fill out the form" => "Töltsd ki az űrlapot", +"Create a new event" => "Új esemény létrehozása", +"Timezone" => "IdÅ‘zóna", +"Timeformat" => "IdÅ‘formátum", +"24h" => "24h", +"12h" => "12h", +"Calendar CalDAV syncing address:" => "Naptár CalDAV szinkronizálási cím:" +); diff --git a/apps/calendar/l10n/hy.php b/apps/calendar/l10n/hy.php new file mode 100644 index 00000000000..3b675693b0f --- /dev/null +++ b/apps/calendar/l10n/hy.php @@ -0,0 +1,11 @@ + "Õ•Ö€Õ¡ÖÕ¸Ö‚ÕµÖ", +"Other" => "Ô±ÕµÕ¬", +"Month" => "Ô±Õ´Õ«Õ½", +"Today" => "Ô±ÕµÕ½Ö…Ö€", +"Download" => "Ô²Õ¥Õ¼Õ¶Õ¥Õ¬", +"Delete" => "Õ‹Õ¶Õ»Õ¥Õ¬", +"Save" => "ÕŠÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬", +"Submit" => "Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬", +"Description" => "Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" +); diff --git a/apps/calendar/l10n/ia.php b/apps/calendar/l10n/ia.php new file mode 100644 index 00000000000..547c96e5a07 --- /dev/null +++ b/apps/calendar/l10n/ia.php @@ -0,0 +1,27 @@ + "Calendario", +"Projects" => "Projectos", +"Work" => "Travalio", +"All day" => "Omne die", +"Title" => "Titulo", +"Week" => "Septimana", +"Month" => "Mense", +"List" => "Lista", +"Today" => "Hodie", +"Calendars" => "Calendarios", +"Choose active calendars" => "Selectionar calendarios active", +"New Calendar" => "Nove calendario", +"Download" => "Discarga", +"Edit" => "Modificar", +"Delete" => "Deler", +"Edit calendar" => "Modificar calendario", +"Active" => "Active", +"Calendar color" => "Color de calendario", +"Save" => "Salveguardar", +"Submit" => "Inviar", +"Cancel" => "Cancellar", +"Select category" => "Selectionar categoria", +"From" => "Ab", +"To" => "A", +"Description" => "Description" +); diff --git a/apps/calendar/l10n/ja_JP.php b/apps/calendar/l10n/ja_JP.php new file mode 100644 index 00000000000..90653c1d6f2 --- /dev/null +++ b/apps/calendar/l10n/ja_JP.php @@ -0,0 +1,86 @@ + "タイムゾーンãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ", +"Invalid request" => "無効ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã™", +"Calendar" => "カレンダー", +"Wrong calendar" => "誤ã£ãŸã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã§ã™", +"Birthday" => "誕生日", +"Business" => "ビジãƒã‚¹", +"Call" => "電話をã‹ã‘ã‚‹", +"Clients" => "顧客", +"Deliverer" => "é‹é€ä¼šç¤¾", +"Holidays" => "休日", +"Ideas" => "アイデア", +"Journey" => "æ—…è¡Œ", +"Jubilee" => "記念祭", +"Meeting" => "ミーティング", +"Other" => "ãã®ä»–", +"Personal" => "個人", +"Projects" => "プロジェクト", +"Questions" => "質å•äº‹é …", +"Work" => "仕事", +"Does not repeat" => "ç¹°ã‚Šè¿”ã•ãªã„", +"Daily" => "毎日", +"Weekly" => "毎週", +"Every Weekday" => "毎平日", +"Bi-Weekly" => "2週間ã”ã¨", +"Monthly" => "毎月", +"Yearly" => "毎年", +"Not an array" => "é…列ã§ã¯ã‚ã‚Šã¾ã›ã‚“", +"All day" => "終日", +"Missing fields" => "é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“", +"Title" => "タイトル", +"From Date" => "開始日", +"From Time" => "開始時間", +"To Date" => "終了日", +"To Time" => "終了時間", +"The event ends before it starts" => "イベント終了時間ãŒé–‹å§‹æ™‚間より先ã§ã™", +"There was a database fail" => "データベースフェイルãŒã‚ã‚Šã¾ã—ãŸ", +"Week" => "週", +"Month" => "月", +"List" => "リスト", +"Today" => "今日", +"Calendars" => "カレンダー", +"There was a fail, while parsing the file." => "ファイルを構文解æžã™ã‚‹éš›ã«å¤±æ•—ã—ã¾ã—ãŸ", +"Choose active calendars" => "アクティブãªã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„", +"New Calendar" => "æ–°ã—ãカレンダーを作æˆã™ã‚‹", +"CalDav Link" => "CalDavã¸ã®ãƒªãƒ³ã‚¯", +"Download" => "ダウンロード", +"Edit" => "編集", +"Delete" => "削除", +"New calendar" => "æ–°ã—ãカレンダーを作æˆã™ã‚‹", +"Edit calendar" => "カレンダーを編集", +"Displayname" => "表示å", +"Active" => "アクティブ", +"Calendar color" => "カレンダーã®è‰²", +"Save" => "ä¿å­˜", +"Submit" => "完了", +"Cancel" => "キャンセル", +"Edit an event" => "イベントを編集", +"Export" => "エクスãƒãƒ¼ãƒˆ", +"Title of the Event" => "イベントã®ã‚¿ã‚¤ãƒˆãƒ«", +"Category" => "カテゴリー", +"Select category" => "カテゴリーをé¸æŠžã—ã¦ãã ã•ã„", +"All Day Event" => "終日イベント", +"From" => "開始", +"To" => "終了", +"Advanced options" => "詳細設定", +"Repeat" => "ç¹°ã‚Šè¿”ã™", +"Location" => "場所", +"Location of the Event" => "イベントã®å ´æ‰€", +"Description" => "メモ", +"Description of the Event" => "イベントã®ãƒ¡ãƒ¢", +"Import Ical File" => "iCalファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ", +"How to import the new calendar?" => "æ–°ã—ã„カレンダーã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ–¹æ³•ã¯ï¼Ÿ", +"Import into an existing calendar" => "既存カレンダーã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™", +"Import into a new calendar" => "æ–°ã—ã„カレンダーã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™", +"Please choose the calendar" => "カレンダーをé¸æŠžã—ã¦ãã ã•ã„", +"Import" => "インãƒãƒ¼ãƒˆ", +"Back" => "戻る", +"Please fill out the form" => "フォームã«å…¥åŠ›ã—ã¦ãã ã•ã„", +"Create a new event" => "æ–°ã—ã„イベントを作æˆã™ã‚‹", +"Timezone" => "タイムゾーン", +"Timeformat" => "時刻ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ", +"24h" => "24時間制", +"12h" => "12時間制", +"Calendar CalDAV syncing address:" => "カレンダーã®CalDAVシンクアドレス" +); diff --git a/apps/calendar/l10n/lt_LT.php b/apps/calendar/l10n/lt_LT.php new file mode 100644 index 00000000000..6baff16abfe --- /dev/null +++ b/apps/calendar/l10n/lt_LT.php @@ -0,0 +1,77 @@ + "Laiko zona pakeista", +"Invalid request" => "Klaidinga užklausa", +"Calendar" => "Kalendorius", +"Wrong calendar" => "Ne tas kalendorius", +"Birthday" => "Gimtadienis", +"Business" => "Verslas", +"Call" => "SkambuÄiai", +"Clients" => "Klientai", +"Holidays" => "IÅ¡eiginÄ—s", +"Ideas" => "IdÄ—jos", +"Journey" => "KelionÄ—", +"Jubilee" => "Jubiliejus", +"Meeting" => "Susitikimas", +"Does not repeat" => "Nekartoti", +"Daily" => "Kasdien", +"Weekly" => "KiekvienÄ… savaitÄ™", +"Every Weekday" => "KiekvienÄ… savaitÄ—s dienÄ…", +"Bi-Weekly" => "Kas dvi savaites", +"Monthly" => "KiekvienÄ… mÄ—nesį", +"Yearly" => "Kiekvienais metais", +"Not an array" => "Ne masyvas", +"All day" => "Visa diena", +"Missing fields" => "TrÅ«kstami laukai", +"Title" => "Pavadinimas", +"To Date" => "Iki datos", +"To Time" => "Iki laiko", +"The event ends before it starts" => "Ä®vykis baigiasi anksÄiau nei jis prasideda", +"There was a database fail" => "Ä®vyko duomenų bazÄ—s klaida", +"Week" => "SavaitÄ—", +"Month" => "MÄ—nuo", +"List" => "SÄ…raÅ¡as", +"Today" => "Å iandien", +"Calendars" => "Kalendoriai", +"There was a fail, while parsing the file." => "Apdorojant failÄ… įvyko klaida.", +"Choose active calendars" => "Pasirinkite naudojamus kalendorius", +"New Calendar" => "Naujas kalendorius", +"CalDav Link" => "CalDav adresas", +"Download" => "Atsisiųsti", +"Edit" => "Keisti", +"Delete" => "Trinti", +"New calendar" => "Naujas kalendorius", +"Edit calendar" => "Taisyti kalendorių", +"Displayname" => "Pavadinimas", +"Active" => "Naudojamas", +"Save" => "IÅ¡saugoti", +"Submit" => "IÅ¡saugoti", +"Cancel" => "AtÅ¡aukti", +"Edit an event" => "Taisyti įvykį", +"Export" => "Eksportuoti", +"Title of the Event" => "Ä®vykio pavadinimas", +"Category" => "Kategorija", +"Select category" => "Pasirinkite kategorijÄ…", +"All Day Event" => "Visos dienos įvykis", +"From" => "Nuo", +"To" => "Iki", +"Advanced options" => "Papildomi nustatymai", +"Repeat" => "Kartoti", +"Location" => "Vieta", +"Location of the Event" => "Ä®vykio vieta", +"Description" => "ApraÅ¡ymas", +"Description of the Event" => "Ä®vykio apraÅ¡ymas", +"Import Ical File" => "Importuoti Ical failÄ…", +"How to import the new calendar?" => "Kaip importuoti naujÄ… kalendorių?", +"Import into an existing calendar" => "Importuoti į esantį katalogÄ…", +"Import into a new calendar" => "Importuoti į naujÄ… kalendorių", +"Please choose the calendar" => "Pasirinkite kalendorių", +"Import" => "Importuoti", +"Back" => "Atgal", +"Please fill out the form" => "Užpildykite formÄ…", +"Create a new event" => "Sukurti naujÄ… įvykį", +"Timezone" => "Laiko juosta", +"Timeformat" => "Laiko formatas", +"24h" => "24val", +"12h" => "12val", +"Calendar CalDAV syncing address:" => "CalDAV kalendoriaus synchronizavimo adresas:" +); diff --git a/apps/calendar/l10n/nl.php b/apps/calendar/l10n/nl.php index 3f7ebfe274e..03211b6cba9 100644 --- a/apps/calendar/l10n/nl.php +++ b/apps/calendar/l10n/nl.php @@ -2,7 +2,7 @@ "Authentication error" => "Foute aanvraag", "Timezone changed" => "U kunt maar een venster tegelijk openen.", "Invalid request" => "Ongeldige aanvraag", -"Calendar" => "Weergavenaam", +"Calendar" => "Kalender", "Does not repeat" => "Wordt niet herhaald", "Daily" => "Dagelijks", "Weekly" => "Wekelijks", diff --git a/apps/calendar/l10n/nn_NO.php b/apps/calendar/l10n/nn_NO.php new file mode 100644 index 00000000000..be1c7a02940 --- /dev/null +++ b/apps/calendar/l10n/nn_NO.php @@ -0,0 +1,65 @@ + "Endra tidssone", +"Invalid request" => "Ugyldig førespurnad", +"Calendar" => "Kalender", +"Wrong calendar" => "Feil kalender", +"Birthday" => "Bursdag", +"Business" => "Forretning", +"Call" => "Telefonsamtale", +"Clients" => "Klientar", +"Deliverer" => "Forsending", +"Holidays" => "Høgtid", +"Ideas" => "Idear", +"Journey" => "Reise", +"Jubilee" => "Jubileum", +"Meeting" => "Møte", +"Other" => "Anna", +"Personal" => "Personleg", +"Projects" => "Prosjekt", +"Questions" => "SpørsmÃ¥l", +"Work" => "Arbeid", +"Does not repeat" => "Ikkje gjenta", +"Daily" => "Kvar dag", +"Weekly" => "Kvar veke", +"Every Weekday" => "Kvar vekedag", +"Bi-Weekly" => "Annakvar veke", +"Monthly" => "Kvar mÃ¥nad", +"Yearly" => "Kvart Ã¥r", +"Not an array" => "Ikkje ein matrise", +"All day" => "Heile dagen", +"Title" => "Tittel", +"Week" => "Veke", +"Month" => "MÃ¥nad", +"List" => "Liste", +"Today" => "I dag", +"Calendars" => "Kalendarar", +"There was a fail, while parsing the file." => "Feil ved tolking av fila.", +"Choose active calendars" => "Vel aktive kalendarar", +"New Calendar" => "Ny kalender", +"CalDav Link" => "CalDav-lenkje", +"Download" => "Last ned", +"Edit" => "Endra", +"Delete" => "Slett", +"New calendar" => "Ny kalender", +"Edit calendar" => "Endra kalendarar", +"Displayname" => "Visingsnamn", +"Active" => "Aktiv", +"Calendar color" => "Kalenderfarge", +"Save" => "Lagra", +"Submit" => "Lagra", +"Cancel" => "Avbryt", +"Edit an event" => "Endra ein hending", +"Title of the Event" => "Tittel pÃ¥ hendinga", +"Category" => "Kategori", +"Select category" => "Vel kategori", +"All Day Event" => "Heildagshending", +"From" => "FrÃ¥", +"To" => "Til", +"Repeat" => "Gjenta", +"Location" => "Stad", +"Location of the Event" => "Stad for hendinga", +"Description" => "Skildring", +"Description of the Event" => "Skildring av hendinga", +"Create a new event" => "Opprett ei ny hending", +"Timezone" => "Tidssone" +); diff --git a/apps/calendar/l10n/sk_SK.php b/apps/calendar/l10n/sk_SK.php new file mode 100644 index 00000000000..0268143792c --- /dev/null +++ b/apps/calendar/l10n/sk_SK.php @@ -0,0 +1,86 @@ + "ÄŒasové pásmo zmenené", +"Invalid request" => "Neplatná požiadavka", +"Calendar" => "Kalendár", +"Wrong calendar" => "Zlý kalendár", +"Birthday" => "Narodeniny", +"Business" => "Podnikanie", +"Call" => "Hovor", +"Clients" => "Klienti", +"Deliverer" => "DoruÄovateľ", +"Holidays" => "Prázdniny", +"Ideas" => "Nápady", +"Journey" => "Cesta", +"Jubilee" => "Jubileá", +"Meeting" => "Stretnutia", +"Other" => "Ostatné", +"Personal" => "Osobné", +"Projects" => "Projekty", +"Questions" => "Otázky", +"Work" => "Práca", +"Does not repeat" => "NeopakovaÅ¥", +"Daily" => "Denne", +"Weekly" => "Týždenne", +"Every Weekday" => "Každý výkend", +"Bi-Weekly" => "Každý druhý týždeň", +"Monthly" => "MesaÄne", +"Yearly" => "RoÄne", +"Not an array" => "Nie je pole", +"All day" => "Celý deň", +"Missing fields" => "Nevyplnené položky", +"Title" => "Nadpis", +"From Date" => "Od Dátumu", +"From Time" => "Od ÄŒasu", +"To Date" => "Do Dátumu", +"To Time" => "Do ÄŒasu", +"The event ends before it starts" => "UdalosÅ¥ konÄí eÅ¡te pred tým než zaÄne", +"There was a database fail" => "Nastala chyba databázy", +"Week" => "Týždeň", +"Month" => "Mesiac", +"List" => "Zoznam", +"Today" => "Dnes", +"Calendars" => "Kalendáre", +"There was a fail, while parsing the file." => "Nastala chyba poÄas parsovania súboru.", +"Choose active calendars" => "Zvoľte aktívne kalendáre", +"New Calendar" => "Nový kalendár", +"CalDav Link" => "CalDav odkaz", +"Download" => "StiahnuÅ¥", +"Edit" => "UpraviÅ¥", +"Delete" => "OdstrániÅ¥", +"New calendar" => "Nový kalendár", +"Edit calendar" => "UpraviÅ¥ kalendár", +"Displayname" => "Zobrazené meno", +"Active" => "Aktívne", +"Calendar color" => "Farba kalendáru", +"Save" => "UložiÅ¥", +"Submit" => "OdoslaÅ¥", +"Cancel" => "ZruÅ¡iÅ¥", +"Edit an event" => "UpraviÅ¥ udalosÅ¥", +"Export" => "ExportovaÅ¥", +"Title of the Event" => "Nadpis Udalosti", +"Category" => "Kategória", +"Select category" => "VybraÅ¥ kategóriu", +"All Day Event" => "Celodenná udalosÅ¥", +"From" => "Od", +"To" => "Do", +"Advanced options" => "PokroÄilé možnosti", +"Repeat" => "OpakovaÅ¥", +"Location" => "Poloha", +"Location of the Event" => "Poloha Udalosti", +"Description" => "Popis", +"Description of the Event" => "Popis Udalosti", +"Import Ical File" => "ImportovaÅ¥ Ical súbor", +"How to import the new calendar?" => "Ako importovaÅ¥ nový kalendár?", +"Import into an existing calendar" => "ImportovaÅ¥ do existujúceho kalendára", +"Import into a new calendar" => "ImportovaÅ¥ do nového kalendára", +"Please choose the calendar" => "Prosím zvoľte kalendár", +"Import" => "ImportovaÅ¥", +"Back" => "Späť", +"Please fill out the form" => "Prosím vyplňte formulár", +"Create a new event" => "VytvoriÅ¥ udalosÅ¥", +"Timezone" => "ÄŒasová zóna", +"Timeformat" => "Formát Äasu", +"24h" => "24h", +"12h" => "12h", +"Calendar CalDAV syncing address:" => "SynchronizaÄná adresa kalendára CalDAV: " +); diff --git a/apps/calendar/l10n/sl.php b/apps/calendar/l10n/sl.php new file mode 100644 index 00000000000..4f091ac39d1 --- /dev/null +++ b/apps/calendar/l10n/sl.php @@ -0,0 +1,86 @@ + "ÄŒasovna Cona spremenjena", +"Invalid request" => "Neveljavna zahteva", +"Calendar" => "Kolendar", +"Wrong calendar" => "NapaÄen Kolendar", +"Birthday" => "Rojstni Dan", +"Business" => "Poslovno", +"Call" => "PokliÄi", +"Clients" => "Stranke", +"Deliverer" => "Dobavitelj", +"Holidays" => "Dopust", +"Ideas" => "Ideje", +"Journey" => "Potovanje", +"Jubilee" => "Obletnica", +"Meeting" => "Sestanek", +"Other" => "Ostalo", +"Personal" => "Osebno", +"Projects" => "Projekt", +"Questions" => "VpraÅ¡anja", +"Work" => "Delo", +"Does not repeat" => "Se ne ponavlja", +"Daily" => "Dnevno", +"Weekly" => "Tedensko", +"Every Weekday" => "Vsak dan v tednu", +"Bi-Weekly" => "Dvakrat Tedensko", +"Monthly" => "MeseÄno", +"Yearly" => "Letno", +"Not an array" => "Not an array", +"All day" => "Cel dan", +"Missing fields" => "MankajoÄa polja", +"Title" => "Naslov", +"From Date" => "od Datum", +"From Time" => "od ÄŒas", +"To Date" => "do Datum", +"To Time" => "do ÄŒas", +"The event ends before it starts" => "Dogodek se konÄa preden se zaÄne", +"There was a database fail" => "Napaka v podatkovni bazi. Kontaktirajte Administratorja", +"Week" => "Teden", +"Month" => "Mesec", +"List" => "Seznam", +"Today" => "Danes", +"Calendars" => "Kolendarji", +"There was a fail, while parsing the file." => "Pri razÄlenjevanju datoteke je priÅ¡lo do napake.", +"Choose active calendars" => "Izberi aktivni Kolendar", +"New Calendar" => "Nov Kolendar", +"CalDav Link" => "CalDav Povezava", +"Download" => "Naloži dol", +"Edit" => "Uredi", +"Delete" => "IzbriÅ¡i", +"New calendar" => "Nov Kolendar", +"Edit calendar" => "Uredi Kolendar", +"Displayname" => "Prikazano Ime", +"Active" => "Aktivno", +"Calendar color" => "Barva Kolendarja", +"Save" => "Shrani", +"Submit" => "Potrdi", +"Cancel" => "PrekliÄi", +"Edit an event" => "Uredi Dogodek", +"Export" => "Izvozi", +"Title of the Event" => "Naslov", +"Category" => "Kategorija", +"Select category" => "Izberi Kategorijo", +"All Day Event" => "Celodnevni Dogodek", +"From" => "Od", +"To" => "Za", +"Advanced options" => "Napredne Možnosti", +"Repeat" => "Ponovi", +"Location" => "Lokacija", +"Location of the Event" => "Lokacija dogodka", +"Description" => "Opis", +"Description of the Event" => "Opis Dogodka", +"Import Ical File" => "Uvozi iCal datoteko", +"How to import the new calendar?" => "Koko uvozim nov kolendar?", +"Import into an existing calendar" => "Uvozi v obstojeÄi kolendar", +"Import into a new calendar" => "Uvozi v nov Kolendar", +"Please choose the calendar" => "Izberi kolendar", +"Import" => "Uvozi", +"Back" => "Nazaj", +"Please fill out the form" => "Prosim izpolnite obrazec", +"Create a new event" => "Ustvari nov dogodek", +"Timezone" => "ÄŒasovna Cona", +"Timeformat" => "ÄŒasovni format", +"24h" => "24ur", +"12h" => "12ur", +"Calendar CalDAV syncing address:" => "Kolendarjev CalDAV sinhronizacijski naslov" +); diff --git a/apps/calendar/l10n/tr.php b/apps/calendar/l10n/tr.php new file mode 100644 index 00000000000..64264c5a8ba --- /dev/null +++ b/apps/calendar/l10n/tr.php @@ -0,0 +1,86 @@ + "Zaman dilimi deÄŸiÅŸtirildi", +"Invalid request" => "Geçersiz istek", +"Calendar" => "Takvim", +"Wrong calendar" => "Yanlış takvim", +"Birthday" => "DoÄŸum günü", +"Business" => "Ä°ÅŸ", +"Call" => "Arama", +"Clients" => "Müşteriler", +"Deliverer" => "Teslimatçı", +"Holidays" => "Tatil günleri", +"Ideas" => "Fikirler", +"Journey" => "Seyahat", +"Jubilee" => "Yıl dönümü", +"Meeting" => "Toplantı", +"Other" => "DiÄŸer", +"Personal" => "KiÅŸisel", +"Projects" => "Projeler", +"Questions" => "Sorular", +"Work" => "Ä°ÅŸ", +"Does not repeat" => "Tekrar etmiyor", +"Daily" => "Günlük", +"Weekly" => "Haftalı", +"Every Weekday" => "Haftaiçi Her gün", +"Bi-Weekly" => "Ä°ki haftada bir", +"Monthly" => "Aylık", +"Yearly" => "Yıllı", +"Not an array" => "Bir dizi deÄŸil", +"All day" => "Tüm gün", +"Missing fields" => "Eksik alanlar", +"Title" => "BaÅŸlık", +"From Date" => "Bu Tarihten", +"From Time" => "Bu Saatten", +"To Date" => "Bu Tarihe", +"To Time" => "Bu Saate", +"The event ends before it starts" => "Olay baÅŸlamadan önce bitiyor", +"There was a database fail" => "Bir veritabanı baÅŸarısızlığı oluÅŸtu", +"Week" => "Hafta", +"Month" => "Ay", +"List" => "Liste", +"Today" => "Bugün", +"Calendars" => "Takvimler", +"There was a fail, while parsing the file." => "Dosya okunurken baÅŸarısızlık oldu.", +"Choose active calendars" => "Aktif takvimleri seçin", +"New Calendar" => "Yeni Takvim", +"CalDav Link" => "CalDav BaÄŸlantısı", +"Download" => "Ä°ndir", +"Edit" => "Düzenle", +"Delete" => "Sil", +"New calendar" => "Yeni takvim", +"Edit calendar" => "Takvimi düzenle", +"Displayname" => "Görünümadı", +"Active" => "Aktif", +"Calendar color" => "Takvim rengi", +"Save" => "Kaydet", +"Submit" => "Gönder", +"Cancel" => "Ä°ptal", +"Edit an event" => "Bir olay düzenle", +"Export" => "Dışa aktar", +"Title of the Event" => "Olayın BaÅŸlığı", +"Category" => "Kategori", +"Select category" => "Kategori seçin", +"All Day Event" => "Tüm Gün Olay", +"From" => "Kimden", +"To" => "Kime", +"Advanced options" => "GeliÅŸmiÅŸ opsiyonlar", +"Repeat" => "Tekrar", +"Location" => "Konum", +"Location of the Event" => "Olayın Konumu", +"Description" => "Açıklama", +"Description of the Event" => "Olayın Açıklaması", +"Import Ical File" => "Ical Dosyası Al", +"How to import the new calendar?" => "Yeni takvim nasıl alınsın?", +"Import into an existing calendar" => "Mevcut bir takvimin içine al", +"Import into a new calendar" => "Yeni bir takvim içine al", +"Please choose the calendar" => "Lütfen takvimi seçin", +"Import" => "İçe Al", +"Back" => "Geri", +"Please fill out the form" => "Lütfen formu doldurun", +"Create a new event" => "Yeni olay oluÅŸtur", +"Timezone" => "Zaman dilimi", +"Timeformat" => "Saat biçimi", +"24h" => "24s", +"12h" => "12s", +"Calendar CalDAV syncing address:" => "CalDAV Takvim senkron adresi:" +); diff --git a/apps/contacts/l10n/ar.php b/apps/contacts/l10n/ar.php new file mode 100644 index 00000000000..662c657797b --- /dev/null +++ b/apps/contacts/l10n/ar.php @@ -0,0 +1,36 @@ + "هذا ليس دÙتر عناوينك.", +"Contact could not be found." => "لم يتم العثور على الشخص.", +"vCard could not be read." => "لم يتم قراءة ال vCard بنجاح.", +"Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة ÙÙŠ ال vCard غير صحيحة. الرجاء إعادة تحديث الصÙحة.", +"Address" => "عنوان", +"Telephone" => "الهاتÙ", +"Email" => "البريد الالكتروني", +"Organization" => "المؤسسة", +"Work" => "الوظيÙØ©", +"Home" => "البيت", +"Mobile" => "الهات٠المحمول", +"Text" => "معلومات إضاÙية", +"Voice" => "صوت", +"Fax" => "الÙاكس", +"Video" => "الÙيديو", +"Pager" => "الرنان", +"This is not your contact." => ".هذا ليس من معارÙÙŠ", +"This card is not RFC compatible." => "هذا الكرت ليس متلائم مع نظام ال RFC.", +"This card does not contain a photo." => "لا يحتوي هذا الكرت على صورة.", +"Add Contact" => "أض٠شخص ", +"Group" => "مجموعة", +"Name" => "الاسم", +"PO Box" => "العنوان البريدي", +"Extended" => "إضاÙØ©", +"Street" => "شارع", +"City" => "المدينة", +"Region" => "المنطقة", +"Zipcode" => "رقم المنطقة", +"Country" => "البلد", +"Create Contact" => "أض٠شخص ", +"Edit" => "تعديل", +"Delete" => "حذÙ", +"Birthday" => "تاريخ الميلاد", +"Phone" => "الهاتÙ" +); diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php new file mode 100644 index 00000000000..4b917ef21f6 --- /dev/null +++ b/apps/contacts/l10n/ca.php @@ -0,0 +1,36 @@ + "Aquesta no és la vostra llibreta d'adreces", +"Contact could not be found." => "No s'ha trobat el contacte.", +"vCard could not be read." => "No s'ha pogut llegir la vCard", +"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.", +"Address" => "Adreça", +"Telephone" => "Telèfon", +"Email" => "Correu electrònic", +"Organization" => "Organització", +"Work" => "Feina", +"Home" => "Casa", +"Mobile" => "Mòbil", +"Text" => "Text", +"Voice" => "Veu", +"Fax" => "Fax", +"Video" => "Vídeo", +"Pager" => "Paginador", +"This is not your contact." => "Aquest contacte no és vostre.", +"This card is not RFC compatible." => "Aquesta targeta no és compatible amb RFC.", +"This card does not contain a photo." => "Aquesta targeta no conté foto.", +"Add Contact" => "Afegeix un contacte", +"Group" => "Grup", +"Name" => "Nom", +"PO Box" => "Adreça Postal", +"Extended" => "Addicional", +"Street" => "Carrer", +"City" => "Ciutat", +"Region" => "Comarca", +"Zipcode" => "Codi postal", +"Country" => "País", +"Create Contact" => "Crea un contacte", +"Edit" => "Edita", +"Delete" => "Elimina", +"Birthday" => "Aniversari", +"Phone" => "Telèfon" +); diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php new file mode 100644 index 00000000000..7cdf8e427b7 --- /dev/null +++ b/apps/contacts/l10n/cs_CZ.php @@ -0,0 +1,36 @@ + "Toto není Váš adresář.", +"Contact could not be found." => "Kontakt nebyl nalezen.", +"vCard could not be read." => "vCard nelze pÅ™eÄíst.", +"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", +"Address" => "Adresa", +"Telephone" => "Telefon", +"Email" => "Email", +"Organization" => "Organizace", +"Work" => "Pracovní", +"Home" => "Domácí", +"Mobile" => "Mobil", +"Text" => "Text", +"Voice" => "Hlas", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Toto není Váš kontakt.", +"This card is not RFC compatible." => "Tato karta není kompatibilní s RFC.", +"This card does not contain a photo." => "Tato karta neobsahuje foto", +"Add Contact" => "PÅ™idat kontakt", +"Group" => "Skupina", +"Name" => "Jméno", +"PO Box" => "PO box", +"Extended" => "Rozšířené", +"Street" => "Ulice", +"City" => "MÄ›sto", +"Region" => "Kraj", +"Zipcode" => "PSÄŒ", +"Country" => "ZemÄ›", +"Create Contact" => "VytvoÅ™it kontakt", +"Edit" => "Editovat", +"Delete" => "Odstranit", +"Birthday" => "Narozeniny", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/da.php b/apps/contacts/l10n/da.php index 2ab382f714a..f4defa28f20 100644 --- a/apps/contacts/l10n/da.php +++ b/apps/contacts/l10n/da.php @@ -1,22 +1,26 @@ "Du skal logge ind.", "This is not your addressbook." => "Dette er ikke din adressebog.", -"Contact could not be found." => "Kontakt kunne ikke findes.", -"This is not your contact." => "Dette er ikke din kontakt.", +"Contact could not be found." => "Kontaktperson kunne ikke findes.", "vCard could not be read." => "Kunne ikke læse vCard.", "Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.", -"This card is not RFC compatible." => "Dette kort er ikke RFC-kompatibelt.", -"This card does not contain a photo." => "Dette kort indeholder ikke et foto.", -"Add Contact" => "Tilføj kontakt", -"Group" => "Gruppe", -"Name" => "Navn", -"Create Contact" => "Ny Kontakt", "Address" => "Adresse", "Telephone" => "Telefon", "Email" => "Email", "Organization" => "Organisation", "Work" => "Arbejde", -"Home" => "Hjem", +"Home" => "Hjemme", +"Mobile" => "Mobil", +"Text" => "SMS", +"Voice" => "Telefonsvarer", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Personsøger", +"This is not your contact." => "Dette er ikke din kontaktperson.", +"This card is not RFC compatible." => "Dette kort er ikke RFC-kompatibelt.", +"This card does not contain a photo." => "Dette kort indeholder ikke et foto.", +"Add Contact" => "Tilføj kontaktperson", +"Group" => "Gruppe", +"Name" => "Navn", "PO Box" => "Postboks", "Extended" => "Udvidet", "Street" => "Vej", @@ -24,15 +28,9 @@ "Region" => "Region", "Zipcode" => "Postnummer", "Country" => "Land", -"Mobile" => "Mobil", -"Text" => "SMS", -"Voice" => "Telefonsvarer", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Personsøger", +"Create Contact" => "Ny kontaktperson", +"Edit" => "Rediger", "Delete" => "Slet", -"Add Property" => "Tilføj Egenskab", "Birthday" => "Fødselsdag", -"Phone" => "Telefon", -"Edit" => "Redigér" +"Phone" => "Telefon" ); diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php index 04a7402442a..f98cabcb5ed 100644 --- a/apps/contacts/l10n/de.php +++ b/apps/contacts/l10n/de.php @@ -1,9 +1,36 @@ "Dies ist nicht dein Adressbuch.", +"Contact could not be found." => "Kontakt konnte nicht gefunden werden.", +"vCard could not be read." => "vCard konnte nicht gelesen werden.", +"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.", +"Address" => "Adresse", +"Telephone" => "Telefon", +"Email" => "Email", +"Organization" => "Organisation", +"Work" => "Arbeit", +"Home" => "Zuhause", "Mobile" => "Mobil", "Text" => "Text", +"Voice" => "Anruf", "Fax" => "Fax", "Video" => "Video", "Pager" => "Pager", +"This is not your contact." => "Dies ist nicht dein Kontakt.", +"This card is not RFC compatible." => "Diese Karte ist nicht RFC-kompatibel.", +"This card does not contain a photo." => "Diese Karte enthält kein Foto.", +"Add Contact" => "Kontakt hinzufügen", +"Group" => "Gruppe", +"Name" => "Name", +"PO Box" => "Postfach", +"Extended" => "Erweitert", +"Street" => "Straße", +"City" => "Stadt", +"Region" => "Region", +"Zipcode" => "Postleitzahl", +"Country" => "Land", +"Create Contact" => "Kontakt erstellen", +"Edit" => "Bearbeiten", +"Delete" => "Löschen", "Birthday" => "Geburtstag", -"Edit" => "Bearbeiten" +"Phone" => "Telefon" ); diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php new file mode 100644 index 00000000000..3a0b24eae8e --- /dev/null +++ b/apps/contacts/l10n/el.php @@ -0,0 +1,36 @@ + "Αυτό δεν είναι βιβλίο διευθÏνσεων σας.", +"Contact could not be found." => "Η επαφή δεν μπÏÏŒÏεσε να βÏεθεί.", +"vCard could not be read." => "Η vCard δεν μποÏεί να διαβαστεί.", +"Information about vCard is incorrect. Please reload the page." => "Οι πληÏοφοÏίες σχετικά με vCard είναι εσφαλμένες. ΠαÏακαλώ επαναφοÏτώστε τη σελίδα.", +"Address" => "ΔιεÏθυνση", +"Telephone" => "Τηλέφωνο", +"Email" => "Email", +"Organization" => "ΟÏγανισμός", +"Work" => "ΕÏγασία", +"Home" => "Σπίτι", +"Mobile" => "Κινητό", +"Text" => "Κείμενο", +"Voice" => "Φωνή", +"Fax" => "Φαξ", +"Video" => "Βίντεο", +"Pager" => "Βομβητής", +"This is not your contact." => "Αυτή δεν είναι επαφή σας.", +"This card is not RFC compatible." => "Αυτή η κάÏτα δεν είναι RFC συμβατή.", +"This card does not contain a photo." => "Αυτή η κάÏτα δεν πεÏιέχει φωτογÏαφία.", +"Add Contact" => "ΠÏοσθήκη επαφής", +"Group" => "Ομάδα", +"Name" => "Όνομα", +"PO Box" => "Ταχ. ΘυÏίδα", +"Extended" => "Εκτεταμένη", +"Street" => "Οδός", +"City" => "Πόλη", +"Region" => "ΠεÏιοχή", +"Zipcode" => "Τ.Κ.", +"Country" => "ΧώÏα", +"Create Contact" => "ΔημιουÏγία επαφής", +"Edit" => "ΕπεξεÏγασία", +"Delete" => "ΔιαγÏαφή", +"Birthday" => "Γενέθλια", +"Phone" => "Τηλέφωνο" +); diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php new file mode 100644 index 00000000000..1b9fe8c1a14 --- /dev/null +++ b/apps/contacts/l10n/eo.php @@ -0,0 +1,36 @@ + "Ĉi tiu ne estas via adresaro.", +"Contact could not be found." => "Ne eblis trovi la kontakton.", +"vCard could not be read." => "Ne eblis legi vCard-on.", +"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malÄusta. Bonvolu reÅargi la paÄon.", +"Address" => "Adreso", +"Telephone" => "Telefono", +"Email" => "RetpoÅtadreso", +"Organization" => "Organizaĵo", +"Work" => "Laboro", +"Home" => "Hejmo", +"Mobile" => "PoÅtelefono", +"Text" => "Teksto", +"Voice" => "Voĉo", +"Fax" => "Fakso", +"Video" => "Videaĵo", +"Pager" => "Televokilo", +"This is not your contact." => "Tiu ĉi ne estas via kontakto.", +"This card is not RFC compatible." => "Ĉi tiu karto ne kongruas kun RFC.", +"This card does not contain a photo." => "Ĉi tiu karto ne havas foton.", +"Add Contact" => "Aldoni kontakton", +"Group" => "Grupo", +"Name" => "Nomo", +"PO Box" => "Abonkesto", +"Extended" => "Etendita", +"Street" => "Strato", +"City" => "Urbo", +"Region" => "Regiono", +"Zipcode" => "PoÅtokodo", +"Country" => "Lando", +"Create Contact" => "Krei kontakton", +"Edit" => "Redakti", +"Delete" => "Forigi", +"Birthday" => "NaskiÄotago", +"Phone" => "Telefono" +); diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php new file mode 100644 index 00000000000..30dedf89fd6 --- /dev/null +++ b/apps/contacts/l10n/es.php @@ -0,0 +1,36 @@ + "Esta no es tu agenda de contactos.", +"Contact could not be found." => "No se pudo encontrar el contacto.", +"vCard could not be read." => "No se pudo leer el vCard.", +"Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.", +"Address" => "Dirección", +"Telephone" => "Teléfono", +"Email" => "Correo electrónico", +"Organization" => "Organización", +"Work" => "Trabajo", +"Home" => "Particular", +"Mobile" => "Móvil", +"Text" => "Texto", +"Voice" => "Voz", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Localizador", +"This is not your contact." => "Este no es tu contacto.", +"This card is not RFC compatible." => "Esta tarjeta no es compatible con RFC.", +"This card does not contain a photo." => "Esta tarjeta no contiene ninguna foto.", +"Add Contact" => "Agregar contacto", +"Group" => "Grupo", +"Name" => "Nombre", +"PO Box" => "Código postal", +"Extended" => "Extendido", +"Street" => "Calle", +"City" => "Ciudad", +"Region" => "Región", +"Zipcode" => "Código Postal", +"Country" => "País", +"Create Contact" => "Crear contacto", +"Edit" => "Editar", +"Delete" => "Borrar", +"Birthday" => "Cumpleaños", +"Phone" => "Teléfono" +); diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php new file mode 100644 index 00000000000..341a74cf778 --- /dev/null +++ b/apps/contacts/l10n/et_EE.php @@ -0,0 +1,36 @@ + "See pole sinu aadressiraamat.", +"Contact could not be found." => "Kontakti ei leitud.", +"vCard could not be read." => "Visiitkaardi lugemine ebaõnnestus,", +"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.", +"Address" => "Aadress", +"Telephone" => "Telefon", +"Email" => "E-post", +"Organization" => "Organisatsioon", +"Work" => "Töö", +"Home" => "Kodu", +"Mobile" => "Mobiil", +"Text" => "Tekst", +"Voice" => "Hääl", +"Fax" => "Faks", +"Video" => "Video", +"Pager" => "Piipar", +"This is not your contact." => "See pole sinu kontakt.", +"This card is not RFC compatible." => "See kaart ei ühildu RFC-ga.", +"This card does not contain a photo." => "Sellel kaardil pole fotot.", +"Add Contact" => "Lisa kontakt", +"Group" => "Grupp", +"Name" => "Nimi", +"PO Box" => "Postkontori postkast", +"Extended" => "Laiendatud", +"Street" => "Tänav", +"City" => "Linn", +"Region" => "Piirkond", +"Zipcode" => "Postiindeks", +"Country" => "Riik", +"Create Contact" => "Lisa kontakt", +"Edit" => "Muuda", +"Delete" => "Kustuta", +"Birthday" => "Sünnipäev", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php new file mode 100644 index 00000000000..19b7ddb3e43 --- /dev/null +++ b/apps/contacts/l10n/eu.php @@ -0,0 +1,36 @@ + "Hau ez da zure helbide liburua.", +"Contact could not be found." => "Ezin izan da kontaktua aurkitu.", +"vCard could not be read." => "Ezin izan da vCard-a irakurri.", +"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", +"Address" => "Helbidea", +"Telephone" => "Telefonoa", +"Email" => "Eposta", +"Organization" => "Erakundea", +"Work" => "Lana", +"Home" => "Etxea", +"Mobile" => "Mugikorra", +"Text" => "Testua", +"Voice" => "Ahotsa", +"Fax" => "Fax-a", +"Video" => "Bideoa", +"Pager" => "Bilagailua", +"This is not your contact." => "Hau ez da zure kontaktua.", +"This card is not RFC compatible." => "Txartel hau ez da RFC bateragarria.", +"This card does not contain a photo." => "Txartel honek ez dauka argazkirik.", +"Add Contact" => "Gehitu Kontaktua", +"Group" => "Taldea", +"Name" => "Izena", +"PO Box" => "Posta kutxa", +"Extended" => "Hedatua", +"Street" => "Kalea", +"City" => "Hiria", +"Region" => "Eskualdea", +"Zipcode" => "Posta Kodea", +"Country" => "Herrialdea", +"Create Contact" => "Sortu Kontaktua", +"Edit" => "Editatu", +"Delete" => "Ezabatu", +"Birthday" => "Jaioteguna", +"Phone" => "Telefonoa" +); diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php new file mode 100644 index 00000000000..2b9cdc77a0a --- /dev/null +++ b/apps/contacts/l10n/fr.php @@ -0,0 +1,36 @@ + "Ce n'est pas votre carnet d'adresses.", +"Contact could not be found." => "Ce contact n'a pas été trouvé.", +"vCard could not be read." => "Cette vCard n'a pas pu être lue.", +"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.", +"Address" => "Adresse", +"Telephone" => "Téléphone", +"Email" => "Email", +"Organization" => "Société", +"Work" => "Travail", +"Home" => "Maison", +"Mobile" => "Mobile", +"Text" => "Texte", +"Voice" => "Voix", +"Fax" => "Fax", +"Video" => "Vidéo", +"Pager" => "Bipeur", +"This is not your contact." => "Ce n'est pas votre contact.", +"This card is not RFC compatible." => "Cette fiche n'est pas compatible RFC.", +"This card does not contain a photo." => "Cette fiche ne contient pas de photo.", +"Add Contact" => "Ajouter un Contact", +"Group" => "Groupe", +"Name" => "Nom", +"PO Box" => "Boîte postale", +"Extended" => "Étendu", +"Street" => "Rue", +"City" => "Ville", +"Region" => "Région", +"Zipcode" => "Code postal", +"Country" => "Pays", +"Create Contact" => "Créer le Contact", +"Edit" => "Modifier", +"Delete" => "Effacer", +"Birthday" => "Anniversaire", +"Phone" => "Téléphone" +); diff --git a/apps/contacts/l10n/he.php b/apps/contacts/l10n/he.php new file mode 100644 index 00000000000..22275f77e59 --- /dev/null +++ b/apps/contacts/l10n/he.php @@ -0,0 +1,36 @@ + "זהו ×ינו ספר הכתובות שלך", +"Contact could not be found." => "×œ× × ×™×ª×Ÿ ל×תר ×יש קשר", +"vCard could not be read." => "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× vCard.", +"Information about vCard is incorrect. Please reload the page." => "המידע ×ודות vCard ×ינו נכון. × × ×œ×˜×¢×•×Ÿ מחדש ×ת הדף.", +"Address" => "כתובת", +"Telephone" => "טלפון", +"Email" => "דו×ר ×לקטרוני", +"Organization" => "×רגון", +"Work" => "עבודה", +"Home" => "בית", +"Mobile" => "נייד", +"Text" => "טקסט", +"Voice" => "קולי", +"Fax" => "פקס", +"Video" => "ויד×ו", +"Pager" => "זימונית", +"This is not your contact." => "זהו ×ינו ×יש קשר שלך", +"This card is not RFC compatible." => "כרטיס ×–×” ×ינו תו×× ×œÖ¾RFC", +"This card does not contain a photo." => "כרטיס ×–×” ×ינו כולל תמונה", +"Add Contact" => "הוספת ×יש קשר", +"Group" => "קבוצה", +"Name" => "ש×", +"PO Box" => "×ª× ×“×•×ר", +"Extended" => "מורחב", +"Street" => "רחוב", +"City" => "עיר", +"Region" => "×זור", +"Zipcode" => "מיקוד", +"Country" => "מדינה", +"Create Contact" => "יצירת ×יש קשר", +"Edit" => "עריכה", +"Delete" => "מחיקה", +"Birthday" => "×™×•× ×”×•×œ×“×ª", +"Phone" => "טלפון" +); diff --git a/apps/contacts/l10n/hr.php b/apps/contacts/l10n/hr.php new file mode 100644 index 00000000000..4b62b292acf --- /dev/null +++ b/apps/contacts/l10n/hr.php @@ -0,0 +1,36 @@ + "Ovo nije vaÅ¡ adresar.", +"Contact could not be found." => "Kontakt ne postoji.", +"vCard could not be read." => "Nemoguće proÄitati vCard.", +"Information about vCard is incorrect. Please reload the page." => "Informacija o vCard je neispravna. Osvježite stranicu.", +"Address" => "Adresa", +"Telephone" => "Telefon", +"Email" => "E-mail", +"Organization" => "Organizacija", +"Work" => "Posao", +"Home" => "Kuća", +"Mobile" => "Mobitel", +"Text" => "Tekst", +"Voice" => "Glasovno", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Ovo nije vaÅ¡ kontakt.", +"This card is not RFC compatible." => "Ova kartica nije sukladna prema RFC direktivama.", +"This card does not contain a photo." => "Ova kartica ne sadrži fotografiju.", +"Add Contact" => "Dodaj kontakt", +"Group" => "Grupa", +"Name" => "Naziv", +"PO Box" => "PoÅ¡tanski Pretinac", +"Extended" => "ProÅ¡ireno", +"Street" => "Ulica", +"City" => "Grad", +"Region" => "Regija", +"Zipcode" => "PoÅ¡tanski broj", +"Country" => "Država", +"Create Contact" => "Izradi Kontakt", +"Edit" => "Uredi", +"Delete" => "ObriÅ¡i", +"Birthday" => "RoÄ‘endan", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php new file mode 100644 index 00000000000..21123645ddb --- /dev/null +++ b/apps/contacts/l10n/hu_HU.php @@ -0,0 +1,36 @@ + "Ez nem a te címjegyzéked.", +"Contact could not be found." => "Kapcsolat nem található.", +"vCard could not be read." => "A vCard-ot nem lehet olvasni.", +"Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.", +"Address" => "Cím", +"Telephone" => "Telefonszám", +"Email" => "E-mail", +"Organization" => "Organizáció", +"Work" => "Munka", +"Home" => "Otthon", +"Mobile" => "Mobiltelefonszám", +"Text" => "Szöveg", +"Voice" => "Hang", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Lapozó", +"This is not your contact." => "Nem a te kapcsolatod.", +"This card is not RFC compatible." => "A kártya nem RFC kompatibilis.", +"This card does not contain a photo." => "A kártya nem tartlmaz fényképet.", +"Add Contact" => "Kontakt hozzáadása", +"Group" => "Csoport", +"Name" => "Név", +"PO Box" => "Postafiók", +"Extended" => "Kiterjesztett", +"Street" => "Utca", +"City" => "Helység", +"Region" => "Megye", +"Zipcode" => "Irányítószám", +"Country" => "Ország", +"Create Contact" => "Kontakt létrehozása", +"Edit" => "Szerkesztés", +"Delete" => "Törlés", +"Birthday" => "Születésnap", +"Phone" => "Telefonszám" +); diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php new file mode 100644 index 00000000000..2bd53255e85 --- /dev/null +++ b/apps/contacts/l10n/ia.php @@ -0,0 +1,32 @@ + "Iste non es tu libro de adresses", +"Contact could not be found." => "Contacto non poterea esser legite", +"vCard could not be read." => "vCard non poterea esser legite.", +"Address" => "Adresse", +"Telephone" => "Telephono", +"Email" => "E-posta", +"Organization" => "Organisation", +"Work" => "Travalio", +"Home" => "Domo", +"Text" => "Texto", +"Voice" => "Voce", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Iste non es tu contacto", +"This card is not RFC compatible." => "Iste carta non es compatibile con RFC", +"Add Contact" => "Adder contacto", +"Group" => "Gruppo", +"Name" => "Nomine", +"PO Box" => "Cassa postal", +"Street" => "Strata", +"City" => "Citate", +"Region" => "Region", +"Zipcode" => "Codice postal", +"Country" => "Pais", +"Create Contact" => "Crear contacto", +"Edit" => "Modificar", +"Delete" => "Deler", +"Birthday" => "Anniversario", +"Phone" => "Phono" +); diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php index 7a57d6fc5d2..c06a2b2a156 100644 --- a/apps/contacts/l10n/it.php +++ b/apps/contacts/l10n/it.php @@ -1,38 +1,36 @@ "Bisogna effettuare il login.", "This is not your addressbook." => "Questa non è la tua rubrica.", "Contact could not be found." => "Il contatto non può essere trovato", -"This is not your contact." => "Questo non è un tuo contatto.", "vCard could not be read." => "La vCard non può essere letta", "Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard incorrette. Ricaricare la pagina.", -"This card is not RFC compatible." => "Questa card non è compatibile con il protocollo RFC.", -"This card does not contain a photo." => "Questa card non contiene una foto.", -"Add Contact" => "Aggiungi contatto", -"Group" => "Gruppo", -"Name" => "Nome", -"Create Contact" => "Crea contatto", "Address" => "Indirizzo", "Telephone" => "Telefono", "Email" => "Email", "Organization" => "Organizzazione", "Work" => "Lavoro", "Home" => "Casa", -"PO Box" => "PO Box", +"Mobile" => "Cellulare", +"Text" => "Testo", +"Voice" => "Voce", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Cercapersone", +"This is not your contact." => "Questo non è un tuo contatto.", +"This card is not RFC compatible." => "Questa card non è compatibile con il protocollo RFC.", +"This card does not contain a photo." => "Questa card non contiene una foto.", +"Add Contact" => "Aggiungi contatto", +"Group" => "Gruppo", +"Name" => "Nome", +"PO Box" => "Casella postale", "Extended" => "Estendi", "Street" => "Via", "City" => "Città", "Region" => "Regione", "Zipcode" => "CAP", "Country" => "Stato", -"Mobile" => "Cellulare", -"Text" => "Testo", -"Voice" => "Voce", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", +"Create Contact" => "Crea contatto", +"Edit" => "Modifica", "Delete" => "Cancella", -"Add Property" => "Aggiungi proprietà", "Birthday" => "Compleanno", -"Phone" => "Telefono", -"Edit" => "Modifica" +"Phone" => "Telefono" ); diff --git a/apps/contacts/l10n/ja_JP.php b/apps/contacts/l10n/ja_JP.php new file mode 100644 index 00000000000..d5ae4b632dd --- /dev/null +++ b/apps/contacts/l10n/ja_JP.php @@ -0,0 +1,36 @@ + "ã“ã‚Œã¯ã‚ãªãŸã®é›»è©±å¸³ã§ã¯ã‚ã‚Šã¾ã›ã‚“。", +"Contact could not be found." => "連絡先を見ã¤ã‘る事ãŒã§ãã¾ã›ã‚“。", +"vCard could not be read." => "vCardã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚", +"Information about vCard is incorrect. Please reload the page." => "vCardã®æƒ…å ±ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ã€‚ページをリロードã—ã¦ä¸‹ã•ã„。", +"Address" => "ä½æ‰€", +"Telephone" => "電話番å·", +"Email" => "メールアドレス", +"Organization" => "所属", +"Work" => "勤務先", +"Home" => "ä½å±…", +"Mobile" => "æºå¸¯é›»è©±", +"Text" => "TTY TDD", +"Voice" => "音声番å·", +"Fax" => "FAX", +"Video" => "テレビ電話", +"Pager" => "ãƒã‚±ãƒ™ãƒ«", +"This is not your contact." => "ã‚ãªãŸã®é€£çµ¡å…ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。", +"This card is not RFC compatible." => "ã“ã®ã‚«ãƒ¼ãƒ‰ã¯RFCã«æº–æ‹ ã—ã¦ã„ã¾ã›ã‚“。", +"This card does not contain a photo." => "ã“ã®ã‚«ãƒ¼ãƒ‰ã¯å†™çœŸã‚’å«ã‚“ã§ãŠã‚Šã¾ã›ã‚“。", +"Add Contact" => "連絡先ã®è¿½åŠ ", +"Group" => "グループ", +"Name" => "æ°å", +"PO Box" => "ç§æ›¸ç®±", +"Extended" => "拡張番地", +"Street" => "街路番地", +"City" => "都市", +"Region" => "地域", +"Zipcode" => "郵便番å·", +"Country" => "国å", +"Create Contact" => "追加", +"Edit" => "編集", +"Delete" => "削除", +"Birthday" => "生年月日", +"Phone" => "電話番å·" +); diff --git a/apps/contacts/l10n/lb.php b/apps/contacts/l10n/lb.php new file mode 100644 index 00000000000..df6e22bfab9 --- /dev/null +++ b/apps/contacts/l10n/lb.php @@ -0,0 +1,36 @@ + "Dat do ass net däin Adressbuch.", +"Contact could not be found." => "Konnt den Kontakt net fannen.", +"vCard could not be read." => "vCard konnt net gelies ginn.", +"Information about vCard is incorrect. Please reload the page." => "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei.", +"Address" => "Adress", +"Telephone" => "Telefon's Nummer", +"Email" => "Email", +"Organization" => "Firma", +"Work" => "Aarbecht", +"Home" => "Doheem", +"Mobile" => "GSM", +"Text" => "SMS", +"Voice" => "Voice", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Dat do ass net däin Kontakt.", +"This card is not RFC compatible." => "Déi do Kaart ass net RFC kompatibel.", +"This card does not contain a photo." => "Déi do Kaart huet keng Foto.", +"Add Contact" => "Kontakt bäisetzen", +"Group" => "Grupp", +"Name" => "Numm", +"PO Box" => "Postleetzuel", +"Extended" => "Erweidert", +"Street" => "Strooss", +"City" => "Staat", +"Region" => "Regioun", +"Zipcode" => "Postleetzuel", +"Country" => "Land", +"Create Contact" => "Kontakt erstellen", +"Edit" => "Editéieren", +"Delete" => "Läschen", +"Birthday" => "Gebuertsdag", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/lt_LT.php b/apps/contacts/l10n/lt_LT.php new file mode 100644 index 00000000000..ad92ebf9cce --- /dev/null +++ b/apps/contacts/l10n/lt_LT.php @@ -0,0 +1,33 @@ + "Tai ne jÅ«sų adresų knygelÄ—.", +"Contact could not be found." => "Kontaktas nerastas", +"vCard could not be read." => "Nenuskaitoma vCard.", +"Information about vCard is incorrect. Please reload the page." => "Informacija apie vCard yra neteisinga. ", +"Address" => "Adresas", +"Telephone" => "Telefonas", +"Email" => "El. paÅ¡tas", +"Organization" => "Organizacija", +"Work" => "Darbo", +"Home" => "Namų", +"Mobile" => "Mobilusis", +"Text" => "Tekstas", +"Voice" => "Balso", +"Fax" => "Faksas", +"Video" => "Vaizdo", +"Pager" => "PraneÅ¡imų gaviklis", +"This is not your contact." => "Tai ne jÅ«sų kontaktas", +"Add Contact" => "PridÄ—ti kontaktÄ…", +"Group" => "GrupÄ—", +"Name" => "Vardas", +"PO Box" => "PaÅ¡to dėžutÄ—", +"Street" => "GatvÄ—", +"City" => "Miestas", +"Region" => "Regionas", +"Zipcode" => "PaÅ¡to indeksas", +"Country" => "Å alis", +"Create Contact" => "Sukurti kontaktÄ…", +"Edit" => "Keisti", +"Delete" => "Trinti", +"Birthday" => "Gimtadienis", +"Phone" => "Telefonas" +); diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php new file mode 100644 index 00000000000..0113eb9df78 --- /dev/null +++ b/apps/contacts/l10n/nl.php @@ -0,0 +1,53 @@ + "Dit is niet uw adresboek.", +"Contact could not be found." => "Contact kon niet worden gevonden.", +"vCard could not be read." => "vCard kon niet worden gelezen.", +"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.", +"Address" => "Adres", +"Telephone" => "Telefoon", +"Email" => "E-mail", +"Organization" => "Organisatie", +"Work" => "Werk", +"Home" => "Thuis", +"Mobile" => "Mobiel", +"Text" => "Tekst", +"Voice" => "Stem", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pieper", +"This is not your contact." => "Dit is niet uw contactpersoon.", +"This card is not RFC compatible." => "Deze kaart is niet RFC compatibel.", +"This card does not contain a photo." => "Deze contact bevat geen foto.", +"Add Contact" => "Contact toevoegen", +"Address Books" => "Adresboeken", +"Group" => "Groep", +"Name" => "Naam", +"Number" => "Nummer", +"Type" => "Type", +"PO Box" => "Postbus", +"Extended" => "Uitgebreide", +"Street" => "Straat", +"City" => "Stad", +"Region" => "Regio", +"Zipcode" => "Postcode", +"Country" => "Land", +"Create Contact" => "Contact aanmaken", +"Choose active Address Books" => "Kies actief Adresboek", +"New Address Book" => "Nieuw Adresboek", +"CardDav Link" => "CardDav Link", +"Download" => "Download", +"Edit" => "Bewerken", +"Delete" => "Verwijderen", +"Delete contact" => "Verwijder contact", +"Add" => "Voeg toe", +"Edit Address Book" => "Bewerk Adresboek", +"Displayname" => "Weergavenaam", +"Active" => "Actief", +"Save" => "Opslaan", +"Submit" => "Opslaan", +"Cancel" => "Anuleren", +"Birthday" => "Verjaardag", +"Preferred" => "Voorkeur", +"Phone" => "Telefoon", +"Update" => "Vernieuwe" +); diff --git a/apps/contacts/l10n/nn_NO.php b/apps/contacts/l10n/nn_NO.php new file mode 100644 index 00000000000..98db59d9751 --- /dev/null +++ b/apps/contacts/l10n/nn_NO.php @@ -0,0 +1,36 @@ + "Dette er ikkje di adressebok.", +"Contact could not be found." => "Fann ikkje kontakten.", +"vCard could not be read." => "Klarte ikkje Ã¥ lesa vCard-et.", +"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida pÃ¥ nytt.", +"Address" => "Adresse", +"Telephone" => "Telefonnummer", +"Email" => "Epost", +"Organization" => "Organisasjon", +"Work" => "Arbeid", +"Home" => "Heime", +"Mobile" => "Mobil", +"Text" => "Tekst", +"Voice" => "Tale", +"Fax" => "Faks", +"Video" => "Video", +"Pager" => "Personsøkjar", +"This is not your contact." => "Dette er ikkje din kontakt.", +"This card is not RFC compatible." => "Dette kortet er ikkje RFC-kompatibelt", +"This card does not contain a photo." => "Dette kortet har ingen bilete.", +"Add Contact" => "Legg til kontakt", +"Group" => "Gruppe", +"Name" => "Namn", +"PO Box" => "Postboks", +"Extended" => "Utvida", +"Street" => "Gate", +"City" => "Stad", +"Region" => "Region/fylke", +"Zipcode" => "Postnummer", +"Country" => "Land", +"Create Contact" => "Opprett kontakt", +"Edit" => "Endra", +"Delete" => "Slett", +"Birthday" => "Bursdag", +"Phone" => "Telefonnummer" +); diff --git a/apps/contacts/l10n/pl.php b/apps/contacts/l10n/pl.php new file mode 100644 index 00000000000..0302b0e3eea --- /dev/null +++ b/apps/contacts/l10n/pl.php @@ -0,0 +1,36 @@ + "To nie jest twoja książka adresowa.", +"Contact could not be found." => "Kontakt nie znaleziony.", +"vCard could not be read." => "Nie można odczytać vCard.", +"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard sÄ… nieprawidÅ‚owe. ProszÄ™ odÅ›wieżyć stronÄ™.", +"Address" => "Adres", +"Telephone" => "Telefon", +"Email" => "E-mail", +"Organization" => "Organizacja", +"Work" => "Praca", +"Home" => "Dom", +"Mobile" => "Komórka", +"Text" => "Tekst", +"Voice" => "PoÅ‚Ä…czenie gÅ‚osowe", +"Fax" => "Faks", +"Video" => "PoÅ‚Ä…czenie wideo", +"Pager" => "Pager", +"This is not your contact." => "To nie jest twój kontakt.", +"This card is not RFC compatible." => "Ta karta nie jest zgodna ze specyfikacjÄ… RFC.", +"This card does not contain a photo." => "Ta karta nie zawiera zdjęć.", +"Add Contact" => "Dodaj kontakt", +"Group" => "Grupa", +"Name" => "Nazwisko", +"PO Box" => "PO Box", +"Extended" => "Rozszerzony", +"Street" => "Ulica", +"City" => "Miasto", +"Region" => "Region", +"Zipcode" => "Kod pocztowy", +"Country" => "Kraj", +"Create Contact" => "Utwórz kontakt", +"Edit" => "Edytuj", +"Delete" => "UsuÅ„", +"Birthday" => "Urodziny", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php new file mode 100644 index 00000000000..42d37451b7a --- /dev/null +++ b/apps/contacts/l10n/pt_BR.php @@ -0,0 +1,36 @@ + "Este não é o seu agenda de endereços.", +"Contact could not be found." => "Contato não pôde ser encontrado.", +"vCard could not be read." => "vCard não pôde ser lida.", +"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.", +"Address" => "Endereço", +"Telephone" => "Telefone", +"Email" => "E-mail", +"Organization" => "Organização", +"Work" => "Trabalho", +"Home" => "Home", +"Mobile" => "Móvel", +"Text" => "Texto", +"Voice" => "Voz", +"Fax" => "Fax", +"Video" => "Vídeo", +"Pager" => "Pager", +"This is not your contact." => "Este não é o seu contato.", +"This card is not RFC compatible." => "Este cartão não é compatível com RFC.", +"This card does not contain a photo." => "Este cartão não contém uma foto.", +"Add Contact" => "Adicionar Contato", +"Group" => "Grupo", +"Name" => "Nome", +"PO Box" => "Caixa Postal", +"Extended" => "Estendido", +"Street" => "Rua", +"City" => "Cidade", +"Region" => "Região", +"Zipcode" => "CEP", +"Country" => "País", +"Create Contact" => "Criar Contato", +"Edit" => "Editar", +"Delete" => "Excluir", +"Birthday" => "Aniversário", +"Phone" => "Telefone" +); diff --git a/apps/contacts/l10n/pt_PT.php b/apps/contacts/l10n/pt_PT.php new file mode 100644 index 00000000000..b354272a3c7 --- /dev/null +++ b/apps/contacts/l10n/pt_PT.php @@ -0,0 +1,36 @@ + "Esta não é a sua lista de contactos", +"Contact could not be found." => "O contacto não foi encontrado", +"vCard could not be read." => "o vCard não pode ser lido", +"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", +"Address" => "Morada", +"Telephone" => "Telefone", +"Email" => "Email", +"Organization" => "Organização", +"Work" => "Trabalho", +"Home" => "Casa", +"Mobile" => "Telemovel", +"Text" => "Texto", +"Voice" => "Voz", +"Fax" => "Fax", +"Video" => "Vídeo", +"Pager" => "Pager", +"This is not your contact." => "Este não é o seu contacto", +"This card is not RFC compatible." => "Este cartão não é compativel com RFC", +"This card does not contain a photo." => "Este cartão não possui foto", +"Add Contact" => "Adicionar Contacto", +"Group" => "Grupo", +"Name" => "Nome", +"PO Box" => "Apartado", +"Extended" => "Extendido", +"Street" => "Rua", +"City" => "Cidade", +"Region" => "Região", +"Zipcode" => "Código Postal", +"Country" => "País", +"Create Contact" => "Criar Contacto", +"Edit" => "Editar", +"Delete" => "Apagar", +"Birthday" => "Aniversário", +"Phone" => "Telefone" +); diff --git a/apps/contacts/l10n/ro.php b/apps/contacts/l10n/ro.php new file mode 100644 index 00000000000..2a89edc4ec7 --- /dev/null +++ b/apps/contacts/l10n/ro.php @@ -0,0 +1,36 @@ + "Nu se găseÈ™te în agendă.", +"Contact could not be found." => "Contactul nu a putut fi găsit.", +"vCard could not be read." => "vCard nu poate fi citit.", +"Information about vCard is incorrect. Please reload the page." => "InformaÈ›iile despre vCard sunt incorecte. ReîncărcaÈ›i pagina.", +"Address" => "Adresă", +"Telephone" => "Telefon", +"Email" => "Email", +"Organization" => "OrganizaÈ›ie", +"Work" => "Servici", +"Home" => "Acasă", +"Mobile" => "Mobil", +"Text" => "Text", +"Voice" => "Voce", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Nu este contactul tău", +"This card is not RFC compatible." => "Nu este compatibil RFC", +"This card does not contain a photo." => "Nu conÈ›ine o fotografie", +"Add Contact" => "Adaugă contact", +"Group" => "Grup", +"Name" => "Nume", +"PO Box" => "CP", +"Extended" => "Extins", +"Street" => "Stradă", +"City" => "OraÈ™", +"Region" => "Regiune", +"Zipcode" => "Cod poÈ™tal", +"Country" => "Èšară", +"Create Contact" => "Crează contact", +"Edit" => "Editează", +"Delete" => "Șterge", +"Birthday" => "Zi de naÈ™tere", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/ru.php b/apps/contacts/l10n/ru.php new file mode 100644 index 00000000000..c3b66a83d8f --- /dev/null +++ b/apps/contacts/l10n/ru.php @@ -0,0 +1,36 @@ + "Это не ваша адреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°.", +"Contact could not be found." => "Контакт не найден.", +"vCard could not be read." => "Ðе удалоÑÑŒ прочеÑÑ‚ÑŒ vCard.", +"Information about vCard is incorrect. Please reload the page." => "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ vCard некорректна. ПожалуйÑта, обновите Ñтраницу.", +"Address" => "ÐдреÑ", +"Telephone" => "Телефон", +"Email" => "Ящик Ñл. почты", +"Organization" => "ОрганизациÑ", +"Work" => "Рабочий", +"Home" => "Домашний", +"Mobile" => "Мобильный", +"Text" => "ТекÑÑ‚", +"Voice" => "ГолоÑ", +"Fax" => "ФакÑ", +"Video" => "Видео", +"Pager" => "Пейджер", +"This is not your contact." => "Это не контакт.", +"This card is not RFC compatible." => "Эта карточка не ÑоответÑтвует RFC.", +"This card does not contain a photo." => "Эта карточка не Ñодержит фотографии.", +"Add Contact" => "Добавить Контакт", +"Group" => "Группа", +"Name" => "ИмÑ", +"PO Box" => "ÐО", +"Extended" => "РаÑширенный", +"Street" => "Улица", +"City" => "Город", +"Region" => "ОблаÑÑ‚ÑŒ", +"Zipcode" => "Почтовый индекÑ", +"Country" => "Страна", +"Create Contact" => "Создать Контакт", +"Edit" => "Редактировать", +"Delete" => "Удалить", +"Birthday" => "День рождениÑ", +"Phone" => "Телефон" +); diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php new file mode 100644 index 00000000000..acc19672595 --- /dev/null +++ b/apps/contacts/l10n/sk_SK.php @@ -0,0 +1,36 @@ + "Toto nie je váš adresár.", +"Contact could not be found." => "Kontakt nebol nájdený.", +"vCard could not be read." => "vCard nemôže byÅ¥ preÄítaná.", +"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.", +"Address" => "Adresa", +"Telephone" => "Telefón", +"Email" => "E-mail", +"Organization" => "Organizácia", +"Work" => "Práca", +"Home" => "Domov", +"Mobile" => "Mobil", +"Text" => "SMS", +"Voice" => "Odkazová schránka", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "Toto nie je váš kontakt.", +"This card is not RFC compatible." => "Táto karta nie je kompatibilná s RFC.", +"This card does not contain a photo." => "Táto karta neobsahuje fotografiu.", +"Add Contact" => "PridaÅ¥ Kontakt.", +"Group" => "Skupina", +"Name" => "Meno", +"PO Box" => "PO Box", +"Extended" => "Rozšírené", +"Street" => "Ulica", +"City" => "Mesto", +"Region" => "Región", +"Zipcode" => "PSÄŒ", +"Country" => "Krajina", +"Create Contact" => "VytvoriÅ¥ Kontakt.", +"Edit" => "UpraviÅ¥", +"Delete" => "OdstrániÅ¥", +"Birthday" => "Narodeniny", +"Phone" => "Telefón" +); diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php new file mode 100644 index 00000000000..bce43a7a2c8 --- /dev/null +++ b/apps/contacts/l10n/sl.php @@ -0,0 +1,36 @@ + "To ni vaÅ¡ adresar.", +"Contact could not be found." => "Kontakta ni bilo mogoÄe najti.", +"vCard could not be read." => "vVizitko (vCard) ni bilo mogoÄe prebrati.", +"Information about vCard is incorrect. Please reload the page." => "Informacije o vVizitki (vCard) niso pravilne, Prosimo ponovno naložite okno.", +"Address" => "Naslov", +"Telephone" => "Telefon", +"Email" => "Email", +"Organization" => "Organizacija", +"Work" => "Delo", +"Home" => "Doma", +"Mobile" => "Mobitel", +"Text" => "Tekst", +"Voice" => "Glas- Voice", +"Fax" => "Faks", +"Video" => "Video", +"Pager" => "Pager", +"This is not your contact." => "To ni vaÅ¡ kontakt", +"This card is not RFC compatible." => "Ta karta ni RFC kopatibilna.", +"This card does not contain a photo." => "Ta karta ne vsebuje slike.", +"Add Contact" => "Dodaj Kontakt", +"Group" => "Skupina", +"Name" => "Ime", +"PO Box" => "PO Box", +"Extended" => "RazÅ¡irjeno.", +"Street" => "Ulica", +"City" => "Mesto", +"Region" => "Regija", +"Zipcode" => "PoÅ¡tna Å¡t.", +"Country" => "Dežela", +"Create Contact" => "Ustvari Kontakt", +"Edit" => "Uredi", +"Delete" => "IzbriÅ¡i", +"Birthday" => "Rojstni Dan", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/sr.php b/apps/contacts/l10n/sr.php new file mode 100644 index 00000000000..f0775f0afda --- /dev/null +++ b/apps/contacts/l10n/sr.php @@ -0,0 +1,36 @@ + "Ово није ваш адреÑар.", +"Contact could not be found." => "Контакт Ñе не може наћи.", +"vCard could not be read." => "вКарта Ñе не може читати.", +"Information about vCard is incorrect. Please reload the page." => "Подаци о вКарти Ñу неиÑправни. Поново учитајте Ñтраницу.", +"Address" => "ÐдреÑа", +"Telephone" => "Телефон", +"Email" => "Е-маил", +"Organization" => "Организација", +"Work" => "ПоÑао", +"Home" => "Кућа", +"Mobile" => "Мобилни", +"Text" => "ТекÑÑ‚", +"Voice" => "ГлаÑ", +"Fax" => "ФакÑ", +"Video" => "Видео", +"Pager" => "Пејџер", +"This is not your contact." => "Ово није ваш контакт.", +"This card is not RFC compatible." => "Ова карта није ÑаглаÑна Ñа РФЦ-ом.", +"This card does not contain a photo." => "Ова карта не Ñадржи фотографију.", +"Add Contact" => "Додај контакт", +"Group" => "Група", +"Name" => "Име", +"PO Box" => "ПоштанÑки број", +"Extended" => "Прошири", +"Street" => "Улица", +"City" => "Град", +"Region" => "Регија", +"Zipcode" => "Зип код", +"Country" => "Земља", +"Create Contact" => "Ðаправи контакт", +"Edit" => "Уреди", +"Delete" => "Обриши", +"Birthday" => "Рођендан", +"Phone" => "Телефон" +); diff --git a/apps/contacts/l10n/sr@latin.php b/apps/contacts/l10n/sr@latin.php new file mode 100644 index 00000000000..a4e70daf99c --- /dev/null +++ b/apps/contacts/l10n/sr@latin.php @@ -0,0 +1,36 @@ + "Ovo nije vaÅ¡ adresar.", +"Contact could not be found." => "Kontakt se ne može naći.", +"vCard could not be read." => "vKarta se ne može Äitati.", +"Information about vCard is incorrect. Please reload the page." => "Podaci o vKarti su neispravni. Ponovo uÄitajte stranicu.", +"Address" => "Adresa", +"Telephone" => "Telefon", +"Email" => "E-mail", +"Organization" => "Organizacija", +"Work" => "Posao", +"Home" => "Kuća", +"Mobile" => "Mobilni", +"Text" => "Tekst", +"Voice" => "Glas", +"Fax" => "Faks", +"Video" => "Video", +"Pager" => "Pejdžer", +"This is not your contact." => "Ovo nije vaÅ¡ kontakt.", +"This card is not RFC compatible." => "Ova karta nije saglasna sa RFC-om.", +"This card does not contain a photo." => "Ova karta ne sadrži fotografiju.", +"Add Contact" => "Dodaj kontakt", +"Group" => "Grupa", +"Name" => "Ime", +"PO Box" => "PoÅ¡tanski broj", +"Extended" => "ProÅ¡iri", +"Street" => "Ulica", +"City" => "Grad", +"Region" => "Regija", +"Zipcode" => "Zip kod", +"Country" => "Zemlja", +"Create Contact" => "Napravi kontakt", +"Edit" => "Uredi", +"Delete" => "ObriÅ¡i", +"Birthday" => "RoÄ‘endan", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php new file mode 100644 index 00000000000..d90f0693b3b --- /dev/null +++ b/apps/contacts/l10n/sv.php @@ -0,0 +1,36 @@ + "Det här är inte din adressbok.", +"Contact could not be found." => "Kontakt kunde inte hittas.", +"vCard could not be read." => "vCard kunde inte läsas in.", +"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.", +"Address" => "Adress", +"Telephone" => "Telefon", +"Email" => "E-post", +"Organization" => "Organisation", +"Work" => "Arbete", +"Home" => "Hem", +"Mobile" => "Mobil", +"Text" => "Text", +"Voice" => "Röst", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "Personsökare", +"This is not your contact." => "Det här är inte din kontakt.", +"This card is not RFC compatible." => "Detta kort är inte RFC-kompatibelt.", +"This card does not contain a photo." => "Detta kort innehÃ¥ller inte nÃ¥got foto.", +"Add Contact" => "Lägg till kontakt", +"Group" => "Grupp", +"Name" => "Namn", +"PO Box" => "Postbox", +"Extended" => "Utökad", +"Street" => "Gata", +"City" => "Stad", +"Region" => "Län", +"Zipcode" => "Postnummer", +"Country" => "Land", +"Create Contact" => "Skapa kontakt", +"Edit" => "Redigera", +"Delete" => "Radera", +"Birthday" => "Födelsedag", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php new file mode 100644 index 00000000000..4ba41a3422c --- /dev/null +++ b/apps/contacts/l10n/tr.php @@ -0,0 +1,36 @@ + "Bu sizin adres defteriniz deÄŸil.", +"Contact could not be found." => "KiÅŸi bulunamadı.", +"vCard could not be read." => "vCard okunamadı.", +"Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doÄŸru deÄŸil. Lütfen sayfayı yenileyin.", +"Address" => "Adres", +"Telephone" => "Telefon", +"Email" => "Eposta", +"Organization" => "Organizasyon", +"Work" => "Ä°ÅŸ", +"Home" => "Ev", +"Mobile" => "Mobil", +"Text" => "Metin", +"Voice" => "Ses", +"Fax" => "Faks", +"Video" => "Video", +"Pager" => "Sayfalayıcı", +"This is not your contact." => "Bu sizin kiÅŸiniz deÄŸil.", +"This card is not RFC compatible." => "Bu kart RFC uyumlu deÄŸil.", +"This card does not contain a photo." => "Bu kart resim içermiyor.", +"Add Contact" => "KiÅŸi Ekle", +"Group" => "Grup", +"Name" => "Ad", +"PO Box" => "Posta Kutusu", +"Extended" => "Uzatılmış", +"Street" => "Sokak", +"City" => "Åžehir", +"Region" => "Bölge", +"Zipcode" => "Posta kodu", +"Country" => "Ãœlke", +"Create Contact" => "KiÅŸi OluÅŸtur", +"Edit" => "Düzenle", +"Delete" => "Sil", +"Birthday" => "DoÄŸum günü", +"Phone" => "Telefon" +); diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php new file mode 100644 index 00000000000..5ebf2d862fb --- /dev/null +++ b/apps/contacts/l10n/zh_CN.php @@ -0,0 +1,36 @@ + "è¿™ä¸æ˜¯æ‚¨çš„地å€ç°¿ã€‚", +"Contact could not be found." => "无法找到è”系人。", +"vCard could not be read." => "vCard 无法读å–。", +"Information about vCard is incorrect. Please reload the page." => "vCard çš„ä¿¡æ¯ä¸æ­£ç¡®ã€‚请é‡æ–°åŠ è½½é¡µé¢ã€‚", +"Address" => "地å€", +"Telephone" => "电è¯", +"Email" => "电å­é‚®ä»¶", +"Organization" => "组织", +"Work" => "工作", +"Home" => "家庭", +"Mobile" => "移动电è¯", +"Text" => "文本", +"Voice" => "语音", +"Fax" => "传真", +"Video" => "视频", +"Pager" => "传呼机", +"This is not your contact." => "è¿™ä¸æ˜¯æ‚¨çš„è”系人。", +"This card is not RFC compatible." => "这张å片和RFC 标准ä¸å…¼å®¹ã€‚", +"This card does not contain a photo." => "这张å片ä¸åŒ…å«ç…§ç‰‡ã€‚", +"Add Contact" => "添加è”系人", +"Group" => "分组", +"Name" => "å称", +"PO Box" => "邮箱", +"Extended" => "扩展", +"Street" => "è¡—é“", +"City" => "城市", +"Region" => "地区", +"Zipcode" => "邮编", +"Country" => "国家", +"Create Contact" => "创建è”系人", +"Edit" => "编辑", +"Delete" => "删除", +"Birthday" => "生日", +"Phone" => "电è¯" +); diff --git a/apps/media/l10n/ar.php b/apps/media/l10n/ar.php new file mode 100644 index 00000000000..a335f36a1f2 --- /dev/null +++ b/apps/media/l10n/ar.php @@ -0,0 +1,13 @@ + "الموسيقى", +"Play" => "إلعب", +"Pause" => "تجميد", +"Previous" => "السابق", +"Next" => "التالي", +"Mute" => "إلغاء الصوت", +"Unmute" => "تشغيل الصوت", +"Rescan Collection" => "إعادة البحث عن ملÙات الموسيقى", +"Artist" => "الÙنان", +"Album" => "الألبوم", +"Title" => "العنوان" +); diff --git a/apps/media/l10n/bg_BG.php b/apps/media/l10n/bg_BG.php index 411ab0a8956..1b71b26a165 100644 --- a/apps/media/l10n/bg_BG.php +++ b/apps/media/l10n/bg_BG.php @@ -6,7 +6,6 @@ "Next" => "Следваща", "Mute" => "Отнеми", "Unmute" => "Върни", -"Songs scanned" => "Сканирани пеÑни", "Rescan Collection" => "Повторно Ñканиране", "Artist" => "ÐртиÑÑ‚", "Album" => "Ðлбум", diff --git a/apps/media/l10n/ca.php b/apps/media/l10n/ca.php index f0e24d8514d..6c0a1855f3d 100644 --- a/apps/media/l10n/ca.php +++ b/apps/media/l10n/ca.php @@ -6,8 +6,7 @@ "Next" => "Següent", "Mute" => "Mut", "Unmute" => "Activa el so", -"Songs scanned" => "Cançons escanejades", -"Rescan Collection" => "Escaneja de nou la col·lecció", +"Rescan Collection" => "Explora de nou la col·lecció", "Artist" => "Artista", "Album" => "Àlbum", "Title" => "Títol" diff --git a/apps/media/l10n/cs_CZ.php b/apps/media/l10n/cs_CZ.php index 46b3a7e0940..074b44c03b5 100644 --- a/apps/media/l10n/cs_CZ.php +++ b/apps/media/l10n/cs_CZ.php @@ -1,12 +1,11 @@ "hudba", +"Music" => "Hudba", "Play" => "PÅ™ehrát", "Pause" => "Pauza", "Previous" => "PÅ™edchozí", "Next" => "Další", "Mute" => "ZtiÅ¡it", "Unmute" => "Zesílit", -"Songs scanned" => "Skladby jsou prohledány", "Rescan Collection" => "Znovu prohledat ", "Artist" => "UmÄ›lec", "Album" => "Album", diff --git a/apps/media/l10n/da.php b/apps/media/l10n/da.php index 64cdc59ded5..776081842c3 100644 --- a/apps/media/l10n/da.php +++ b/apps/media/l10n/da.php @@ -1,7 +1,11 @@ "Musik", +"Play" => "Afspil", "Pause" => "Pause", -"Songs scanned" => "Sange skannet", +"Previous" => "Forrige", +"Next" => "Næste", +"Mute" => "Lydløs", +"Unmute" => "Lyd til", "Rescan Collection" => "Genskan Samling", "Artist" => "Kunstner", "Album" => "Album", diff --git a/apps/media/l10n/de.php b/apps/media/l10n/de.php index 7a87f6dcb35..021a7e9bfe4 100644 --- a/apps/media/l10n/de.php +++ b/apps/media/l10n/de.php @@ -1,8 +1,12 @@ "Musik", +"Play" => "Abspielen", "Pause" => "Pause", -"Songs scanned" => "Lieder gescannt", -"Rescan Collection" => "Sammlung scannen", +"Previous" => "Vorheriges", +"Next" => "Nächstes", +"Mute" => "Ton aus", +"Unmute" => "Ton an", +"Rescan Collection" => "Sammlung noch einmal scannen", "Artist" => "Künstler", "Album" => "Album", "Title" => "Titel" diff --git a/apps/media/l10n/el.php b/apps/media/l10n/el.php index 6d4b781b78f..9996180c03e 100644 --- a/apps/media/l10n/el.php +++ b/apps/media/l10n/el.php @@ -6,7 +6,6 @@ "Next" => "Επόμενο", "Mute" => "Σίγαση", "Unmute" => "ΕπαναφοÏά ήχου", -"Songs scanned" => "ΣαÏωμένα Ï„ÏαγοÏγια", "Rescan Collection" => "ΕπανασάÏωση συλλογής", "Artist" => "Καλλιτέχνης", "Album" => "Άλμπουμ", diff --git a/apps/media/l10n/eo.php b/apps/media/l10n/eo.php new file mode 100644 index 00000000000..a572c15cb4c --- /dev/null +++ b/apps/media/l10n/eo.php @@ -0,0 +1,13 @@ + "Muziko", +"Play" => "Ludi", +"Pause" => "PaÅ­zi", +"Previous" => "Maljena", +"Next" => "Jena", +"Mute" => "Silentigi", +"Unmute" => "Malsilentigi", +"Rescan Collection" => "Reskani la aron", +"Artist" => "Verkinto", +"Album" => "Albumo", +"Title" => "Titolo" +); diff --git a/apps/media/l10n/es.php b/apps/media/l10n/es.php index b97fb0bf157..8d654fd36cd 100644 --- a/apps/media/l10n/es.php +++ b/apps/media/l10n/es.php @@ -6,7 +6,6 @@ "Next" => "Siguiente", "Mute" => "Silenciar", "Unmute" => "Sonar", -"Songs scanned" => "Canciones encontradas", "Rescan Collection" => "Buscar música nueva", "Artist" => "Artista", "Album" => "Ãlbum", diff --git a/apps/media/l10n/et_EE.php b/apps/media/l10n/et_EE.php index c516ca64f26..4133cb84a98 100644 --- a/apps/media/l10n/et_EE.php +++ b/apps/media/l10n/et_EE.php @@ -6,7 +6,6 @@ "Next" => "Järgmine", "Mute" => "Vaikseks", "Unmute" => "Hääl tagasi", -"Songs scanned" => "Skännitud lood", "Rescan Collection" => "Skänni kollekttsiooni uuesti", "Artist" => "Esitaja", "Album" => "Album", diff --git a/apps/media/l10n/eu.php b/apps/media/l10n/eu.php new file mode 100644 index 00000000000..d30e3519161 --- /dev/null +++ b/apps/media/l10n/eu.php @@ -0,0 +1,13 @@ + "Musika", +"Play" => "Erreproduzitu", +"Pause" => "Pausarazi", +"Previous" => "Aurrekoa", +"Next" => "Hurrengoa", +"Mute" => "Mututu", +"Unmute" => "Ez Mututu", +"Rescan Collection" => "Bireskaneatu Bilduma", +"Artist" => "Artista", +"Album" => "Albuma", +"Title" => "Izenburua" +); diff --git a/apps/media/l10n/fr.php b/apps/media/l10n/fr.php index 3e4e0f19283..c96e84d73fd 100644 --- a/apps/media/l10n/fr.php +++ b/apps/media/l10n/fr.php @@ -1,7 +1,11 @@ "Musique", +"Play" => "Play", "Pause" => "Pause", -"Songs scanned" => "Pistes scannées", +"Previous" => "Précédent", +"Next" => "Suivant", +"Mute" => "Muet", +"Unmute" => "Audible", "Rescan Collection" => "Réanalyser la Collection", "Artist" => "Artiste", "Album" => "Album", diff --git a/apps/media/l10n/he.php b/apps/media/l10n/he.php new file mode 100644 index 00000000000..772bfb90281 --- /dev/null +++ b/apps/media/l10n/he.php @@ -0,0 +1,13 @@ + "מוזיקה", +"Play" => "נגן", +"Pause" => "השהה", +"Previous" => "קוד×", +"Next" => "הב×", +"Mute" => "השתק", +"Unmute" => "בטל השתקה", +"Rescan Collection" => "סריקת ×וסף מחדש", +"Artist" => "מבצע", +"Album" => "×לבו×", +"Title" => "כותרת" +); diff --git a/apps/media/l10n/hr.php b/apps/media/l10n/hr.php new file mode 100644 index 00000000000..bab149743cf --- /dev/null +++ b/apps/media/l10n/hr.php @@ -0,0 +1,13 @@ + "Glazba", +"Play" => "Reprodukcija", +"Pause" => "Pauza", +"Previous" => "Prethodna", +"Next" => "Sljedeća", +"Mute" => "UtiÅ¡aj zvuk", +"Unmute" => "UkljuÄi zvuk", +"Rescan Collection" => "Ponovi skeniranje kolekcije", +"Artist" => "IzvoÄ‘aÄ", +"Album" => "Album", +"Title" => "Naslov" +); diff --git a/apps/media/l10n/hu_HU.php b/apps/media/l10n/hu_HU.php new file mode 100644 index 00000000000..299e0af0287 --- /dev/null +++ b/apps/media/l10n/hu_HU.php @@ -0,0 +1,13 @@ + "Zene", +"Play" => "Lejátszás", +"Pause" => "Szünet", +"Previous" => "ElÅ‘zÅ‘", +"Next" => "KövetkezÅ‘", +"Mute" => "Némítás", +"Unmute" => "Némítás megszüntetése", +"Rescan Collection" => "Gyűjtemény újraolvasása", +"Artist" => "ElÅ‘adó", +"Album" => "Album", +"Title" => "Cím" +); diff --git a/apps/media/l10n/ia.php b/apps/media/l10n/ia.php new file mode 100644 index 00000000000..597b36e10fa --- /dev/null +++ b/apps/media/l10n/ia.php @@ -0,0 +1,13 @@ + "Musica", +"Play" => "Reproducer", +"Pause" => "Pausa", +"Previous" => "Previe", +"Next" => "Proxime", +"Mute" => "Mute", +"Unmute" => "Con sono", +"Rescan Collection" => "Rescannar collection", +"Artist" => "Artista", +"Album" => "Album", +"Title" => "Titulo" +); diff --git a/apps/media/l10n/id.php b/apps/media/l10n/id.php index 7127f85fbf0..52b0bae0eea 100644 --- a/apps/media/l10n/id.php +++ b/apps/media/l10n/id.php @@ -1,7 +1,11 @@ "Musik", +"Play" => "Mainkan", "Pause" => "Jeda", -"Songs scanned" => "Lagu-lagu yang telah dipindai", +"Previous" => "Sebelumnya", +"Next" => "Selanjutnya", +"Mute" => "Nonaktifkan suara", +"Unmute" => "Aktifkan suara", "Rescan Collection" => "Pindai ulang Koleksi", "Artist" => "Artis", "Album" => "Album", diff --git a/apps/media/l10n/it.php b/apps/media/l10n/it.php index f0d9c606e74..d4bad14a4bb 100644 --- a/apps/media/l10n/it.php +++ b/apps/media/l10n/it.php @@ -6,8 +6,7 @@ "Next" => "Successiva", "Mute" => "Disattiva audio", "Unmute" => "Riattiva audio", -"Songs scanned" => "Canzoni analizzate", -"Rescan Collection" => "Rianalizza colezione", +"Rescan Collection" => "Rianalizza collezione", "Artist" => "Artista", "Album" => "Album", "Title" => "Titolo" diff --git a/apps/media/l10n/ja_JP.php b/apps/media/l10n/ja_JP.php new file mode 100644 index 00000000000..395ebe792eb --- /dev/null +++ b/apps/media/l10n/ja_JP.php @@ -0,0 +1,13 @@ + "ミュージック", +"Play" => "å†ç”Ÿ", +"Pause" => "一時åœæ­¢", +"Previous" => "å‰", +"Next" => "次", +"Mute" => "ミュート", +"Unmute" => "ミュート解除", +"Rescan Collection" => "コレクションをå†èª­ã¿è¾¼ã¿ã™ã‚‹", +"Artist" => "アーティスト", +"Album" => "アルãƒãƒ ", +"Title" => "曲å" +); diff --git a/apps/media/l10n/lb.php b/apps/media/l10n/lb.php index 2c127cf83ed..4a2727fcb11 100644 --- a/apps/media/l10n/lb.php +++ b/apps/media/l10n/lb.php @@ -6,7 +6,6 @@ "Next" => "Weider", "Mute" => "Toun ausmaachen", "Unmute" => "Toun umaachen", -"Songs scanned" => "Lidder gescannt", "Rescan Collection" => "Kollektioun nei scannen", "Artist" => "Artist", "Album" => "Album", diff --git a/apps/media/l10n/lt_LT.php b/apps/media/l10n/lt_LT.php new file mode 100644 index 00000000000..1761ffdc3b2 --- /dev/null +++ b/apps/media/l10n/lt_LT.php @@ -0,0 +1,13 @@ + "Muzika", +"Play" => "Groti", +"Pause" => "Pristabdyti", +"Previous" => "Atgal", +"Next" => "Kitas", +"Mute" => "Nutildyti", +"Unmute" => "Ä®jungti garsÄ…", +"Rescan Collection" => "Atnaujinti kolekcijÄ…", +"Artist" => "AtlikÄ—jas", +"Album" => "Albumas", +"Title" => "Pavadinimas" +); diff --git a/apps/media/l10n/ms_MY.php b/apps/media/l10n/ms_MY.php index 43cc47c81d7..aaa1c3edfb9 100644 --- a/apps/media/l10n/ms_MY.php +++ b/apps/media/l10n/ms_MY.php @@ -6,7 +6,6 @@ "Next" => "Seterus", "Mute" => "Bisu", "Unmute" => "Nyahbisu", -"Songs scanned" => "Lagu telah diimbas", "Rescan Collection" => "Imbas semula koleksi", "Artist" => "Artis", "Album" => "Album", diff --git a/apps/media/l10n/nb_NO.php b/apps/media/l10n/nb_NO.php index 7afe796bb2c..dbed1526b76 100644 --- a/apps/media/l10n/nb_NO.php +++ b/apps/media/l10n/nb_NO.php @@ -6,7 +6,6 @@ "Next" => "Neste", "Mute" => "Demp", "Unmute" => "Skru pÃ¥ lyd", -"Songs scanned" => "Sanger skannet", "Rescan Collection" => "Skan samling pÃ¥ nytt", "Artist" => "Artist", "Album" => "Album", diff --git a/apps/media/l10n/nl.php b/apps/media/l10n/nl.php index 7ae0a761af0..705bf2a613c 100644 --- a/apps/media/l10n/nl.php +++ b/apps/media/l10n/nl.php @@ -1,7 +1,11 @@ "Muziek", -"Pause" => "Pauze", -"Songs scanned" => "nummers gescanned", +"Play" => "Afspelen", +"Pause" => "Pauzeer", +"Previous" => "Vorige", +"Next" => "Volgende", +"Mute" => "Dempen", +"Unmute" => "Dempen uit", "Rescan Collection" => "Collectie opnieuw scannen", "Artist" => "Artiest", "Album" => "Album", diff --git a/apps/media/l10n/nn_NO.php b/apps/media/l10n/nn_NO.php new file mode 100644 index 00000000000..2579c7b6ba0 --- /dev/null +++ b/apps/media/l10n/nn_NO.php @@ -0,0 +1,13 @@ + "Musikk", +"Play" => "Spel", +"Pause" => "Pause", +"Previous" => "Førre", +"Next" => "Neste", +"Mute" => "Demp", +"Unmute" => "Skru pÃ¥ lyd", +"Rescan Collection" => "Skann samlinga pÃ¥ nytt", +"Artist" => "Artist", +"Album" => "Album", +"Title" => "Tittel" +); diff --git a/apps/media/l10n/pl.php b/apps/media/l10n/pl.php index bb74d6d578a..3612d714eca 100644 --- a/apps/media/l10n/pl.php +++ b/apps/media/l10n/pl.php @@ -1,7 +1,11 @@ "Muzyka", +"Play" => "Odtwarzaj", "Pause" => "Zatrzymaj", -"Songs scanned" => "Przeskanowane utwory", +"Previous" => "Poprzedni", +"Next" => "NastÄ™pny", +"Mute" => "Wycisz", +"Unmute" => "WÅ‚Ä…cz", "Rescan Collection" => "Przeskanuj kolekcjÄ™", "Artist" => "Artysta", "Album" => "Album", diff --git a/apps/media/l10n/pt_BR.php b/apps/media/l10n/pt_BR.php index ac5b1c22d7d..6a1289cfa83 100644 --- a/apps/media/l10n/pt_BR.php +++ b/apps/media/l10n/pt_BR.php @@ -6,7 +6,6 @@ "Next" => "Próximo", "Mute" => "Mudo", "Unmute" => "Não Mudo", -"Songs scanned" => "Músicas encontradas", "Rescan Collection" => "Atualizar a Coleção", "Artist" => "Artista", "Album" => "Ãlbum", diff --git a/apps/media/l10n/ro.php b/apps/media/l10n/ro.php index a185a958f71..17711d61dc9 100644 --- a/apps/media/l10n/ro.php +++ b/apps/media/l10n/ro.php @@ -6,7 +6,6 @@ "Next" => "Următor", "Mute" => "Fără sonor", "Unmute" => "Cu sonor", -"Songs scanned" => "Melodii scanate", "Rescan Collection" => "Rescanează colecÈ›ia", "Artist" => "Artist", "Album" => "Album", diff --git a/apps/media/l10n/ru.php b/apps/media/l10n/ru.php index d0934a73363..5426332a1b0 100644 --- a/apps/media/l10n/ru.php +++ b/apps/media/l10n/ru.php @@ -6,7 +6,6 @@ "Next" => "Следующий", "Mute" => "Отключить звук", "Unmute" => "Включить звук", -"Songs scanned" => "ПеÑен проÑканировано", "Rescan Collection" => "ПереÑканировать коллекцию", "Artist" => "ИÑполнитель", "Album" => "Ðльбом", diff --git a/apps/media/l10n/sk_SK.php b/apps/media/l10n/sk_SK.php new file mode 100644 index 00000000000..05f52d76d88 --- /dev/null +++ b/apps/media/l10n/sk_SK.php @@ -0,0 +1,13 @@ + "Hudba", +"Play" => "PrehraÅ¥", +"Pause" => "Pauza", +"Previous" => "Predchádzajúce", +"Next" => "ÄŽalÅ¡ie", +"Mute" => "StlmiÅ¥", +"Unmute" => "Nahlas", +"Rescan Collection" => "Znovu skenovaÅ¥ Zbierku", +"Artist" => "Umelec", +"Album" => "Album", +"Title" => "Názov" +); diff --git a/apps/media/l10n/sl.php b/apps/media/l10n/sl.php new file mode 100644 index 00000000000..e7c0dd0c57b --- /dev/null +++ b/apps/media/l10n/sl.php @@ -0,0 +1,13 @@ + "Glasba", +"Play" => "Predvajaj", +"Pause" => "Pavza", +"Previous" => "PrejÅ¡nja", +"Next" => "Naslednja", +"Mute" => "IzkljuÄi zvok", +"Unmute" => "VkljuÄi zvok", +"Rescan Collection" => "Skeniraj zbirko", +"Artist" => "Izvajalec", +"Album" => "Album", +"Title" => "Naslov" +); diff --git a/apps/media/l10n/sr.php b/apps/media/l10n/sr.php index 7440bf43019..dff0daf4358 100644 --- a/apps/media/l10n/sr.php +++ b/apps/media/l10n/sr.php @@ -6,7 +6,6 @@ "Next" => "Следећа", "Mute" => "ИÑкључи звук", "Unmute" => "Укључи звук", -"Songs scanned" => "Претражених пеÑама", "Rescan Collection" => "Поново претражи збирку", "Artist" => "Извођач", "Album" => "Ðлбум", diff --git a/apps/media/l10n/sr@latin.php b/apps/media/l10n/sr@latin.php index fecdb0a5a74..6476898387b 100644 --- a/apps/media/l10n/sr@latin.php +++ b/apps/media/l10n/sr@latin.php @@ -6,7 +6,6 @@ "Next" => "Sledeća", "Mute" => "IskljuÄi zvuk", "Unmute" => "UkljuÄi zvuk", -"Songs scanned" => "Pretraženih pesama", "Rescan Collection" => "Ponovo pretraži zbirku", "Artist" => "IzvoÄ‘aÄ", "Album" => "Album", diff --git a/apps/media/l10n/sv.php b/apps/media/l10n/sv.php index f20fb2c6a57..75670a48515 100644 --- a/apps/media/l10n/sv.php +++ b/apps/media/l10n/sv.php @@ -6,7 +6,6 @@ "Next" => "Nästa", "Mute" => "Ljudlös", "Unmute" => "Ljud pÃ¥", -"Songs scanned" => "Skannade lÃ¥tar", "Rescan Collection" => "Sök igenom samlingen", "Artist" => "Artist", "Album" => "Album", diff --git a/apps/media/l10n/tr.php b/apps/media/l10n/tr.php new file mode 100644 index 00000000000..1eaf98145ac --- /dev/null +++ b/apps/media/l10n/tr.php @@ -0,0 +1,13 @@ + "Müzik", +"Play" => "Oynat", +"Pause" => "Beklet", +"Previous" => "Önceki", +"Next" => "Sonraki", +"Mute" => "Sesi kapat", +"Unmute" => "Sesi aç", +"Rescan Collection" => "Koleksiyonu Tara", +"Artist" => "Sanatç", +"Album" => "Albüm", +"Title" => "BaÅŸlık" +); diff --git a/apps/media/l10n/zh_CN.php b/apps/media/l10n/zh_CN.php index 4747dfd30e7..0b24cf3fe0d 100644 --- a/apps/media/l10n/zh_CN.php +++ b/apps/media/l10n/zh_CN.php @@ -6,7 +6,6 @@ "Next" => "åŽä¸€é¦–", "Mute" => "é™éŸ³", "Unmute" => "å–消é™éŸ³", -"Songs scanned" => "歌曲已扫æ", "Rescan Collection" => "é‡æ–°æ‰«æ收è—", "Artist" => "艺术家", "Album" => "专辑", diff --git a/core/l10n/ar.php b/core/l10n/ar.php new file mode 100644 index 00000000000..02b8bcda2ca --- /dev/null +++ b/core/l10n/ar.php @@ -0,0 +1,34 @@ + "سو٠نرسل لك بريد يحتوي على وصلة لتجديد كلمة السر.", +"Requested" => "تم طلب", +"Login failed!" => "محاولة دخول Ùاشلة!", +"Username" => "إسم المستخدم", +"Request reset" => "طلب تعديل", +"Your password was reset" => "لقد تم تعديل كلمة السر", +"New password" => "كلمة سر جديدة", +"Reset password" => "تعديل كلمة السر", +"Personal" => "خصوصيات", +"Users" => "المستخدم", +"Apps" => "التطبيقات", +"Admin" => "مستخدم رئيسي", +"Help" => "المساعدة", +"Cloud not found" => "لم يتم إيجاد", +"Create an admin account" => "أض٠مستخدم رئيسي ", +"Password" => "كلمة السر", +"Advanced" => "خيارات متقدمة", +"Data folder" => "مجلد المعلومات", +"Configure the database" => "أسس قاعدة البيانات", +"will be used" => "سيتم استخدمه", +"Database user" => "مستخدم قاعدة البيانات", +"Database password" => "كلمة سر مستخدم قاعدة البيانات", +"Database name" => "إسم قاعدة البيانات", +"Database host" => "خادم قاعدة البيانات", +"Finish setup" => "انهاء التعديلات", +"Log out" => "الخروج", +"Settings" => "تعديلات", +"Lost your password?" => "هل نسيت كلمة السر؟", +"remember" => "تذكر", +"You are logged out." => "تم الخروج بنجاح.", +"prev" => "السابق", +"next" => "التالي" +); diff --git a/core/l10n/bg_BG.php b/core/l10n/bg_BG.php index 6bf25e5598b..46047a35350 100644 --- a/core/l10n/bg_BG.php +++ b/core/l10n/bg_BG.php @@ -1,4 +1,12 @@ "Ще получите връзка за нулиране на паролата Ви.", +"Requested" => "ЗаÑвено", +"Login failed!" => "Входа пропадна!", +"Username" => "Потребител", +"Request reset" => "Ðулиране на заÑвка", +"Your password was reset" => "Вашата парола е нулирана", +"New password" => "Ðова парола", +"Reset password" => "Ðулиране на парола", "Personal" => "Лични", "Users" => "Потребители", "Apps" => "Програми", @@ -6,31 +14,21 @@ "Help" => "Помощ", "Cloud not found" => "облакът не намерен", "Create an admin account" => "Създаване на админ профил", -"Username" => "Потребител", "Password" => "Парола", +"Advanced" => "Разширено", +"Data folder" => "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни", "Configure the database" => "Конфигуриране на базата", "will be used" => "ще Ñе ползва", "Database user" => "Потребител за базата", "Database password" => "Парола за базата", "Database name" => "Име на базата", -"Advanced" => "Разширено", "Database host" => "ХоÑÑ‚ за базата", -"Data folder" => "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни", "Finish setup" => "Завършване на наÑтройките", -"gives you freedom and control over your own data" => "дава Ви Ñвобода и контрол на Вашите лични данни", "Log out" => "Изход", "Settings" => "ÐаÑтройки", "Lost your password?" => "Забравена парола?", "remember" => "запомни", "You are logged out." => "Вие излÑзохте.", -"You will receive a link to reset your password via Email." => "Ще получите връзка за да нулирате паролата Ñи.", -"Requested" => "ЗаÑвено", -"Login failed!" => "Входа пропадна!", -"Username or Email" => "ПотребителÑко име или Email", -"Request reset" => "ЗаÑвка за нулиране", "prev" => "пред.", -"next" => "Ñледващо", -"Your password was reset" => "Вашата парола е нулирана", -"New password" => "Ðова парола", -"Reset password" => "Ðулиране на парола" +"next" => "Ñледващо" ); diff --git a/core/l10n/ca.php b/core/l10n/ca.php index 3ecd041ad01..2f9017822eb 100644 --- a/core/l10n/ca.php +++ b/core/l10n/ca.php @@ -1,4 +1,12 @@ "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya.", +"Requested" => "Sol·licitat", +"Login failed!" => "No s'ha pogut entrar", +"Username" => "Nom d'usuari", +"Request reset" => "Sol·licita reinicialització", +"Your password was reset" => "La vostra contrasenya s'ha reinicialitzat", +"New password" => "Contrasenya nova", +"Reset password" => "Reinicialitza contrasenya", "Personal" => "Personal", "Users" => "Usuaris", "Apps" => "Aplicacions", @@ -6,31 +14,21 @@ "Help" => "Ajuda", "Cloud not found" => "No s'ha trobat el núvol", "Create an admin account" => "Crea un compte d'administrador", -"Username" => "Nom d'usuari", "Password" => "Contrasenya", +"Advanced" => "Avançat", +"Data folder" => "Carpeta de dades", "Configure the database" => "Configura la base de dades", "will be used" => "s'usarà", "Database user" => "Usuari de la base de dades", "Database password" => "Contrasenya de la base de dades", "Database name" => "Nom de la base de dades", -"Advanced" => "Avançat", "Database host" => "Ordinador central de la base de dades", -"Data folder" => "Carpeta de dades", "Finish setup" => "Acaba la configuració", -"gives you freedom and control over your own data" => "us dóna llibertat i control sobre les seves dades", "Log out" => "Sortir", "Settings" => "Arranjament", "Lost your password?" => "Heu perdut la contrasenya?", "remember" => "recorda'm", "You are logged out." => "Heu tancat la sessió.", -"You will receive a link to reset your password via Email." => "Rebreu un enllaç per correu electrònic per restablir la contrasenya", -"Requested" => "Sol·licitat", -"Login failed!" => "L'inici de sessió ha fallat!", -"Username or Email" => "Nom d'usuari o correu electrònic", -"Request reset" => "Sol.licitud de restabliment", "prev" => "anterior", -"next" => "següent", -"Your password was reset" => "La vostra contrasenya s'ha restablert", -"New password" => "Nova contrasenya", -"Reset password" => "Restabliment de la contrasenya" +"next" => "següent" ); diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php index 08a90ba4a0f..ad2b34e7a70 100644 --- a/core/l10n/cs_CZ.php +++ b/core/l10n/cs_CZ.php @@ -1,4 +1,12 @@ "Bude Vám zaslán odkaz pro obnovu hesla", +"Requested" => "Požadováno", +"Login failed!" => "PÅ™ihlášení selhalo", +"Username" => "Uživatelské jméno", +"Request reset" => "Vyžádat obnovu", +"Your password was reset" => "VaÅ¡e heslo bylo obnoveno", +"New password" => "Nové heslo", +"Reset password" => "Obnovit heslo", "Personal" => "Osobní", "Users" => "Uživatelé", "Apps" => "Aplikace", @@ -6,21 +14,21 @@ "Help" => "NápovÄ›da", "Cloud not found" => "Cloud nebyl nalezen", "Create an admin account" => "VytvoÅ™it úÄet správce", -"Username" => "Uživatelské jméno", "Password" => "Heslo", +"Advanced" => "Rozšířené volby", +"Data folder" => "Datový adresář", "Configure the database" => "Konfigurace databáze", "will be used" => "bude použito", "Database user" => "Uživatel databáze", "Database password" => "Heslo k databázi", "Database name" => "Název databáze", -"Advanced" => "Rozšířené volby", -"Data folder" => "Datový adresář", +"Database host" => "Hostitel databáze", "Finish setup" => "DokonÄit instalaci", "Log out" => "Odhlásit se", "Settings" => "Nastavení", +"Lost your password?" => "Zapomenuté heslo?", "remember" => "zapamatovat si", "You are logged out." => "Jste odhlášeni.", -"Login failed!" => "PÅ™ihlášení se nezdaÅ™ilo!", "prev" => "zpÄ›t", "next" => "vpÅ™ed" ); diff --git a/core/l10n/da.php b/core/l10n/da.php index 5c1ca0dc211..298ee69ec22 100644 --- a/core/l10n/da.php +++ b/core/l10n/da.php @@ -1,36 +1,34 @@ "Du vil modtage et link til at nulstille dit kodeord via email.", +"Requested" => "Forespugt", +"Login failed!" => "Login fejlede!", +"Username" => "Brugernavn", +"Request reset" => "Anmod om nulstilling", +"Your password was reset" => "Dit kodeord blev nulstillet", +"New password" => "Nyt kodeord", +"Reset password" => "Nulstil kodeord", "Personal" => "Personlig", "Users" => "Brugere", "Apps" => "Apps", "Admin" => "Admin", "Help" => "Hjælp", "Cloud not found" => "Sky ikke fundet", -"Create an admin account" => "Lav en administrator konto", -"Username" => "Brugernavn", +"Create an admin account" => "Opret en administratorkonto", "Password" => "Kodeord", +"Advanced" => "Avanceret", +"Data folder" => "Datamappe", "Configure the database" => "Konfigurer databasen", "will be used" => "vil blive brugt", -"Database user" => "Database-bruger", -"Database password" => "Database-kodeord", -"Database name" => "Database-navn", -"Advanced" => "Avanceret", -"Database host" => "Database host", -"Data folder" => "Data mappe", -"Finish setup" => "Afslut installation", -"gives you freedom and control over your own data" => "giver dig frihed og kontrol over dine egne data", +"Database user" => "Databasebruger", +"Database password" => "Databasekodeord", +"Database name" => "Navn pÃ¥ database", +"Database host" => "Databasehost", +"Finish setup" => "Afslut opsætning", "Log out" => "Log ud", "Settings" => "Indstillinger", "Lost your password?" => "Mistet dit kodeord?", "remember" => "husk", -"You are logged out." => "Du er nu logget ud", -"You will receive a link to reset your password via Email." => "Du vil modtage et link til at nulstille din adgangskode via e-mail.", -"Requested" => "Anmodet", -"Login failed!" => "Login mislykkedes!", -"Username or Email" => "Brugernavn eller E-mail", -"Request reset" => "Anmod om nulstilling", +"You are logged out." => "Du er nu logget ud.", "prev" => "forrige", -"next" => "næste", -"Your password was reset" => "Din adgangskode blev nulstillet", -"New password" => "Ny adgangskode", -"Reset password" => "Nulstil adgangskode" +"next" => "næste" ); diff --git a/core/l10n/de.php b/core/l10n/de.php index 0b5a0e13cea..0bbfa406fad 100644 --- a/core/l10n/de.php +++ b/core/l10n/de.php @@ -1,4 +1,12 @@ "Sie erhalten einen Link, um Ihr Passwort per E-Mail zurückzusetzen.", +"Requested" => "Angefragt", +"Login failed!" => "Login fehlgeschlagen!", +"Username" => "Nutzername", +"Request reset" => "Anfrage zurückgesetzt", +"Your password was reset" => "Ihr Passwort wurde zurückgesetzt.", +"New password" => "Neues Passwort", +"Reset password" => "Passwort zurücksetzen", "Personal" => "Persönlich", "Users" => "Nutzer", "Apps" => "Anwendungen", @@ -6,31 +14,21 @@ "Help" => "Hilfe", "Cloud not found" => "Cloud nicht verfügbar", "Create an admin account" => "Admin-Konto anlegen", -"Username" => "Nutzername", "Password" => "Passwort", +"Advanced" => "Erweitert", +"Data folder" => "Datenverzeichnis", "Configure the database" => "Datenbank einrichten", "will be used" => "wird genutzt", "Database user" => "Datenbanknutzer", "Database password" => "Datenbankpasswort", "Database name" => "Datenbankname", -"Advanced" => "Erweitert", "Database host" => "Datenbank-Host", -"Data folder" => "Datenverzeichnis", "Finish setup" => "Installation abschließen", -"gives you freedom and control over your own data" => "gibt dir Freiheit und Kontrolle über deine eigenen Daten", "Log out" => "Abmelden", "Settings" => "Einstellungen", "Lost your password?" => "Passwort vergessen?", "remember" => "merken", "You are logged out." => "Abgemeldet", -"You will receive a link to reset your password via Email." => "Du wirst per Email einen Link zum Zurücksetzen deines Passworts erhalten.", -"Requested" => "zurückgesetzt", -"Login failed!" => "Anmeldung fehlgeschlagen!", -"Username or Email" => "Nutzername oder Email", -"Request reset" => "Zurücksetzen", "prev" => "Zurück", -"next" => "Weiter", -"Your password was reset" => "Dein Passwort wurde zurückgesetzt.", -"New password" => "Neues Passwort", -"Reset password" => "Zurücksetzen" +"next" => "Weiter" ); diff --git a/core/l10n/el.php b/core/l10n/el.php index c75227f8aad..c831f5a64e3 100644 --- a/core/l10n/el.php +++ b/core/l10n/el.php @@ -1,4 +1,12 @@ "Θα λάβετε ένα σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου.", +"Requested" => "Ζητήθησαν", +"Login failed!" => "Η σÏνδεση απέτυχε!", +"Username" => "Όνομα ΧÏήστη", +"Request reset" => "ΕπαναφοÏά αίτησης", +"Your password was reset" => "Ο κωδικός Ï€Ïόσβασής σας επαναφέÏθηκε", +"New password" => "Îέος κωδικός", +"Reset password" => "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης", "Personal" => "ΠÏοσωπικά", "Users" => "ΧÏήστες", "Apps" => "ΕφαÏμογές", @@ -6,31 +14,21 @@ "Help" => "Βοήθεια", "Cloud not found" => "Δεν βÏέθηκε σÏννεφο", "Create an admin account" => "ΔημιουÏγήστε έναν λογαÏιασμό διαχειÏιστή", -"Username" => "Όνομα ΧÏήστη", "Password" => "Κωδικός", +"Advanced" => "Για Ï€ÏοχωÏημένους", +"Data folder" => "Φάκελος δεδομένων", "Configure the database" => "ΔιαμόÏφωση της βάσης δεδομένων", "will be used" => "θα χÏησιμοποιηθοÏν", "Database user" => "ΧÏήστης της βάσης δεδομένων", "Database password" => "Κωδικός Ï€Ïόσβασης βάσης δεδομένων", "Database name" => "Όνομα βάσης δεδομένων", -"Advanced" => "Για Ï€ÏοχωÏημένους", "Database host" => "Διακομιστής βάσης δεδομένων", -"Data folder" => "Φάκελος δεδομένων", "Finish setup" => "ΟλοκλήÏωση εγκατάστασης", -"gives you freedom and control over your own data" => "σας δίνει την ελευθεÏία και τον έλεγχο επί των δικών σας δεδομένων", "Log out" => "ΑποσÏνδεση", "Settings" => "Ρυθμίσεις", "Lost your password?" => "Ξεχάσατε τον κωδικό σας;", "remember" => "να με θυμάσαι", "You are logged out." => "Έχετε αποσυνδεθεί.", -"You will receive a link to reset your password via Email." => "Θα λάβετε ένα σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας, μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου.", -"Requested" => "Αιτήθησαν", -"Login failed!" => "Η σÏνδεση απέτυχε!", -"Username or Email" => "Όνομα ΧÏήστη ή Email", -"Request reset" => "ΕπαναφοÏάς αίτησης", "prev" => "Ï€ÏοηγοÏμενο", -"next" => "επόμενο", -"Your password was reset" => "Έγινε επαναφοÏά του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασής σας", -"New password" => "Îέος κωδικός", -"Reset password" => "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" +"next" => "επόμενο" ); diff --git a/core/l10n/eo.php b/core/l10n/eo.php new file mode 100644 index 00000000000..9719ab39c19 --- /dev/null +++ b/core/l10n/eo.php @@ -0,0 +1,34 @@ + "Vi ricevos ligilon retpoÅte por rekomencigi vian pasvorton.", +"Requested" => "Petita", +"Login failed!" => "Ensaluto malsukcesis!", +"Username" => "Uzantonomo", +"Request reset" => "Peti rekomencigon", +"Your password was reset" => "Via pasvorto rekomencis", +"New password" => "Nova pasvorto", +"Reset password" => "Rekomenci la pasvorton", +"Personal" => "Persona", +"Users" => "Uzantoj", +"Apps" => "Aplikaĵoj", +"Admin" => "Administranto", +"Help" => "Helpo", +"Cloud not found" => "La nubo ne estas trovita", +"Create an admin account" => "Krei administran konton", +"Password" => "Pasvorto", +"Advanced" => "Porsperta", +"Data folder" => "Datuma dosierujo", +"Configure the database" => "Agordi la datumbazon", +"will be used" => "estos uzata", +"Database user" => "Datumbaza uzanto", +"Database password" => "Datumbaza pasvorto", +"Database name" => "Datumbaza nomo", +"Database host" => "Datumbaza gastigo", +"Finish setup" => "Fini la instalon", +"Log out" => "Elsaluti", +"Settings" => "Agordo", +"Lost your password?" => "Ĉu vi perdis vian pasvorton?", +"remember" => "memori", +"You are logged out." => "Vi elsalutis.", +"prev" => "maljena", +"next" => "jena" +); diff --git a/core/l10n/es.php b/core/l10n/es.php index e997a17002f..20a92b51e8b 100644 --- a/core/l10n/es.php +++ b/core/l10n/es.php @@ -1,4 +1,12 @@ "Recibirás un enlace por correo electrónico para restablecer tu contraseña", +"Requested" => "Pedido", +"Login failed!" => "¡Fallo al iniciar sesión!", +"Username" => "Nombre de usuario", +"Request reset" => "Solicitar restablecimiento", +"Your password was reset" => "Tu contraseña se ha restablecido", +"New password" => "Nueva contraseña", +"Reset password" => "Restablecer contraseña", "Personal" => "Personal", "Users" => "Usuarios", "Apps" => "Aplicaciones", @@ -6,31 +14,21 @@ "Help" => "Ayuda", "Cloud not found" => "No se encontró la nube", "Create an admin account" => "Crea una cuenta de administrador", -"Username" => "Nombre de usuario", "Password" => "Contraseña", +"Advanced" => "Avanzado", +"Data folder" => "Directorio de almacenamiento", "Configure the database" => "Configurar la base de datos", "will be used" => "serán utilizados", "Database user" => "Usuario de la base de datos", "Database password" => "Contraseña de la base de datos", "Database name" => "Nombre de la base de datos", -"Advanced" => "Avanzado", "Database host" => "Host de la base de datos", -"Data folder" => "Directorio de almacenamiento", "Finish setup" => "Completar la instalación", -"gives you freedom and control over your own data" => "te da la libertad y el control sobre tus propios datos", "Log out" => "Salir", "Settings" => "Ajustes", "Lost your password?" => "¿Has perdido tu contraseña?", "remember" => "recuérdame", "You are logged out." => "Has cerrado sesión.", -"You will receive a link to reset your password via Email." => "Recibirás un link para restablecer tu contraseña vía Email.", -"Requested" => "Solicitado", -"Login failed!" => "¡No se pudo iniciar sesión!", -"Username or Email" => "Nombre de usuario o Email", -"Request reset" => "Solicitar restablecimiento", "prev" => "anterior", -"next" => "siguiente", -"Your password was reset" => "Tu contraseña se ha restablecido", -"New password" => "Nueva contraseña", -"Reset password" => "Restablecer contraseña" +"next" => "siguiente" ); diff --git a/core/l10n/et_EE.php b/core/l10n/et_EE.php index 84d05d17ba7..ba70a6a0c42 100644 --- a/core/l10n/et_EE.php +++ b/core/l10n/et_EE.php @@ -1,4 +1,12 @@ "Sinu parooli taastamise link saadetakse sulle e-postile.", +"Requested" => "Kohustuslik", +"Login failed!" => "Sisselogimine ebaõnnestus!", +"Username" => "Kasutajanimi", +"Request reset" => "Päringu taastamine", +"Your password was reset" => "Sinu parool on taastatud", +"New password" => "Uus parool", +"Reset password" => "Nulli parool", "Personal" => "isiklik", "Users" => "Kasutajad", "Apps" => "Programmid", @@ -6,31 +14,21 @@ "Help" => "Abiinfo", "Cloud not found" => "Pilve ei leitud", "Create an admin account" => "Loo admini konto", -"Username" => "Kasutajanimi", "Password" => "Parool", +"Advanced" => "Lisavalikud", +"Data folder" => "Andmete kaust", "Configure the database" => "Seadista andmebaasi", "will be used" => "kasutatakse", "Database user" => "Andmebaasi kasutaja", "Database password" => "Andmebaasi parool", "Database name" => "Andmebasi nimi", -"Advanced" => "Lisavalikud", "Database host" => "Andmebaasi host", -"Data folder" => "Andmete kaust", "Finish setup" => "Lõpeta seadistamine", -"gives you freedom and control over your own data" => "Annab sulle vabaduse ja kontrolli sinu enda andmete üle", "Log out" => "Logi välja", "Settings" => "Seaded", "Lost your password?" => "Kaotasid oma parooli?", "remember" => "pea meeles", "You are logged out." => "Sa oled välja loginud", -"You will receive a link to reset your password via Email." => "Sulle saadetakse e-postile link, millelt sa saad oma parooli taastada.", -"Requested" => "Kohustuslik", -"Login failed!" => "Sisselogimine ebaõnnestus", -"Username or Email" => "Kasutajanimi või e-post", -"Request reset" => "Palu taastamist", "prev" => "eelm", -"next" => "järgm", -"Your password was reset" => "Sinu parool on taastatud", -"New password" => "Uus parool", -"Reset password" => "Nulli parool" +"next" => "järgm" ); diff --git a/core/l10n/eu.php b/core/l10n/eu.php new file mode 100644 index 00000000000..bc1993c024c --- /dev/null +++ b/core/l10n/eu.php @@ -0,0 +1,34 @@ + "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez.", +"Requested" => "Eskatuta", +"Login failed!" => "Saio hasierak huts egin du!", +"Username" => "Erabiltzaile izena", +"Request reset" => "Eskaera berrezarri da", +"Your password was reset" => "Zure pasahitza berrezarri da", +"New password" => "Pasahitz berria", +"Reset password" => "Berrezarri pasahitza", +"Personal" => "Pertsonala", +"Users" => "Erabiltzaileak", +"Apps" => "Aplikazioak", +"Admin" => "Kudeatzailea", +"Help" => "Laguntza", +"Cloud not found" => "Ez da hodeia aurkitu", +"Create an admin account" => "Sortu kudeatzaile kontu bat", +"Password" => "Pasahitza", +"Advanced" => "Aurreratua", +"Data folder" => "Datuen karpeta", +"Configure the database" => "Konfiguratu datu basea", +"will be used" => "erabiliko da", +"Database user" => "Datubasearen erabiltzailea", +"Database password" => "Datubasearen pasahitza", +"Database name" => "Datubasearen izena", +"Database host" => "Datubasearen hostalaria", +"Finish setup" => "Bukatu konfigurazioa", +"Log out" => "Saioa bukatu", +"Settings" => "Ezarpenak", +"Lost your password?" => "Galdu duzu pasahitza?", +"remember" => "gogoratu", +"You are logged out." => "Zure saioa bukatu da.", +"prev" => "aurrekoa", +"next" => "hurrengoa" +); diff --git a/core/l10n/fr.php b/core/l10n/fr.php index 15e7846efbb..a736cf89745 100644 --- a/core/l10n/fr.php +++ b/core/l10n/fr.php @@ -1,4 +1,12 @@ "Vous allez recevoir un e-mail contenant un lien pour réinitialiser votre mot de passe", +"Requested" => "Demande envoyée", +"Login failed!" => "Nom d'utilisateur ou e-mail invalide", +"Username" => "Nom d'utilisateur", +"Request reset" => "Demander la réinitialisation", +"Your password was reset" => "Votre mot de passe a été réinitialisé", +"New password" => "Nouveau mot de passe", +"Reset password" => "Réinitialiser le mot de passe", "Personal" => "Personnels", "Users" => "Utilisateurs", "Apps" => "Applications", @@ -6,31 +14,21 @@ "Help" => "Aide", "Cloud not found" => "Introuvable", "Create an admin account" => "Créer un compte administrateur", -"Username" => "Nom d'utilisateur", "Password" => "Mot de passe", +"Advanced" => "Avancé", +"Data folder" => "Répertoire des données", "Configure the database" => "Configurer la base de données", "will be used" => "sera utilisé", "Database user" => "Utilisateur de la base de données", "Database password" => "Mot de passe de la base de données", "Database name" => "Nom de la base de données", -"Advanced" => "Avancé", "Database host" => "Serveur de la base de données", -"Data folder" => "Répertoire des données", "Finish setup" => "Terminer l'installation", -"gives you freedom and control over your own data" => "vous donne la liberté et le contrôle de vos propres données", "Log out" => "Se déconnecter", "Settings" => "Paramètres", "Lost your password?" => "Mot de passe perdu ?", "remember" => "se souvenir de moi", "You are logged out." => "Vous êtes désormais déconnecté.", -"You will receive a link to reset your password via Email." => "Vous allez recevoir un lien par email qui vous permettra de réinitialiser votre mot de passe.", -"Requested" => "Nécessaire", -"Login failed!" => "Échec de la connexion !", -"Username or Email" => "Nom d'utilisateur ou Email", -"Request reset" => "Demande de réinitialisation", "prev" => "précédent", -"next" => "suivant", -"Your password was reset" => "Votre mot de passe a été réinitialisé", -"New password" => "Nouveau mot de passe", -"Reset password" => "Réinitialisation du mot de passe" +"next" => "suivant" ); diff --git a/core/l10n/he.php b/core/l10n/he.php new file mode 100644 index 00000000000..f91d283118e --- /dev/null +++ b/core/l10n/he.php @@ -0,0 +1,34 @@ + "יישלח לתיבת הדו×״ל שלך קישור ל×יפוס הססמה.", +"Requested" => "נדרש", +"Login failed!" => "הכניסה נכשלה!", +"Username" => "×©× ×ž×©×ª×ž×©", +"Request reset" => "בקשת ×יפוס", +"Your password was reset" => "הססמה שלך ×ופסה", +"New password" => "ססמה חדשה", +"Reset password" => "×יפוס ססמה", +"Personal" => "×ישי", +"Users" => "משתמשי×", +"Apps" => "יישומי×", +"Admin" => "מנהל", +"Help" => "עזרה", +"Cloud not found" => "ענן ×œ× × ×ž×¦×", +"Create an admin account" => "יצירת חשבון מנהל", +"Password" => "ססמה", +"Advanced" => "מתקד×", +"Data folder" => "תיקיית נתוני×", +"Configure the database" => "הגדרת מסד הנתוני×", +"will be used" => "ינוצלו", +"Database user" => "×©× ×ž×©×ª×ž×© במסד הנתוני×", +"Database password" => "ססמת מסד הנתוני×", +"Database name" => "×©× ×ž×¡×“ הנתוני×", +"Database host" => "שרת בסיס נתוני×", +"Finish setup" => "×¡×™×•× ×”×ª×§× ×”", +"Log out" => "התנתקות", +"Settings" => "הגדרות", +"Lost your password?" => "שכחת ×ת ססמתך?", +"remember" => "שמירת הססמה", +"You are logged out." => "×ינך מחובר.", +"prev" => "קוד×", +"next" => "הב×" +); diff --git a/core/l10n/hr.php b/core/l10n/hr.php new file mode 100644 index 00000000000..f129ca70608 --- /dev/null +++ b/core/l10n/hr.php @@ -0,0 +1,34 @@ + "Primit ćete link kako biste poniÅ¡tili zaporku putem e-maila.", +"Requested" => "Zahtijevano", +"Login failed!" => "Prijava nije uspjela!", +"Username" => "KorisniÄko ime", +"Request reset" => "Zahtjev za resetiranjem", +"Your password was reset" => "VaÅ¡a lozinka je resetirana", +"New password" => "nova lozinka", +"Reset password" => "poniÅ¡tavanje lozinke", +"Personal" => "Osobno", +"Users" => "korisnici", +"Apps" => "aplikacije", +"Admin" => "administrator", +"Help" => "pomoć", +"Cloud not found" => "Cloud nije pronaÄ‘en", +"Create an admin account" => "stvoriti Administratorski raÄun", +"Password" => "Lozinka", +"Advanced" => "Dodatno", +"Data folder" => "Mapa baze podataka", +"Configure the database" => "konfigurirati baze podataka", +"will be used" => "će se koristiti", +"Database user" => "korisnik baze podataka", +"Database password" => "lozinka baze podataka", +"Database name" => "ime baze podataka", +"Database host" => "Poslužitelj baze podataka", +"Finish setup" => "zavrÅ¡iti postavljanje", +"Log out" => "odjaviti", +"Settings" => "postavke", +"Lost your password?" => "Izgubili ste lozinku?", +"remember" => "zapamtiti", +"You are logged out." => "Vi ste odjavljeni.", +"prev" => "prethodan", +"next" => "sljedeći" +); diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php new file mode 100644 index 00000000000..9a7d2bc5395 --- /dev/null +++ b/core/l10n/hu_HU.php @@ -0,0 +1,33 @@ + "Egy e-mailben kap értesítést a jelszóváltoztatás módjáról.", +"Requested" => "Kért", +"Login failed!" => "Belépés sikertelen!", +"Username" => "Felhasználói név", +"Your password was reset" => "Jelszó megváltoztatásra került", +"New password" => "Új jelszó", +"Reset password" => "Jelszó beállítás", +"Personal" => "Személyes", +"Users" => "Felhasználók", +"Apps" => "Alkalmazások", +"Admin" => "Adminisztráció", +"Help" => "Súgó", +"Cloud not found" => "Nem talált felhÅ‘", +"Create an admin account" => "Adminisztrációs fiók létrehozása", +"Password" => "Jelszó", +"Advanced" => "Fejlett", +"Data folder" => "Adat könyvtár", +"Configure the database" => "Adatbázis konfigurálása", +"will be used" => "használva lesz", +"Database user" => "Adatbázis felhasználó", +"Database password" => "Adatbázis jelszó", +"Database name" => "Adatbázis név", +"Database host" => "Adatbázis szerver", +"Finish setup" => "Beállítások befejezése", +"Log out" => "Kilépés", +"Settings" => "Beállítások", +"Lost your password?" => "Elfelejtett jelszó?", +"remember" => "emlékezni", +"You are logged out." => "Kilépés sikerült.", +"prev" => "ElÅ‘zÅ‘", +"next" => "KövetkezÅ‘" +); diff --git a/core/l10n/ia.php b/core/l10n/ia.php new file mode 100644 index 00000000000..2d41601d69a --- /dev/null +++ b/core/l10n/ia.php @@ -0,0 +1,27 @@ + "Requestate", +"Login failed!" => "Initio de session fallate!", +"Username" => "Nomine de usator", +"Request reset" => "Requestar reinitialisation", +"Your password was reset" => "Tu contrasigno esseva reinitialisate", +"New password" => "Nove contrasigno", +"Reset password" => "Reinitialisar contrasigno", +"Users" => "Usatores", +"Apps" => "Applicationes", +"Help" => "Adjuta", +"Cloud not found" => "Nube non trovate", +"Create an admin account" => "Crear un conto de administration", +"Password" => "Contrasigno", +"Advanced" => "Avantiate", +"Data folder" => "Dossier de datos", +"Configure the database" => "Configurar le base de datos", +"will be used" => "essera usate", +"Database user" => "Usator de base de datos", +"Database password" => "Contrasigno de base de datos", +"Database name" => "Nomine de base de datos", +"Log out" => "Clauder le session", +"Settings" => "Configurationes", +"remember" => "memora", +"prev" => "prev", +"next" => "prox" +); diff --git a/core/l10n/id.php b/core/l10n/id.php index 56221fafb96..eb20a4209c5 100644 --- a/core/l10n/id.php +++ b/core/l10n/id.php @@ -1,4 +1,5 @@ "Username", "Personal" => "Pribadi", "Users" => "Pengguna", "Apps" => "Aplikasi", @@ -6,31 +7,21 @@ "Help" => "Bantuan", "Cloud not found" => "Cloud tidak ditemukan", "Create an admin account" => "Buat sebuah akun admin", -"Username" => "Username", "Password" => "Password", +"Advanced" => "Tingkat Lanjut", +"Data folder" => "Folder data", "Configure the database" => "Konfigurasi database", "will be used" => "akan digunakan", "Database user" => "Pengguna database", "Database password" => "Password database", "Database name" => "Nama database", -"Advanced" => "Tingkat Lanjut", "Database host" => "Host database", -"Data folder" => "Folder data", "Finish setup" => "Selesaikan instalasi", -"gives you freedom and control over your own data" => "memberikan anda kebebasan dan kendali atas data anda sendiri", "Log out" => "Keluar", "Settings" => "Setelan", "Lost your password?" => "Lupa password anda?", "remember" => "selalu login", "You are logged out." => "Anda telah keluar.", -"You will receive a link to reset your password via Email." => "Anda akan menerima tautan untuk menset ulang password anda via Email.", -"Requested" => "Telah diminta", -"Login failed!" => "Gagal masuk!", -"Username or Email" => "Nama Pengguna atau Email", -"Request reset" => "Meminta set ulang", "prev" => "sebelum", -"next" => "selanjutnya", -"Your password was reset" => "Password anda telah diset ulang", -"New password" => "Password Baru", -"Reset password" => "Set Ulang Password" +"next" => "selanjutnya" ); diff --git a/core/l10n/it.php b/core/l10n/it.php index 1d743fa87ed..893e41e407e 100644 --- a/core/l10n/it.php +++ b/core/l10n/it.php @@ -1,36 +1,34 @@ "Riceverai un link per resettare la tua password via Email", +"Requested" => "Richiesto", +"Login failed!" => "Login fallito!", +"Username" => "Nome utente", +"Request reset" => "Richiesta di ripristino", +"Your password was reset" => "La password è stata reimpostata", +"New password" => "Nuova password", +"Reset password" => "Reimposta password", "Personal" => "Personale", "Users" => "Utenti", "Apps" => "Applicazioni", "Admin" => "Admin", "Help" => "Aiuto", "Cloud not found" => "Cloud non trovata", -"Create an admin account" => "Crea un <strong>account amministratore</strong>", -"Username" => "Nome utente", +"Create an admin account" => "Crea un account amministratore", "Password" => "Password", +"Advanced" => "Opzioni avanzate", +"Data folder" => "Cartella dati", "Configure the database" => "Configura il database", "will be used" => "sarà usato", "Database user" => "Utente database", "Database password" => "Password database", "Database name" => "Nome database", -"Advanced" => "Opzioni avanzate", "Database host" => "Host del database", -"Data folder" => "Cartella dati", "Finish setup" => "Termina", -"gives you freedom and control over your own data" => "Libertà e controllo dei propri dati", "Log out" => "Log out", "Settings" => "Impostazioni", "Lost your password?" => "Password persa?", "remember" => "ricorda", "You are logged out." => "Sei uscito.", -"You will receive a link to reset your password via Email." => "Riceverai via email un link per il reset della tua password", -"Requested" => "Richiesto", -"Login failed!" => "Login fallito!", -"Username or Email" => "Username o email", -"Request reset" => "Reset richiesta", "prev" => "precedente", -"next" => "successivo", -"Your password was reset" => "tua password è stata resettata", -"New password" => "Nuova password", -"Reset password" => "Reset password" +"next" => "successivo" ); diff --git a/core/l10n/ja_JP.php b/core/l10n/ja_JP.php new file mode 100644 index 00000000000..ae2b47253cc --- /dev/null +++ b/core/l10n/ja_JP.php @@ -0,0 +1,34 @@ + "パスワードをリセットã™ã‚‹ãƒªãƒ³ã‚¯ãŒãƒ¡ãƒ¼ãƒ«ã§å±Šãã¾ã™ã€‚", +"Requested" => "é€ä¿¡ã•ã‚Œã¾ã—ãŸ", +"Login failed!" => "ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚", +"Username" => "ユーザå", +"Request reset" => "リセットをè¦æ±‚ã™ã‚‹ã€‚", +"Your password was reset" => "ã‚ãªãŸã®ãƒ‘スワードã¯ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã—ãŸã€‚", +"New password" => "æ–°ã—ã„パスワードを入力", +"Reset password" => "パスワードをリセット", +"Personal" => "個人設定", +"Users" => "ユーザ", +"Apps" => "アプリ", +"Admin" => "管ç†è€…", +"Help" => "ヘルプ", +"Cloud not found" => "見ã¤ã‘られã¾ã›ã‚“", +"Create an admin account" => "管ç†è€…アカウントを作æˆã—ã¦ãã ã•ã„", +"Password" => "パスワード", +"Advanced" => "詳細設定", +"Data folder" => "データフォルダ", +"Configure the database" => "データベースを設定ã—ã¦ãã ã•ã„", +"will be used" => "ãŒä½¿ç”¨ã•ã‚Œã¾ã™", +"Database user" => "データベースã®ãƒ¦ãƒ¼ã‚¶å", +"Database password" => "データベースã®ãƒ‘スワード", +"Database name" => "データベースå", +"Database host" => "データベースã®ãƒ›ã‚¹ãƒˆå", +"Finish setup" => "セットアップを完了ã—ã¾ã™", +"Log out" => "ログアウト", +"Settings" => "設定", +"Lost your password?" => "パスワードãŒã‚ã‹ã‚‰ãªããªã‚Šã¾ã—ãŸã‹ï¼Ÿ", +"remember" => "パスワードを記憶ã™ã‚‹", +"You are logged out." => "ログアウトã—ã¾ã—ãŸã€‚", +"prev" => "å‰", +"next" => "次" +); diff --git a/core/l10n/lb.php b/core/l10n/lb.php index 40bd86d6a3a..d663b6dc424 100644 --- a/core/l10n/lb.php +++ b/core/l10n/lb.php @@ -1,4 +1,12 @@ "Du kriss en Link fir däin Passwuert nei ze setzen via Email geschéckt.", +"Requested" => "Gefrot", +"Login failed!" => "Falschen Login!", +"Username" => "Benotzernumm", +"Request reset" => "Reset ufroen", +"Your password was reset" => "Dän Passwuert ass zeréck gesat gin", +"New password" => "Neit Passwuert", +"Reset password" => "Passwuert zeréck setzen", "Personal" => "Perséinlech", "Users" => "Benotzer", "Apps" => "Applicatiounen", @@ -6,31 +14,21 @@ "Help" => "Hëllef", "Cloud not found" => "Cloud net fonnt", "Create an admin account" => "En Admin Account uleeën", -"Username" => "Benotzernumm", "Password" => "Passwuert", +"Advanced" => "Erweidert", +"Data folder" => "Daten Dossier", "Configure the database" => "Datebank konfiguréieren", "will be used" => "wärt benotzt ginn", "Database user" => "Datebank Benotzer", "Database password" => "Datebank Passwuert", "Database name" => "Datebank Numm", -"Advanced" => "Erweidert", "Database host" => "Datebank Server", -"Data folder" => "Daten Dossier", "Finish setup" => "Installatioun ofschléissen", -"gives you freedom and control over your own data" => "gëtt dir Fräiheet an Kontroll iwwert deng eegen Daten", "Log out" => "Ausloggen", "Settings" => "Astellungen", "Lost your password?" => "Passwuert vergiess?", "remember" => "verhalen", "You are logged out." => "Du bass ausgeloggt.", -"You will receive a link to reset your password via Email." => "Du kriss per E-mail en Link geschéckt fir däin Passwuert nei ze setzen.", -"Requested" => "Verlaangt", -"Login failed!" => "Aloggen feelgeschloen!", -"Username or Email" => "Benotzernumm oder E-Mail", -"Request reset" => "Reset ufroen", "prev" => "zeréck", -"next" => "weider", -"Your password was reset" => "Dän Passwuert ass nei gesat ginn", -"New password" => "Neit Passwuert", -"Reset password" => "Passwuert nei setzen" +"next" => "weider" ); diff --git a/core/l10n/lt_LT.php b/core/l10n/lt_LT.php new file mode 100644 index 00000000000..0d5306321c2 --- /dev/null +++ b/core/l10n/lt_LT.php @@ -0,0 +1,33 @@ + "Elektroniniu paÅ¡tu gausite nuorodÄ…, su kuria galÄ—site iÅ¡ naujo nustatyti slaptažodį.", +"Requested" => "Užklausta", +"Login failed!" => "Prisijungti nepavyko!", +"Username" => "Prisijungimo vardas", +"Request reset" => "PraÅ¡yti nustatymo iÅ¡ najo", +"Your password was reset" => "JÅ«sų slaptažodis buvo nustatytas iÅ¡ naujo", +"New password" => "Naujas slaptažodis", +"Reset password" => "Atkurti slaptažodį", +"Personal" => "Asmeniniai", +"Users" => "Vartotojai", +"Apps" => "Programos", +"Admin" => "Administravimas", +"Help" => "Pagalba", +"Cloud not found" => "Negalima rasti", +"Create an admin account" => "Sukurti administratoriaus paskyrÄ…", +"Password" => "Slaptažodis", +"Data folder" => "Duomenų katalogas", +"Configure the database" => "Nustatyti duomenų bazÄ™", +"will be used" => "bus naudojama", +"Database user" => "Duomenų bazÄ—s vartotojas", +"Database password" => "Duomenų bazÄ—s slaptažodis", +"Database name" => "Duomenų bazÄ—s pavadinimas", +"Database host" => "Duomenų bazÄ—s serveris", +"Finish setup" => "Baigti diegimÄ…", +"Log out" => "Atsijungti", +"Settings" => "Nustatymai", +"Lost your password?" => "PamirÅ¡ote slaptažodį?", +"remember" => "prisiminti", +"You are logged out." => "JÅ«s atsijungÄ—te.", +"prev" => "atgal", +"next" => "kitas" +); diff --git a/core/l10n/ms_MY.php b/core/l10n/ms_MY.php index e7551a30bb8..b2e68c53658 100644 --- a/core/l10n/ms_MY.php +++ b/core/l10n/ms_MY.php @@ -1,4 +1,5 @@ "Nama pengguna", "Personal" => "Peribadi", "Users" => "Pengguna", "Apps" => "Aplikasi", @@ -6,31 +7,21 @@ "Help" => "Bantuan", "Cloud not found" => "Awan tidak dijumpai", "Create an admin account" => "buat akaun admin", -"Username" => "Nama pengguna", "Password" => "Kata laluan", +"Advanced" => "Maju", +"Data folder" => "Fail data", "Configure the database" => "Konfigurasi pangkalan data", "will be used" => "akan digunakan", "Database user" => "Nama pengguna pangkalan data", "Database password" => "Kata laluan pangkalan data", "Database name" => "Nama pangkalan data", -"Advanced" => "Maju", "Database host" => "Hos pangkalan data", -"Data folder" => "Fail data", "Finish setup" => "Setup selesai", -"gives you freedom and control over your own data" => "memberikan anda kebebasan dan kendalian keatas data anda", "Log out" => "Log keluar", "Settings" => "Tetapan", "Lost your password?" => "Hilang kata laluan?", "remember" => "ingat", "You are logged out." => "Anda telah log keluar.", -"You will receive a link to reset your password via Email." => "Anda akan menerima link untuk menetapkan semula kata laluan anda melalui emel", -"Requested" => "diminta", -"Login failed!" => "Log in gagal!", -"Username or Email" => "Nama pengguna atau Emel", -"Request reset" => "Minta set semula", "prev" => "sebelum", -"next" => "seterus", -"Your password was reset" => "Kata laluan anda diset semula", -"New password" => "Kata laluan baru", -"Reset password" => "Set semula kata laluan" +"next" => "seterus" ); diff --git a/core/l10n/nb_NO.php b/core/l10n/nb_NO.php index 07b176e4985..e276d570f69 100644 --- a/core/l10n/nb_NO.php +++ b/core/l10n/nb_NO.php @@ -1,4 +1,5 @@ "Brukernavn", "Personal" => "Personlig", "Users" => "Brukere", "Apps" => "Apper", @@ -6,21 +7,19 @@ "Help" => "Hjelp", "Cloud not found" => "Sky ikke funnet", "Create an admin account" => "opprett en administrator-konto", -"Username" => "Brukernavn", "Password" => "Passord", +"Advanced" => "Avansert", +"Data folder" => "Datamappe", "Configure the database" => "Konfigurer databasen", "will be used" => "vil bli brukt", "Database user" => "Databasebruker", "Database password" => "Databasepassord", "Database name" => "Databasenavn", -"Advanced" => "Avansert", -"Data folder" => "Datamappe", "Finish setup" => "Fullfør oppsetting", "Log out" => "Logg ut", "Settings" => "Innstillinger", "remember" => "husk", "You are logged out." => "Du er logget ut", -"Login failed!" => "Klarte ikke Ã¥ logge inn!", "prev" => "forrige", "next" => "neste" ); diff --git a/core/l10n/nl.php b/core/l10n/nl.php index 98ad267ff51..22b751aaa15 100644 --- a/core/l10n/nl.php +++ b/core/l10n/nl.php @@ -1,4 +1,12 @@ "U ontvangt een link om je wachtwoord opnieuw in te stellen via e-mail.", +"Requested" => "Gevraagd", +"Login failed!" => "Login mislukt!", +"Username" => "Gebruikersnaam", +"Request reset" => "Resetaanvraag", +"Your password was reset" => "Je wachtwoord is geweizigd", +"New password" => "Nieuw wachtwoord", +"Reset password" => "Reset wachtwoord", "Personal" => "Persoonlijk", "Users" => "Gebruikers", "Apps" => "Apps", @@ -6,31 +14,21 @@ "Help" => "Help", "Cloud not found" => "Cloud niet gevonden", "Create an admin account" => "Maak een beheerdersaccount aan", -"Username" => "Gebruikersnaam", "Password" => "Wachtwoord", +"Advanced" => "Geavanceerd", +"Data folder" => "Gegevensmap", "Configure the database" => "Configureer de databank", "will be used" => "zal gebruikt worden", "Database user" => "Gebruiker databank", "Database password" => "Wachtwoord databank", "Database name" => "Naam databank", -"Advanced" => "Geavanceerd", "Database host" => "Database server", -"Data folder" => "Gegevensmap", "Finish setup" => "Installatie afronden", -"gives you freedom and control over your own data" => "geeft u vrijheid en controle over uw eigen data", "Log out" => "Afmelden", "Settings" => "Instellingen", "Lost your password?" => "Uw wachtwoord vergeten?", "remember" => "onthoud gegevens", "You are logged out." => "U bent afgemeld.", -"You will receive a link to reset your password via Email." => "U ontvangt een link om uw wachtwoord te wijzigen via Email", -"Requested" => "Aangevraagd", -"Login failed!" => "Aanmelden mislukt!", -"Username or Email" => "Gebruikersnaam of Email", -"Request reset" => "Wachtwoordreset aanvragen", "prev" => "vorige", -"next" => "volgende", -"Your password was reset" => "Uw wachtwoord is opnieuw ingesteld", -"New password" => "Nieuw wachtwoord", -"Reset password" => "Reset wachtwoord" +"next" => "volgende" ); diff --git a/core/l10n/nn_NO.php b/core/l10n/nn_NO.php new file mode 100644 index 00000000000..c62302b3bc4 --- /dev/null +++ b/core/l10n/nn_NO.php @@ -0,0 +1,34 @@ + "Du vil fÃ¥ ei lenkje for Ã¥ nullstilla passordet via epost.", +"Requested" => "Førespurt", +"Login failed!" => "Feil ved innlogging!", +"Username" => "Brukarnamn", +"Request reset" => "Be om nullstilling", +"Your password was reset" => "Passordet ditt er nullstilt", +"New password" => "Nytt passord", +"Reset password" => "Nullstill passord", +"Personal" => "Personleg", +"Users" => "Brukarar", +"Apps" => "Applikasjonar", +"Admin" => "Administrer", +"Help" => "Hjelp", +"Cloud not found" => "Fann ikkje skyen", +"Create an admin account" => "Lag ein admin-konto", +"Password" => "Passord", +"Advanced" => "Avansert", +"Data folder" => "Datamappe", +"Configure the database" => "Konfigurer databasen", +"will be used" => "vil bli nytta", +"Database user" => "Databasebrukar", +"Database password" => "Databasepassord", +"Database name" => "Databasenamn", +"Database host" => "Databasetenar", +"Finish setup" => "Fullfør oppsettet", +"Log out" => "Logg ut", +"Settings" => "Innstillingar", +"Lost your password?" => "Gløymt passordet?", +"remember" => "hugs", +"You are logged out." => "Du er logga ut.", +"prev" => "førre", +"next" => "neste" +); diff --git a/core/l10n/pl.php b/core/l10n/pl.php index b4d9fbe9248..d972bed54e1 100644 --- a/core/l10n/pl.php +++ b/core/l10n/pl.php @@ -1,4 +1,12 @@ "Otrzymasz link do resetowania hasÅ‚a poprzez e-mail.", +"Requested" => "Żądane", +"Login failed!" => "Logowanie nie powiodÅ‚o siÄ™!", +"Username" => "Użytkownik", +"Request reset" => "Żądanie resetowania", +"Your password was reset" => "Twoje hasÅ‚o zostaÅ‚o zresetowane", +"New password" => "Nowe hasÅ‚o", +"Reset password" => "Zresetuj hasÅ‚o", "Personal" => "Ustawienia osobiste", "Users" => "Użytkownicy", "Apps" => "Aplikacje", @@ -6,31 +14,21 @@ "Help" => "Pomoc", "Cloud not found" => "Konta nie znaleziono ", "Create an admin account" => "Stwórz jako konto administratora", -"Username" => "Użytkownik", "Password" => "HasÅ‚o", +"Advanced" => "Zaawansowane", +"Data folder" => "Katalog danych", "Configure the database" => "Konfiguracja bazy danych", "will be used" => "zostanie użyte", "Database user" => "Użytkownik bazy danych", "Database password" => "HasÅ‚o do bazy danych", "Database name" => "Nazwa bazy danych", -"Advanced" => "Zaawansowane", "Database host" => "Host bazy danych", -"Data folder" => "Katalog danych", "Finish setup" => "ZakoÅ„cz instalacjÄ™", -"gives you freedom and control over your own data" => "zapewnia Ci wolność i kontrolÄ™ nad wÅ‚asnymi danymi", "Log out" => "Wyloguj siÄ™", "Settings" => "Ustawienia", "Lost your password?" => "Nie pamiÄ™tasz hasÅ‚a?", "remember" => "zapamiÄ™taj", "You are logged out." => "ZostaÅ‚eÅ› wylogowany.", -"You will receive a link to reset your password via Email." => "Otrzymasz link do resetowania hasÅ‚a poprzez e-mail.", -"Requested" => "Żądane", -"Login failed!" => "Nie udaÅ‚o siÄ™ zalogować!", -"Username or Email" => "Użytkownik lub email", -"Request reset" => "Zresetuj hasÅ‚o", "prev" => "wstecz", -"next" => "dalej", -"Your password was reset" => "Twoje hasÅ‚o zostaÅ‚o zresetowane", -"New password" => "Nowe hasÅ‚o", -"Reset password" => "Zresetuj hasÅ‚o" +"next" => "dalej" ); diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php index 229d60f65c4..4f1a31ae3e7 100644 --- a/core/l10n/pt_BR.php +++ b/core/l10n/pt_BR.php @@ -1,4 +1,12 @@ "Você receberá um link para redefinir sua senha via e-mail.", +"Requested" => "Solicitado", +"Login failed!" => "Falha ao fazer o login!", +"Username" => "Nome de Usuário", +"Request reset" => "Pedido de reposição", +"Your password was reset" => "Sua senha foi mudada", +"New password" => "Nova senha", +"Reset password" => "Mudar senha", "Personal" => "Pessoal", "Users" => "Usuários", "Apps" => "Apps", @@ -6,31 +14,21 @@ "Help" => "Ajuda", "Cloud not found" => "Cloud não encontrado", "Create an admin account" => "Criar uma conta de administrador", -"Username" => "Nome de Usuário", "Password" => "Senha", +"Advanced" => "Avançado", +"Data folder" => "Pasta de dados", "Configure the database" => "Configurar o banco de dados", "will be used" => "será usado", "Database user" => "Usuário de banco de dados", "Database password" => "Senha do banco de dados", "Database name" => "Nome do banco de dados", -"Advanced" => "Avançado", "Database host" => "Banco de dados do host", -"Data folder" => "Pasta de dados", "Finish setup" => "Concluir configuração", -"gives you freedom and control over your own data" => "proporciona liberdade e controle sobre seus próprios dados", "Log out" => "Sair", "Settings" => "Configurações", "Lost your password?" => "Esqueçeu sua senha?", "remember" => "lembrete", "You are logged out." => "Você está desconectado.", -"You will receive a link to reset your password via Email." => "Você receberá um link para redefinir sua senha via e-mail.", -"Requested" => "Solicitado", -"Login failed!" => "Login sem sucesso", -"Username or Email" => "Nome de usuário ou e-mail", -"Request reset" => "Pedido de troca", "prev" => "anterior", -"next" => "próximo", -"Your password was reset" => "Sua senha foi trocada", -"New password" => "Nova senha", -"Reset password" => "Toca de senha" +"next" => "próximo" ); diff --git a/core/l10n/pt_PT.php b/core/l10n/pt_PT.php new file mode 100644 index 00000000000..e41152bcbbc --- /dev/null +++ b/core/l10n/pt_PT.php @@ -0,0 +1,3 @@ + "Avançado" +); diff --git a/core/l10n/ro.php b/core/l10n/ro.php index 8440c44d1d8..86c03478096 100644 --- a/core/l10n/ro.php +++ b/core/l10n/ro.php @@ -1,4 +1,12 @@ "VeÈ›i primi la adresa de email un link prin care veÈ›i putea reseta parola", +"Requested" => "Cerută", +"Login failed!" => "Autentificare eÈ™uată", +"Username" => "Utilizator", +"Request reset" => "Cerere trimisă", +"Your password was reset" => "Parola a fost resetată", +"New password" => "Noua parolă", +"Reset password" => "Resetează parola", "Personal" => "Personal", "Users" => "Utilizatori", "Apps" => "AplicaÈ›ii", @@ -6,31 +14,21 @@ "Help" => "Ajutor", "Cloud not found" => "Nu s-a găsit", "Create an admin account" => "Crează un cont de administrator", -"Username" => "Utilizator", "Password" => "Parola", +"Advanced" => "Avansat", +"Data folder" => "Directorul cu date", "Configure the database" => "Configurează baza de date", "will be used" => "vor fi folosite", "Database user" => "Utilizatorul bazei de date", "Database password" => "Parola bazei de date", "Database name" => "Numele bazei de date", -"Advanced" => "Avansat", "Database host" => "Baza de date", -"Data folder" => "Directorul cu date", "Finish setup" => "Finalizează instalarea", -"gives you freedom and control over your own data" => "îți oferă libertatea de a-È›i controla datele", "Log out" => "IeÈ™ire", "Settings" => "Setări", "Lost your password?" => "Ai uitat parola?", "remember" => "È›ine minte", "You are logged out." => "Ai ieÈ™it", -"You will receive a link to reset your password via Email." => "Vei primi prin email un link pentru resetarea parolei", -"Requested" => "Cerută", -"Login failed!" => "Autentificare eÈ™uată!", -"Username or Email" => "Utilizator sau email", -"Request reset" => "Cere schimbarea parolei", "prev" => "precedentul", -"next" => "următorul", -"Your password was reset" => "Parola a fost schimbată", -"New password" => "Parola nouă", -"Reset password" => "Schimbă parola" +"next" => "următorul" ); diff --git a/core/l10n/ru.php b/core/l10n/ru.php index 45f0f4aef9d..12dd26a3507 100644 --- a/core/l10n/ru.php +++ b/core/l10n/ru.php @@ -1,4 +1,12 @@ "Ðа ваш Ð°Ð´Ñ€ÐµÑ Email выÑлана ÑÑылка Ð´Ð»Ñ ÑброÑа паролÑ.", +"Requested" => "Запрошено", +"Login failed!" => "Ðе удалоÑÑŒ войти!", +"Username" => "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ", +"Request reset" => "ЗапроÑить ÑброÑ", +"Your password was reset" => "Ваш пароль был Ñброшен", +"New password" => "Ðовый пароль", +"Reset password" => "СброÑить пароль", "Personal" => "Личное", "Users" => "Пользователи", "Apps" => "ПриложениÑ", @@ -6,31 +14,21 @@ "Help" => "Помощь", "Cloud not found" => "Облако не найдено", "Create an admin account" => "Создать учётную запиÑÑŒ админиÑтратора", -"Username" => "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ", "Password" => "Пароль", +"Advanced" => "Дополнительно", +"Data folder" => "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸", "Configure the database" => "ÐаÑтройка базы данных", "will be used" => "будет иÑпользовано", "Database user" => "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных", "Database password" => "Пароль Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных", "Database name" => "Ðазвание базы данных", -"Advanced" => "Дополнительно", "Database host" => "ХоÑÑ‚ базы данных", -"Data folder" => "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸", "Finish setup" => "Завершить уÑтановку", -"gives you freedom and control over your own data" => "даёт Вам Ñвободу и контроль над Вашими данными", "Log out" => "Выйти", "Settings" => "ÐаÑтройки", "Lost your password?" => "Забыли пароль?", "remember" => "запомнить", "You are logged out." => "Ð’Ñ‹ вышли.", -"You will receive a link to reset your password via Email." => "Ð’Ñ‹ получите ÑÑылку Ð´Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° Ваш e-mail.", -"Requested" => "Запрошено", -"Login failed!" => "Войти не удалоÑÑŒ!", -"Username or Email" => "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ e-mail", -"Request reset" => "ЗапроÑить ÑброÑ", "prev" => "пред", -"next" => "Ñлед", -"Your password was reset" => "Пароль был Ñброшен", -"New password" => "Ðовый пароль", -"Reset password" => "СброÑить пароль" +"next" => "Ñлед" ); diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php new file mode 100644 index 00000000000..43d8ca7d5e0 --- /dev/null +++ b/core/l10n/sk_SK.php @@ -0,0 +1,34 @@ + "Odkaz pre obnovenie hesla obdržíte E-mailom.", +"Requested" => "Požiadané", +"Login failed!" => "Prihlásenie zlyhalo!", +"Username" => "Prihlasovacie meno", +"Request reset" => "PožiadaÅ¥ o obnovenie", +"Your password was reset" => "VaÅ¡e heslo bolo obnovené", +"New password" => "Nové heslo", +"Reset password" => "Obnova hesla", +"Personal" => "Osobné", +"Users" => "Používatelia", +"Apps" => "Aplikácie", +"Admin" => "Administrácia", +"Help" => "Pomoc", +"Cloud not found" => "Nedokážem nájsÅ¥", +"Create an admin account" => "VytvoriÅ¥ administrátorský úÄet", +"Password" => "Heslo", +"Advanced" => "PokroÄilé", +"Data folder" => "PrieÄinok dát", +"Configure the database" => "NastaviÅ¥ databázu", +"will be used" => "bude použité", +"Database user" => "Hostiteľ databázy", +"Database password" => "Heslo databázy", +"Database name" => "Meno databázy", +"Database host" => "Server databázy", +"Finish setup" => "DokonÄiÅ¥ inÅ¡taláciu", +"Log out" => "OdhlásiÅ¥", +"Settings" => "Nastavenia", +"Lost your password?" => "Zabudli ste heslo?", +"remember" => "zapamätaÅ¥", +"You are logged out." => "Ste odhlásený.", +"prev" => "späť", +"next" => "Äalej" +); diff --git a/core/l10n/sl.php b/core/l10n/sl.php new file mode 100644 index 00000000000..62d5412a22a --- /dev/null +++ b/core/l10n/sl.php @@ -0,0 +1,34 @@ + "Preko email sporoÄila boste prejeli povezavo s katero lahko ponovno nastavite geslo", +"Requested" => "Zahtevano", +"Login failed!" => "Prijava ni Uspela!", +"Username" => "UporabniÅ¡ko Ime", +"Request reset" => "Zahtevaj ponastavitev", +"Your password was reset" => "VaÅ¡e geslo je bilo ponastavljeno", +"New password" => "novo geslo", +"Reset password" => "Ponastavi Geslo", +"Personal" => "Osebno", +"Users" => "Uporabniki", +"Apps" => "Apps", +"Admin" => "Admin", +"Help" => "PomoÄ", +"Cloud not found" => "Ni najdeno", +"Create an admin account" => "Ustvari admin raÄun", +"Password" => "Geslo", +"Advanced" => "Napredno", +"Data folder" => "Data Mapa", +"Configure the database" => "Nastavi Podatkovno Bazo", +"will be used" => "Bo uporabljeno", +"Database user" => "Podatkovna Baza Uporabnik", +"Database password" => "Podatkovna Baza Geslo", +"Database name" => "Ime Podatkovne Baze", +"Database host" => "Database host", +"Finish setup" => "KonÄaj instalacijo", +"Log out" => "Odjava", +"Settings" => "Nastavitve", +"Lost your password?" => "Ste pozabili vaÅ¡e geslo?", +"remember" => "zapomni", +"You are logged out." => "Odjavljeni ste", +"prev" => "nazaj", +"next" => "naprej" +); diff --git a/core/l10n/sr.php b/core/l10n/sr.php index 0fd43c7b0a4..667a7b054c3 100644 --- a/core/l10n/sr.php +++ b/core/l10n/sr.php @@ -1,4 +1,12 @@ "Добићете везу за реÑетовање лозинке путем е-поште.", +"Requested" => "Захтевано", +"Login failed!" => "ÐеÑупела пријава!", +"Username" => "КориÑничко име", +"Request reset" => "Захтевај реÑетовање", +"Your password was reset" => "Ваша лозинка је реÑетована", +"New password" => "Ðова лозинка", +"Reset password" => "РеÑетуј лозинку", "Personal" => "Лична", "Users" => "КориÑници", "Apps" => "Програми", @@ -6,31 +14,21 @@ "Help" => "Помоћ", "Cloud not found" => "Облак није нађен", "Create an admin account" => "Ðаправи админиÑтративни налог", -"Username" => "КориÑничко име", "Password" => "Лозинка", +"Advanced" => "Ðапредно", +"Data folder" => "Фацикла података", "Configure the database" => "Подешавање базе", "will be used" => "ће бити коришћен", "Database user" => "КориÑник базе", "Database password" => "Лозинка базе", "Database name" => "Име базе", -"Advanced" => "Ðапредно", "Database host" => "Домаћин базе", -"Data folder" => "Фацикла података", "Finish setup" => "Заврши подешавање", -"gives you freedom and control over your own data" => "вам даје Ñлободу и контролу над вашим подацима", "Log out" => "Одјава", "Settings" => "Подешавања", "Lost your password?" => "Изгубили Ñте лозинку?", "remember" => "упамти", "You are logged out." => "Одјављени Ñте.", -"You will receive a link to reset your password via Email." => "Добићете везу за реÑетовање лозинке путем е-поште.", -"Requested" => "Захтев поÑлат", -"Login failed!" => "ÐеуÑпешно пријављивање!", -"Username or Email" => "КориÑничко име или адреÑа е-поште", -"Request reset" => "Захтев за реÑетовање", "prev" => "претходно", -"next" => "Ñледеће", -"Your password was reset" => "Ваша лозинка је реÑетована", -"New password" => "Ðова лозинка", -"Reset password" => "РеÑетуј лозинку" +"next" => "Ñледеће" ); diff --git a/core/l10n/sr@latin.php b/core/l10n/sr@latin.php index f8565f6ee4e..e240de011ee 100644 --- a/core/l10n/sr@latin.php +++ b/core/l10n/sr@latin.php @@ -1,4 +1,12 @@ "Dobićete vezu za resetovanje lozinke putem e-poÅ¡te.", +"Requested" => "Zahtevano", +"Login failed!" => "Nesupela prijava!", +"Username" => "KorisniÄko ime", +"Request reset" => "Zahtevaj resetovanje", +"Your password was reset" => "VaÅ¡a lozinka je resetovana", +"New password" => "Nova lozinka", +"Reset password" => "Resetuj lozinku", "Personal" => "LiÄna", "Users" => "Korisnici", "Apps" => "Programi", @@ -6,31 +14,21 @@ "Help" => "Pomoć", "Cloud not found" => "Oblak nije naÄ‘en", "Create an admin account" => "Napravi administrativni nalog", -"Username" => "KorisniÄko ime", "Password" => "Lozinka", +"Advanced" => "Napredno", +"Data folder" => "Facikla podataka", "Configure the database" => "PodeÅ¡avanje baze", "will be used" => "će biti korišćen", "Database user" => "Korisnik baze", "Database password" => "Lozinka baze", "Database name" => "Ime baze", -"Advanced" => "Napredno", "Database host" => "Domaćin baze", -"Data folder" => "Facikla podataka", "Finish setup" => "ZavrÅ¡i podeÅ¡avanje", -"gives you freedom and control over your own data" => "vam daje slobodu i kontrolu nad vaÅ¡im podacima", "Log out" => "Odjava", "Settings" => "PodeÅ¡avanja", "Lost your password?" => "Izgubili ste lozinku?", "remember" => "upamti", "You are logged out." => "Odjavljeni ste.", -"You will receive a link to reset your password via Email." => "Dobićete vezu za resetovanje lozinke putem e-poÅ¡te.", -"Requested" => "Zahtev poslat", -"Login failed!" => "NeuspeÅ¡no prijavljivanje!", -"Username or Email" => "KorisniÄko ime ili adresa e-poÅ¡te", -"Request reset" => "Zahtev za resetovanje", "prev" => "prethodno", -"next" => "sledeće", -"Your password was reset" => "VaÅ¡a lozinka je resetovana", -"New password" => "Nova lozinka", -"Reset password" => "Resetuj lozinku" +"next" => "sledeće" ); diff --git a/core/l10n/sv.php b/core/l10n/sv.php index d7e1c240378..2b4bb2b9511 100644 --- a/core/l10n/sv.php +++ b/core/l10n/sv.php @@ -1,4 +1,12 @@ "Du fÃ¥r en länk att Ã¥terställa ditt lösenord via e-post.", +"Requested" => "Begärd", +"Login failed!" => "Inloggning misslyckades!", +"Username" => "Användarnamn", +"Request reset" => "Begär Ã¥terställning", +"Your password was reset" => "Ditt lösenord har Ã¥terställts", +"New password" => "Nytt lösenord", +"Reset password" => "Ã…terställ lösenordet", "Personal" => "Personlig", "Users" => "Användare", "Apps" => "Program", @@ -6,31 +14,21 @@ "Help" => "Hjälp", "Cloud not found" => "Hittade inget moln", "Create an admin account" => "Skapa ett administratörskonto", -"Username" => "Användarnamn", "Password" => "Lösenord", +"Advanced" => "Avancerat", +"Data folder" => "Datamapp", "Configure the database" => "Konfigurera databasen", "will be used" => "kommer att användas", "Database user" => "Databas-användare", "Database password" => "Lösenord för databasen", "Database name" => "Databasens namn", -"Advanced" => "Avancerat", "Database host" => "Databasserver", -"Data folder" => "Datamapp", "Finish setup" => "Avsluta installation", -"gives you freedom and control over your own data" => "ger dig frihet och kontroll över din egen data", "Log out" => "Logga ut", "Settings" => "Inställningar", -"Lost your password?" => "Tappat bort ditt lösenord?", +"Lost your password?" => "Glömt ditt lösenord?", "remember" => "kom ihÃ¥g", "You are logged out." => "Du är utloggad", -"You will receive a link to reset your password via Email." => "Du kommer fÃ¥ en länk, via e-post, där du kan Ã¥terställ ditt lösenord", -"Requested" => "Begärd", -"Login failed!" => "Inloggning misslyckades!", -"Username or Email" => "Användarnamn eller e-post", -"Request reset" => "Begär Ã¥terställning", "prev" => "föregÃ¥ende", -"next" => "nästa", -"Your password was reset" => "Ditt lösenord har Ã¥terställts", -"New password" => "Nytt lösenord", -"Reset password" => "Ã…terställ lösenord" +"next" => "nästa" ); diff --git a/core/l10n/tr.php b/core/l10n/tr.php new file mode 100644 index 00000000000..100fa9960cb --- /dev/null +++ b/core/l10n/tr.php @@ -0,0 +1,34 @@ + "Parolanızı sıfırlamak için bir baÄŸlantı Eposta olarak gönderilecek.", +"Requested" => "Ä°stendi", +"Login failed!" => "GiriÅŸ baÅŸarısız!", +"Username" => "Kullanıcı adı", +"Request reset" => "Sıfırlama iste", +"Your password was reset" => "Parolanız sıfırlandı", +"New password" => "Yeni parola", +"Reset password" => "Parolayı sıfırla", +"Personal" => "KiÅŸisel", +"Users" => "Kullanıcılar", +"Apps" => "Uygulamalar", +"Admin" => "Yönetici", +"Help" => "Yardı", +"Cloud not found" => "Bulut bulunamadı", +"Create an admin account" => "Bir yönetici hesabı oluÅŸturun", +"Password" => "Parola", +"Advanced" => "GeliÅŸmiÅŸ", +"Data folder" => "Veri klasörü", +"Configure the database" => "Veritabanını ayarla", +"will be used" => "kullanılacak", +"Database user" => "Veritabanı kullanıcı adı", +"Database password" => "Veritabanı parolası", +"Database name" => "Veritabanı adı", +"Database host" => "Veritabanı sunucusu", +"Finish setup" => "Kurulumu tamamla", +"Log out" => "Çıkış yap", +"Settings" => "Ayarlar", +"Lost your password?" => "Parolanızı mı unuttunuz?", +"remember" => "hatırla", +"You are logged out." => "Çıkış yaptınız.", +"prev" => "önceki", +"next" => "sonraki" +); diff --git a/core/l10n/zh_CN.php b/core/l10n/zh_CN.php index 4c9f197346c..8ab1419fed2 100644 --- a/core/l10n/zh_CN.php +++ b/core/l10n/zh_CN.php @@ -1,4 +1,12 @@ "您将会收到包å«å¯ä»¥é‡ç½®å¯†ç é“¾æŽ¥çš„邮件。", +"Requested" => "已请求", +"Login failed!" => "登录失败ï¼", +"Username" => "用户å", +"Request reset" => "请求é‡ç½®", +"Your password was reset" => "您的密ç å·²é‡ç½®", +"New password" => "新密ç ", +"Reset password" => "é‡ç½®å¯†ç ", "Personal" => "个人", "Users" => "用户", "Apps" => "应用", @@ -6,31 +14,21 @@ "Help" => "帮助", "Cloud not found" => "未找到云", "Create an admin account" => "创建管ç†å‘˜è´¦å·", -"Username" => "用户å", "Password" => "密ç ", +"Advanced" => "高级", +"Data folder" => "æ•°æ®ç›®å½•", "Configure the database" => "é…置数æ®åº“", "will be used" => "将被使用", "Database user" => "æ•°æ®åº“用户", "Database password" => "æ•°æ®åº“密ç ", "Database name" => "æ•°æ®åº“å", -"Advanced" => "高级", "Database host" => "æ•°æ®åº“主机", -"Data folder" => "æ•°æ®ç›®å½•", "Finish setup" => "安装完æˆ", -"gives you freedom and control over your own data" => "自由掌控您的数æ®", "Log out" => "注销", "Settings" => "设置", "Lost your password?" => "忘记密ç ï¼Ÿ", "remember" => "è®°ä½", "You are logged out." => "您已注销。", -"You will receive a link to reset your password via Email." => "您将通过邮件收到一个用于é‡ç½®å¯†ç çš„链接", -"Requested" => "请求已å‘é€", -"Login failed!" => "登陆失败ï¼", -"Username or Email" => "用户å或电å­é‚®ä»¶", -"Request reset" => "请求é‡ç½®", "prev" => "上一页", -"next" => "下一页", -"Your password was reset" => "您的密ç å·²é‡ç½®", -"New password" => "新密ç ", -"Reset password" => "é‡ç½®å¯†ç " +"next" => "下一页" ); diff --git a/files/l10n/ar.php b/files/l10n/ar.php new file mode 100644 index 00000000000..afdc0a89201 --- /dev/null +++ b/files/l10n/ar.php @@ -0,0 +1,19 @@ + "تم ترÙيع الملÙات بنجاح.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم المل٠الذي تريد ترÙيعه أعلى مما upload_max_filesize يسمح به ÙÙŠ مل٠php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حجم المل٠الذي تريد ترÙيعه أعلى مما MAX_FILE_SIZE يسمح به ÙÙŠ واجهة ال HTML.", +"The uploaded file was only partially uploaded" => "تم ترÙيع جزء من الملÙات الذي تريد ترÙيعها Ùقط", +"No file was uploaded" => "لم يتم ترÙيع أي من الملÙات", +"Missing a temporary folder" => "المجلد المؤقت غير موجود", +"Files" => "الملÙات", +"Maximum upload size" => "الحد الأقصى لحجم الملÙات التي يمكن رÙعها", +"Upload" => "إرÙع", +"Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرÙع بعض الملÙات!", +"Name" => "الاسم", +"Download" => "تحميل", +"Size" => "حجم", +"Modified" => "معدل", +"Delete" => "محذوÙ", +"Upload too large" => "حجم الترÙيع أعلى من المسموح", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملÙات التي تريد ترÙيعها أعلى من المسموح على الخادم." +); diff --git a/files/l10n/bg_BG.php b/files/l10n/bg_BG.php index db5a095c2cb..027a7698203 100644 --- a/files/l10n/bg_BG.php +++ b/files/l10n/bg_BG.php @@ -1,8 +1,13 @@ "Файлът е качен уÑпешно", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Файлът който Ñе опитвате да качите, надвишава зададените ÑтойноÑти в upload_max_filesize в PHP.INI", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файлът който Ñе опитвате да качите надвишава ÑтойноÑтите в MAX_FILE_SIZE в HTML формата.", +"The uploaded file was only partially uploaded" => "Файлът е качен чаÑтично", +"No file was uploaded" => "Фахлът не бе качен", +"Missing a temporary folder" => "ЛипÑва временната папка", "Files" => "Файлове", "Maximum upload size" => "МакÑ. размер за качване", "Upload" => "Качване", -"New Folder" => "Ðова папка", "Nothing in here. Upload something!" => "ÐÑма нищо, качете нещо!", "Name" => "Име", "Download" => "ИзтеглÑне", diff --git a/files/l10n/ca.php b/files/l10n/ca.php index 8515ab35f27..cb685e543fd 100644 --- a/files/l10n/ca.php +++ b/files/l10n/ca.php @@ -1,8 +1,13 @@ "El fitxer s'ha pujat correctament", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer de pujada excedeix la directiva upload_max_filesize establerta a php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer de pujada excedeix la directiva MAX_FILE_SIZE especificada al formulari HTML", +"The uploaded file was only partially uploaded" => "El fitxer només s'ha pujat parcialment", +"No file was uploaded" => "El fitxer no s'ha pujat", +"Missing a temporary folder" => "S'ha perdut un fitxer temporal", "Files" => "Fitxers", "Maximum upload size" => "Mida màxima de pujada", "Upload" => "Puja", -"New Folder" => "Carpeta nova", "Nothing in here. Upload something!" => "Res per aquí. Pugeu alguna cosa!", "Name" => "Nom", "Download" => "Descarrega", diff --git a/files/l10n/cs_CZ.php b/files/l10n/cs_CZ.php index c5430deaeb6..d0ebace2d89 100644 --- a/files/l10n/cs_CZ.php +++ b/files/l10n/cs_CZ.php @@ -1,8 +1,13 @@ "Soubor byl odeslán úspěšnÄ›", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Odeslaný soubor pÅ™esáhl velikostí parametr upload_max_filesize v php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Odeslaný soubor pÅ™esáhl velikostí parametr MAX_FILE_SIZE specifikovaný v HTML formuláři", +"The uploaded file was only partially uploaded" => "Soubor byl odeslán pouze ÄásteÄnÄ›", +"No file was uploaded" => "Soubor nebyl odeslán", +"Missing a temporary folder" => "Chybí adresář pro soÄasné soubory", "Files" => "Soubory", "Maximum upload size" => "Maximální velikost ukládaných souborů", "Upload" => "Uložit", -"New Folder" => "Nový adresář", "Nothing in here. Upload something!" => "Žádný obsah. Uložte si nÄ›co!", "Name" => "Název", "Download" => "Stáhnout", diff --git a/files/l10n/da.php b/files/l10n/da.php index bc909a92331..0bffc6a63e1 100644 --- a/files/l10n/da.php +++ b/files/l10n/da.php @@ -1,8 +1,13 @@ "Der er ingen fejl, filen blev uploadet med success", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uploadede fil overskrider upload_max_filesize direktivet i php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uploadede fil overskrider MAX_FILE_SIZE -direktivet som er specificeret i HTML-formularen", +"The uploaded file was only partially uploaded" => "Den uploadede file blev kun delvist uploadet", +"No file was uploaded" => "Ingen fil blev uploadet", +"Missing a temporary folder" => "Mangler en midlertidig mappe", "Files" => "Filer", "Maximum upload size" => "Maksimal upload-størrelse", "Upload" => "Upload", -"New Folder" => "Ny Mappe", "Nothing in here. Upload something!" => "Her er tomt. Upload noget!", "Name" => "Navn", "Download" => "Download", @@ -10,5 +15,5 @@ "Modified" => "Ændret", "Delete" => "Slet", "Upload too large" => "Upload for stor", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne du prøver at uploade er større end den maksimale størrelse for fil-upload pÃ¥ denne server." +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload pÃ¥ denne server." ); diff --git a/files/l10n/de.php b/files/l10n/de.php index 0259dd02e84..ea229b5dd73 100644 --- a/files/l10n/de.php +++ b/files/l10n/de.php @@ -1,8 +1,13 @@ "Datei hochgeladen.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die hochgeladene Datei ist zu groß.", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die hochgeladene Datei ist zu groß.", +"The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", +"No file was uploaded" => "Es wurde keine Datei hochgeladen.", +"Missing a temporary folder" => "Temporärer Ordner fehlt.", "Files" => "Dateien", "Maximum upload size" => "Maximale Größe", "Upload" => "Hochladen", -"New Folder" => "Neuer Ordner", "Nothing in here. Upload something!" => "Alles leer. Lad’ was hoch!", "Name" => "Name", "Download" => "Herunterladen", diff --git a/files/l10n/el.php b/files/l10n/el.php index 14b95e69ca6..151527c7890 100644 --- a/files/l10n/el.php +++ b/files/l10n/el.php @@ -1,8 +1,13 @@ "Δεν υπάÏχει λάθος, το αÏχείο που μεταφοÏτώθηκε επιτυχώς", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το αÏχείο που μεταφοÏτώθηκε υπεÏβαίνει την οδηγία μέγιστου επιτÏÎµÏ€Ï„Î¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ \"upload_max_filesize\" του php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το αÏχείο υπεÏβαίνει την οδηγία μέγιστου επιτÏÎµÏ€Ï„Î¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ \"MAX_FILE_SIZE\" που έχει οÏιστεί στην html φόÏμα", +"The uploaded file was only partially uploaded" => "Το αÏχείο μεταφοÏώθηκε μόνο εν μέÏει", +"No file was uploaded" => "Το αÏχείο δεν μεταφοÏτώθηκε", +"Missing a temporary folder" => "Λείπει ένας Ï€ÏοσωÏινός φάκελος", "Files" => "ΑÏχεία", "Maximum upload size" => "Μέγιστο μέγεθος μεταφόÏτωσης", "Upload" => "ΜεταφόÏτωση", -"New Folder" => "Îέος φάκελος", "Nothing in here. Upload something!" => "Δεν υπάÏχει τίποτα εδώ. Ανέβασε κάτι!", "Name" => "Όνομα", "Download" => "Λήψη", diff --git a/files/l10n/eo.php b/files/l10n/eo.php new file mode 100644 index 00000000000..42dc4f1280e --- /dev/null +++ b/files/l10n/eo.php @@ -0,0 +1,19 @@ + "Ne estas eraro, la dosiero alÅutiÄis sukcese", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "La dosiero alÅutita superas la regulon upload_max_filesize el php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La dosiero alÅutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en la HTML-formularo", +"The uploaded file was only partially uploaded" => "La alÅutita dosiero nur parte alÅutiÄis", +"No file was uploaded" => "Neniu dosiero estas alÅutita", +"Missing a temporary folder" => "Mankas tempa dosierujo", +"Files" => "Dosieroj", +"Maximum upload size" => "Maksimuma alÅutogrando", +"Upload" => "AlÅuti", +"Nothing in here. Upload something!" => "Nenio estas ĉi tie. AlÅutu ion!", +"Name" => "Nomo", +"Download" => "ElÅuti", +"Size" => "Grando", +"Modified" => "Modifita", +"Delete" => "Forigi", +"Upload too large" => "ElÅuto tro larÄa", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alÅuti, transpasas la maksimuman grandon por dosieralÅutoj en ĉi tiu servilo." +); diff --git a/files/l10n/es.php b/files/l10n/es.php index 28dc17af761..14086d3f6ce 100644 --- a/files/l10n/es.php +++ b/files/l10n/es.php @@ -1,8 +1,13 @@ "No hubo ningún error, el archivo se subió con éxito", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo que intentas subir sobrepasa el tamaño definido por la variable MAX_FILE_SIZE especificada en el formulario HTML", +"The uploaded file was only partially uploaded" => "El archivo que intentas subir solo se subió parcialmente", +"No file was uploaded" => "No se subió ningún archivo", +"Missing a temporary folder" => "Falta un directorio temporal", "Files" => "Archivos", "Maximum upload size" => "Tamaño máximo de subida", "Upload" => "Subir", -"New Folder" => "Crear Carpeta", "Nothing in here. Upload something!" => "Aquí no hay nada. ¡Sube algo!", "Name" => "Nombre", "Download" => "Descargar", diff --git a/files/l10n/et_EE.php b/files/l10n/et_EE.php index 29c44dac106..c8604b14dd0 100644 --- a/files/l10n/et_EE.php +++ b/files/l10n/et_EE.php @@ -1,8 +1,13 @@ "Ãœhtegi viga pole, fail on üles laetud", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ãœles laetud faili suurus ületab php.ini määratud upload_max_filesize suuruse", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ãœles laetud faili suurus ületab HTML vormis määratud upload_max_filesize suuruse", +"The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt", +"No file was uploaded" => "Ãœhtegi faili ei laetud üles", +"Missing a temporary folder" => "Ajutiste failide kaust puudub", "Files" => "Failid", "Maximum upload size" => "Maksimaalne üleslaadimise suurus", "Upload" => "Lae üles", -"New Folder" => "Uus kaust", "Nothing in here. Upload something!" => "Siin pole midagi. Lae midagi üles!", "Name" => "Nimi", "Download" => "Lae alla", diff --git a/files/l10n/eu.php b/files/l10n/eu.php new file mode 100644 index 00000000000..b9873e6c3fa --- /dev/null +++ b/files/l10n/eu.php @@ -0,0 +1,19 @@ + "Ez da arazorik izan, fitxategia ongi igo da", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Igotako fitxategiaren tamaina php.ini-ko upload_max_filesize direktiban adierazitakoa baino handiagoa da", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Igotako fitxategiaren tamaina HTML inprimakiko MAX_FILESIZE direktiban adierazitakoa baino handiagoa da", +"The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat baino gehiago ez da igo", +"No file was uploaded" => "Ez da fitxategirik igo", +"Missing a temporary folder" => "Aldi baterako karpeta falta da", +"Files" => "Fitxategiak", +"Maximum upload size" => "Igo daitekeen gehienezko tamaina", +"Upload" => "Igo", +"Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!", +"Name" => "Izena", +"Download" => "Deskargatu", +"Size" => "Tamaina", +"Modified" => "Aldatuta", +"Delete" => "Ezabatu", +"Upload too large" => "Igotakoa handiegia da", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira." +); diff --git a/files/l10n/fr.php b/files/l10n/fr.php index fa58f073d66..6cc15896e21 100644 --- a/files/l10n/fr.php +++ b/files/l10n/fr.php @@ -1,8 +1,13 @@ "Aucune erreur, le fichier a été téléversé avec succès", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier téléversé excède la valeur de upload_max_filesize spécifiée dans php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier téléversé excède la valeur de MAX_FILE_SIZE spécifiée dans le formulaire HTML", +"The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement téléversé", +"No file was uploaded" => "Aucun fichier n'a été téléversé", +"Missing a temporary folder" => "Il manque un répertoire temporaire", "Files" => "Fichiers", "Maximum upload size" => "Taille max. d'envoi", "Upload" => "Envoyer", -"New Folder" => "Nouveau dossier", "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)", "Name" => "Nom", "Download" => "Téléchargement", diff --git a/files/l10n/he.php b/files/l10n/he.php new file mode 100644 index 00000000000..79ae1edb7a5 --- /dev/null +++ b/files/l10n/he.php @@ -0,0 +1,19 @@ + "×œ× ×ירעה תקלה, ×”×§×‘×¦×™× ×”×•×¢×œ×• בהצלחה", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "הקובץ שהועלה חרג מההנחיה upload_max_filesize בקובץ php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ×”Ö¾HTML", +"The uploaded file was only partially uploaded" => "הקובץ שהועלה הועלה בצורה חלקית", +"No file was uploaded" => "×œ× ×”×•×¢×œ×• קבצי×", +"Missing a temporary folder" => "תיקייה זמנית חסרה", +"Files" => "קבצי×", +"Maximum upload size" => "גודל העל××” מקסימלי", +"Upload" => "העל××”", +"Nothing in here. Upload something!" => "×ין ×›×ן ×©×•× ×“×‘×¨. ×ולי ברצונך להעלות משהו?", +"Name" => "ש×", +"Download" => "הורדה", +"Size" => "גודל", +"Modified" => "זמן שינוי", +"Delete" => "מחיקה", +"Upload too large" => "העל××” גדולה מידי", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "×”×§×‘×¦×™× ×©× ×™×¡×™×ª להעלות חרגו מהגודל המקסימלי להעל×ת ×§×‘×¦×™× ×¢×œ שרת ×–×”." +); diff --git a/files/l10n/hr.php b/files/l10n/hr.php new file mode 100644 index 00000000000..670e87f6557 --- /dev/null +++ b/files/l10n/hr.php @@ -0,0 +1,19 @@ + "Datoteka je poslana uspjeÅ¡no i bez pogreÅ¡aka", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Poslana datoteka izlazi iz okvira upload_max_size direktive postavljene u php.ini konfiguracijskoj datoteci", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslana datoteka izlazi iz okvira MAX_FILE_SIZE direktive postavljene u HTML obrascu", +"The uploaded file was only partially uploaded" => "Datoteka je poslana samo djelomiÄno", +"No file was uploaded" => "Ni jedna datoteka nije poslana", +"Missing a temporary folder" => "Nedostaje privremena mapa", +"Files" => "Datoteke", +"Maximum upload size" => "Maksimalna veliÄina prijenosa", +"Upload" => "PoÅ¡alji", +"Nothing in here. Upload something!" => "Nema niÄega u ovoj mapi. PoÅ¡alji neÅ¡to!", +"Name" => "Naziv", +"Download" => "Preuzmi", +"Size" => "VeliÄina", +"Modified" => "Zadnja promjena", +"Delete" => "BriÅ¡i", +"Upload too large" => "Prijenos je preobiman", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokuÅ¡avate prenijeti prelaze maksimalnu veliÄinu za prijenos datoteka na ovom poslužitelju." +); diff --git a/files/l10n/hu_HU.php b/files/l10n/hu_HU.php new file mode 100644 index 00000000000..a176ffce647 --- /dev/null +++ b/files/l10n/hu_HU.php @@ -0,0 +1,19 @@ + "Nincs hiba, a fájl sikeresen feltöltve.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött file meghaladja az upload_max_filesize direktívát a php.ini-ben.", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "A feltöltött fájl meghaladja a MAX_FILE_SIZE direktívát ami meghatározott a HTML form-ban.", +"The uploaded file was only partially uploaded" => "Az eredeti fájl csak részlegesen van feltöltve.", +"No file was uploaded" => "Nem lett fájl feltöltve.", +"Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár", +"Files" => "Fájlok", +"Maximum upload size" => "Maximális feltölthetÅ‘ fájlméret", +"Upload" => "Feltöltés", +"Nothing in here. Upload something!" => "Töltsön fel egy fájlt.", +"Name" => "Név", +"Download" => "Letöltés", +"Size" => "Méret", +"Modified" => "Módosítva", +"Delete" => "Törlés", +"Upload too large" => "Feltöltés túl nagy", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren." +); diff --git a/files/l10n/ia.php b/files/l10n/ia.php new file mode 100644 index 00000000000..852fb8794ac --- /dev/null +++ b/files/l10n/ia.php @@ -0,0 +1,14 @@ + "Le file incargate solmente esseva incargate partialmente", +"No file was uploaded" => "Nulle file esseva incargate", +"Files" => "Files", +"Maximum upload size" => "Dimension maxime de incargamento", +"Upload" => "Incargar", +"Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!", +"Name" => "Nomine", +"Download" => "Discargar", +"Size" => "Dimension", +"Modified" => "Modificate", +"Delete" => "Deler", +"Upload too large" => "Incargamento troppo longe" +); diff --git a/files/l10n/id.php b/files/l10n/id.php index feb5c6d8631..902eeeb4ec2 100644 --- a/files/l10n/id.php +++ b/files/l10n/id.php @@ -2,7 +2,6 @@ "Files" => "Berkas", "Maximum upload size" => "Ukuran unggah maksimum", "Upload" => "Unggah", -"New Folder" => "Folder Baru", "Nothing in here. Upload something!" => "Tidak ada apa-apa di sini. Unggah sesuatu!", "Name" => "Nama", "Download" => "Unduh", diff --git a/files/l10n/it.php b/files/l10n/it.php index 4c958924ceb..15ade733b97 100644 --- a/files/l10n/it.php +++ b/files/l10n/it.php @@ -1,8 +1,13 @@ "Non ci sono errori, file caricato con successo", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file caricato supera il valore upload_max_filesize in php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file caricato supera il valore MAX_FILE_SIZE definito nel form HTML", +"The uploaded file was only partially uploaded" => "Il file è stato parzialmente caricato", +"No file was uploaded" => "Nessun file è stato caricato", +"Missing a temporary folder" => "Cartella temporanea mancante", "Files" => "File", "Maximum upload size" => "Dimensione massima upload", "Upload" => "Carica", -"New Folder" => "Nuova Cartella", "Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!", "Name" => "Nome", "Download" => "Scarica", diff --git a/files/l10n/ja_JP.php b/files/l10n/ja_JP.php new file mode 100644 index 00000000000..d41e7e119a2 --- /dev/null +++ b/files/l10n/ja_JP.php @@ -0,0 +1,19 @@ + "エラーã¯ã‚ã‚Šã¾ã›ã‚“。ファイルã®ã‚¢ãƒƒãƒ—ロードã¯æˆåŠŸã—ã¾ã—ãŸã€‚", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯php.iniã®upload_max_filesizeã«è¨­å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯HTMLã®ãƒ•ã‚©ãƒ¼ãƒ ã«è¨­å®šã•ã‚ŒãŸMAX_FILE_SIZEã«è¨­å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™", +"The uploaded file was only partially uploaded" => "ファイルã¯ä¸€éƒ¨åˆ†ã—ã‹ã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ", +"No file was uploaded" => "ファイルã¯ã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ", +"Missing a temporary folder" => "テンãƒãƒ©ãƒªãƒ•ã‚©ãƒ«ãƒ€ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“", +"Files" => "ファイル", +"Maximum upload size" => "最大アップロードサイズ", +"Upload" => "アップロード", +"Nothing in here. Upload something!" => "ã“ã“ã«ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。何ã‹ã‚¢ãƒƒãƒ—ロードã—ã¦ãã ã•ã„。", +"Name" => "åå‰", +"Download" => "ダウンロード", +"Size" => "サイズ", +"Modified" => "更新日時", +"Delete" => "削除", +"Upload too large" => "ファイルサイズãŒå¤§ãã™ãŽã¾ã™", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードã—よã†ã¨ã—ã¦ã„るファイルã¯ã‚µãƒ¼ãƒã§è¦å®šã•ã‚ŒãŸæœ€å¤§ã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™" +); diff --git a/files/l10n/lb.php b/files/l10n/lb.php index 3f8a4af0bd9..43956fcd63e 100644 --- a/files/l10n/lb.php +++ b/files/l10n/lb.php @@ -1,8 +1,13 @@ "Keen Feeler, Datei ass komplett ropgelueden ginn", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Déi ropgelueden Datei ass méi grouss wei d'upload_max_filesize Eegenschaft an der php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass", +"The uploaded file was only partially uploaded" => "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn", +"No file was uploaded" => "Et ass keng Datei ropgelueden ginn", +"Missing a temporary folder" => "Et feelt en temporären Dossier", "Files" => "Dateien", "Maximum upload size" => "Maximum Upload Gréisst ", "Upload" => "Eroplueden", -"New Folder" => "Neien Dossier", "Nothing in here. Upload something!" => "Hei ass näischt. Lued eppes rop!", "Name" => "Numm", "Download" => "Eroflueden", diff --git a/files/l10n/lt_LT.php b/files/l10n/lt_LT.php new file mode 100644 index 00000000000..1bec35e0f8c --- /dev/null +++ b/files/l10n/lt_LT.php @@ -0,0 +1,19 @@ + "Klaidų nÄ—ra, failas įkeltas sÄ—kmingai", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ä®keliamo failo dydis virÅ¡ija upload_max_filesize parametrÄ… php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ä®keliamo failo dydis virÅ¡ija MAX_FILE_SIZE parametrÄ…, kuris yra nustatytas HTML formoje", +"The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai", +"No file was uploaded" => "Nebuvo įkeltas nÄ— vienas failas", +"Missing a temporary folder" => "NÄ—ra laikinojo katalogo", +"Files" => "Failai", +"Maximum upload size" => "Maksimalus failo dydis", +"Upload" => "Ä®kelti", +"Nothing in here. Upload something!" => "ÄŒia tuÅ¡Äia. Ä®kelkite kÄ… nors!", +"Name" => "Pavadinimas", +"Download" => "Atsisiųsti", +"Size" => "Dydis", +"Modified" => "Pakeista", +"Delete" => "IÅ¡trinti", +"Upload too large" => "Ä®kÄ—limui failas per didelis", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis virÅ¡ija maksimalų leidžiamÄ… Å¡iame serveryje" +); diff --git a/files/l10n/ms_MY.php b/files/l10n/ms_MY.php index 3b654cccdaf..038ffd521a0 100644 --- a/files/l10n/ms_MY.php +++ b/files/l10n/ms_MY.php @@ -2,7 +2,6 @@ "Files" => "fail", "Maximum upload size" => "Saiz maksimum muat naik", "Upload" => "Muat naik", -"New Folder" => "Folder baru", "Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!", "Name" => "Nama ", "Download" => "Muat turun", diff --git a/files/l10n/nb_NO.php b/files/l10n/nb_NO.php index 49c6c158f47..c4ef4989a58 100644 --- a/files/l10n/nb_NO.php +++ b/files/l10n/nb_NO.php @@ -2,7 +2,6 @@ "Files" => "Filer", "Maximum upload size" => "Maksimum opplastingsstørrelse", "Upload" => "Last opp", -"New Folder" => "Ny mappe", "Nothing in here. Upload something!" => "Ingenting her. Last opp noe!", "Name" => "Navn", "Download" => "Last ned", diff --git a/files/l10n/nl.php b/files/l10n/nl.php index c474d9a4ca2..9d470bdf2ff 100644 --- a/files/l10n/nl.php +++ b/files/l10n/nl.php @@ -1,8 +1,13 @@ "Geen fout opgetreden, bestand successvol geupload.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het geüploade bestand is groter dan de upload_max_filesize instelling in php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het geüploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is opgegeven in de HTML-formulier", +"The uploaded file was only partially uploaded" => "Het bestand is slechts gedeeltelijk geupload", +"No file was uploaded" => "Geen bestand geüpload", +"Missing a temporary folder" => "Een tijdelijke map mist", "Files" => "Bestanden", "Maximum upload size" => "Maximale bestandsgrootte voor uploads", "Upload" => "Upload", -"New Folder" => "Nieuwe map", "Nothing in here. Upload something!" => "Er bevindt zich hier niets. Upload een bestand!", "Name" => "Naam", "Download" => "Download", diff --git a/files/l10n/nn_NO.php b/files/l10n/nn_NO.php new file mode 100644 index 00000000000..34f2f6be960 --- /dev/null +++ b/files/l10n/nn_NO.php @@ -0,0 +1,19 @@ + "Ingen feil, fila vart lasta opp", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den opplasta fila er større enn variabelen upload_max_filesize i php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet", +"The uploaded file was only partially uploaded" => "Fila vart berre delvis lasta opp", +"No file was uploaded" => "Ingen filer vart lasta opp", +"Missing a temporary folder" => "Manglar ei mellombels mappe", +"Files" => "Filer", +"Maximum upload size" => "Maksimal opplastingsstorleik", +"Upload" => "Last opp", +"Nothing in here. Upload something!" => "Ingenting her. Last noko opp!", +"Name" => "Namn", +"Download" => "Last ned", +"Size" => "Storleik", +"Modified" => "Endra", +"Delete" => "Slett", +"Upload too large" => "For stor opplasting", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver Ã¥ laste opp er større enn maksgrensa til denne tenaren." +); diff --git a/files/l10n/pl.php b/files/l10n/pl.php index 6cd60267fc8..075a3da07fe 100644 --- a/files/l10n/pl.php +++ b/files/l10n/pl.php @@ -1,8 +1,13 @@ "Brak bÅ‚Ä™du, plik przesÅ‚any z sukcesem", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "PrzesÅ‚any plik przekracza ustawienie upload_max_filesize w pliku php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "PrzesÅ‚any plik przekracza MAX_FILE_SIZE ustawienia, które zostaÅ‚o okreÅ›lono w formularzu HTML", +"The uploaded file was only partially uploaded" => "Plik zostaÅ‚ przesÅ‚any tylko częściowo.", +"No file was uploaded" => "Å»aden plik nie zostaÅ‚ przesÅ‚any", +"Missing a temporary folder" => "Brakuje folderu tymczasowego", "Files" => "Pliki", "Maximum upload size" => "Maksymalna wielkość przesyÅ‚anego pliku", "Upload" => "PrzeÅ›lij", -"New Folder" => "Nowy katalog", "Nothing in here. Upload something!" => "Nic tu nie ma. PrzeÅ›lij jakieÅ› pliki!", "Name" => "Nazwa", "Download" => "ÅšciÄ…ganie", diff --git a/files/l10n/pt_BR.php b/files/l10n/pt_BR.php index efaefe51655..57b1af2ae6d 100644 --- a/files/l10n/pt_BR.php +++ b/files/l10n/pt_BR.php @@ -1,8 +1,13 @@ "Não houve nenhum erro, o arquivo foi transferido com sucesso", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O tamanho do arquivo excede o limed especifiicado em upload_max_filesize no php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O arquivo carregado excede o MAX_FILE_SIZE que foi especificado no formulário HTML", +"The uploaded file was only partially uploaded" => "O arquivo foi transferido parcialmente", +"No file was uploaded" => "Nenhum arquivo foi transferido", +"Missing a temporary folder" => "Pasta temporária não encontrada", "Files" => "Arquivos", "Maximum upload size" => "Tamanho máximo para carregar", "Upload" => "Carregar", -"New Folder" => "Nova Pasta", "Nothing in here. Upload something!" => "Nada aqui.Carregar alguma coisa!", "Name" => "Nome", "Download" => "Baixar", diff --git a/files/l10n/ro.php b/files/l10n/ro.php index a54b011d109..65ce6953ad0 100644 --- a/files/l10n/ro.php +++ b/files/l10n/ro.php @@ -1,8 +1,13 @@ "Nu am întâmpinat nici eroare, fiÈ™ierul a fost încărcat cu success", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "FiÈ™ierul are o dimensiune mai mare decât cea specificată în variabila upload_max_filesize din php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "FiÈ™ierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML", +"The uploaded file was only partially uploaded" => "FiÈ™ierul a fost încărcat doar parÈ›ial", +"No file was uploaded" => "Nu a fost încărcat nici un fiÈ™ier", +"Missing a temporary folder" => "Lipsă folder temporar", "Files" => "FiÈ™iere", "Maximum upload size" => "Dimensiunea maximă", "Upload" => "ÃŽncarcă", -"New Folder" => "Director nou", "Nothing in here. Upload something!" => "Nici un fiÈ™ier, încarcă ceva!", "Name" => "Nume", "Download" => "Descarcă", diff --git a/files/l10n/ru.php b/files/l10n/ru.php index ff1c05ce8ee..a77e6e370b4 100644 --- a/files/l10n/ru.php +++ b/files/l10n/ru.php @@ -1,8 +1,13 @@ "Файл уÑпешно загружен", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Файл превышает допуÑтимые размеры (опиÑаны как upload_max_filesize в php.ini)", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файл превышает размер MAX_FILE_SIZE, указаный в HTML-форме", +"The uploaded file was only partially uploaded" => "Файл был чаÑтично загружен", +"No file was uploaded" => "Файл не был загружен", +"Missing a temporary folder" => "Ðевозможно найти временную директорию", "Files" => "Файлы", "Maximum upload size" => "МакÑимальный размер файла", "Upload" => "Закачать", -"New Folder" => "ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°", "Nothing in here. Upload something!" => "ЗдеÑÑŒ ничего нет. Закачайте что-нибудь!", "Name" => "Ðазвание", "Download" => "Скачать", diff --git a/files/l10n/sk_SK.php b/files/l10n/sk_SK.php new file mode 100644 index 00000000000..840d924fbee --- /dev/null +++ b/files/l10n/sk_SK.php @@ -0,0 +1,19 @@ + "Nenastala žiadna chyba, súbor bol úspeÅ¡ne nahraný", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahraný súbor presiahol direktívu upload_max_filesize v php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný súbor presiahol MAX_FILE_SIZE direktívu, ktorá bola Å¡pecifikovaná v HTML formulári", +"The uploaded file was only partially uploaded" => "Nahrávaný súbor bol iba ÄiastoÄne nahraný", +"No file was uploaded" => "Žiaden súbor nebol nahraný", +"Missing a temporary folder" => "Chýbajúci doÄasný prieÄinok", +"Files" => "Súbory", +"Maximum upload size" => "Maximálna veľkosÅ¥ nahratia", +"Upload" => "NahraÅ¥", +"Nothing in here. Upload something!" => "NiÄ tu nie je. Nahrakte nieÄo!", +"Name" => "Meno", +"Download" => "StiahnuÅ¥", +"Size" => "VeľkosÅ¥", +"Modified" => "Upravené", +"Delete" => "OdstrániÅ¥", +"Upload too large" => "Nahrávanie príliÅ¡ veľké", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahraÅ¥ presahujú maximálnu veľkosÅ¥ pre nahratie súborov na tento server." +); diff --git a/files/l10n/sl.php b/files/l10n/sl.php new file mode 100644 index 00000000000..5a09e0fe20b --- /dev/null +++ b/files/l10n/sl.php @@ -0,0 +1,19 @@ + "datoteka je bila naložena uspeÅ¡no.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Velikost željene naložene datoteke je prevelika. (upload_max_filesize - php.ini) Kontaktirajte Administratorja.", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Velikost željene naložene datoteke je prevelika. (MAX_FILE_SIZE - html formi) Kontaktirajte Administratorja.", +"The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena.", +"No file was uploaded" => "Naloženih ni bilo niÄ Datotek.", +"Missing a temporary folder" => "Ni potrebne zaÄasne datoteke. (temporary folder)", +"Files" => "Datoteke", +"Maximum upload size" => "Maksimalna velikost", +"Upload" => "Naloži gor", +"Nothing in here. Upload something!" => "Naloženih Å¡e ni bilo niÄ datotek.", +"Name" => "Ime", +"Download" => "Naloži dol", +"Size" => "Velikost", +"Modified" => "Urejeno", +"Delete" => "IzbriÅ¡i", +"Upload too large" => "Nalaganje ni mogoÄe, ker je preveliko.", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke ki jih želiÅ¡ naložiti presegajo maksimalno velikost na tem strežniku. Kontaktirajte Administratorja." +); diff --git a/files/l10n/sr.php b/files/l10n/sr.php index 445387ffa2f..9c5dbae2a23 100644 --- a/files/l10n/sr.php +++ b/files/l10n/sr.php @@ -1,8 +1,13 @@ "Ðема грешке, фајл је уÑпешно поÑлат", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ПоÑлати фајл превазилази директиву upload_max_filesize из ", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ПоÑлати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми", +"The uploaded file was only partially uploaded" => "ПоÑлати фајл је Ñамо делимично отпремљен!", +"No file was uploaded" => "Ðиједан фајл није поÑлат", +"Missing a temporary folder" => "ÐедоÑтаје привремена фаÑцикла", "Files" => "Фајлови", "Maximum upload size" => "МакÑимална величина пошиљке", "Upload" => "Пошаљи", -"New Folder" => "Ðова фаÑцикла", "Nothing in here. Upload something!" => "Овде нема ничег. Пошаљите нешто!", "Name" => "Име", "Download" => "Преузми", diff --git a/files/l10n/sr@latin.php b/files/l10n/sr@latin.php index 3cc0ee0f150..1b5addbc571 100644 --- a/files/l10n/sr@latin.php +++ b/files/l10n/sr@latin.php @@ -1,8 +1,13 @@ "Nema greÅ¡ke, fajl je uspeÅ¡no poslat", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Poslati fajl prevazilazi direktivu upload_max_filesize iz ", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslati fajl prevazilazi direktivu MAX_FILE_SIZE koja je navedena u HTML formi", +"The uploaded file was only partially uploaded" => "Poslati fajl je samo delimiÄno otpremljen!", +"No file was uploaded" => "Nijedan fajl nije poslat", +"Missing a temporary folder" => "Nedostaje privremena fascikla", "Files" => "Fajlovi", "Maximum upload size" => "Maksimalna veliÄina poÅ¡iljke", "Upload" => "PoÅ¡alji", -"New Folder" => "Nova fascikla", "Nothing in here. Upload something!" => "Ovde nema niÄeg. PoÅ¡aljite neÅ¡to!", "Name" => "Ime", "Download" => "Preuzmi", diff --git a/files/l10n/sv.php b/files/l10n/sv.php index dd1ac479366..dfd32f3f5c2 100644 --- a/files/l10n/sv.php +++ b/files/l10n/sv.php @@ -1,14 +1,19 @@ "Inga fel uppstod. Filen laddades upp utan problem", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-formulär", +"The uploaded file was only partially uploaded" => "Den uppladdade filen var endast delvist uppladdad", +"No file was uploaded" => "Ingen fil blev uppladdad", +"Missing a temporary folder" => "Saknar en tillfällig mapp", "Files" => "Filer", "Maximum upload size" => "Maximal storlek att lägga upp", -"Upload" => "Lägg upp", -"New Folder" => "Ny katalog", -"Nothing in here. Upload something!" => "Ingenting här. Lägg upp nÃ¥got!", +"Upload" => "Ladda upp", +"Nothing in here. Upload something!" => "Ingenting här. Ladda upp nÃ¥got!", "Name" => "Namn", "Download" => "Ladda ned", "Size" => "Storlek", "Modified" => "Ändrad", "Delete" => "Ta bort", -"Upload too large" => "För stor överföring", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker lägga upp överstiger den maximala storleken för filöverföringar pÃ¥ servern." +"Upload too large" => "För stor uppladdning", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar pÃ¥ servern." ); diff --git a/files/l10n/tr.php b/files/l10n/tr.php new file mode 100644 index 00000000000..5fc46056175 --- /dev/null +++ b/files/l10n/tr.php @@ -0,0 +1,19 @@ + "Bir hata yok, dosya baÅŸarıyla yüklendi", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Yüklenen dosya php.ini de belirtilen upload_max_filesize sınırını aşıyor", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Yüklenen dosya HTML formundaki MAX_FILE_SIZE sınırını aşıyor", +"The uploaded file was only partially uploaded" => "Yüklenen dosyanın sadece bir kısmı yüklendi", +"No file was uploaded" => "Hiç dosya yüklenmedi", +"Missing a temporary folder" => "Geçici bir klasör eksik", +"Files" => "Dosyalar", +"Maximum upload size" => "Maksimum yükleme boyutu", +"Upload" => "Yükle", +"Nothing in here. Upload something!" => "Burada hiçbir ÅŸey yok. BirÅŸeyler yükleyin!", +"Name" => "Ad", +"Download" => "Ä°ndir", +"Size" => "Boyut", +"Modified" => "DeÄŸiÅŸtirilme", +"Delete" => "Sil", +"Upload too large" => "Yüklemeniz çok büyük", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor." +); diff --git a/files/l10n/zh_CN.php b/files/l10n/zh_CN.php index abb2f9db232..a4d7283df87 100644 --- a/files/l10n/zh_CN.php +++ b/files/l10n/zh_CN.php @@ -1,8 +1,13 @@ "没有å‘生错误,文件上传æˆåŠŸã€‚", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件大å°è¶…过了php.ini 中指定的upload_max_filesize", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件超过了在HTML 表å•ä¸­æŒ‡å®šçš„MAX_FILE_SIZE", +"The uploaded file was only partially uploaded" => "åªä¸Šä¼ äº†æ–‡ä»¶çš„一部分", +"No file was uploaded" => "文件没有上传", +"Missing a temporary folder" => "缺少临时目录", "Files" => "文件", "Maximum upload size" => "最大上传大å°", "Upload" => "上传", -"New Folder" => "新建文件夹", "Nothing in here. Upload something!" => "这里还什么都没有。上传些东西å§ï¼", "Name" => "å称", "Download" => "下载", diff --git a/l10n/.tx/config b/l10n/.tx/config new file mode 100644 index 00000000000..b75b28bf1cd --- /dev/null +++ b/l10n/.tx/config @@ -0,0 +1,33 @@ +[main] +host = https://www.transifex.net + +[owncloud.core] +file_filter = /core.po +source_file = templates/core.pot +source_lang = en + +[owncloud.calendar] +file_filter = /calendar.po +source_file = templates/calendar.pot +source_lang = en + +[owncloud.contacts] +file_filter = /contacts.po +source_file = templates/contacts.pot +source_lang = en + +[owncloud.files] +file_filter = /files.po +source_file = templates/files.pot +source_lang = en + +[owncloud.media] +file_filter = /media.po +source_file = templates/media.pot +source_lang = en + +[owncloud.settings] +file_filter = /settings.po +source_file = templates/settings.pot +source_lang = en + diff --git a/l10n/ar/calendar.po b/l10n/ar/calendar.po new file mode 100644 index 00000000000..c24233afb29 --- /dev/null +++ b/l10n/ar/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "تم تغيير المنطقة الزمنية" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "طلب غير Ù…Ùهوم" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "الجدول الزمني" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "جدول زمني خاطئ" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "عيد ميلاد" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "عمل" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "إتصال" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "الزبائن" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "المرسل" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "عطلة" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ø£Ùكار" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "رحلة" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "يوبيل" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "إجتماع" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "شيء آخر" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "شخصي" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "مشاريع" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "اسئلة" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "العمل" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "لا يعاد" + +#: lib/object.php:354 +msgid "Daily" +msgstr "يومي" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "أسبوعي" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "كل نهاية الأسبوع" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "كل اسبوعين" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "شهري" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "سنوي" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "ليس صÙÙŠÙ" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "كل النهار" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "خانات خالية من المعلومات" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "عنوان" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "من تاريخ" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "إلى تاريخ" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "إلى يوم" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "إلى وقت" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "هذا الحدث ينتهي قبل أن يبدأ" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "خطأ ÙÙŠ قاعدة البيانات" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "إسبوع" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "شهر" + +#: templates/calendar.php:40 +msgid "List" +msgstr "قائمة" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "اليوم" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "الجداول الزمنية" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "لم يتم قراءة المل٠بنجاح." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "إختر الجدول الزمني الرئيسي" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "جدول زمني جديد" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "وصلة CalDav" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "تحميل" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "تعديل" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "حذÙ" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "جدول زمني جديد" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "عادل الجدول الزمني" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "الاسم المرئي" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "حالي" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "لون الجدول الزمني" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "إحÙظ" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "أرسل" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "إلغاء" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "عادل حدث" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "تصدير المعلومات" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "عنوان الحدث" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Ùئة" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "اختر الÙئة" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "حدث ÙÙŠ يوم كامل" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "من" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "إلى" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "خيارات متقدمة" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "إعادة" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "مكان" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "مكان الحدث" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "مواصÙات" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "وص٠الحدث" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "إدخال مل٠Ical" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "كيÙية إدخال مل٠جدول زمني ØŸ" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "إدخال معلومات إلى جدول زمني حالي" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "إدخال معلومات إلى جدول زمني جديد" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "الرجاء إختر الجدول الزمني" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "إدخال" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "الرجوع" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "الرجاء إملء الخانات" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "إضاÙØ© حدث جديد" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "المنطقة الزمنية" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "شكل الوقت" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24 ساعة" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12 ساعة" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "عنوان لتحديث ال CalDAV الجدول الزمني" + + diff --git a/l10n/ar/contacts.po b/l10n/ar/contacts.po new file mode 100644 index 00000000000..5f67130cd91 --- /dev/null +++ b/l10n/ar/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "هذا ليس دÙتر عناوينك." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "لم يتم العثور على الشخص." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "لم يتم قراءة ال vCard بنجاح." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "المعلومات الموجودة ÙÙŠ ال vCard غير صحيحة. الرجاء إعادة تحديث الصÙحة." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "عنوان" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "الهاتÙ" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "البريد الالكتروني" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "المؤسسة" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "الوظيÙØ©" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "البيت" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "الهات٠المحمول" + +#: lib/app.php:114 +msgid "Text" +msgstr "معلومات إضاÙية" + +#: lib/app.php:115 +msgid "Voice" +msgstr "صوت" + +#: lib/app.php:116 +msgid "Fax" +msgstr "الÙاكس" + +#: lib/app.php:117 +msgid "Video" +msgstr "الÙيديو" + +#: lib/app.php:118 +msgid "Pager" +msgstr "الرنان" + +#: photo.php:40 +msgid "This is not your contact." +msgstr ".هذا ليس من معارÙÙŠ" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "هذا الكرت ليس متلائم مع نظام ال RFC." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "لا يحتوي هذا الكرت على صورة." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "أض٠شخص " + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "مجموعة" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "الاسم" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "العنوان البريدي" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "إضاÙØ©" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "شارع" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "المدينة" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "المنطقة" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "رقم المنطقة" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "البلد" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "أض٠شخص " + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "تعديل" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "حذÙ" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "تاريخ الميلاد" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "الهاتÙ" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/ar/core.po b/l10n/ar/core.po new file mode 100644 index 00000000000..058ad6fbd7f --- /dev/null +++ b/l10n/ar/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "سو٠نرسل لك بريد يحتوي على وصلة لتجديد كلمة السر." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "تم طلب" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "محاولة دخول Ùاشلة!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "إسم المستخدم" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "طلب تعديل" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "لقد تم تعديل كلمة السر" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "كلمة سر جديدة" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "تعديل كلمة السر" + +#: strings.php:5 +msgid "Personal" +msgstr "خصوصيات" + +#: strings.php:6 +msgid "Users" +msgstr "المستخدم" + +#: strings.php:7 +msgid "Apps" +msgstr "التطبيقات" + +#: strings.php:8 +msgid "Admin" +msgstr "مستخدم رئيسي" + +#: strings.php:9 +msgid "Help" +msgstr "المساعدة" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "لم يتم إيجاد" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "أض٠مستخدم رئيسي " + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "كلمة السر" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "خيارات متقدمة" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "مجلد المعلومات" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "أسس قاعدة البيانات" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "سيتم استخدمه" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "مستخدم قاعدة البيانات" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "كلمة سر مستخدم قاعدة البيانات" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "إسم قاعدة البيانات" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "خادم قاعدة البيانات" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "انهاء التعديلات" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "الخروج" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "تعديلات" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "هل نسيت كلمة السر؟" + +#: templates/login.php:15 +msgid "remember" +msgstr "تذكر" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "تم الخروج بنجاح." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "السابق" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "التالي" + + diff --git a/l10n/ar/files.po b/l10n/ar/files.po new file mode 100644 index 00000000000..d557d0039c8 --- /dev/null +++ b/l10n/ar/files.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "تم ترÙيع الملÙات بنجاح." + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"حجم المل٠الذي تريد ترÙيعه أعلى مما upload_max_filesize يسمح به ÙÙŠ مل٠" +"php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"حجم المل٠الذي تريد ترÙيعه أعلى مما MAX_FILE_SIZE يسمح به ÙÙŠ واجهة ال HTML." + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "تم ترÙيع جزء من الملÙات الذي تريد ترÙيعها Ùقط" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "لم يتم ترÙيع أي من الملÙات" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "المجلد المؤقت غير موجود" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "الملÙات" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "الحد الأقصى لحجم الملÙات التي يمكن رÙعها" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "إرÙع" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "لا يوجد شيء هنا. إرÙع بعض الملÙات!" + +#: templates/index.php:43 +msgid "Name" +msgstr "الاسم" + +#: templates/index.php:45 +msgid "Download" +msgstr "تحميل" + +#: templates/index.php:49 +msgid "Size" +msgstr "حجم" + +#: templates/index.php:50 +msgid "Modified" +msgstr "معدل" + +#: templates/index.php:50 +msgid "Delete" +msgstr "محذوÙ" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "حجم الترÙيع أعلى من المسموح" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "حجم الملÙات التي تريد ترÙيعها أعلى من المسموح على الخادم." + + diff --git a/l10n/ar/media.po b/l10n/ar/media.po new file mode 100644 index 00000000000..7438bf29e3f --- /dev/null +++ b/l10n/ar/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "الموسيقى" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "إلعب" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "تجميد" + +#: templates/music.php:5 +msgid "Previous" +msgstr "السابق" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "التالي" + +#: templates/music.php:7 +msgid "Mute" +msgstr "إلغاء الصوت" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "تشغيل الصوت" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "إعادة البحث عن ملÙات الموسيقى" + +#: templates/music.php:37 +msgid "Artist" +msgstr "الÙنان" + +#: templates/music.php:38 +msgid "Album" +msgstr "الألبوم" + +#: templates/music.php:39 +msgid "Title" +msgstr "العنوان" + + diff --git a/l10n/ar/settings.po b/l10n/ar/settings.po new file mode 100644 index 00000000000..ed62562f685 --- /dev/null +++ b/l10n/ar/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/team/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "طلبك غير Ù…Ùهوم" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "تم تغيير ال OpenID" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "تم تغيير اللغة" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "أض٠تطبيقاتك" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "إختر تطبيقاً" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-مسجل" + +#: templates/apps.php:23 +msgid "by" +msgstr "من قبل" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "إسأل سؤال" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "الاتصال بقاعدة بيانات المساعدة لم يتم بنجاح" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "إذهب هنالك بنÙسك" + +#: templates/help.php:29 +msgid "Answer" +msgstr "الجواب" + +#: templates/personal.php:8 +msgid "You use" +msgstr "أنت تستخدم" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "من الموجود" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "لقد تم تغيير كلمات السر" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "لم يتم تعديل كلمة السر بنجاح" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "كلمات السر الحالية" + +#: templates/personal.php:16 +msgid "New password" +msgstr "كلمات سر جديدة" + +#: templates/personal.php:17 +msgid "show" +msgstr "أظهر" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "عدل كلمة السر" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "اللغة" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "إستخدم هذا العنوان للإتصال ب ownCloud داخل نظام الملÙات " + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "الاسم" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "كلمات السر" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "مجموعات" + +#: templates/users.php:23 +msgid "Create" +msgstr "انشئ" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "حذÙ" + + diff --git a/l10n/bg_BG/contacts.po b/l10n/bg_BG/contacts.po index 4b6ca8fc510..ebddb139140 100644 --- a/l10n/bg_BG/contacts.po +++ b/l10n/bg_BG/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/team/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +17,222 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: photo.php:53 -msgid "This card is not RFC compatible." +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" msgstr "" -#: photo.php:90 -msgid "This card does not contain a photo." +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" msgstr "" -#: templates/index.php:8 -msgid "Add Contact" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" msgstr "" -#: templates/part.addcardform.php:5 -msgid "Group" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" msgstr "" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" msgstr "" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: lib/app.php:112 +msgid "Mobile" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" +#: lib/app.php:114 +msgid "Text" msgstr "" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" +#: lib/app.php:115 +msgid "Voice" msgstr "" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: lib/app.php:117 +msgid "Video" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.addcardform.php:97 +msgid "Create Contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" msgstr "" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/bg_BG/core.po b/l10n/bg_BG/core.po index f23044c9878..c7db7403c9f 100644 --- a/l10n/bg_BG/core.po +++ b/l10n/bg_BG/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-06 19:20+0000\n" -"Last-Translator: adin \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/team/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,51 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Ще получите връзка за нулиране на паролата Ви." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "ЗаÑвено" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Входа пропадна!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Потребител" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Ðулиране на заÑвка" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Вашата парола е нулирана" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Ðова парола" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Ðулиране на парола" + #: strings.php:5 msgid "Personal" msgstr "Лични" @@ -48,54 +93,50 @@ msgstr "облакът не намерен" msgid "Create an admin account" msgstr "Създаване на админ профил" -#: templates/installation.php:21 -msgid "Username" -msgstr "Потребител" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Парола" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Разширено" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Конфигуриране на базата" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "ще Ñе ползва" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Потребител за базата" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Парола за базата" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Име на базата" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Разширено" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "ХоÑÑ‚ за базата" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° данни" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Завършване на наÑтройките" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "дава Ви Ñвобода и контрол на Вашите лични данни" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -105,38 +146,22 @@ msgstr "Изход" msgid "Settings" msgstr "ÐаÑтройки" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Забравена парола?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "запомни" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Вие излÑзохте." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Ще получите връзка за да нулирате паролата Ñи." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "ЗаÑвено" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Входа пропадна!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "ПотребителÑко име или Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "ЗаÑвка за нулиране" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "пред." @@ -145,16 +170,4 @@ msgstr "пред." msgid "next" msgstr "Ñледващо" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Вашата парола е нулирана" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Ðова парола" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Ðулиране на парола" - diff --git a/l10n/bg_BG/files.po b/l10n/bg_BG/files.po index 475f6dc3fae..3ed53c3a4b0 100644 --- a/l10n/bg_BG/files.po +++ b/l10n/bg_BG/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/team/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Файлът е качен уÑпешно" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Файлът който Ñе опитвате да качите, надвишава зададените ÑтойноÑти в " +"upload_max_filesize в PHP.INI" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Файлът който Ñе опитвате да качите надвишава ÑтойноÑтите в MAX_FILE_SIZE в " +"HTML формата." -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Файлът е качен чаÑтично" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Фахлът не бе качен" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "ЛипÑва временната папка" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Файлове" @@ -52,43 +56,55 @@ msgstr "Файлове" msgid "Maximum upload size" msgstr "МакÑ. размер за качване" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Качване" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Ðова папка" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "ÐÑма нищо, качете нещо!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Име" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "ИзтеглÑне" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Размер" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Променено" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Изтриване" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Файлът е прекалено голÑм" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/bg_BG/media.po b/l10n/bg_BG/media.po index e8fa24bbe50..b06ecc85d90 100644 --- a/l10n/bg_BG/media.po +++ b/l10n/bg_BG/media.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-06 08:43+0000\n" -"Last-Translator: ep98 \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/team/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +18,15 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Музика" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "ПуÑни" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Пауза" @@ -34,7 +34,7 @@ msgstr "Пауза" msgid "Previous" msgstr "Предишна" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Следваща" @@ -46,11 +46,7 @@ msgstr "Отнеми" msgid "Unmute" msgstr "Върни" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Сканирани пеÑни" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Повторно Ñканиране" diff --git a/l10n/bg_BG/settings.po b/l10n/bg_BG/settings.po index 9f23a84787f..c5a72e79d81 100644 --- a/l10n/bg_BG/settings.po +++ b/l10n/bg_BG/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-06 19:21+0000\n" -"Last-Translator: adin \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/team/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,22 +19,26 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Проблем Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñта" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID е Ñменено" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ðевалидна заÑвка" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID е Ñменено" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Езика е Ñменен" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Добавете Ваша програма" @@ -55,15 +59,15 @@ msgstr "от" msgid "Ask a question" msgstr "Задайте въпроÑ" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Проблеми при Ñвързване Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ð½Ð°Ñ‚Ð° база" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Отидете ръчно." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Отговор" @@ -99,35 +103,51 @@ msgstr "показва" msgid "Change password" msgstr "ПромÑна на парола" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Език" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Помогнете Ñ Ð¿Ñ€ÐµÐ²Ð¾Ð´Ð°" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "ползвай този Ð°Ð´Ñ€ÐµÑ Ð·Ð° връзка Ñ Ð’Ð°ÑˆÐ¸Ñ ownCloud във Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ Ð¼ÐµÐ½Ð¸Ð´Ð¶ÑŠÑ€" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Име" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Парола" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Групи" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Ðово" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Изтриване" diff --git a/l10n/ca/contacts.po b/l10n/ca/contacts.po index a9a23483bc3..f463226b436 100644 --- a/l10n/ca/contacts.po +++ b/l10n/ca/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/team/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Aquesta no és la vostra llibreta d'adreces" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "No s'ha trobat el contacte." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "No s'ha pogut llegir la vCard" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "La informació de la vCard és incorrecta. Carregueu la pàgina de nou." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adreça" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telèfon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Correu electrònic" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organització" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Feina" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Casa" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mòbil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Text" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Veu" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Paginador" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Aquest contacte no és vostre." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Aquesta targeta no és compatible amb RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Aquesta targeta no conté foto." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Afegeix un contacte" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grup" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nom" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Adreça Postal" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Addicional" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Carrer" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Ciutat" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Comarca" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Codi postal" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "País" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Crea un contacte" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Edita" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Elimina" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Aniversari" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telèfon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/ca/core.po b/l10n/ca/core.po index cfbd4678f9f..cf30bb6af45 100644 --- a/l10n/ca/core.po +++ b/l10n/ca/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 13:54+0000\n" -"Last-Translator: rogerc \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/team/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Sol·licitat" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "No s'ha pogut entrar" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nom d'usuari" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Sol·licita reinicialització" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "La vostra contrasenya s'ha reinicialitzat" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Contrasenya nova" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Reinicialitza contrasenya" + #: strings.php:5 msgid "Personal" msgstr "Personal" @@ -46,54 +91,50 @@ msgstr "No s'ha trobat el núvol" msgid "Create an admin account" msgstr "Crea un compte d'administrador" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nom d'usuari" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Contrasenya" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avançat" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Carpeta de dades" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configura la base de dades" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "s'usarà" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Usuari de la base de dades" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Contrasenya de la base de dades" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nom de la base de dades" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avançat" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Ordinador central de la base de dades" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Carpeta de dades" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Acaba la configuració" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "us dóna llibertat i control sobre les seves dades" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +144,22 @@ msgstr "Sortir" msgid "Settings" msgstr "Arranjament" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Heu perdut la contrasenya?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "recorda'm" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Heu tancat la sessió." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Rebreu un enllaç per correu electrònic per restablir la contrasenya" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Sol·licitat" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "L'inici de sessió ha fallat!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nom d'usuari o correu electrònic" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Sol.licitud de restabliment" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "anterior" @@ -143,16 +168,4 @@ msgstr "anterior" msgid "next" msgstr "següent" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "La vostra contrasenya s'ha restablert" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nova contrasenya" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Restabliment de la contrasenya" - diff --git a/l10n/ca/files.po b/l10n/ca/files.po index faf3ca5063e..8427ff069a7 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/team/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "El fitxer s'ha pujat correctament" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"El fitxer de pujada excedeix la directiva upload_max_filesize establerta a " +"php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"El fitxer de pujada excedeix la directiva MAX_FILE_SIZE especificada al " +"formulari HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "El fitxer només s'ha pujat parcialment" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "El fitxer no s'ha pujat" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "S'ha perdut un fitxer temporal" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Fitxers" @@ -52,43 +56,55 @@ msgstr "Fitxers" msgid "Maximum upload size" msgstr "Mida màxima de pujada" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Puja" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Carpeta nova" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Res per aquí. Pugeu alguna cosa!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nom" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Descarrega" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Mida" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modificat" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Esborra" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "La pujada és massa gran" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/ca/media.po b/l10n/ca/media.po index b0754f01964..7f400afcfd1 100644 --- a/l10n/ca/media.po +++ b/l10n/ca/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-23 11:09+0200\n" -"PO-Revision-Date: 2011-08-21 10:56+0000\n" -"Last-Translator: rogerc \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/team/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Música" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Reprodueix" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pausa" @@ -33,7 +34,7 @@ msgstr "Pausa" msgid "Previous" msgstr "Anterior" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Següent" @@ -45,13 +46,9 @@ msgstr "Mut" msgid "Unmute" msgstr "Activa el so" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Cançons escanejades" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" -msgstr "Escaneja de nou la col·lecció" +msgstr "Explora de nou la col·lecció" #: templates/music.php:37 msgid "Artist" diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po index e976e434c85..16747902ae7 100644 --- a/l10n/ca/settings.po +++ b/l10n/ca/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-23 15:33+0000\n" -"Last-Translator: rogerc \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/team/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,29 +18,33 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Error d'autenticació" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID ha canviat" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Sol.licitud no vàlida" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID ha canviat" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "S'ha canviat l'idioma" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Afegir una aplicació" #: templates/apps.php:21 msgid "Select an App" -msgstr "Sel·leccioneu una aplicació" +msgstr "Seleccioneu una aplicació" #: templates/apps.php:23 msgid "-licensed" @@ -53,15 +58,15 @@ msgstr "per" msgid "Ask a question" msgstr "Feu una pregunta" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problemes per connectar-se a la base de dades d'ajuda." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Vés-hi manualment." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Resposta" @@ -77,6 +82,10 @@ msgstr "del disponible" msgid "Your password got changed" msgstr "La contrasenya ha canviat" +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "No s'ha pogut canviar la contrasenya" + #: templates/personal.php:15 msgid "Current password" msgstr "contrasenya actual" @@ -94,35 +103,51 @@ msgid "Change password" msgstr "canvia la contrasenya" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Idioma" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Ajudeu amb la traducció" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "useu aquesta adreça per connectar-vos a ownCloud des del gestor de fitxers" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nom" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Contrasenya" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grups" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Crea" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Esborra" diff --git a/l10n/cs_CZ/contacts.po b/l10n/cs_CZ/contacts.po index 76af9f7e5ca..3bf09f0a1af 100644 --- a/l10n/cs_CZ/contacts.po +++ b/l10n/cs_CZ/contacts.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jan Krejci , 2011. +# Martin , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/team/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +19,222 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Toto není Váš adresář." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Kontakt nebyl nalezen." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard nelze pÅ™eÄíst." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Informace o vCard je nesprávná. Obnovte stránku, prosím." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresa" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizace" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Pracovní" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Domácí" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Text" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Hlas" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Toto není Váš kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Tato karta není kompatibilní s RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Tato karta neobsahuje foto" -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "PÅ™idat kontakt" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Skupina" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Jméno" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PO box" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Rozšířené" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulice" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "MÄ›sto" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Kraj" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PSÄŒ" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "ZemÄ›" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "VytvoÅ™it kontakt" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editovat" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Odstranit" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Narozeniny" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po index f13d48f0b08..1aa44c40cd7 100644 --- a/l10n/cs_CZ/core.po +++ b/l10n/cs_CZ/core.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Jan Krejci , 2011. # Martin , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-04 18:14+0200\n" -"PO-Revision-Date: 2011-09-04 16:14+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/team/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +19,51 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Bude Vám zaslán odkaz pro obnovu hesla" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Požadováno" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "PÅ™ihlášení selhalo" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Uživatelské jméno" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Vyžádat obnovu" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "VaÅ¡e heslo bylo obnoveno" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nové heslo" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Obnovit heslo" + #: strings.php:5 msgid "Personal" msgstr "Osobní" @@ -45,53 +92,49 @@ msgstr "Cloud nebyl nalezen" msgid "Create an admin account" msgstr "VytvoÅ™it úÄet správce" -#: templates/installation.php:21 -msgid "Username" -msgstr "Uživatelské jméno" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Heslo" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Rozšířené volby" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datový adresář" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurace databáze" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "bude použito" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Uživatel databáze" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Heslo k databázi" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Název databáze" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Rozšířené volby" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" -msgstr "" +msgstr "Hostitel databáze" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Datový adresář" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "DokonÄit instalaci" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" +msgid "web services under your control" msgstr "" #: templates/layout.user.php:34 @@ -102,38 +145,22 @@ msgstr "Odhlásit se" msgid "Settings" msgstr "Nastavení" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" -msgstr "" +msgstr "Zapomenuté heslo?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "zapamatovat si" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Jste odhlášeni." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "PÅ™ihlášení se nezdaÅ™ilo!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "zpÄ›t" @@ -142,16 +169,4 @@ msgstr "zpÄ›t" msgid "next" msgstr "vpÅ™ed" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "" - diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index 6dc49c6a5d5..883d1a427f9 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/team/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,36 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Soubor byl odeslán úspěšnÄ›" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Odeslaný soubor pÅ™esáhl velikostí parametr upload_max_filesize v php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Odeslaný soubor pÅ™esáhl velikostí parametr MAX_FILE_SIZE specifikovaný v " +"HTML formuláři" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Soubor byl odeslán pouze ÄásteÄnÄ›" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Soubor nebyl odeslán" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Chybí adresář pro soÄasné soubory" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Soubory" @@ -52,43 +55,55 @@ msgstr "Soubory" msgid "Maximum upload size" msgstr "Maximální velikost ukládaných souborů" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Uložit" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nový adresář" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Žádný obsah. Uložte si nÄ›co!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Název" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Stáhnout" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Velikost" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "ZmÄ›nÄ›no" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Vymazat" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "PříliÅ¡ velký soubor" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/cs_CZ/media.po b/l10n/cs_CZ/media.po index f27aab19c88..896bb88c3f7 100644 --- a/l10n/cs_CZ/media.po +++ b/l10n/cs_CZ/media.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Jan Krejci , 2011. # Martin , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-09-01 14:09+0000\n" -"Last-Translator: Fireball \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/team/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +19,15 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" -msgstr "hudba" +msgstr "Hudba" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "PÅ™ehrát" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pauza" @@ -33,7 +35,7 @@ msgstr "Pauza" msgid "Previous" msgstr "PÅ™edchozí" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Další" @@ -45,11 +47,7 @@ msgstr "ZtiÅ¡it" msgid "Unmute" msgstr "Zesílit" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Skladby jsou prohledány" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Znovu prohledat " diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po index f9863f56d18..dbcea3a216b 100644 --- a/l10n/cs_CZ/settings.po +++ b/l10n/cs_CZ/settings.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Jan Krejci , 2011. # Martin , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-09-01 14:15+0000\n" -"Last-Translator: Fireball \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/team/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +19,26 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Chyba pÅ™i ověření" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID zmÄ›nÄ›n" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Chybný dotaz" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID zmÄ›nÄ›n" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Jazyk byl zmÄ›nÄ›n" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "PÅ™idejte svou aplikaci" @@ -53,15 +59,15 @@ msgstr "podle" msgid "Ask a question" msgstr "Zeptat se" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problémy s pÅ™ipojením k databázi s nápovÄ›dou." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "PÅ™ejít ruÄnÄ›." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "OdpovÄ›Ä" @@ -97,36 +103,52 @@ msgstr "zobrazit" msgid "Change password" msgstr "ZmÄ›nit heslo" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Jazyk" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Pomozte s pÅ™ekladem" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "tuto adresu použijte pro pÅ™ipojení k ownCloud ve VaÅ¡em správci souborů" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Jméno" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Heslo" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Skupiny" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "VytvoÅ™it" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Vymazat" diff --git a/l10n/da/contacts.po b/l10n/da/contacts.po index c65bf62822a..9d69617ac47 100644 --- a/l10n/da/contacts.po +++ b/l10n/da/contacts.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# Morten Juhl-Johansen Zölde-Fejér , 2011. # Pascal d'Hermilly , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 20:41+0000\n" -"Last-Translator: pascal_a \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/team/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,164 +20,222 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "Du skal logge ind." - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "Dette er ikke din adressebog." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "Kontakt kunne ikke findes." - -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "Dette er ikke din kontakt." +msgstr "Kontaktperson kunne ikke findes." -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "Kunne ikke læse vCard." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informationen om vCard er forkert. Genindlæs siden." -#: photo.php:53 -msgid "This card is not RFC compatible." -msgstr "Dette kort er ikke RFC-kompatibelt." - -#: photo.php:90 -msgid "This card does not contain a photo." -msgstr "Dette kort indeholder ikke et foto." - -#: templates/index.php:8 -msgid "Add Contact" -msgstr "Tilføj kontakt" - -#: templates/part.addcardform.php:5 -msgid "Group" -msgstr "Gruppe" - -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" -msgstr "Navn" - -#: templates/part.addcardform.php:14 -msgid "Create Contact" -msgstr "Ny Kontakt" - -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 msgid "Address" msgstr "Adresse" -#: templates/part.addpropertyform.php:5 +#: lib/app.php:92 templates/part.addcardform.php:37 msgid "Telephone" msgstr "Telefon" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 msgid "Email" msgstr "Email" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 msgid "Organization" msgstr "Organisation" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 +#: lib/app.php:106 lib/app.php:113 msgid "Work" msgstr "Arbejde" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 +#: lib/app.php:107 lib/app.php:111 msgid "Home" -msgstr "Hjem" +msgstr "Hjemme" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Telefonsvarer" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Personsøger" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Dette er ikke din kontaktperson." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Dette kort er ikke RFC-kompatibelt." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Dette kort indeholder ikke et foto." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Tilføj kontaktperson" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Gruppe" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Navn" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "Postboks" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "Udvidet" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "Vej" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "By" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "Region" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "Postnummer" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "Land" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" -msgstr "Mobil" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Ny kontaktperson" -#: templates/part.addpropertyform.php:33 -msgid "Text" -msgstr "SMS" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" -msgstr "Telefonsvarer" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" -msgstr "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" -msgstr "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" -msgstr "Personsøger" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Rediger" -#: templates/part.details.php:31 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "Slet" -#: templates/part.details.php:32 -msgid "Add Property" -msgstr "Tilføj Egenskab" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" msgstr "Fødselsdag" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" -msgstr "Redigér" +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" diff --git a/l10n/da/core.po b/l10n/da/core.po index 90f79622ab2..e2a57581e7f 100644 --- a/l10n/da/core.po +++ b/l10n/da/core.po @@ -4,14 +4,15 @@ # # Translators: # , 2011. +# Morten Juhl-Johansen Zölde-Fejér , 2011. # Pascal d'Hermilly , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-14 07:41+0000\n" -"Last-Translator: mikkel_ilu \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/team/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +20,51 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Du vil modtage et link til at nulstille dit kodeord via email." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Forespugt" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Login fejlede!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Brugernavn" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Anmod om nulstilling" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Dit kodeord blev nulstillet" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nyt kodeord" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Nulstil kodeord" + #: strings.php:5 msgid "Personal" msgstr "Personlig" @@ -45,56 +91,52 @@ msgstr "Sky ikke fundet" #: templates/installation.php:20 msgid "Create an admin account" -msgstr "Lav en administrator konto" +msgstr "Opret en administratorkonto" -#: templates/installation.php:21 -msgid "Username" -msgstr "Brugernavn" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Kodeord" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avanceret" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datamappe" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurer databasen" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "vil blive brugt" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" -msgstr "Database-bruger" +msgstr "Databasebruger" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" -msgstr "Database-kodeord" +msgstr "Databasekodeord" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" -msgstr "Database-navn" +msgstr "Navn pÃ¥ database" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avanceret" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" -msgstr "Database host" +msgstr "Databasehost" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Data mappe" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" -msgstr "Afslut installation" +msgstr "Afslut opsætning" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "giver dig frihed og kontrol over dine egne data" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -104,37 +146,21 @@ msgstr "Log ud" msgid "Settings" msgstr "Indstillinger" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Mistet dit kodeord?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "husk" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." -msgstr "Du er nu logget ud" - -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Du vil modtage et link til at nulstille din adgangskode via e-mail." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Anmodet" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login mislykkedes!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Brugernavn eller E-mail" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Anmod om nulstilling" +msgstr "Du er nu logget ud." #: templates/part.pagenavi.php:3 msgid "prev" @@ -144,16 +170,4 @@ msgstr "forrige" msgid "next" msgstr "næste" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Din adgangskode blev nulstillet" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Ny adgangskode" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Nulstil adgangskode" - diff --git a/l10n/da/files.po b/l10n/da/files.po index ac9da46eefa..af2561b7e24 100644 --- a/l10n/da/files.po +++ b/l10n/da/files.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Morten Juhl-Johansen Zölde-Fejér , 2011. # Pascal d'Hermilly , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/team/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +19,36 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Der er ingen fejl, filen blev uploadet med success" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Den uploadede fil overskrider upload_max_filesize direktivet i php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Den uploadede fil overskrider MAX_FILE_SIZE -direktivet som er specificeret " +"i HTML-formularen" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Den uploadede file blev kun delvist uploadet" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Ingen fil blev uploadet" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Mangler en midlertidig mappe" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Filer" @@ -52,48 +56,60 @@ msgstr "Filer" msgid "Maximum upload size" msgstr "Maksimal upload-størrelse" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Upload" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Ny Mappe" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Her er tomt. Upload noget!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Navn" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Download" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Størrelse" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Ændret" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Slet" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Upload for stor" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -"Filerne du prøver at uploade er større end den maksimale størrelse for fil-" -"upload pÃ¥ denne server." +"Filerne, du prøver at uploade, er større end den maksimale størrelse for " +"fil-upload pÃ¥ denne server." diff --git a/l10n/da/media.po b/l10n/da/media.po index 7c12df9653a..b73d59a6cfd 100644 --- a/l10n/da/media.po +++ b/l10n/da/media.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Morten Juhl-Johansen Zölde-Fejér , 2011. # Pascal d'Hermilly , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/team/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,39 +19,35 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musik" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Afspil" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pause" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Forrige" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "Næste" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Lydløs" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Sange skannet" +msgstr "Lyd til" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Genskan Samling" diff --git a/l10n/da/settings.po b/l10n/da/settings.po index 7921a74708a..ee508eab264 100644 --- a/l10n/da/settings.po +++ b/l10n/da/settings.po @@ -2,14 +2,17 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# , 2011. +# Morten Juhl-Johansen Zölde-Fejér , 2011. # Pascal d'Hermilly , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-26 13:49+0000\n" -"Last-Translator: pascal_a \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/team/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +20,26 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Godkendelsesfejl" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID ændret" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ugyldig forespørgsel" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID ændret" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Sprog ændret" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Tilføj dit program" @@ -53,15 +60,15 @@ msgstr "af" msgid "Ask a question" msgstr "Stil et spørgsmÃ¥l" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." -msgstr "Problemer med at forbinde til hjælpe-databasen" +msgstr "Problemer med at forbinde til hjælpe-databasen." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "GÃ¥ derhen manuelt." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Svar" @@ -77,6 +84,10 @@ msgstr "af det tilgængelige" msgid "Your password got changed" msgstr "Din adgangskode er blevet ændret" +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Ude af stand til at ændre dit kodeord" + #: templates/personal.php:15 msgid "Current password" msgstr "Nuværende adgangskode" @@ -91,37 +102,53 @@ msgstr "vis" #: templates/personal.php:18 msgid "Change password" -msgstr "Skift password" +msgstr "Skift kodeord" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Sprog" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Hjælp med at oversætte" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "benyt denne adresse til at forbinde til din ownCloud i din filbrowser" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Navn" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Kodeord" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupper" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Ny" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Slet" diff --git a/l10n/de/contacts.po b/l10n/de/contacts.po index 75f737b0135..a85b6c5f1e4 100644 --- a/l10n/de/contacts.po +++ b/l10n/de/contacts.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. # Jan-Christoph Borchardt , 2011. +# Jan-Christoph Borchardt , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: German (http://www.transifex.net/projects/p/owncloud/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,164 +20,223 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Dies ist nicht dein Adressbuch." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" - -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" +msgstr "Kontakt konnte nicht gefunden werden." -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard konnte nicht gelesen werden." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" +"Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite." -#: photo.php:53 -msgid "This card is not RFC compatible." -msgstr "" +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresse" -#: photo.php:90 -msgid "This card does not contain a photo." -msgstr "" +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" -#: templates/index.php:8 -msgid "Add Contact" -msgstr "" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" -#: templates/part.addcardform.php:5 -msgid "Group" -msgstr "" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organisation" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" -msgstr "" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Arbeit" -#: templates/part.addcardform.php:14 -msgid "Create Contact" -msgstr "" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Zuhause" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" -msgstr "" +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: lib/app.php:114 +msgid "Text" +msgstr "Text" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: lib/app.php:115 +msgid "Voice" +msgstr "Anruf" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Dies ist nicht dein Kontakt." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Diese Karte ist nicht RFC-kompatibel." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Diese Karte enthält kein Foto." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Kontakt hinzufügen" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Gruppe" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Name" + +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" -msgstr "" +msgstr "Postfach" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" -msgstr "" +msgstr "Erweitert" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" -msgstr "" +msgstr "Straße" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" -msgstr "" +msgstr "Stadt" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" -msgstr "" +msgstr "Region" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" -msgstr "" +msgstr "Postleitzahl" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" +msgstr "Land" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Kontakt erstellen" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" -msgstr "Mobil" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" -msgstr "Text" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" -msgstr "Fax" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Bearbeiten" -#: templates/part.addpropertyform.php:36 -msgid "Video" -msgstr "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Löschen" -#: templates/part.addpropertyform.php:37 -msgid "Pager" -msgstr "Pager" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" #: templates/part.details.php:33 -msgid "Delete" +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" msgstr "Geburtstag" -#: templates/part.property.php:29 -msgid "Phone" +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" -msgstr "Bearbeiten" +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefon" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" diff --git a/l10n/de/core.po b/l10n/de/core.po index 893b8acc4a7..26675dbd954 100644 --- a/l10n/de/core.po +++ b/l10n/de/core.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. # , 2011. # , 2011. # Jan-Christoph Borchardt , 2011. @@ -10,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-07 22:59+0000\n" -"Last-Translator: infinity8 \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: German (http://www.transifex.net/projects/p/owncloud/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +21,51 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Sie erhalten einen Link, um Ihr Passwort per E-Mail zurückzusetzen." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Angefragt" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Login fehlgeschlagen!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nutzername" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Anfrage zurückgesetzt" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Ihr Passwort wurde zurückgesetzt." + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Neues Passwort" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Passwort zurücksetzen" + #: strings.php:5 msgid "Personal" msgstr "Persönlich" @@ -48,54 +94,50 @@ msgstr "Cloud nicht verfügbar" msgid "Create an admin account" msgstr "Admin-Konto anlegen" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nutzername" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Passwort" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Erweitert" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datenverzeichnis" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Datenbank einrichten" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "wird genutzt" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Datenbanknutzer" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Datenbankpasswort" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Datenbankname" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Erweitert" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Datenbank-Host" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Datenverzeichnis" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Installation abschließen" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "gibt dir Freiheit und Kontrolle über deine eigenen Daten" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -105,39 +147,22 @@ msgstr "Abmelden" msgid "Settings" msgstr "Einstellungen" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Passwort vergessen?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "merken" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Abgemeldet" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Du wirst per Email einen Link zum Zurücksetzen deines Passworts erhalten." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "zurückgesetzt" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Anmeldung fehlgeschlagen!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nutzername oder Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Zurücksetzen" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "Zurück" @@ -146,16 +171,4 @@ msgstr "Zurück" msgid "next" msgstr "Weiter" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Dein Passwort wurde zurückgesetzt." - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Neues Passwort" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Zurücksetzen" - diff --git a/l10n/de/files.po b/l10n/de/files.po index b0d31fb286c..97a3d576211 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -4,13 +4,14 @@ # # Translators: # Jan-Christoph Borchardt , 2011. +# Jan-Christoph Borchardt , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: German (http://www.transifex.net/projects/p/owncloud/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +19,33 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Datei hochgeladen." -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "Die hochgeladene Datei ist zu groß." -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" -msgstr "" +msgstr "Die hochgeladene Datei ist zu groß." -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Die Datei wurde nur teilweise hochgeladen." -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Es wurde keine Datei hochgeladen." -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Temporärer Ordner fehlt." -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Dateien" @@ -52,43 +53,55 @@ msgstr "Dateien" msgid "Maximum upload size" msgstr "Maximale Größe" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Hochladen" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Neuer Ordner" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Alles leer. Lad’ was hoch!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Name" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Herunterladen" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Größe" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Bearbeitet" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Löschen" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Upload zu groß" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/de/media.po b/l10n/de/media.po index 437d50939d7..6e4584a979d 100644 --- a/l10n/de/media.po +++ b/l10n/de/media.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# , 2011. # Jan-Christoph Borchardt , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: German (http://www.transifex.net/projects/p/owncloud/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,41 +19,37 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musik" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Abspielen" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pause" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Vorheriges" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "Nächstes" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Ton aus" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Lieder gescannt" +msgstr "Ton an" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" -msgstr "Sammlung scannen" +msgstr "Sammlung noch einmal scannen" #: templates/music.php:37 msgid "Artist" diff --git a/l10n/de/settings.po b/l10n/de/settings.po index 2998d93e0f7..33f745e2687 100644 --- a/l10n/de/settings.po +++ b/l10n/de/settings.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# , 2011. # Jan-Christoph Borchardt , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:13+0200\n" -"PO-Revision-Date: 2011-08-27 23:13+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: German (http://www.transifex.net/projects/p/owncloud/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +19,26 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Berechtigungsfehler" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID geändert" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ungültige Anfrage" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID geändert" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Sprache geändert" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Eigene Anwendung hinzufügen" @@ -53,15 +59,15 @@ msgstr "von" msgid "Ask a question" msgstr "Stell eine Frage" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Probleme bei der Verbindung zur Hilfe-Datenbank." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Datenbank direkt besuchen." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Antwort" @@ -79,7 +85,7 @@ msgstr "Dein Passwort wurde geändert" #: templates/personal.php:14 msgid "Unable to change your password" -msgstr "" +msgstr "Passwort konnte nicht geändert werden" #: templates/personal.php:15 msgid "Current password" @@ -98,36 +104,52 @@ msgid "Change password" msgstr "Passwort ändern" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Sprache" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Hilf bei der Ãœbersetzung" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "benutze diese Adresse, um deine ownCloud mit deinem Dateiverwalter zu " "verbinden" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Name" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Passwort" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Gruppen" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Anlegen" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Löschen" diff --git a/l10n/el/contacts.po b/l10n/el/contacts.po index bdd775c8ba2..ab36ccdfd3e 100644 --- a/l10n/el/contacts.po +++ b/l10n/el/contacts.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# Petros Kyladitis , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/team/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +19,224 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Αυτό δεν είναι βιβλίο διευθÏνσεων σας." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Η επαφή δεν μπÏÏŒÏεσε να βÏεθεί." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "Η vCard δεν μποÏεί να διαβαστεί." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" +"Οι πληÏοφοÏίες σχετικά με vCard είναι εσφαλμένες. ΠαÏακαλώ επαναφοÏτώστε τη " +"σελίδα." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "ΔιεÏθυνση" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Τηλέφωνο" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "ΟÏγανισμός" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "ΕÏγασία" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Σπίτι" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Κινητό" -#: photo.php:53 +#: lib/app.php:114 +msgid "Text" +msgstr "Κείμενο" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Φωνή" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Φαξ" + +#: lib/app.php:117 +msgid "Video" +msgstr "Βίντεο" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Βομβητής" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Αυτή δεν είναι επαφή σας." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Αυτή η κάÏτα δεν είναι RFC συμβατή." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Αυτή η κάÏτα δεν πεÏιέχει φωτογÏαφία." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "ΠÏοσθήκη επαφής" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Ομάδα" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Όνομα" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Ταχ. ΘυÏίδα" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Εκτεταμένη" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Οδός" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Πόλη" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "ΠεÏιοχή" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Τ.Κ." -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "ΧώÏα" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "ΔημιουÏγία επαφής" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "ΕπεξεÏγασία" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "ΔιαγÏαφή" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Γενέθλια" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Τηλέφωνο" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/el/core.po b/l10n/el/core.po index f7d9f565555..bf36969732a 100644 --- a/l10n/el/core.po +++ b/l10n/el/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-07 09:13+0000\n" -"Last-Translator: multipetros \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/team/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,53 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Θα λάβετε ένα σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας μέσω " +"ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Ζητήθησαν" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Η σÏνδεση απέτυχε!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Όνομα ΧÏήστη" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "ΕπαναφοÏά αίτησης" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Ο κωδικός Ï€Ïόσβασής σας επαναφέÏθηκε" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Îέος κωδικός" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" + #: strings.php:5 msgid "Personal" msgstr "ΠÏοσωπικά" @@ -47,54 +94,50 @@ msgstr "Δεν βÏέθηκε σÏννεφο" msgid "Create an admin account" msgstr "ΔημιουÏγήστε έναν λογαÏιασμό διαχειÏιστή" -#: templates/installation.php:21 -msgid "Username" -msgstr "Όνομα ΧÏήστη" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Κωδικός" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Για Ï€ÏοχωÏημένους" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Φάκελος δεδομένων" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "ΔιαμόÏφωση της βάσης δεδομένων" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "θα χÏησιμοποιηθοÏν" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "ΧÏήστης της βάσης δεδομένων" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Κωδικός Ï€Ïόσβασης βάσης δεδομένων" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Όνομα βάσης δεδομένων" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Για Ï€ÏοχωÏημένους" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Διακομιστής βάσης δεδομένων" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Φάκελος δεδομένων" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "ΟλοκλήÏωση εγκατάστασης" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "σας δίνει την ελευθεÏία και τον έλεγχο επί των δικών σας δεδομένων" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -104,40 +147,22 @@ msgstr "ΑποσÏνδεση" msgid "Settings" msgstr "Ρυθμίσεις" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Ξεχάσατε τον κωδικό σας;" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "να με θυμάσαι" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Έχετε αποσυνδεθεί." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Θα λάβετε ένα σÏνδεσμο για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας, μέσω " -"ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Αιτήθησαν" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Η σÏνδεση απέτυχε!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Όνομα ΧÏήστη ή Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "ΕπαναφοÏάς αίτησης" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "Ï€ÏοηγοÏμενο" @@ -146,16 +171,4 @@ msgstr "Ï€ÏοηγοÏμενο" msgid "next" msgstr "επόμενο" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Έγινε επαναφοÏά του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασής σας" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Îέος κωδικός" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" - diff --git a/l10n/el/files.po b/l10n/el/files.po index da78a25356e..5f2920a2114 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/team/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Δεν υπάÏχει λάθος, το αÏχείο που μεταφοÏτώθηκε επιτυχώς" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Το αÏχείο που μεταφοÏτώθηκε υπεÏβαίνει την οδηγία μέγιστου επιτÏÎµÏ€Ï„Î¿Ï " +"μεγέθους \"upload_max_filesize\" του php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Το αÏχείο υπεÏβαίνει την οδηγία μέγιστου επιτÏÎµÏ€Ï„Î¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ " +"\"MAX_FILE_SIZE\" που έχει οÏιστεί στην html φόÏμα" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Το αÏχείο μεταφοÏώθηκε μόνο εν μέÏει" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Το αÏχείο δεν μεταφοÏτώθηκε" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Λείπει ένας Ï€ÏοσωÏινός φάκελος" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "ΑÏχεία" @@ -52,43 +56,55 @@ msgstr "ΑÏχεία" msgid "Maximum upload size" msgstr "Μέγιστο μέγεθος μεταφόÏτωσης" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "ΜεταφόÏτωση" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Îέος φάκελος" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Δεν υπάÏχει τίποτα εδώ. Ανέβασε κάτι!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Όνομα" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Λήψη" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Μέγεθος" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "ΤÏοποποιήθηκε" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "ΔιαγÏαφή" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ το αÏχείο Ï€Ïος μεταφόÏτωση" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/el/media.po b/l10n/el/media.po index c5bd96407cb..cb05fad3c96 100644 --- a/l10n/el/media.po +++ b/l10n/el/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Petros Kyladitis , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-23 11:09+0200\n" -"PO-Revision-Date: 2011-08-21 22:51+0000\n" -"Last-Translator: multipetros \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/team/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Μουσική" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "ΑναπαÏαγωγή" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "ΠαÏση" @@ -33,7 +34,7 @@ msgstr "ΠαÏση" msgid "Previous" msgstr "ΠÏοηγοÏμενο" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Επόμενο" @@ -45,11 +46,7 @@ msgstr "Σίγαση" msgid "Unmute" msgstr "ΕπαναφοÏά ήχου" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "ΣαÏωμένα Ï„ÏαγοÏγια" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "ΕπανασάÏωση συλλογής" diff --git a/l10n/el/settings.po b/l10n/el/settings.po index 03240ac6c73..ea32c35f4fd 100644 --- a/l10n/el/settings.po +++ b/l10n/el/settings.po @@ -2,15 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. # Petros Kyladitis , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:13+0200\n" -"PO-Revision-Date: 2011-08-27 23:13+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/team/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,25 +19,29 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Σφάλμα ταυτοποίησης" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "Το OpenID άλλαξε" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "ΆκυÏα αίτημα" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "Το OpenID άλλαξε" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Η γλώσσα άλλαξε" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" -msgstr "" +msgstr "ΠÏοσθέστε την δική σας εφαÏμογή" #: templates/apps.php:21 msgid "Select an App" @@ -54,15 +59,15 @@ msgstr "με" msgid "Ask a question" msgstr "Κάντε μια εÏώτηση" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "ΠÏοβλήματα κατά τη σÏνδεση με τη βάση δεδομένων βοήθειας." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "ΧειÏοκίνητη μετάβαση." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Απάντηση" @@ -80,7 +85,7 @@ msgstr "Ο κωδικός Ï€Ïόσβασής σας άλαλαξε" #: templates/personal.php:14 msgid "Unable to change your password" -msgstr "" +msgstr "Δεν ήταν δυνατή η αλλαγή του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" #: templates/personal.php:15 msgid "Current password" @@ -99,36 +104,52 @@ msgid "Change password" msgstr "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Γλώσσα" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Βοηθήστε στη μετάφÏαση" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "χÏησιμοποιήστε αυτή τη διεÏθυνση για να συνδεθείτε στο ownCloud σας από το " "διαχειÏιστή αÏχείων σας" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Όνομα" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Κωδικός" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Ομάδες" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "ΔημιουÏγία" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "ΔιαγÏαφή" diff --git a/l10n/eo/calendar.po b/l10n/eo/calendar.po new file mode 100644 index 00000000000..a3701a03348 --- /dev/null +++ b/l10n/eo/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: mctpyt \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "Nova horzono:" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "La horozono estas ÅanÄita" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Nevalida peto" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kalendaro" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "MalÄusta kalendaro" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "NaskiÄotago" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Negoco" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Voko" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Klientoj" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Livero" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Ferioj" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ideoj" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "VojaÄo" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Jubileo" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Rendevuo" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Alia" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Persona" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projektoj" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Demandoj" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Laboro" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Ĉi tio ne ripetiÄas" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Tage" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Semajne" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Tage" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Semajnduope" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "Monate" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Jare" + +#: lib/object.php:366 +msgid "never" +msgstr "neniam" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "laÅ­ aperoj" + +#: lib/object.php:368 +msgid "by date" +msgstr "laÅ­ dato" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "laÅ­ monattago" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "laÅ­ semajntago" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "lundo" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "mardo" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "merkredo" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "ĵaÅ­do" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "vendredo" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "sabato" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "dimanĉo" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "la monatsemajno de la okazaĵo" + +#: lib/object.php:397 +msgid "first" +msgstr "unua" + +#: lib/object.php:398 +msgid "second" +msgstr "dua" + +#: lib/object.php:399 +msgid "third" +msgstr "tria" + +#: lib/object.php:400 +msgid "fourth" +msgstr "kvara" + +#: lib/object.php:401 +msgid "fifth" +msgstr "kvina" + +#: lib/object.php:402 +msgid "last" +msgstr "lasta" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "Januaro" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "Februaro" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "Marto" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "Aprilo" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "Majo" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "Junio" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "Julio" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "AÅ­gusto" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "Septembro" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "Oktobro" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "Novembro" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "Decembro" + +#: lib/object.php:441 +msgid "by events date" +msgstr "laÅ­ okazaĵdato" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "laÅ­ jartago(j)" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "laÅ­ semajnnumero(j)" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "laÅ­ tago kaj monato" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Ĉi tio ne estas tabeltipa" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "Dato" + +#: lib/search.php:40 +msgid "Cal." +msgstr "Kal." + +#: templates/calendar.php:10 +msgid "All day" +msgstr "La tuta tago" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Mankas iuj kampoj" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Titolo" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "ekde la dato" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "ekde la horo" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Äis la dato" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Äis la horo" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "La okazaĵo finas antaÅ­ komenci" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Datumbaza malsukceso okazis" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Semajno" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Monato" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Listo" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "HodiaÅ­" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kalendaroj" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Malsukceso okazis dum analizo de la dosiero." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Elektu aktivajn kalendarojn" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Nova kalendaro" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav-a ligilo" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "ElÅuti" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Redakti" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Forigi" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Nova kalendaro" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Redakti la kalendaron" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Montrota nomo" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktiva" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Kalendarokoloro" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Konservi" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Sendi" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Nuligi" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Redakti okazaĵon" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Elporti" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Okazaĵotitolo" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategorio" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Elekti kategorion" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "La tuta tago" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Ekde" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Äœis" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Altnivela agordo" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Ripeti" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "Altnivelo" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "Elekti semajntagojn" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "Elekti tagojn" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "kaj la jartago de la okazaĵo." + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "kaj la monattago de la okazaĵo." + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "Elekti monatojn" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "Elekti semajnojn" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "kaj la jarsemajno de la okazaĵo." + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "Intervalo" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "Fino" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "aperoj" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Loko" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Okazaĵoloko" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Priskribo" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Okazaĵopriskribo" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Enporti Ical-dosieron" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Kiel enporti la novan kalendaron?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "Enporti en estantan kalendaron" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Enporti en novan kalendaron" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Bonvolu elekti kalendaron" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Enporti" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "AntaÅ­eniri" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Bonvolu plenigi la formularon" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Krei okazaĵon" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Horozono" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "Ĉiam kontroli ĉu la horzono ÅanÄiÄis" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Tempoformo" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24h" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12h" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "Adreso de kalendarosinkronigo per CalDAV:" + + diff --git a/l10n/eo/contacts.po b/l10n/eo/contacts.po new file mode 100644 index 00000000000..7ab063d4d8f --- /dev/null +++ b/l10n/eo/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Ĉi tiu ne estas via adresaro." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Ne eblis trovi la kontakton." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "Ne eblis legi vCard-on." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "Informo pri vCard estas malÄusta. Bonvolu reÅargi la paÄon." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adreso" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefono" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "RetpoÅtadreso" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizaĵo" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Laboro" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Hejmo" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "PoÅtelefono" + +#: lib/app.php:114 +msgid "Text" +msgstr "Teksto" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voĉo" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fakso" + +#: lib/app.php:117 +msgid "Video" +msgstr "Videaĵo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Televokilo" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Tiu ĉi ne estas via kontakto." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Ĉi tiu karto ne kongruas kun RFC." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Ĉi tiu karto ne havas foton." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Aldoni kontakton" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Grupo" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Nomo" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Abonkesto" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Etendita" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Strato" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Urbo" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regiono" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PoÅtokodo" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Lando" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Krei kontakton" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Redakti" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Forigi" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "NaskiÄotago" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefono" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/eo/core.po b/l10n/eo/core.po new file mode 100644 index 00000000000..af35e74b74e --- /dev/null +++ b/l10n/eo/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Vi ricevos ligilon retpoÅte por rekomencigi vian pasvorton." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Petita" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Ensaluto malsukcesis!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Uzantonomo" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Peti rekomencigon" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Via pasvorto rekomencis" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nova pasvorto" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Rekomenci la pasvorton" + +#: strings.php:5 +msgid "Personal" +msgstr "Persona" + +#: strings.php:6 +msgid "Users" +msgstr "Uzantoj" + +#: strings.php:7 +msgid "Apps" +msgstr "Aplikaĵoj" + +#: strings.php:8 +msgid "Admin" +msgstr "Administranto" + +#: strings.php:9 +msgid "Help" +msgstr "Helpo" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "La nubo ne estas trovita" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Krei administran konton" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Pasvorto" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Porsperta" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datuma dosierujo" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Agordi la datumbazon" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "estos uzata" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Datumbaza uzanto" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Datumbaza pasvorto" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Datumbaza nomo" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Datumbaza gastigo" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Fini la instalon" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Elsaluti" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Agordo" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Ĉu vi perdis vian pasvorton?" + +#: templates/login.php:15 +msgid "remember" +msgstr "memori" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Vi elsalutis." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "maljena" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "jena" + + diff --git a/l10n/eo/files.po b/l10n/eo/files.po new file mode 100644 index 00000000000..9bfe7d92ab3 --- /dev/null +++ b/l10n/eo/files.po @@ -0,0 +1,113 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Ne estas eraro, la dosiero alÅutiÄis sukcese" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "La dosiero alÅutita superas la regulon upload_max_filesize el php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"La dosiero alÅutita superas laregulon MAX_FILE_SIZE, kiu estas difinita en " +"la HTML-formularo" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "La alÅutita dosiero nur parte alÅutiÄis" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Neniu dosiero estas alÅutita" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Mankas tempa dosierujo" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Dosieroj" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimuma alÅutogrando" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "AlÅuti" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Nenio estas ĉi tie. AlÅutu ion!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Nomo" + +#: templates/index.php:45 +msgid "Download" +msgstr "ElÅuti" + +#: templates/index.php:49 +msgid "Size" +msgstr "Grando" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Modifita" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Forigi" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "ElÅuto tro larÄa" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"La dosieroj, kiujn vi provas alÅuti, transpasas la maksimuman grandon por " +"dosieralÅutoj en ĉi tiu servilo." + + diff --git a/l10n/eo/media.po b/l10n/eo/media.po new file mode 100644 index 00000000000..c7eeddac865 --- /dev/null +++ b/l10n/eo/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Muziko" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Ludi" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "PaÅ­zi" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Maljena" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Jena" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Silentigi" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Malsilentigi" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Reskani la aron" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Verkinto" + +#: templates/music.php:38 +msgid "Album" +msgstr "Albumo" + +#: templates/music.php:39 +msgid "Title" +msgstr "Titolo" + + diff --git a/l10n/eo/settings.po b/l10n/eo/settings.po new file mode 100644 index 00000000000..d99fbc60bd9 --- /dev/null +++ b/l10n/eo/settings.po @@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/team/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Nevalida peto" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "La agordo de OpenID estas ÅanÄita" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "La lingvo estas ÅanÄita" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Aldonu vian aplikaĵon" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Elekti aplikaĵon" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-permesila" + +#: templates/apps.php:23 +msgid "by" +msgstr "de" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Faru demandon" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Problemoj okazis dum konektado al la helpa datumbazo." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Iri tien mane." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Respondi" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Vi uzas" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "el la disponeblaj" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "Via pasvorto ÅanÄiÄis" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Ne eblis ÅanÄi vian pasvorton" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Nuna pasvorto" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Nova pasvorto" + +#: templates/personal.php:17 +msgid "show" +msgstr "montri" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "ÅœanÄi la pasvorton" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Lingvo" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" +"uzu ĉi tiun adreson por konektiÄi al via ownCloud per via dosieradministrilo" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Nomo" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Pasvorto" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Grupoj" + +#: templates/users.php:23 +msgid "Create" +msgstr "Krei" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Forigi" + + diff --git a/l10n/es/contacts.po b/l10n/es/contacts.po index 08f4ae29109..0591daf015a 100644 --- a/l10n/es/contacts.po +++ b/l10n/es/contacts.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +19,224 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Esta no es tu agenda de contactos." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "No se pudo encontrar el contacto." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "No se pudo leer el vCard." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" +"La información sobre el vCard es incorrecta. Por favor vuelve a cargar la " +"página." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Dirección" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Teléfono" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Correo electrónico" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organización" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Trabajo" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Particular" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Móvil" -#: photo.php:53 +#: lib/app.php:114 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Localizador" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Este no es tu contacto." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Esta tarjeta no es compatible con RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Esta tarjeta no contiene ninguna foto." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Agregar contacto" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupo" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nombre" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Código postal" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Extendido" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Calle" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Ciudad" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Región" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Código Postal" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "País" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Crear contacto" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editar" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Borrar" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Cumpleaños" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Teléfono" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/es/core.po b/l10n/es/core.po index 2fe3fcaa783..40f9f0ab4e8 100644 --- a/l10n/es/core.po +++ b/l10n/es/core.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-04 17:01+0000\n" -"Last-Translator: xsergiolpx \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +20,52 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Recibirás un enlace por correo electrónico para restablecer tu contraseña" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Pedido" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "¡Fallo al iniciar sesión!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nombre de usuario" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Solicitar restablecimiento" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Tu contraseña se ha restablecido" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nueva contraseña" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Restablecer contraseña" + #: strings.php:5 msgid "Personal" msgstr "Personal" @@ -47,54 +94,50 @@ msgstr "No se encontró la nube" msgid "Create an admin account" msgstr "Crea una cuenta de administrador" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nombre de usuario" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Contraseña" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avanzado" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Directorio de almacenamiento" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configurar la base de datos" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "serán utilizados" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Usuario de la base de datos" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Contraseña de la base de datos" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nombre de la base de datos" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avanzado" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Host de la base de datos" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Directorio de almacenamiento" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Completar la instalación" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "te da la libertad y el control sobre tus propios datos" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -104,38 +147,22 @@ msgstr "Salir" msgid "Settings" msgstr "Ajustes" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "¿Has perdido tu contraseña?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "recuérdame" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Has cerrado sesión." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Recibirás un link para restablecer tu contraseña vía Email." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Solicitado" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "¡No se pudo iniciar sesión!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nombre de usuario o Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Solicitar restablecimiento" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "anterior" @@ -144,16 +171,4 @@ msgstr "anterior" msgid "next" msgstr "siguiente" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Tu contraseña se ha restablecido" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nueva contraseña" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Restablecer contraseña" - diff --git a/l10n/es/files.po b/l10n/es/files.po index 2c2bed5cdc4..0349f481b1d 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "No hubo ningún error, el archivo se subió con éxito" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"El archivo que intentas subir sobrepasa el tamaño definido por la variable " +"upload_max_filesize en php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"El archivo que intentas subir sobrepasa el tamaño definido por la variable " +"MAX_FILE_SIZE especificada en el formulario HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "El archivo que intentas subir solo se subió parcialmente" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "No se subió ningún archivo" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Falta un directorio temporal" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Archivos" @@ -52,43 +56,55 @@ msgstr "Archivos" msgid "Maximum upload size" msgstr "Tamaño máximo de subida" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Subir" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Crear Carpeta" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Aquí no hay nada. ¡Sube algo!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nombre" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Descargar" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Tamaño" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modificado" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Eliminado" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "El archivo es demasiado grande" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/es/media.po b/l10n/es/media.po index 3a159198a26..e03322be6ae 100644 --- a/l10n/es/media.po +++ b/l10n/es/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-23 11:09+0200\n" -"PO-Revision-Date: 2011-08-21 22:27+0000\n" -"Last-Translator: xsergiolpx \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Música" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Reproducir" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pausa" @@ -33,7 +34,7 @@ msgstr "Pausa" msgid "Previous" msgstr "Anterior" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Siguiente" @@ -45,11 +46,7 @@ msgstr "Silenciar" msgid "Unmute" msgstr "Sonar" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Canciones encontradas" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Buscar música nueva" diff --git a/l10n/es/settings.po b/l10n/es/settings.po index 27e14d97249..9be0c001e36 100644 --- a/l10n/es/settings.po +++ b/l10n/es/settings.po @@ -2,15 +2,18 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # -# , 2011. +# Translators: +# , 2011. +# , 2011. # , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-24 23:20+0000\n" -"Last-Translator: xsergiolpx \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +21,26 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Error de autentificación" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID Cambiado" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Solicitud no válida" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID Cambiado" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Idioma cambiado" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Añadir tu aplicación" @@ -54,15 +61,15 @@ msgstr "por" msgid "Ask a question" msgstr "Hacer una pregunta" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problemas al conectar con la base de datos de ayuda." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Ir manualmente" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Respuesta" @@ -78,6 +85,10 @@ msgstr "del total disponible de" msgid "Your password got changed" msgstr "Tu contraseña ha sido cambiada" +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "No se pudo cambiar su contraseña" + #: templates/personal.php:15 msgid "Current password" msgstr "Contraseña actual" @@ -95,35 +106,52 @@ msgid "Change password" msgstr "Cambiar contraseña" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Idioma" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Ayuda a traducir" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" -"usar esta dirección para conectar tu ownCloud en tu explorador de archivos" +"utiliza esta dirección para conectar a tu ownCloud desde tu explorador de " +"archivos" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nombre" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Contraseña" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupos" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Crear" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Eliminar" diff --git a/l10n/et_EE/contacts.po b/l10n/et_EE/contacts.po index 119d01b09f0..b7034000524 100644 --- a/l10n/et_EE/contacts.po +++ b/l10n/et_EE/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/team/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "See pole sinu aadressiraamat." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Kontakti ei leitud." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "Visiitkaardi lugemine ebaõnnestus," -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Visiitkaardi info pole korrektne. Palun lae leht uuesti." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Aadress" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-post" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organisatsioon" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Töö" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Kodu" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobiil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Hääl" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Piipar" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "See pole sinu kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "See kaart ei ühildu RFC-ga." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Sellel kaardil pole fotot." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Lisa kontakt" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupp" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nimi" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Postkontori postkast" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Laiendatud" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Tänav" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Linn" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Piirkond" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Postiindeks" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Riik" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Lisa kontakt" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Muuda" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Kustuta" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Sünnipäev" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/et_EE/core.po b/l10n/et_EE/core.po index 02b3782f220..18831a8a35f 100644 --- a/l10n/et_EE/core.po +++ b/l10n/et_EE/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 14:48+0000\n" -"Last-Translator: Eraser \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/team/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Sinu parooli taastamise link saadetakse sulle e-postile." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Kohustuslik" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Sisselogimine ebaõnnestus!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Kasutajanimi" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Päringu taastamine" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Sinu parool on taastatud" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Uus parool" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Nulli parool" + #: strings.php:5 msgid "Personal" msgstr "isiklik" @@ -46,54 +91,50 @@ msgstr "Pilve ei leitud" msgid "Create an admin account" msgstr "Loo admini konto" -#: templates/installation.php:21 -msgid "Username" -msgstr "Kasutajanimi" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Parool" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Lisavalikud" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Andmete kaust" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Seadista andmebaasi" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "kasutatakse" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Andmebaasi kasutaja" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Andmebaasi parool" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Andmebasi nimi" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Lisavalikud" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Andmebaasi host" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Andmete kaust" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Lõpeta seadistamine" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "Annab sulle vabaduse ja kontrolli sinu enda andmete üle" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,39 +144,22 @@ msgstr "Logi välja" msgid "Settings" msgstr "Seaded" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Kaotasid oma parooli?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "pea meeles" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Sa oled välja loginud" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Sulle saadetakse e-postile link, millelt sa saad oma parooli taastada." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Kohustuslik" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Sisselogimine ebaõnnestus" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Kasutajanimi või e-post" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Palu taastamist" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "eelm" @@ -144,16 +168,4 @@ msgstr "eelm" msgid "next" msgstr "järgm" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Sinu parool on taastatud" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Uus parool" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Nulli parool" - diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index 92f9fa8d855..49191aa3a92 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/team/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,36 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Ãœhtegi viga pole, fail on üles laetud" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Ãœles laetud faili suurus ületab php.ini määratud upload_max_filesize suuruse" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Ãœles laetud faili suurus ületab HTML vormis määratud upload_max_filesize " +"suuruse" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Fail laeti üles ainult osaliselt" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Ãœhtegi faili ei laetud üles" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Ajutiste failide kaust puudub" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Failid" @@ -52,43 +55,55 @@ msgstr "Failid" msgid "Maximum upload size" msgstr "Maksimaalne üleslaadimise suurus" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Lae üles" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Uus kaust" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Siin pole midagi. Lae midagi üles!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nimi" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Lae alla" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Suurus" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Muudetud" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Kustuta" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Ãœleslaadimine on liiga suur" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/et_EE/media.po b/l10n/et_EE/media.po index 7d40f8a4ffa..a0e33794bfd 100644 --- a/l10n/et_EE/media.po +++ b/l10n/et_EE/media.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 14:54+0000\n" -"Last-Translator: Eraser \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/team/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +18,15 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muusika" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Esita" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Paus" @@ -34,7 +34,7 @@ msgstr "Paus" msgid "Previous" msgstr "Eelmine" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Järgmine" @@ -46,11 +46,7 @@ msgstr "Vaikseks" msgid "Unmute" msgstr "Hääl tagasi" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Skännitud lood" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Skänni kollekttsiooni uuesti" diff --git a/l10n/et_EE/settings.po b/l10n/et_EE/settings.po index 3fad92d9479..9de62de218d 100644 --- a/l10n/et_EE/settings.po +++ b/l10n/et_EE/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 14:59+0000\n" -"Last-Translator: Eraser \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/team/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +18,26 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Autentimise viga" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID on muudetud" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Vigane päring" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID on muudetud" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Keel on muudetud" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Lisa oma programm" @@ -54,15 +58,15 @@ msgstr "kelle poolt" msgid "Ask a question" msgstr "Küsi küsimus" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Probleemid abiinfo andmebaasiga ühendumisel." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Mine sinna käsitsi." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Vasta" @@ -98,35 +102,51 @@ msgstr "näita" msgid "Change password" msgstr "Muuda parooli" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Keel" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Abiinfo tõlkimine" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "kasuta seda aadressi oma ownCloudiga ühendamiseks failihalduriga" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nimi" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Parool" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupid" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Lisa" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Kustuta" diff --git a/l10n/eu/calendar.po b/l10n/eu/calendar.po new file mode 100644 index 00000000000..93fd3c27f37 --- /dev/null +++ b/l10n/eu/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "Ordu-zona aldatuta" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Baligabeko eskaera" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Egutegia" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Egutegi okerra" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Jaioteguna" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Negozioa" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Deia" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Bezeroak" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Banatzailea" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Oporrak" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ideiak" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Bidaia" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Urteurrena" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Bilera" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Bestelakoa" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Pertsonala" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Proiektuak" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Galderak" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Lana" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Ez da errepikatzen" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Egunero" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Astero" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Asteko egun guztietan" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Bi-Astero" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "Hilabetero" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Urtero" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Ez da bektore bat" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Egun guztia" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Eremuak faltan" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Izenburua" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "Hasierako Data" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "Hasierako Ordua" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Bukaerako Data" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Bukaerako Ordua" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "Gertaera hasi baino lehen bukatzen da" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Datu baseak huts egin du" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Astea" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Hilabetea" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Zerrenda" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Gaur" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Egutegiak" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Huts bat egon da, fitxategia aztertzen zen bitartea." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Aukeratu egutegi aktiboak" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Egutegi berria" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav Lotura" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Deskargatu" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Editatu" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Ezabatu" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Egutegi berria" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Editatu egutegia" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Bistaratzeko izena" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktiboa" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Egutegiaren kolorea" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Gorde" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Bidali" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Ezeztatu" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Editatu gertaera" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Exportatu" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Gertaeraren izenburua" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategoria" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Aukeratu kategoria" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Egun osoko gertaera" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Hasiera" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Bukaera" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Aukera aurreratuak" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Errepikatu" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Kokalekua" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Gertaeraren kokalekua" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Deskribapena" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Gertaeraren deskribapena" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "inportatu ical fitxategia" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Nola inportatu egutegi berria?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "inportatu existitzen den egutegi batera" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "inportatu egutegi berri batera" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Mesedez aukeratu egutegia" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Importatu" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Atzera" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Mesedez inprimakia bete" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Sortu gertaera berria" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Ordu-zona" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Ordu formatua" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24h" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12h" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "Egutegiaren CalDAV sinkronizazio helbidea" + + diff --git a/l10n/eu/contacts.po b/l10n/eu/contacts.po new file mode 100644 index 00000000000..c7023773dd0 --- /dev/null +++ b/l10n/eu/contacts.po @@ -0,0 +1,240 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Hau ez da zure helbide liburua." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Ezin izan da kontaktua aurkitu." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "Ezin izan da vCard-a irakurri." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "" +"vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Helbidea" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefonoa" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Eposta" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Erakundea" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Lana" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Etxea" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mugikorra" + +#: lib/app.php:114 +msgid "Text" +msgstr "Testua" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Ahotsa" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax-a" + +#: lib/app.php:117 +msgid "Video" +msgstr "Bideoa" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Bilagailua" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Hau ez da zure kontaktua." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Txartel hau ez da RFC bateragarria." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Txartel honek ez dauka argazkirik." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Gehitu Kontaktua" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Taldea" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Izena" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Posta kutxa" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Hedatua" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Kalea" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Hiria" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Eskualdea" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Posta Kodea" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Herrialdea" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Sortu Kontaktua" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editatu" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Ezabatu" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Jaioteguna" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefonoa" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/eu/core.po b/l10n/eu/core.po new file mode 100644 index 00000000000..4508c5380f0 --- /dev/null +++ b/l10n/eu/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Eskatuta" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Saio hasierak huts egin du!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Erabiltzaile izena" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Eskaera berrezarri da" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Zure pasahitza berrezarri da" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Pasahitz berria" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Berrezarri pasahitza" + +#: strings.php:5 +msgid "Personal" +msgstr "Pertsonala" + +#: strings.php:6 +msgid "Users" +msgstr "Erabiltzaileak" + +#: strings.php:7 +msgid "Apps" +msgstr "Aplikazioak" + +#: strings.php:8 +msgid "Admin" +msgstr "Kudeatzailea" + +#: strings.php:9 +msgid "Help" +msgstr "Laguntza" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Ez da hodeia aurkitu" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Sortu kudeatzaile kontu bat" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Pasahitza" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Aurreratua" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datuen karpeta" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Konfiguratu datu basea" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "erabiliko da" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Datubasearen erabiltzailea" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Datubasearen pasahitza" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Datubasearen izena" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Datubasearen hostalaria" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Bukatu konfigurazioa" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Saioa bukatu" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Ezarpenak" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Galdu duzu pasahitza?" + +#: templates/login.php:15 +msgid "remember" +msgstr "gogoratu" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Zure saioa bukatu da." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "aurrekoa" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "hurrengoa" + + diff --git a/l10n/eu/files.po b/l10n/eu/files.po new file mode 100644 index 00000000000..d2af4c2d58f --- /dev/null +++ b/l10n/eu/files.po @@ -0,0 +1,115 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Ez da arazorik izan, fitxategia ongi igo da" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"Igotako fitxategiaren tamaina php.ini-ko upload_max_filesize direktiban " +"adierazitakoa baino handiagoa da" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Igotako fitxategiaren tamaina HTML inprimakiko MAX_FILESIZE direktiban " +"adierazitakoa baino handiagoa da" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Igotako fitxategiaren zati bat baino gehiago ez da igo" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Ez da fitxategirik igo" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Aldi baterako karpeta falta da" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Fitxategiak" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Igo daitekeen gehienezko tamaina" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Igo" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Ez dago ezer. Igo zerbait!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Izena" + +#: templates/index.php:45 +msgid "Download" +msgstr "Deskargatu" + +#: templates/index.php:49 +msgid "Size" +msgstr "Tamaina" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Aldatuta" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Ezabatu" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Igotakoa handiegia da" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen " +"duena baino handiagoak dira." + + diff --git a/l10n/eu/media.po b/l10n/eu/media.po new file mode 100644 index 00000000000..8fbf9e464f4 --- /dev/null +++ b/l10n/eu/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Musika" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Erreproduzitu" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pausarazi" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Aurrekoa" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Hurrengoa" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Mututu" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Ez Mututu" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Bireskaneatu Bilduma" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Artista" + +#: templates/music.php:38 +msgid "Album" +msgstr "Albuma" + +#: templates/music.php:39 +msgid "Title" +msgstr "Izenburua" + + diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po new file mode 100644 index 00000000000..e4655b60a08 --- /dev/null +++ b/l10n/eu/settings.po @@ -0,0 +1,155 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Asier Urio Larrea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/team/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Baliogabeko eskaria" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID aldatuta" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Hizkuntza aldatuta" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Gehitu zure programa" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Aukeratu Programa bat" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "lizentziarekin." + +#: templates/apps.php:23 +msgid "by" +msgstr " Egilea:" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Egin galdera bat" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Arazoak daude laguntza datubasera konektatzeko." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Joan hara eskuz." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Erantzun" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Erabiltzen ari zara " + +#: templates/personal.php:8 +msgid "of the available" +msgstr "eta guztira erabil dezakezu " + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "Zure pasahitza aldatu da" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Ezin izan da zure pasahitza aldatu" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Uneko pasahitza" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Pasahitz berria" + +#: templates/personal.php:17 +msgid "show" +msgstr "erakutsi" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Aldatu pasahitza" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Hizkuntza" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" +"erabili helbide hau zure fitxategi kudeatzailean zure ownCloudera " +"konektatzeko" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Izena" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Pasahitza" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Taldeak" + +#: templates/users.php:23 +msgid "Create" +msgstr "Sortu" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Ezabatu" + + diff --git a/l10n/fr/contacts.po b/l10n/fr/contacts.po index 1a7dea24d8d..2f2dd572cd9 100644 --- a/l10n/fr/contacts.po +++ b/l10n/fr/contacts.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: French (http://www.transifex.net/projects/p/owncloud/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +19,224 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Ce n'est pas votre carnet d'adresses." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Ce contact n'a pas été trouvé." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "Cette vCard n'a pas pu être lue." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" +"Les informations relatives à cette vCard sont incorrectes. Veuillez " +"recharger la page." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresse" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Téléphone" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Société" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Travail" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Maison" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobile" -#: photo.php:53 +#: lib/app.php:114 +msgid "Text" +msgstr "Texte" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voix" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Vidéo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Bipeur" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Ce n'est pas votre contact." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Cette fiche n'est pas compatible RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Cette fiche ne contient pas de photo." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Ajouter un Contact" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Groupe" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nom" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Boîte postale" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Étendu" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Rue" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Ville" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Région" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Code postal" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Pays" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Créer le Contact" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Modifier" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Effacer" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Anniversaire" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Téléphone" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/fr/core.po b/l10n/fr/core.po index b1e286ce6ea..2760dfdeb9d 100644 --- a/l10n/fr/core.po +++ b/l10n/fr/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 15:01+0000\n" -"Last-Translator: bibzor \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: French (http://www.transifex.net/projects/p/owncloud/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,53 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Vous allez recevoir un e-mail contenant un lien pour réinitialiser votre mot" +" de passe" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Demande envoyée" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Nom d'utilisateur ou e-mail invalide" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Demander la réinitialisation" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Votre mot de passe a été réinitialisé" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nouveau mot de passe" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Réinitialiser le mot de passe" + #: strings.php:5 msgid "Personal" msgstr "Personnels" @@ -46,54 +93,50 @@ msgstr "Introuvable" msgid "Create an admin account" msgstr "Créer un compte administrateur" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nom d'utilisateur" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Mot de passe" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avancé" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Répertoire des données" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configurer la base de données" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "sera utilisé" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Utilisateur de la base de données" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Mot de passe de la base de données" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nom de la base de données" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avancé" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Serveur de la base de données" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Répertoire des données" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Terminer l'installation" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "vous donne la liberté et le contrôle de vos propres données" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,40 +146,22 @@ msgstr "Se déconnecter" msgid "Settings" msgstr "Paramètres" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Mot de passe perdu ?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "se souvenir de moi" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Vous êtes désormais déconnecté." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Vous allez recevoir un lien par email qui vous permettra de réinitialiser " -"votre mot de passe." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Nécessaire" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Échec de la connexion !" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nom d'utilisateur ou Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Demande de réinitialisation" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "précédent" @@ -145,16 +170,4 @@ msgstr "précédent" msgid "next" msgstr "suivant" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Votre mot de passe a été réinitialisé" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nouveau mot de passe" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Réinitialisation du mot de passe" - diff --git a/l10n/fr/files.po b/l10n/fr/files.po index b898f187030..8f1ba975395 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: French (http://www.transifex.net/projects/p/owncloud/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Aucune erreur, le fichier a été téléversé avec succès" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Le fichier téléversé excède la valeur de upload_max_filesize spécifiée dans " +"php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Le fichier téléversé excède la valeur de MAX_FILE_SIZE spécifiée dans le " +"formulaire HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Le fichier n'a été que partiellement téléversé" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Aucun fichier n'a été téléversé" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Il manque un répertoire temporaire" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Fichiers" @@ -52,43 +56,55 @@ msgstr "Fichiers" msgid "Maximum upload size" msgstr "Taille max. d'envoi" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Envoyer" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nouveau dossier" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Il n'y a rien ici ! Envoyez donc quelque chose :)" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nom" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Téléchargement" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Taille" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modifié" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Supprimer" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Fichier trop volumineux" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/fr/media.po b/l10n/fr/media.po index 5cdf1cd9036..62c9e525cf3 100644 --- a/l10n/fr/media.po +++ b/l10n/fr/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: French (http://www.transifex.net/projects/p/owncloud/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,39 +18,35 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musique" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Play" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pause" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Précédent" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "Suivant" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Muet" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Pistes scannées" +msgstr "Audible" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Réanalyser la Collection" diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po index 46f9713e9cb..c3737d58524 100644 --- a/l10n/fr/settings.po +++ b/l10n/fr/settings.po @@ -2,15 +2,17 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # -# , 2011. +# Translators: +# , 2011. # Jan-Christoph Borchardt , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-04 16:48+0200\n" -"PO-Revision-Date: 2011-09-03 18:25+0000\n" -"Last-Translator: bibzor \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: French (http://www.transifex.net/projects/p/owncloud/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +20,26 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Erreur d'authentification" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "Identifiant OpenID changé" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Requête invalide" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "Identifiant OpenID changé" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Langue changée" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Ajoutez votre application" @@ -54,15 +60,15 @@ msgstr "par" msgid "Ask a question" msgstr "Poser une question" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problème de connexion à la base de données d'aide." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "S'y rendre manuellement." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Réponse" @@ -72,7 +78,7 @@ msgstr "Vous utilisez" #: templates/personal.php:8 msgid "of the available" -msgstr "sur un total de" +msgstr "d'espace de stockage sur un total de" #: templates/personal.php:13 msgid "Your password got changed" @@ -98,37 +104,53 @@ msgstr "Afficher" msgid "Change password" msgstr "Changer de mot de passe" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Langue" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Aider à traduire" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "utilisez cette adresse pour vous connecter à votre ownCloud depuis un " "explorateur de fichiers" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nom" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Mot de passe" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Groupes" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Créer" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Supprimer" diff --git a/l10n/he/calendar.po b/l10n/he/calendar.po new file mode 100644 index 00000000000..39d8b244769 --- /dev/null +++ b/l10n/he/calendar.po @@ -0,0 +1,639 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Elad Alfassa , 2011. +# , 2011. +# Yaron Shahrabani , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "×זור זמן השתנה" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "בקשה ×œ× ×—×•×§×™×ª" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "×— שנה" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "לוח שנה ×œ× × ×›×•×Ÿ" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "×™×•× ×”×•×œ×“×ª" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "עסקי×" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "שיחה" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "לקוחות" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "משלוח" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "×—×’×™×" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "רעיונות" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "מסע" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "יובל" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "פגישה" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "×חר" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "×ישי" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "פרוייקטי×" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "ש×לות" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "עבודה" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "×œ×œ× ×—×–×¨×”" + +#: lib/object.php:354 +msgid "Daily" +msgstr "יומי" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "שבועי" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "כל ×™×•× ×¢×‘×•×“×”" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "דו שבועי" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "חודשי" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "שנתי" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "×œ× ×ž×¢×¨×š" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "היו×" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "כותרת" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "שבוע" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "חודש" + +#: templates/calendar.php:40 +msgid "List" +msgstr "רשימה" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "היו×" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "לוחות שנה" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "×ירעה שגי××” בעת פענוח הקובץ." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "בחר לוחות שנה פעילי×" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "לוח שנה חדש" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "קישור CalDav" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "הורדה" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "עריכה" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "מחיקה" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "לוח שנה חדש" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "עריכת לוח שנה" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "×©× ×ª×¦×•×’×”" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "פעיל" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "צבע לוח שנה" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "שמירה" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "שליחה" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "ביטול" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "עריכת ×ירוע" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "יצו×" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "כותרת ×”×ירוע" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "קטגוריה" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "בחר קטגוריה" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "×ירוע של כל היו×" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "מ×ת" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "עבור" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "חזרה" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "מיקו×" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "×ž×™×§×•× ×”×ירוע" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "תי×ור" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "תי×ור ×”×ירוע" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "יבו×" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "יצירת ×ירוע חדש" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "×זור זמן" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "" + +#: templates/settings.php:34 +msgid "24h" +msgstr "" + +#: templates/settings.php:35 +msgid "12h" +msgstr "" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "" + + diff --git a/l10n/he/contacts.po b/l10n/he/contacts.po new file mode 100644 index 00000000000..3932aca9797 --- /dev/null +++ b/l10n/he/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "זהו ×ינו ספר הכתובות שלך" + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "×œ× × ×™×ª×Ÿ ל×תר ×יש קשר" + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× vCard." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "המידע ×ודות vCard ×ינו נכון. × × ×œ×˜×¢×•×Ÿ מחדש ×ת הדף." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "כתובת" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "טלפון" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "דו×ר ×לקטרוני" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "×רגון" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "עבודה" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "בית" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "נייד" + +#: lib/app.php:114 +msgid "Text" +msgstr "טקסט" + +#: lib/app.php:115 +msgid "Voice" +msgstr "קולי" + +#: lib/app.php:116 +msgid "Fax" +msgstr "פקס" + +#: lib/app.php:117 +msgid "Video" +msgstr "ויד×ו" + +#: lib/app.php:118 +msgid "Pager" +msgstr "זימונית" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "זהו ×ינו ×יש קשר שלך" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "כרטיס ×–×” ×ינו תו×× ×œÖ¾RFC" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "כרטיס ×–×” ×ינו כולל תמונה" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "הוספת ×יש קשר" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "קבוצה" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "ש×" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "×ª× ×“×•×ר" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "מורחב" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "רחוב" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "עיר" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "×זור" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "מיקוד" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "מדינה" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "יצירת ×יש קשר" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "עריכה" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "מחיקה" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "×™×•× ×”×•×œ×“×ª" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "טלפון" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/he/core.po b/l10n/he/core.po new file mode 100644 index 00000000000..705a03e4d94 --- /dev/null +++ b/l10n/he/core.po @@ -0,0 +1,172 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +# Yaron Shahrabani , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "יישלח לתיבת הדו×״ל שלך קישור ל×יפוס הססמה." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "נדרש" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "הכניסה נכשלה!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "×©× ×ž×©×ª×ž×©" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "בקשת ×יפוס" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "הססמה שלך ×ופסה" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "ססמה חדשה" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "×יפוס ססמה" + +#: strings.php:5 +msgid "Personal" +msgstr "×ישי" + +#: strings.php:6 +msgid "Users" +msgstr "משתמשי×" + +#: strings.php:7 +msgid "Apps" +msgstr "יישומי×" + +#: strings.php:8 +msgid "Admin" +msgstr "מנהל" + +#: strings.php:9 +msgid "Help" +msgstr "עזרה" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "ענן ×œ× × ×ž×¦×" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "יצירת חשבון מנהל" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "ססמה" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "מתקד×" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "תיקיית נתוני×" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "הגדרת מסד הנתוני×" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "ינוצלו" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "×©× ×ž×©×ª×ž×© במסד הנתוני×" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "ססמת מסד הנתוני×" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "×©× ×ž×¡×“ הנתוני×" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "שרת בסיס נתוני×" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "×¡×™×•× ×”×ª×§× ×”" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "התנתקות" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "הגדרות" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "שכחת ×ת ססמתך?" + +#: templates/login.php:15 +msgid "remember" +msgstr "שמירת הססמה" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "×ינך מחובר." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "קוד×" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "הב×" + + diff --git a/l10n/he/files.po b/l10n/he/files.po new file mode 100644 index 00000000000..1147b3e49d7 --- /dev/null +++ b/l10n/he/files.po @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "×œ× ×ירעה תקלה, ×”×§×‘×¦×™× ×”×•×¢×œ×• בהצלחה" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "הקובץ שהועלה חרג מההנחיה upload_max_filesize בקובץ php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ×”Ö¾HTML" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "הקובץ שהועלה הועלה בצורה חלקית" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "×œ× ×”×•×¢×œ×• קבצי×" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "תיקייה זמנית חסרה" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "קבצי×" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "גודל העל××” מקסימלי" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "העל××”" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "×ין ×›×ן ×©×•× ×“×‘×¨. ×ולי ברצונך להעלות משהו?" + +#: templates/index.php:43 +msgid "Name" +msgstr "ש×" + +#: templates/index.php:45 +msgid "Download" +msgstr "הורדה" + +#: templates/index.php:49 +msgid "Size" +msgstr "גודל" + +#: templates/index.php:50 +msgid "Modified" +msgstr "זמן שינוי" + +#: templates/index.php:50 +msgid "Delete" +msgstr "מחיקה" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "העל××” גדולה מידי" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "×”×§×‘×¦×™× ×©× ×™×¡×™×ª להעלות חרגו מהגודל המקסימלי להעל×ת ×§×‘×¦×™× ×¢×œ שרת ×–×”." + + diff --git a/l10n/he/media.po b/l10n/he/media.po new file mode 100644 index 00000000000..e578ad99185 --- /dev/null +++ b/l10n/he/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "מוזיקה" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "נגן" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "השהה" + +#: templates/music.php:5 +msgid "Previous" +msgstr "קוד×" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "הב×" + +#: templates/music.php:7 +msgid "Mute" +msgstr "השתק" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "בטל השתקה" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "סריקת ×וסף מחדש" + +#: templates/music.php:37 +msgid "Artist" +msgstr "מבצע" + +#: templates/music.php:38 +msgid "Album" +msgstr "×לבו×" + +#: templates/music.php:39 +msgid "Title" +msgstr "כותרת" + + diff --git a/l10n/he/settings.po b/l10n/he/settings.po new file mode 100644 index 00000000000..7941f186486 --- /dev/null +++ b/l10n/he/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/team/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "בקשה ×œ× ×—×•×§×™×ª" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID השתנה" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "שפה השתנתה" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "הוספת ×”×™×™×©×•× ×©×œ×š" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "בחירת יישו×" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "רשיון" + +#: templates/apps.php:23 +msgid "by" +msgstr "מ×ת" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "ש×ל ש×לה" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "בעיות בהתחברות לבסיס נתוני העזרה" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "גש ×œ×©× ×‘×ופן ידני" + +#: templates/help.php:29 +msgid "Answer" +msgstr "מענה" + +#: templates/personal.php:8 +msgid "You use" +msgstr "הנך משתמש " + +#: templates/personal.php:8 +msgid "of the available" +msgstr "מתוך " + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "הססמה שלך שונתה" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "×œ× × ×™×ª×Ÿ לשנות ×ת הססמה שלך" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "ססמה נוכחית" + +#: templates/personal.php:16 +msgid "New password" +msgstr "ססמה חדשה" + +#: templates/personal.php:17 +msgid "show" +msgstr "הצגה" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "שינוי ססמה" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "פה" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "השתמש בכתובת זו כדי להתחבר ל־ownCloude שלך ממנהל הקבצי×" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "ש×" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "ססמה" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "קבוצות" + +#: templates/users.php:23 +msgid "Create" +msgstr "יצירה" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "מחיקה" + + diff --git a/l10n/hr/calendar.po b/l10n/hr/calendar.po new file mode 100644 index 00000000000..c4ea31f3c0a --- /dev/null +++ b/l10n/hr/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "Vremenska zona promijenjena" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Neispravan zahtjev" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kalendar" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "PogreÅ¡an kalendar" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "RoÄ‘endan" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Poslovno" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Poziv" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Klijenti" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "DostavljaÄ" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Odmori" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ideje" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Putovanje" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Obljetnica" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Sastanak" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Ostalo" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Osobno" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projekti" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Pitanja" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Posao" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Ne ponavlja se" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Dnevno" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Tjedno" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Svakog radnog dana" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Dvotjedno" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "MjeseÄno" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "GodiÅ¡nje" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Nije niz" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Cijeli dan" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Nedostaju polja" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Naslov" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "Datum Od" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "Vrijeme Od" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Datum Do" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Vrijeme Do" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "DogaÄ‘aj zavrÅ¡ava prije nego poÄinje" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "PogreÅ¡ka u bazi podataka" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Tjedan" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Mjesec" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Lista" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Danas" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kalendari" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "PogreÅ¡ka pri Äitanju datoteke." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Odaberite aktive kalendare" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Novi Kalendar" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav Poveznica" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Spremi lokalno" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Uredi" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "BriÅ¡i" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Novi kalendar" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Uredi kalendar" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Naziv" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktivan" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Boja kalendara" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Spremi" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Potvrdi" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Odustani" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Uredi dogaÄ‘aj" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Izvoz" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Naslov DogaÄ‘aja" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategorija" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Odabir kategorije" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Cjelodnevni dogaÄ‘aj" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Od" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Za" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Napredne mogućnosti" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Ponavljanje" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Lokacija" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Lokacija DogaÄ‘aja" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Opis" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Opis dogaÄ‘aja" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Uvoz Ical datoteke" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Kako uvesti novi kalendar?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "Uvoz u postojeći kalendar" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Uvoz u novi kalendar" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Odaberite kalendar" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Uvoz" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Natrag" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Molimo popunite obrazac" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Unesi novi dogaÄ‘aj" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Vremenska zona" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Format vremena" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24h" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12h" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "Adresa za CalDAV sinkronizaciju kalendara" + + diff --git a/l10n/hr/contacts.po b/l10n/hr/contacts.po new file mode 100644 index 00000000000..e722369c0d5 --- /dev/null +++ b/l10n/hr/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Ovo nije vaÅ¡ adresar." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Kontakt ne postoji." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "Nemoguće proÄitati vCard." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "Informacija o vCard je neispravna. Osvježite stranicu." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresa" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizacija" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Posao" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Kuća" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobitel" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Glasovno" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Ovo nije vaÅ¡ kontakt." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Ova kartica nije sukladna prema RFC direktivama." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Ova kartica ne sadrži fotografiju." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Dodaj kontakt" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Grupa" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Naziv" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PoÅ¡tanski Pretinac" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "ProÅ¡ireno" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulica" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Grad" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regija" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PoÅ¡tanski broj" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Država" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Izradi Kontakt" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Uredi" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "ObriÅ¡i" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "RoÄ‘endan" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefon" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/hr/core.po b/l10n/hr/core.po new file mode 100644 index 00000000000..0ddb082dd54 --- /dev/null +++ b/l10n/hr/core.po @@ -0,0 +1,172 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +# Thomas SilaÄ‘i , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Primit ćete link kako biste poniÅ¡tili zaporku putem e-maila." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Zahtijevano" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Prijava nije uspjela!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "KorisniÄko ime" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Zahtjev za resetiranjem" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "VaÅ¡a lozinka je resetirana" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "nova lozinka" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "poniÅ¡tavanje lozinke" + +#: strings.php:5 +msgid "Personal" +msgstr "Osobno" + +#: strings.php:6 +msgid "Users" +msgstr "korisnici" + +#: strings.php:7 +msgid "Apps" +msgstr "aplikacije" + +#: strings.php:8 +msgid "Admin" +msgstr "administrator" + +#: strings.php:9 +msgid "Help" +msgstr "pomoć" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Cloud nije pronaÄ‘en" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "stvoriti Administratorski raÄun" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Lozinka" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Dodatno" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Mapa baze podataka" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "konfigurirati baze podataka" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "će se koristiti" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "korisnik baze podataka" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "lozinka baze podataka" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "ime baze podataka" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Poslužitelj baze podataka" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "zavrÅ¡iti postavljanje" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "odjaviti" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "postavke" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Izgubili ste lozinku?" + +#: templates/login.php:15 +msgid "remember" +msgstr "zapamtiti" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Vi ste odjavljeni." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "prethodan" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "sljedeći" + + diff --git a/l10n/hr/files.po b/l10n/hr/files.po new file mode 100644 index 00000000000..4109098bdcc --- /dev/null +++ b/l10n/hr/files.po @@ -0,0 +1,115 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Datoteka je poslana uspjeÅ¡no i bez pogreÅ¡aka" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"Poslana datoteka izlazi iz okvira upload_max_size direktive postavljene u " +"php.ini konfiguracijskoj datoteci" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Poslana datoteka izlazi iz okvira MAX_FILE_SIZE direktive postavljene u HTML" +" obrascu" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Datoteka je poslana samo djelomiÄno" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Ni jedna datoteka nije poslana" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Nedostaje privremena mapa" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Datoteke" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimalna veliÄina prijenosa" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "PoÅ¡alji" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Nema niÄega u ovoj mapi. PoÅ¡alji neÅ¡to!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Naziv" + +#: templates/index.php:45 +msgid "Download" +msgstr "Preuzmi" + +#: templates/index.php:49 +msgid "Size" +msgstr "VeliÄina" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Zadnja promjena" + +#: templates/index.php:50 +msgid "Delete" +msgstr "BriÅ¡i" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Prijenos je preobiman" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Datoteke koje pokuÅ¡avate prenijeti prelaze maksimalnu veliÄinu za prijenos " +"datoteka na ovom poslužitelju." + + diff --git a/l10n/hr/media.po b/l10n/hr/media.po new file mode 100644 index 00000000000..dd2823a5ae5 --- /dev/null +++ b/l10n/hr/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Glazba" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Reprodukcija" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pauza" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Prethodna" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Sljedeća" + +#: templates/music.php:7 +msgid "Mute" +msgstr "UtiÅ¡aj zvuk" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "UkljuÄi zvuk" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Ponovi skeniranje kolekcije" + +#: templates/music.php:37 +msgid "Artist" +msgstr "IzvoÄ‘aÄ" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Naslov" + + diff --git a/l10n/hr/settings.po b/l10n/hr/settings.po new file mode 100644 index 00000000000..c40085592cb --- /dev/null +++ b/l10n/hr/settings.po @@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Davor Kustec , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/team/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Neispravan zahtjev" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID promijenjen" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Jezik promijenjen" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Dodajte vaÅ¡u aplikaciju" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Odaberite Aplikaciju" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-licencirano" + +#: templates/apps.php:23 +msgid "by" +msgstr "od" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Postavite pitanje" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Problem pri spajanju na bazu podataka pomoći" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Idite tamo ruÄno." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Odgovor" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Koristite" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "od dostupno" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "VaÅ¡a lozinka je promijenjena" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Nemoguće promijeniti lozinku" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Trenutna lozinka" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Nova lozinka" + +#: templates/personal.php:17 +msgid "show" +msgstr "prikaz" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Izmjena lozinke" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Jezik" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" +"koristite ovu adresu za spajanje na Cloud u vaÅ¡em upravitelju datoteka" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Ime" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Lozinka" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Grupe" + +#: templates/users.php:23 +msgid "Create" +msgstr "Izradi" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "ObriÅ¡i" + + diff --git a/l10n/hu_HU/calendar.po b/l10n/hu_HU/calendar.po new file mode 100644 index 00000000000..aee11c9a501 --- /dev/null +++ b/l10n/hu_HU/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Peter Borsa , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "IdÅ‘zóna megváltozott" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Érvénytelen kérés" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Naptár" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Hibás naptár" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Születésap" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Ãœzlet" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Hívás" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Kliensek" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Szállító" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Ãœnnepek" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ötletek" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Utazás" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Évforduló" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Találkozó" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Egyéb" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Személyes" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projektek" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Kérdések" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Munka" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Nem ismétlÅ‘dik" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Napi" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Heti" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Minden hétköznap" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Kéthetente" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "Havi" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Évi" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Nem egy tömb" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Egész nap" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Hiányzó mezÅ‘k" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Cím" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "Napjától" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "IdÅ‘tÅ‘l" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Napig" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Ideig" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "Az esemény véget ér a kezdés elÅ‘tt." + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Adatbázis hiba történt" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Hét" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Hónap" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Lista" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Ma" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Naptárak" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Probléma volt a fájl elemzése közben." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Aktív naptár kiválasztása" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Új naptár" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDAV link" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Letöltés" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Szerkesztés" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Törlés" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Új naptár" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Naptár szerkesztése" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Megjelenítési név" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktív" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Naptár szín" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Mentés" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Beküldés" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Mégse" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Esemény szerkesztése" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Export" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Az esemény címe" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategória" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Kategória kiválasztása" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Egész napos esemény" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Haladó beállítások" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Ismétlés" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Hely" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Az esemény helyszíne" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Leírás" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Az esemény leírása" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Ical fájl importálása" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Hogyan legyen importálva az új naptár?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "LétezÅ‘ naptárba importálás" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Új naptárba importálás" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Válassz naptárat" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Importálás" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Vissza" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Töltsd ki az űrlapot" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Új esemény létrehozása" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "IdÅ‘zóna" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "IdÅ‘formátum" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24h" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12h" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "Naptár CalDAV szinkronizálási cím:" + + diff --git a/l10n/hu_HU/contacts.po b/l10n/hu_HU/contacts.po new file mode 100644 index 00000000000..463190e33fc --- /dev/null +++ b/l10n/hu_HU/contacts.po @@ -0,0 +1,240 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +# Peter Borsa , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Ez nem a te címjegyzéked." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Kapcsolat nem található." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "A vCard-ot nem lehet olvasni." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "A vCardról szóló információ helytelen. Töltsd újra az oldalt." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Cím" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefonszám" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizáció" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Munka" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Otthon" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobiltelefonszám" + +#: lib/app.php:114 +msgid "Text" +msgstr "Szöveg" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Hang" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Lapozó" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Nem a te kapcsolatod." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "A kártya nem RFC kompatibilis." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "A kártya nem tartlmaz fényképet." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Kontakt hozzáadása" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Csoport" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Név" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Postafiók" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Kiterjesztett" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Utca" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Helység" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Megye" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Irányítószám" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Ország" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Kontakt létrehozása" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Szerkesztés" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Törlés" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Születésnap" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefonszám" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/hu_HU/core.po b/l10n/hu_HU/core.po new file mode 100644 index 00000000000..a6a15a1bf9e --- /dev/null +++ b/l10n/hu_HU/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Egy e-mailben kap értesítést a jelszóváltoztatás módjáról." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Kért" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Belépés sikertelen!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Felhasználói név" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Jelszó megváltoztatásra került" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Új jelszó" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Jelszó beállítás" + +#: strings.php:5 +msgid "Personal" +msgstr "Személyes" + +#: strings.php:6 +msgid "Users" +msgstr "Felhasználók" + +#: strings.php:7 +msgid "Apps" +msgstr "Alkalmazások" + +#: strings.php:8 +msgid "Admin" +msgstr "Adminisztráció" + +#: strings.php:9 +msgid "Help" +msgstr "Súgó" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Nem talált felhÅ‘" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Adminisztrációs fiók létrehozása" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Jelszó" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Fejlett" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Adat könyvtár" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Adatbázis konfigurálása" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "használva lesz" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Adatbázis felhasználó" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Adatbázis jelszó" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Adatbázis név" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Adatbázis szerver" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Beállítások befejezése" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Kilépés" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Beállítások" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Elfelejtett jelszó?" + +#: templates/login.php:15 +msgid "remember" +msgstr "emlékezni" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Kilépés sikerült." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "ElÅ‘zÅ‘" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "KövetkezÅ‘" + + diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po new file mode 100644 index 00000000000..2dfe1c33917 --- /dev/null +++ b/l10n/hu_HU/files.po @@ -0,0 +1,116 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +# Peter Borsa , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Nincs hiba, a fájl sikeresen feltöltve." + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"A feltöltött file meghaladja az upload_max_filesize direktívát a php.ini-" +"ben." + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"A feltöltött fájl meghaladja a MAX_FILE_SIZE direktívát ami meghatározott a " +"HTML form-ban." + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Az eredeti fájl csak részlegesen van feltöltve." + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Nem lett fájl feltöltve." + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Hiányzik az ideiglenes könyvtár" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Fájlok" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maximális feltölthetÅ‘ fájlméret" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Feltöltés" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Töltsön fel egy fájlt." + +#: templates/index.php:43 +msgid "Name" +msgstr "Név" + +#: templates/index.php:45 +msgid "Download" +msgstr "Letöltés" + +#: templates/index.php:49 +msgid "Size" +msgstr "Méret" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Módosítva" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Törlés" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Feltöltés túl nagy" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen" +" a szerveren." + + diff --git a/l10n/hu_HU/media.po b/l10n/hu_HU/media.po new file mode 100644 index 00000000000..d11eeca2ef4 --- /dev/null +++ b/l10n/hu_HU/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Peter Borsa , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Zene" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Lejátszás" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Szünet" + +#: templates/music.php:5 +msgid "Previous" +msgstr "ElÅ‘zÅ‘" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "KövetkezÅ‘" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Némítás" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Némítás megszüntetése" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Gyűjtemény újraolvasása" + +#: templates/music.php:37 +msgid "Artist" +msgstr "ElÅ‘adó" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Cím" + + diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po new file mode 100644 index 00000000000..d91ad225434 --- /dev/null +++ b/l10n/hu_HU/settings.po @@ -0,0 +1,155 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Peter Borsa , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/team/hu_HU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu_HU\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Érvénytelen kérés" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID megváltozott" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "A nyelv megváltozott" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Alkalmazásod hozzáadása" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Egy App kiválasztása" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-licenszelt" + +#: templates/apps.php:23 +msgid "by" +msgstr "" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Tégy fel egy kérdést" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Menj oda kézzel" + +#: templates/help.php:29 +msgid "Answer" +msgstr "Válasz" + +#: templates/personal.php:8 +msgid "You use" +msgstr "" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "a rendelkezésre álló" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "A jelszó megváltozott" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Nem lehet megváltoztatni a jelszavad" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Jelenlegi jelszó" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Új jelszó" + +#: templates/personal.php:17 +msgid "show" +msgstr "Mutatás" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Jelszó megváltoztatása" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Nyelv" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" +"Használd ezt a címet hogy csatlakozz a saját ownCloud rendszeredhez a " +"fájlkezelÅ‘dben" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Név" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Jelszó" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Csoportok" + +#: templates/users.php:23 +msgid "Create" +msgstr "Létrehozás" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Törlés" + + diff --git a/l10n/hy/calendar.po b/l10n/hy/calendar.po new file mode 100644 index 00000000000..b3a8dbbe07b --- /dev/null +++ b/l10n/hy/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Arman Poghosyan , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Õ•Ö€Õ¡ÖÕ¸Ö‚ÕµÖ" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Ô±ÕµÕ¬" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "" + +#: lib/object.php:354 +msgid "Daily" +msgstr "" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Ô±Õ´Õ«Õ½" + +#: templates/calendar.php:40 +msgid "List" +msgstr "" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Ô±ÕµÕ½Ö…Ö€" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "" + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Ô²Õ¥Õ¼Õ¶Õ¥Õ¬" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Õ‹Õ¶Õ»Õ¥Õ¬" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "ÕŠÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "" + +#: templates/settings.php:34 +msgid "24h" +msgstr "" + +#: templates/settings.php:35 +msgid "12h" +msgstr "" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "" + + diff --git a/l10n/hy/contacts.po b/l10n/hy/contacts.po new file mode 100644 index 00000000000..f4a8aac2cd5 --- /dev/null +++ b/l10n/hy/contacts.po @@ -0,0 +1,238 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "" + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "" + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "" + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "" + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "" + +#: lib/app.php:114 +msgid "Text" +msgstr "" + +#: lib/app.php:115 +msgid "Voice" +msgstr "" + +#: lib/app.php:116 +msgid "Fax" +msgstr "" + +#: lib/app.php:117 +msgid "Video" +msgstr "" + +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/hy/core.po b/l10n/hy/core.po new file mode 100644 index 00000000000..df17a143a65 --- /dev/null +++ b/l10n/hy/core.po @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + +#: strings.php:5 +msgid "Personal" +msgstr "" + +#: strings.php:6 +msgid "Users" +msgstr "" + +#: strings.php:7 +msgid "Apps" +msgstr "" + +#: strings.php:8 +msgid "Admin" +msgstr "" + +#: strings.php:9 +msgid "Help" +msgstr "" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "" + +#: templates/login.php:15 +msgid "remember" +msgstr "" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "" + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "" + + diff --git a/l10n/hy/files.po b/l10n/hy/files.po new file mode 100644 index 00000000000..77b97fc34df --- /dev/null +++ b/l10n/hy/files.po @@ -0,0 +1,108 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "" + +#: templates/index.php:43 +msgid "Name" +msgstr "" + +#: templates/index.php:45 +msgid "Download" +msgstr "" + +#: templates/index.php:49 +msgid "Size" +msgstr "" + +#: templates/index.php:50 +msgid "Modified" +msgstr "" + +#: templates/index.php:50 +msgid "Delete" +msgstr "" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" + + diff --git a/l10n/hy/media.po b/l10n/hy/media.po new file mode 100644 index 00000000000..8fe3c57905b --- /dev/null +++ b/l10n/hy/media.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "" + +#: templates/music.php:5 +msgid "Previous" +msgstr "" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "" + +#: templates/music.php:7 +msgid "Mute" +msgstr "" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "" + +#: templates/music.php:37 +msgid "Artist" +msgstr "" + +#: templates/music.php:38 +msgid "Album" +msgstr "" + +#: templates/music.php:39 +msgid "Title" +msgstr "" + + diff --git a/l10n/hy/settings.po b/l10n/hy/settings.po new file mode 100644 index 00000000000..7712776cd67 --- /dev/null +++ b/l10n/hy/settings.po @@ -0,0 +1,152 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/team/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "" + +#: templates/apps.php:23 +msgid "by" +msgstr "" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "" + +#: templates/help.php:29 +msgid "Answer" +msgstr "" + +#: templates/personal.php:8 +msgid "You use" +msgstr "" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "" + +#: templates/personal.php:16 +msgid "New password" +msgstr "" + +#: templates/personal.php:17 +msgid "show" +msgstr "" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "" + +#: templates/users.php:23 +msgid "Create" +msgstr "" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "" + + diff --git a/l10n/ia/calendar.po b/l10n/ia/calendar.po new file mode 100644 index 00000000000..da2e4a59022 --- /dev/null +++ b/l10n/ia/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Calendario" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projectos" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Travalio" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "" + +#: lib/object.php:354 +msgid "Daily" +msgstr "" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Omne die" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Titulo" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Septimana" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Mense" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Lista" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Hodie" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Calendarios" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "" + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Selectionar calendarios active" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Nove calendario" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Discarga" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Modificar" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Deler" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Modificar calendario" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Active" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Color de calendario" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Salveguardar" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Inviar" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Cancellar" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Selectionar categoria" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Ab" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "A" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Description" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "" + +#: templates/settings.php:34 +msgid "24h" +msgstr "" + +#: templates/settings.php:35 +msgid "12h" +msgstr "" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "" + + diff --git a/l10n/ia/contacts.po b/l10n/ia/contacts.po new file mode 100644 index 00000000000..89f2366ca88 --- /dev/null +++ b/l10n/ia/contacts.po @@ -0,0 +1,240 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Iste non es tu libro de adresses" + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Contacto non poterea esser legite" + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "vCard non poterea esser legite." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "" + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresse" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telephono" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-posta" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organisation" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Travalio" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Domo" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "" + +#: lib/app.php:114 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Iste non es tu contacto" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Iste carta non es compatibile con RFC" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Adder contacto" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Gruppo" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Nomine" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Cassa postal" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Strata" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Citate" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Region" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Codice postal" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Pais" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Crear contacto" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Modificar" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Deler" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Anniversario" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Phono" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/ia/core.po b/l10n/ia/core.po new file mode 100644 index 00000000000..f3f5f87ceea --- /dev/null +++ b/l10n/ia/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Requestate" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Initio de session fallate!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nomine de usator" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Requestar reinitialisation" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Tu contrasigno esseva reinitialisate" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nove contrasigno" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Reinitialisar contrasigno" + +#: strings.php:5 +msgid "Personal" +msgstr "" + +#: strings.php:6 +msgid "Users" +msgstr "Usatores" + +#: strings.php:7 +msgid "Apps" +msgstr "Applicationes" + +#: strings.php:8 +msgid "Admin" +msgstr "" + +#: strings.php:9 +msgid "Help" +msgstr "Adjuta" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Nube non trovate" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Crear un conto de administration" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Contrasigno" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avantiate" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Dossier de datos" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Configurar le base de datos" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "essera usate" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Usator de base de datos" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Contrasigno de base de datos" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Nomine de base de datos" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Clauder le session" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Configurationes" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "" + +#: templates/login.php:15 +msgid "remember" +msgstr "memora" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "" + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "prev" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "prox" + + diff --git a/l10n/ia/files.po b/l10n/ia/files.po new file mode 100644 index 00000000000..8ecc6217302 --- /dev/null +++ b/l10n/ia/files.po @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Le file incargate solmente esseva incargate partialmente" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Nulle file esseva incargate" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Files" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Dimension maxime de incargamento" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Incargar" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Nihil hic. Incarga alcun cosa!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Nomine" + +#: templates/index.php:45 +msgid "Download" +msgstr "Discargar" + +#: templates/index.php:49 +msgid "Size" +msgstr "Dimension" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Modificate" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Deler" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Incargamento troppo longe" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" + + diff --git a/l10n/ia/media.po b/l10n/ia/media.po new file mode 100644 index 00000000000..0a64e175db4 --- /dev/null +++ b/l10n/ia/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Musica" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Reproducer" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pausa" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Previe" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Proxime" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Mute" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Con sono" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Rescannar collection" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Artista" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Titulo" + + diff --git a/l10n/ia/settings.po b/l10n/ia/settings.po new file mode 100644 index 00000000000..b05a2f18bb6 --- /dev/null +++ b/l10n/ia/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Emilio Sepúlveda , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/team/ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID cambiate" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Linguage cambiate" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Adder tu application" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Selectionar un app" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "" + +#: templates/apps.php:23 +msgid "by" +msgstr "per" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Facer un question" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "" + +#: templates/help.php:29 +msgid "Answer" +msgstr "Responsa" + +#: templates/personal.php:8 +msgid "You use" +msgstr "" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "Tu contrasigno esseva cambiate" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Non pote cambiar tu contrasigno" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Contrasigno currente" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Nove contrasigno" + +#: templates/personal.php:17 +msgid "show" +msgstr "monstrar" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Cambiar contrasigno" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Linguage" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Nomine" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Contrasigno" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Gruppos" + +#: templates/users.php:23 +msgid "Create" +msgstr "Crear" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Deler" + + diff --git a/l10n/id/contacts.po b/l10n/id/contacts.po index 3a6360c599f..5ae316e2e11 100644 --- a/l10n/id/contacts.po +++ b/l10n/id/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/team/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +17,222 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: photo.php:53 -msgid "This card is not RFC compatible." +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" msgstr "" -#: photo.php:90 -msgid "This card does not contain a photo." +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" msgstr "" -#: templates/index.php:8 -msgid "Add Contact" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" msgstr "" -#: templates/part.addcardform.php:5 -msgid "Group" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" msgstr "" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" msgstr "" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: lib/app.php:112 +msgid "Mobile" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" +#: lib/app.php:114 +msgid "Text" msgstr "" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" +#: lib/app.php:115 +msgid "Voice" msgstr "" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: lib/app.php:117 +msgid "Video" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.addcardform.php:97 +msgid "Create Contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" msgstr "" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/id/core.po b/l10n/id/core.po index d19793d98a1..b2751d7daa3 100644 --- a/l10n/id/core.po +++ b/l10n/id/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 01:19+0000\n" -"Last-Translator: radifar \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/team/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Username" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + #: strings.php:5 msgid "Personal" msgstr "Pribadi" @@ -46,54 +91,50 @@ msgstr "Cloud tidak ditemukan" msgid "Create an admin account" msgstr "Buat sebuah akun admin" -#: templates/installation.php:21 -msgid "Username" -msgstr "Username" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Password" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Tingkat Lanjut" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Folder data" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurasi database" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "akan digunakan" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Pengguna database" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Password database" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nama database" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Tingkat Lanjut" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Host database" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Folder data" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Selesaikan instalasi" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "memberikan anda kebebasan dan kendali atas data anda sendiri" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +144,22 @@ msgstr "Keluar" msgid "Settings" msgstr "Setelan" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Lupa password anda?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "selalu login" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Anda telah keluar." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Anda akan menerima tautan untuk menset ulang password anda via Email." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Telah diminta" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Gagal masuk!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nama Pengguna atau Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Meminta set ulang" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "sebelum" @@ -143,16 +168,4 @@ msgstr "sebelum" msgid "next" msgstr "selanjutnya" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Password anda telah diset ulang" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Password Baru" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Set Ulang Password" - diff --git a/l10n/id/files.po b/l10n/id/files.po index 8b116d05259..7a7d4ce4b33 100644 --- a/l10n/id/files.po +++ b/l10n/id/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/team/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,33 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" msgstr "" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Berkas" @@ -52,43 +52,55 @@ msgstr "Berkas" msgid "Maximum upload size" msgstr "Ukuran unggah maksimum" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Unggah" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Folder Baru" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Tidak ada apa-apa di sini. Unggah sesuatu!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nama" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Unduh" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Ukuran" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Dimodifikasi" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Hapus" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Unggahan terlalu besar" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/id/media.po b/l10n/id/media.po index 5e833cc559b..16f3ae710a1 100644 --- a/l10n/id/media.po +++ b/l10n/id/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Muhammad Radifar , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/team/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,39 +18,35 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musik" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Mainkan" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Jeda" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Sebelumnya" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "Selanjutnya" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Nonaktifkan suara" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Lagu-lagu yang telah dipindai" +msgstr "Aktifkan suara" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Pindai ulang Koleksi" diff --git a/l10n/id/settings.po b/l10n/id/settings.po index 890bf7b34af..19c8fb9ec9c 100644 --- a/l10n/id/settings.po +++ b/l10n/id/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Muhammad Radifar , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-23 09:45+0000\n" -"Last-Translator: radifar \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/team/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +18,26 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Otentikasi bermasalah" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID telah dirubah" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Permintaan tidak valid" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID telah dirubah" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Bahasa telah diganti" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Tambahkan aplikasi anda" @@ -53,15 +58,15 @@ msgstr "oleh" msgid "Ask a question" msgstr "Ajukan pertanyaan" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Bermasalah saat menghubungi database bantuan." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Pergi kesana secara manual." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Jawab" @@ -77,6 +82,10 @@ msgstr "dari yang tersedia" msgid "Your password got changed" msgstr "Password anda telah dirubah" +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Tidak dapat merubah password anda" + #: templates/personal.php:15 msgid "Current password" msgstr "Password saat ini" @@ -94,36 +103,52 @@ msgid "Change password" msgstr "Rubah password" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Bahasa" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Bantu terjemahkan" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "gunakan alamat ini untuk terhubung dengan ownCloud anda dalam file manager " "anda" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nama" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Password" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Group" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Buat" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Hapus" diff --git a/l10n/it/contacts.po b/l10n/it/contacts.po index 3f8e3bd1696..9a88c328e49 100644 --- a/l10n/it/contacts.po +++ b/l10n/it/contacts.po @@ -4,13 +4,14 @@ # # Translators: # Francesco Apruzzese , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,164 +19,222 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "Bisogna effettuare il login." - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "Questa non è la tua rubrica." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "Il contatto non può essere trovato" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "Questo non è un tuo contatto." - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "La vCard non può essere letta" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informazioni sulla vCard incorrette. Ricaricare la pagina." -#: photo.php:53 -msgid "This card is not RFC compatible." -msgstr "Questa card non è compatibile con il protocollo RFC." - -#: photo.php:90 -msgid "This card does not contain a photo." -msgstr "Questa card non contiene una foto." - -#: templates/index.php:8 -msgid "Add Contact" -msgstr "Aggiungi contatto" - -#: templates/part.addcardform.php:5 -msgid "Group" -msgstr "Gruppo" - -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" -msgstr "Nome" - -#: templates/part.addcardform.php:14 -msgid "Create Contact" -msgstr "Crea contatto" - -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 msgid "Address" msgstr "Indirizzo" -#: templates/part.addpropertyform.php:5 +#: lib/app.php:92 templates/part.addcardform.php:37 msgid "Telephone" msgstr "Telefono" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 msgid "Email" msgstr "Email" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 msgid "Organization" msgstr "Organizzazione" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 +#: lib/app.php:106 lib/app.php:113 msgid "Work" msgstr "Lavoro" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 +#: lib/app.php:107 lib/app.php:111 msgid "Home" msgstr "Casa" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: lib/app.php:112 +msgid "Mobile" +msgstr "Cellulare" + +#: lib/app.php:114 +msgid "Text" +msgstr "Testo" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Cercapersone" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Questo non è un tuo contatto." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Questa card non è compatibile con il protocollo RFC." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Questa card non contiene una foto." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Aggiungi contatto" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Gruppo" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Nome" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" -msgstr "PO Box" +msgstr "Casella postale" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "Estendi" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "Via" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "Città" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "Regione" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "CAP" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "Stato" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" -msgstr "Cellulare" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Crea contatto" -#: templates/part.addpropertyform.php:33 -msgid "Text" -msgstr "Testo" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" -msgstr "Voce" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" -msgstr "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" -msgstr "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" -msgstr "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Modifica" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "Cancella" -#: templates/part.details.php:34 -msgid "Add Property" -msgstr "Aggiungi proprietà" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "Compleanno" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "Telefono" -#: templates/part.setpropertyform.php:17 -msgid "Edit" -msgstr "Modifica" +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" diff --git a/l10n/it/core.po b/l10n/it/core.po index cd840405802..369e41fd05b 100644 --- a/l10n/it/core.po +++ b/l10n/it/core.po @@ -5,14 +5,15 @@ # Translators: # , 2011. # Francesco Apruzzese , 2011. +# , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-23 08:17+0000\n" -"Last-Translator: OpenCode \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +21,51 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Riceverai un link per resettare la tua password via Email" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Richiesto" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Login fallito!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nome utente" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Richiesta di ripristino" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "La password è stata reimpostata" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nuova password" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Reimposta password" + #: strings.php:5 msgid "Personal" msgstr "Personale" @@ -46,56 +92,52 @@ msgstr "Cloud non trovata" #: templates/installation.php:20 msgid "Create an admin account" -msgstr "Crea un <strong>account amministratore</strong>" - -#: templates/installation.php:21 -msgid "Username" -msgstr "Nome utente" +msgstr "Crea un account amministratore" -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Password" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Opzioni avanzate" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Cartella dati" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configura il database" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "sarà usato" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Utente database" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Password database" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nome database" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Opzioni avanzate" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Host del database" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Cartella dati" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Termina" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "Libertà e controllo dei propri dati" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -105,38 +147,22 @@ msgstr "Log out" msgid "Settings" msgstr "Impostazioni" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Password persa?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "ricorda" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Sei uscito." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Riceverai via email un link per il reset della tua password" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Richiesto" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login fallito!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Username o email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Reset richiesta" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "precedente" @@ -145,16 +171,4 @@ msgstr "precedente" msgid "next" msgstr "successivo" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "tua password è stata resettata" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nuova password" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Reset password" - diff --git a/l10n/it/files.po b/l10n/it/files.po index ee66302f62f..30aeedd1997 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -4,13 +4,14 @@ # # Translators: # , 2011. +# Francesco Apruzzese , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +19,34 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Non ci sono errori, file caricato con successo" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "Il file caricato supera il valore upload_max_filesize in php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Il file caricato supera il valore MAX_FILE_SIZE definito nel form HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Il file è stato parzialmente caricato" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Nessun file è stato caricato" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Cartella temporanea mancante" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "File" @@ -52,43 +54,55 @@ msgstr "File" msgid "Maximum upload size" msgstr "Dimensione massima upload" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Carica" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nuova Cartella" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Non c'è niente qui. Carica qualcosa!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nome" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Scarica" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Dimensione" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modificato" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Cancella" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Il file caricato è troppo grande" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/it/media.po b/l10n/it/media.po index 7f27ceaf216..573b9775417 100644 --- a/l10n/it/media.po +++ b/l10n/it/media.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Francesco Apruzzese , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-23 11:09+0200\n" -"PO-Revision-Date: 2011-08-21 23:18+0000\n" -"Last-Translator: OpenCode \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +19,15 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musica" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Play" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pausa" @@ -33,7 +35,7 @@ msgstr "Pausa" msgid "Previous" msgstr "Precedente" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Successiva" @@ -45,13 +47,9 @@ msgstr "Disattiva audio" msgid "Unmute" msgstr "Riattiva audio" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Canzoni analizzate" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" -msgstr "Rianalizza colezione" +msgstr "Rianalizza collezione" #: templates/music.php:37 msgid "Artist" diff --git a/l10n/it/settings.po b/l10n/it/settings.po index 8e0042ea43d..64402b03520 100644 --- a/l10n/it/settings.po +++ b/l10n/it/settings.po @@ -2,16 +2,18 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # -# , 2011. +# Translators: # Francesco Apruzzese , 2011. # Jan-Christoph Borchardt , 2011. +# , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-04 16:48+0200\n" -"PO-Revision-Date: 2011-09-04 12:49+0000\n" -"Last-Translator: RColombo \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,22 +21,26 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Errore nell'autenticazione" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID Modificato" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Richiesta non valida" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID Modificato" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Lingua modificata" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Aggiungi un applicazione" @@ -45,7 +51,7 @@ msgstr "Seleziona un applicazione" #: templates/apps.php:23 msgid "-licensed" -msgstr "-licensed" +msgstr "-rilasciato" #: templates/apps.php:23 msgid "by" @@ -55,15 +61,15 @@ msgstr "da" msgid "Ask a question" msgstr "Fai una domanda" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problemi di connessione al database di aiuto" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Vai lì manualmente." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Risposta" @@ -99,37 +105,53 @@ msgstr "mostra" msgid "Change password" msgstr "Modifica password" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Lingua" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Aiuta nella traduzione" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "usa questo indirizzo per connettersi al proprio ownCloud nel tuo file " "manager" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nome" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Password" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Gruppi" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Crea" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Cancella" diff --git a/l10n/ja_JP/calendar.po b/l10n/ja_JP/calendar.po new file mode 100644 index 00000000000..31c287da115 --- /dev/null +++ b/l10n/ja_JP/calendar.po @@ -0,0 +1,636 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "タイムゾーンãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "無効ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã™" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "カレンダー" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "誤ã£ãŸã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã§ã™" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "誕生日" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "ビジãƒã‚¹" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "電話をã‹ã‘ã‚‹" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "顧客" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "é‹é€ä¼šç¤¾" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "休日" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "アイデア" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "æ—…è¡Œ" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "記念祭" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "ミーティング" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "ãã®ä»–" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "個人" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "プロジェクト" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "質å•äº‹é …" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "仕事" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "ç¹°ã‚Šè¿”ã•ãªã„" + +#: lib/object.php:354 +msgid "Daily" +msgstr "毎日" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "毎週" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "毎平日" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "2週間ã”ã¨" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "毎月" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "毎年" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "é…列ã§ã¯ã‚ã‚Šã¾ã›ã‚“" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "終日" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "タイトル" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "開始日" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "開始時間" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "終了日" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "終了時間" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "イベント終了時間ãŒé–‹å§‹æ™‚間より先ã§ã™" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "データベースフェイルãŒã‚ã‚Šã¾ã—ãŸ" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "週" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "月" + +#: templates/calendar.php:40 +msgid "List" +msgstr "リスト" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "今日" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "カレンダー" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "ファイルを構文解æžã™ã‚‹éš›ã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "アクティブãªã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "æ–°ã—ãカレンダーを作æˆã™ã‚‹" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDavã¸ã®ãƒªãƒ³ã‚¯" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "ダウンロード" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "編集" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "削除" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "æ–°ã—ãカレンダーを作æˆã™ã‚‹" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "カレンダーを編集" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "表示å" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "アクティブ" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "カレンダーã®è‰²" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "ä¿å­˜" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "完了" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "キャンセル" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "イベントを編集" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "エクスãƒãƒ¼ãƒˆ" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "イベントã®ã‚¿ã‚¤ãƒˆãƒ«" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "カテゴリー" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "カテゴリーをé¸æŠžã—ã¦ãã ã•ã„" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "終日イベント" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "開始" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "終了" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "詳細設定" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "ç¹°ã‚Šè¿”ã™" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "場所" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "イベントã®å ´æ‰€" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "メモ" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "イベントã®ãƒ¡ãƒ¢" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "iCalファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "æ–°ã—ã„カレンダーã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ–¹æ³•ã¯ï¼Ÿ" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "既存カレンダーã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "æ–°ã—ã„カレンダーã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "カレンダーをé¸æŠžã—ã¦ãã ã•ã„" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "インãƒãƒ¼ãƒˆ" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "戻る" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "フォームã«å…¥åŠ›ã—ã¦ãã ã•ã„" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "æ–°ã—ã„イベントを作æˆã™ã‚‹" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "タイムゾーン" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "時刻ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24時間制" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12時間制" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "カレンダーã®CalDAVシンクアドレス" + + diff --git a/l10n/ja_JP/contacts.po b/l10n/ja_JP/contacts.po new file mode 100644 index 00000000000..c0c91102cd9 --- /dev/null +++ b/l10n/ja_JP/contacts.po @@ -0,0 +1,238 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "ã“ã‚Œã¯ã‚ãªãŸã®é›»è©±å¸³ã§ã¯ã‚ã‚Šã¾ã›ã‚“。" + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "連絡先を見ã¤ã‘る事ãŒã§ãã¾ã›ã‚“。" + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "vCardã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "vCardã®æƒ…å ±ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ã€‚ページをリロードã—ã¦ä¸‹ã•ã„。" + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "ä½æ‰€" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "電話番å·" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "メールアドレス" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "所属" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "勤務先" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "ä½å±…" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "æºå¸¯é›»è©±" + +#: lib/app.php:114 +msgid "Text" +msgstr "TTY TDD" + +#: lib/app.php:115 +msgid "Voice" +msgstr "音声番å·" + +#: lib/app.php:116 +msgid "Fax" +msgstr "FAX" + +#: lib/app.php:117 +msgid "Video" +msgstr "テレビ電話" + +#: lib/app.php:118 +msgid "Pager" +msgstr "ãƒã‚±ãƒ™ãƒ«" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "ã‚ãªãŸã®é€£çµ¡å…ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "ã“ã®ã‚«ãƒ¼ãƒ‰ã¯RFCã«æº–æ‹ ã—ã¦ã„ã¾ã›ã‚“。" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "ã“ã®ã‚«ãƒ¼ãƒ‰ã¯å†™çœŸã‚’å«ã‚“ã§ãŠã‚Šã¾ã›ã‚“。" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "連絡先ã®è¿½åŠ " + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "グループ" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "æ°å" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "ç§æ›¸ç®±" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "拡張番地" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "街路番地" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "都市" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "地域" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "郵便番å·" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "国å" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "追加" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "編集" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "削除" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "生年月日" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "電話番å·" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/ja_JP/core.po b/l10n/ja_JP/core.po new file mode 100644 index 00000000000..9511997e083 --- /dev/null +++ b/l10n/ja_JP/core.po @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "パスワードをリセットã™ã‚‹ãƒªãƒ³ã‚¯ãŒãƒ¡ãƒ¼ãƒ«ã§å±Šãã¾ã™ã€‚" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "é€ä¿¡ã•ã‚Œã¾ã—ãŸ" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "ユーザå" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "リセットをè¦æ±‚ã™ã‚‹ã€‚" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "ã‚ãªãŸã®ãƒ‘スワードã¯ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã—ãŸã€‚" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "æ–°ã—ã„パスワードを入力" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "パスワードをリセット" + +#: strings.php:5 +msgid "Personal" +msgstr "個人設定" + +#: strings.php:6 +msgid "Users" +msgstr "ユーザ" + +#: strings.php:7 +msgid "Apps" +msgstr "アプリ" + +#: strings.php:8 +msgid "Admin" +msgstr "管ç†è€…" + +#: strings.php:9 +msgid "Help" +msgstr "ヘルプ" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "見ã¤ã‘られã¾ã›ã‚“" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "管ç†è€…アカウントを作æˆã—ã¦ãã ã•ã„" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "パスワード" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "詳細設定" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "データフォルダ" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "データベースを設定ã—ã¦ãã ã•ã„" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "ãŒä½¿ç”¨ã•ã‚Œã¾ã™" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "データベースã®ãƒ¦ãƒ¼ã‚¶å" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "データベースã®ãƒ‘スワード" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "データベースå" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "データベースã®ãƒ›ã‚¹ãƒˆå" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "セットアップを完了ã—ã¾ã™" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "ログアウト" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "設定" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "パスワードãŒã‚ã‹ã‚‰ãªããªã‚Šã¾ã—ãŸã‹ï¼Ÿ" + +#: templates/login.php:15 +msgid "remember" +msgstr "パスワードを記憶ã™ã‚‹" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "ログアウトã—ã¾ã—ãŸã€‚" + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "å‰" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "次" + + diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po new file mode 100644 index 00000000000..f4097681b60 --- /dev/null +++ b/l10n/ja_JP/files.po @@ -0,0 +1,108 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "エラーã¯ã‚ã‚Šã¾ã›ã‚“。ファイルã®ã‚¢ãƒƒãƒ—ロードã¯æˆåŠŸã—ã¾ã—ãŸã€‚" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯php.iniã®upload_max_filesizeã«è¨­å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯HTMLã®ãƒ•ã‚©ãƒ¼ãƒ ã«è¨­å®šã•ã‚ŒãŸMAX_FILE_SIZEã«è¨­å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "ファイルã¯ä¸€éƒ¨åˆ†ã—ã‹ã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "ファイルã¯ã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "テンãƒãƒ©ãƒªãƒ•ã‚©ãƒ«ãƒ€ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "ファイル" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "最大アップロードサイズ" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "アップロード" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "ã“ã“ã«ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。何ã‹ã‚¢ãƒƒãƒ—ロードã—ã¦ãã ã•ã„。" + +#: templates/index.php:43 +msgid "Name" +msgstr "åå‰" + +#: templates/index.php:45 +msgid "Download" +msgstr "ダウンロード" + +#: templates/index.php:49 +msgid "Size" +msgstr "サイズ" + +#: templates/index.php:50 +msgid "Modified" +msgstr "更新日時" + +#: templates/index.php:50 +msgid "Delete" +msgstr "削除" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "ファイルサイズãŒå¤§ãã™ãŽã¾ã™" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "アップロードã—よã†ã¨ã—ã¦ã„るファイルã¯ã‚µãƒ¼ãƒã§è¦å®šã•ã‚ŒãŸæœ€å¤§ã‚µã‚¤ã‚ºã‚’超ãˆã¦ã„ã¾ã™" + + diff --git a/l10n/ja_JP/media.po b/l10n/ja_JP/media.po new file mode 100644 index 00000000000..7288c83d3a2 --- /dev/null +++ b/l10n/ja_JP/media.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "ミュージック" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "å†ç”Ÿ" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "一時åœæ­¢" + +#: templates/music.php:5 +msgid "Previous" +msgstr "å‰" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "次" + +#: templates/music.php:7 +msgid "Mute" +msgstr "ミュート" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "ミュート解除" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "コレクションをå†èª­ã¿è¾¼ã¿ã™ã‚‹" + +#: templates/music.php:37 +msgid "Artist" +msgstr "アーティスト" + +#: templates/music.php:38 +msgid "Album" +msgstr "アルãƒãƒ " + +#: templates/music.php:39 +msgid "Title" +msgstr "曲å" + + diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po new file mode 100644 index 00000000000..24ad0f09c5d --- /dev/null +++ b/l10n/ja_JP/settings.po @@ -0,0 +1,152 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/team/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "無効ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã™" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenIDãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "言語ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "アプリを追加ã—ã¦ãã ã•ã„" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "アプリをé¸æŠžã—ã¦ãã ã•ã„" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "権利をä¿æŒã•ã‚Œã¦ã„ã¾ã™" + +#: templates/apps.php:23 +msgid "by" +msgstr "ã«ã‚ˆã£ã¦" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "質å•ã—ã¦ãã ã•ã„" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "ヘルプ用データベース接続ã«å•é¡ŒãŒç”Ÿã˜ã¾ã—ãŸ" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "手動ã§ç§»å‹•ã—ã¦ãã ã•ã„" + +#: templates/help.php:29 +msgid "Answer" +msgstr "解答" + +#: templates/personal.php:8 +msgid "You use" +msgstr "ã‚ãªãŸãŒä½¿ã£ã¦ã„ã‚‹ã®ã¯" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "ã§ã™ã€‚利用å¯èƒ½å®¹é‡ã¯" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "パスワードã¯å¤‰æ›´ã•ã‚Œã¾ã—ãŸ" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "パスワードを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "ç¾åœ¨ã®ãƒ‘スワード" + +#: templates/personal.php:16 +msgid "New password" +msgstr "æ–°ã—ã„パスワード" + +#: templates/personal.php:17 +msgid "show" +msgstr "表示" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "パスワードを変更ã™ã‚‹" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "言語" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§ã‚ãªãŸã®ownCloudã«æŽ¥ç¶šã™ã‚‹ã¨ãã¯ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’使用ã—ã¦ãã ã•ã„" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "åå‰" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "パスワード" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "グループ" + +#: templates/users.php:23 +msgid "Create" +msgstr "作æˆ" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "削除" + + diff --git a/l10n/lb/contacts.po b/l10n/lb/contacts.po index 63d22e6f7c8..f0dae69e7d1 100644 --- a/l10n/lb/contacts.po +++ b/l10n/lb/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/team/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Dat do ass net däin Adressbuch." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Konnt den Kontakt net fannen." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard konnt net gelies ginn." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adress" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon's Nummer" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Firma" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Aarbecht" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Doheem" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "GSM" + +#: lib/app.php:114 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voice" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Dat do ass net däin Kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Déi do Kaart ass net RFC kompatibel." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Déi do Kaart huet keng Foto." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Kontakt bäisetzen" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupp" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Numm" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Postleetzuel" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Erweidert" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Strooss" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Staat" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regioun" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Postleetzuel" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Land" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Kontakt erstellen" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editéieren" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Läschen" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Gebuertsdag" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/lb/core.po b/l10n/lb/core.po index 9e0db1c821d..325db00a595 100644 --- a/l10n/lb/core.po +++ b/l10n/lb/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-17 14:32+0000\n" -"Last-Translator: sim0n \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/team/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,52 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Du kriss en Link fir däin Passwuert nei ze setzen via Email geschéckt." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Gefrot" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Falschen Login!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Benotzernumm" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Reset ufroen" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Dän Passwuert ass zeréck gesat gin" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Neit Passwuert" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Passwuert zeréck setzen" + #: strings.php:5 msgid "Personal" msgstr "Perséinlech" @@ -46,54 +92,50 @@ msgstr "Cloud net fonnt" msgid "Create an admin account" msgstr "En Admin Account uleeën" -#: templates/installation.php:21 -msgid "Username" -msgstr "Benotzernumm" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Passwuert" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Erweidert" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Daten Dossier" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Datebank konfiguréieren" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "wärt benotzt ginn" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Datebank Benotzer" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Datebank Passwuert" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Datebank Numm" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Erweidert" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Datebank Server" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Daten Dossier" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Installatioun ofschléissen" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "gëtt dir Fräiheet an Kontroll iwwert deng eegen Daten" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,39 +145,22 @@ msgstr "Ausloggen" msgid "Settings" msgstr "Astellungen" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Passwuert vergiess?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "verhalen" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Du bass ausgeloggt." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Du kriss per E-mail en Link geschéckt fir däin Passwuert nei ze setzen." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Verlaangt" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Aloggen feelgeschloen!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Benotzernumm oder E-Mail" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Reset ufroen" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "zeréck" @@ -144,16 +169,4 @@ msgstr "zeréck" msgid "next" msgstr "weider" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Dän Passwuert ass nei gesat ginn" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Neit Passwuert" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Passwuert nei setzen" - diff --git a/l10n/lb/files.po b/l10n/lb/files.po index 795847eb7ab..2580734d259 100644 --- a/l10n/lb/files.po +++ b/l10n/lb/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/team/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Keen Feeler, Datei ass komplett ropgelueden ginn" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Déi ropgelueden Datei ass méi grouss wei d'upload_max_filesize Eegenschaft " +"an der php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an " +"der HTML form uginn ass" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Et ass keng Datei ropgelueden ginn" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Et feelt en temporären Dossier" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Dateien" @@ -52,43 +56,55 @@ msgstr "Dateien" msgid "Maximum upload size" msgstr "Maximum Upload Gréisst " +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Eroplueden" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Neien Dossier" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Hei ass näischt. Lued eppes rop!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Numm" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Eroflueden" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Gréisst" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Geännert" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Läschen" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Upload ze grouss" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/lb/media.po b/l10n/lb/media.po index a6123404729..57de6b20880 100644 --- a/l10n/lb/media.po +++ b/l10n/lb/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-08-25 14:24+0000\n" -"Last-Translator: sim0n \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/team/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musek" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Ofspillen" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Paus" @@ -33,7 +34,7 @@ msgstr "Paus" msgid "Previous" msgstr "Zeréck" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Weider" @@ -45,11 +46,7 @@ msgstr "Toun ausmaachen" msgid "Unmute" msgstr "Toun umaachen" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Lidder gescannt" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Kollektioun nei scannen" diff --git a/l10n/lb/settings.po b/l10n/lb/settings.po index 3f8ef7ff305..ae3884d073b 100644 --- a/l10n/lb/settings.po +++ b/l10n/lb/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-17 14:28+0000\n" -"Last-Translator: sim0n \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/team/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +18,26 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Authentifikatioun's Feeler" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID huet geännert" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ongülteg Requête" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID huet geännert" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Sprooch huet geännert" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Sätz deng Applikatioun bäi" @@ -54,17 +58,17 @@ msgstr "vun" msgid "Ask a question" msgstr "Stell eng Fro" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "" "Problemer sinn opgetrueden beim Versuch sech un d'Hëllef Datebank ze " "verbannen." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Gei manuell dohinner." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Äntwert" @@ -100,37 +104,53 @@ msgstr "weisen" msgid "Change password" msgstr "Passwuert änneren" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Sprooch" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Hëllef ze Iwwersetzen" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "benotz dës Adress fir dech un deng ownCloud iwwert däin Datei Manager ze " "verbannen" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Numm" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Passwuert" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Gruppen" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Erstellen" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Läschen" diff --git a/l10n/lt_LT/calendar.po b/l10n/lt_LT/calendar.po new file mode 100644 index 00000000000..0a1fbf9cd30 --- /dev/null +++ b/l10n/lt_LT/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "Laiko zona pakeista" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Klaidinga užklausa" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kalendorius" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Ne tas kalendorius" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Gimtadienis" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Verslas" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "SkambuÄiai" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Klientai" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "IÅ¡eiginÄ—s" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "IdÄ—jos" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "KelionÄ—" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Jubiliejus" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Susitikimas" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Nekartoti" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Kasdien" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "KiekvienÄ… savaitÄ™" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "KiekvienÄ… savaitÄ—s dienÄ…" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Kas dvi savaites" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "KiekvienÄ… mÄ—nesį" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Kiekvienais metais" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Ne masyvas" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Visa diena" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "TrÅ«kstami laukai" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Pavadinimas" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Iki datos" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Iki laiko" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "Ä®vykis baigiasi anksÄiau nei jis prasideda" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Ä®vyko duomenų bazÄ—s klaida" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "SavaitÄ—" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "MÄ—nuo" + +#: templates/calendar.php:40 +msgid "List" +msgstr "SÄ…raÅ¡as" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Å iandien" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kalendoriai" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Apdorojant failÄ… įvyko klaida." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Pasirinkite naudojamus kalendorius" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Naujas kalendorius" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav adresas" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Atsisiųsti" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Keisti" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Trinti" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Naujas kalendorius" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Taisyti kalendorių" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Pavadinimas" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Naudojamas" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "IÅ¡saugoti" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "IÅ¡saugoti" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "AtÅ¡aukti" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Taisyti įvykį" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Eksportuoti" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Ä®vykio pavadinimas" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategorija" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Pasirinkite kategorijÄ…" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Visos dienos įvykis" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Nuo" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Iki" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Papildomi nustatymai" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Kartoti" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Vieta" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Ä®vykio vieta" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "ApraÅ¡ymas" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Ä®vykio apraÅ¡ymas" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Importuoti Ical failÄ…" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Kaip importuoti naujÄ… kalendorių?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "Importuoti į esantį katalogÄ…" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Importuoti į naujÄ… kalendorių" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Pasirinkite kalendorių" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Importuoti" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Atgal" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Užpildykite formÄ…" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Sukurti naujÄ… įvykį" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Laiko juosta" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Laiko formatas" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24val" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12val" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "CalDAV kalendoriaus synchronizavimo adresas:" + + diff --git a/l10n/lt_LT/contacts.po b/l10n/lt_LT/contacts.po new file mode 100644 index 00000000000..4e57c2a6575 --- /dev/null +++ b/l10n/lt_LT/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Tai ne jÅ«sų adresų knygelÄ—." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Kontaktas nerastas" + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "Nenuskaitoma vCard." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "Informacija apie vCard yra neteisinga. " + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresas" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefonas" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "El. paÅ¡tas" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizacija" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Darbo" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Namų" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobilusis" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekstas" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Balso" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faksas" + +#: lib/app.php:117 +msgid "Video" +msgstr "Vaizdo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "PraneÅ¡imų gaviklis" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Tai ne jÅ«sų kontaktas" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "PridÄ—ti kontaktÄ…" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "GrupÄ—" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Vardas" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PaÅ¡to dėžutÄ—" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "GatvÄ—" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Miestas" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regionas" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PaÅ¡to indeksas" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Å alis" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Sukurti kontaktÄ…" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Keisti" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Trinti" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Gimtadienis" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefonas" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/lt_LT/core.po b/l10n/lt_LT/core.po new file mode 100644 index 00000000000..0f9ca6992ca --- /dev/null +++ b/l10n/lt_LT/core.po @@ -0,0 +1,173 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Elektroniniu paÅ¡tu gausite nuorodÄ…, su kuria galÄ—site iÅ¡ naujo nustatyti " +"slaptažodį." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Užklausta" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Prisijungti nepavyko!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Prisijungimo vardas" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "PraÅ¡yti nustatymo iÅ¡ najo" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "JÅ«sų slaptažodis buvo nustatytas iÅ¡ naujo" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Naujas slaptažodis" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Atkurti slaptažodį" + +#: strings.php:5 +msgid "Personal" +msgstr "Asmeniniai" + +#: strings.php:6 +msgid "Users" +msgstr "Vartotojai" + +#: strings.php:7 +msgid "Apps" +msgstr "Programos" + +#: strings.php:8 +msgid "Admin" +msgstr "Administravimas" + +#: strings.php:9 +msgid "Help" +msgstr "Pagalba" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Negalima rasti" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Sukurti administratoriaus paskyrÄ…" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Slaptažodis" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Duomenų katalogas" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Nustatyti duomenų bazÄ™" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "bus naudojama" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Duomenų bazÄ—s vartotojas" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Duomenų bazÄ—s slaptažodis" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Duomenų bazÄ—s pavadinimas" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Duomenų bazÄ—s serveris" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Baigti diegimÄ…" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Atsijungti" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Nustatymai" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "PamirÅ¡ote slaptažodį?" + +#: templates/login.php:15 +msgid "remember" +msgstr "prisiminti" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "JÅ«s atsijungÄ—te." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "atgal" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "kitas" + + diff --git a/l10n/lt_LT/files.po b/l10n/lt_LT/files.po new file mode 100644 index 00000000000..6ad89a67524 --- /dev/null +++ b/l10n/lt_LT/files.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Klaidų nÄ—ra, failas įkeltas sÄ—kmingai" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "Ä®keliamo failo dydis virÅ¡ija upload_max_filesize parametrÄ… php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Ä®keliamo failo dydis virÅ¡ija MAX_FILE_SIZE parametrÄ…, kuris yra nustatytas " +"HTML formoje" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Failas buvo įkeltas tik dalinai" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Nebuvo įkeltas nÄ— vienas failas" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "NÄ—ra laikinojo katalogo" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Failai" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimalus failo dydis" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Ä®kelti" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "ÄŒia tuÅ¡Äia. Ä®kelkite kÄ… nors!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Pavadinimas" + +#: templates/index.php:45 +msgid "Download" +msgstr "Atsisiųsti" + +#: templates/index.php:49 +msgid "Size" +msgstr "Dydis" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Pakeista" + +#: templates/index.php:50 +msgid "Delete" +msgstr "IÅ¡trinti" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Ä®kÄ—limui failas per didelis" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Bandomų įkelti failų dydis virÅ¡ija maksimalų leidžiamÄ… Å¡iame serveryje" + + diff --git a/l10n/lt_LT/media.po b/l10n/lt_LT/media.po new file mode 100644 index 00000000000..3cf68998f16 --- /dev/null +++ b/l10n/lt_LT/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Muzika" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Groti" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pristabdyti" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Atgal" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Kitas" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Nutildyti" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Ä®jungti garsÄ…" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Atnaujinti kolekcijÄ…" + +#: templates/music.php:37 +msgid "Artist" +msgstr "AtlikÄ—jas" + +#: templates/music.php:38 +msgid "Album" +msgstr "Albumas" + +#: templates/music.php:39 +msgid "Title" +msgstr "Pavadinimas" + + diff --git a/l10n/lt_LT/settings.po b/l10n/lt_LT/settings.po new file mode 100644 index 00000000000..ec0f1bd45cb --- /dev/null +++ b/l10n/lt_LT/settings.po @@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Dr. ROX , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/team/lt_LT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt_LT\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Klaidinga užklausa" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID pakeistas" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Kalba pakeista" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "PridÄ—ti jÅ«sų programÄ…" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Pasirinkite programÄ…" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-licencijuota" + +#: templates/apps.php:23 +msgid "by" +msgstr "" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Užduoti klausimÄ…" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Problemos jungiantis prie duomenų bazÄ—s" + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "" + +#: templates/help.php:29 +msgid "Answer" +msgstr "Atsakyti" + +#: templates/personal.php:8 +msgid "You use" +msgstr "JÅ«s naudojate" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "iÅ¡ galimų" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "JÅ«sų slaptažodis buvo pakeistas" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Neįmanoma pakeisti slaptažodžio" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Dabartinis slaptažodis" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Naujas slaptažodis" + +#: templates/personal.php:17 +msgid "show" +msgstr "rodyti" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Pakeisti slaptažodį" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Kalba" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "" +"naudokite šį adresÄ…, jei norite pasiekti savo ownCloud per failų tvarkyklÄ™" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Vardas" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Slaptažodis" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "GrupÄ—s" + +#: templates/users.php:23 +msgid "Create" +msgstr "Sukurti" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "IÅ¡trinti" + + diff --git a/l10n/ms_MY/contacts.po b/l10n/ms_MY/contacts.po index 59b737d3660..bf358898d49 100644 --- a/l10n/ms_MY/contacts.po +++ b/l10n/ms_MY/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/team/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +17,222 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: photo.php:53 -msgid "This card is not RFC compatible." +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" msgstr "" -#: photo.php:90 -msgid "This card does not contain a photo." +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" msgstr "" -#: templates/index.php:8 -msgid "Add Contact" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" msgstr "" -#: templates/part.addcardform.php:5 -msgid "Group" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" msgstr "" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" msgstr "" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: lib/app.php:112 +msgid "Mobile" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" +#: lib/app.php:114 +msgid "Text" msgstr "" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" +#: lib/app.php:115 +msgid "Voice" msgstr "" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: lib/app.php:117 +msgid "Video" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.addcardform.php:97 +msgid "Create Contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" msgstr "" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/ms_MY/core.po b/l10n/ms_MY/core.po index fdd7e66e3ae..7425a4e2781 100644 --- a/l10n/ms_MY/core.po +++ b/l10n/ms_MY/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-15 13:57+0000\n" -"Last-Translator: hadrihilmi \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/team/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nama pengguna" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + #: strings.php:5 msgid "Personal" msgstr "Peribadi" @@ -46,54 +91,50 @@ msgstr "Awan tidak dijumpai" msgid "Create an admin account" msgstr "buat akaun admin" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nama pengguna" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Kata laluan" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Maju" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Fail data" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurasi pangkalan data" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "akan digunakan" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Nama pengguna pangkalan data" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Kata laluan pangkalan data" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nama pangkalan data" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Maju" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Hos pangkalan data" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Fail data" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Setup selesai" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "memberikan anda kebebasan dan kendalian keatas data anda" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,40 +144,22 @@ msgstr "Log keluar" msgid "Settings" msgstr "Tetapan" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Hilang kata laluan?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "ingat" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Anda telah log keluar." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" -"Anda akan menerima link untuk menetapkan semula kata laluan anda melalui " -"emel" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "diminta" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Log in gagal!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nama pengguna atau Emel" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Minta set semula" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "sebelum" @@ -145,16 +168,4 @@ msgstr "sebelum" msgid "next" msgstr "seterus" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Kata laluan anda diset semula" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Kata laluan baru" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Set semula kata laluan" - diff --git a/l10n/ms_MY/files.po b/l10n/ms_MY/files.po index 2e340c01696..1d35a713693 100644 --- a/l10n/ms_MY/files.po +++ b/l10n/ms_MY/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/team/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,33 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" msgstr "" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "fail" @@ -52,43 +52,55 @@ msgstr "fail" msgid "Maximum upload size" msgstr "Saiz maksimum muat naik" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Muat naik" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Folder baru" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Tiada apa-apa di sini. Muat naik sesuatu!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nama " -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Muat turun" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Saiz" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Dimodifikasi" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Padam" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Muat naik terlalu besar" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/ms_MY/media.po b/l10n/ms_MY/media.po index f6c41264bc1..b0ee4ec4540 100644 --- a/l10n/ms_MY/media.po +++ b/l10n/ms_MY/media.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-09 00:01+0000\n" -"Last-Translator: hadrihilmi \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/team/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +18,15 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muzik" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Main" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Jeda" @@ -34,7 +34,7 @@ msgstr "Jeda" msgid "Previous" msgstr "Sebelum" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Seterus" @@ -46,11 +46,7 @@ msgstr "Bisu" msgid "Unmute" msgstr "Nyahbisu" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Lagu telah diimbas" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Imbas semula koleksi" diff --git a/l10n/ms_MY/settings.po b/l10n/ms_MY/settings.po index dda63fafd8d..d8166d0823a 100644 --- a/l10n/ms_MY/settings.po +++ b/l10n/ms_MY/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-15 14:00+0000\n" -"Last-Translator: hadrihilmi \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/team/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +18,26 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Ralat pengesahan" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID ditukar" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Permintaan tidak sah" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID ditukar" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Bahasa ditukar" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Tambah aplikasi anda" @@ -54,15 +58,15 @@ msgstr "oleh" msgid "Ask a question" msgstr "Tanya soalan" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Masalah menghubung untuk membantu pengkalan data" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Pergi ke sana secara manual" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Jawapan" @@ -98,36 +102,52 @@ msgstr "Papar" msgid "Change password" msgstr "Tukar kata laluan" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Bahasa" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Bantu perterjemahan" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "guna alamat ini untuk menyambung owncloud anda dalam pengurus fail anda" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nama" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Kata laluan " -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Kumpulan" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Buat" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Padam" diff --git a/l10n/nb_NO/contacts.po b/l10n/nb_NO/contacts.po index 430819ce1c9..4107b2438ac 100644 --- a/l10n/nb_NO/contacts.po +++ b/l10n/nb_NO/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Norwegian BokmÃ¥l (Norway) (http://www.transifex.net/projects/p/owncloud/team/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +17,222 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: photo.php:53 -msgid "This card is not RFC compatible." +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" msgstr "" -#: photo.php:90 -msgid "This card does not contain a photo." +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" msgstr "" -#: templates/index.php:8 -msgid "Add Contact" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" msgstr "" -#: templates/part.addcardform.php:5 -msgid "Group" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" msgstr "" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" msgstr "" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: lib/app.php:112 +msgid "Mobile" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" +#: lib/app.php:114 +msgid "Text" msgstr "" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" +#: lib/app.php:115 +msgid "Voice" msgstr "" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: lib/app.php:117 +msgid "Video" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.addcardform.php:97 +msgid "Create Contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" msgstr "" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/nb_NO/core.po b/l10n/nb_NO/core.po index 018c1d81e7a..f29376cf89e 100644 --- a/l10n/nb_NO/core.po +++ b/l10n/nb_NO/core.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-04 18:14+0200\n" -"PO-Revision-Date: 2011-09-04 16:14+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Norwegian BokmÃ¥l (Norway) (http://www.transifex.net/projects/p/owncloud/team/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +18,51 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Brukernavn" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + #: strings.php:5 msgid "Personal" msgstr "Personlig" @@ -45,53 +91,49 @@ msgstr "Sky ikke funnet" msgid "Create an admin account" msgstr "opprett en administrator-konto" -#: templates/installation.php:21 -msgid "Username" -msgstr "Brukernavn" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Passord" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avansert" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datamappe" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurer databasen" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "vil bli brukt" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Databasebruker" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Databasepassord" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Databasenavn" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avansert" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Datamappe" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Fullfør oppsetting" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" +msgid "web services under your control" msgstr "" #: templates/layout.user.php:34 @@ -102,38 +144,22 @@ msgstr "Logg ut" msgid "Settings" msgstr "Innstillinger" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "husk" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Du er logget ut" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Klarte ikke Ã¥ logge inn!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "forrige" @@ -142,16 +168,4 @@ msgstr "forrige" msgid "next" msgstr "neste" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "" - diff --git a/l10n/nb_NO/files.po b/l10n/nb_NO/files.po index c3bfd2ffbfc..67190d755f6 100644 --- a/l10n/nb_NO/files.po +++ b/l10n/nb_NO/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Norwegian BokmÃ¥l (Norway) (http://www.transifex.net/projects/p/owncloud/team/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,33 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" msgstr "" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Filer" @@ -52,43 +52,55 @@ msgstr "Filer" msgid "Maximum upload size" msgstr "Maksimum opplastingsstørrelse" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Last opp" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Ny mappe" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Ingenting her. Last opp noe!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Navn" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Last ned" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Størrelse" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Endret" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Slett" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Opplasting for stor" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/nb_NO/media.po b/l10n/nb_NO/media.po index 490bdb6f40f..7d52e2bc2b8 100644 --- a/l10n/nb_NO/media.po +++ b/l10n/nb_NO/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-08-28 19:34+0000\n" -"Last-Translator: anjar \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Norwegian BokmÃ¥l (Norway) (http://www.transifex.net/projects/p/owncloud/team/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musikk" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Spill" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pause" @@ -33,7 +34,7 @@ msgstr "Pause" msgid "Previous" msgstr "Forrige" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Neste" @@ -45,11 +46,7 @@ msgstr "Demp" msgid "Unmute" msgstr "Skru pÃ¥ lyd" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Sanger skannet" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Skan samling pÃ¥ nytt" diff --git a/l10n/nb_NO/settings.po b/l10n/nb_NO/settings.po index 46743d594a2..70ffa14920e 100644 --- a/l10n/nb_NO/settings.po +++ b/l10n/nb_NO/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-08-28 19:31+0000\n" -"Last-Translator: anjar \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Norwegian BokmÃ¥l (Norway) (http://www.transifex.net/projects/p/owncloud/team/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +18,26 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Autentifikasjonsfeil" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID endret" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ugyldig forespørsel" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID endret" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "SprÃ¥k endret" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Legg til din applikasjon" @@ -53,15 +58,15 @@ msgstr "av" msgid "Ask a question" msgstr "Still et spørsmÃ¥l" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problemer med Ã¥ koble til hjelp-databasen" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "GÃ¥ dit manuelt" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Svar" @@ -97,36 +102,52 @@ msgstr "vis" msgid "Change password" msgstr "Endre passord" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "SprÃ¥k" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Hjelp oss Ã¥ oversett" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "bruk denne adressen for Ã¥ koble til din ownCloud gjennom filhÃ¥ndtereren" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Navn" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Passord" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupper" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Opprett" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Slett" diff --git a/l10n/nl/contacts.po b/l10n/nl/contacts.po index 48de047d7a4..fcdf92add2b 100644 --- a/l10n/nl/contacts.po +++ b/l10n/nl/contacts.po @@ -3,13 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# , 2011. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:53+0000\n" +"Last-Translator: icewind \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +20,222 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Dit is niet uw adresboek." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" - -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" +msgstr "Contact kon niet worden gevonden." -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard kon niet worden gelezen." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" - -#: photo.php:53 -msgid "This card is not RFC compatible." -msgstr "" +msgstr "Informatie over de vCard is onjuist. Herlaad de pagina." -#: photo.php:90 -msgid "This card does not contain a photo." -msgstr "" - -#: templates/index.php:8 -msgid "Add Contact" -msgstr "" - -#: templates/part.addcardform.php:5 -msgid "Group" -msgstr "" - -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" -msgstr "" - -#: templates/part.addcardform.php:14 -msgid "Create Contact" -msgstr "" - -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 msgid "Address" -msgstr "" +msgstr "Adres" -#: templates/part.addpropertyform.php:5 +#: lib/app.php:92 templates/part.addcardform.php:37 msgid "Telephone" -msgstr "" +msgstr "Telefoon" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 msgid "Email" -msgstr "" +msgstr "E-mail" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 msgid "Organization" -msgstr "" +msgstr "Organisatie" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 +#: lib/app.php:106 lib/app.php:113 msgid "Work" -msgstr "" +msgstr "Werk" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 +#: lib/app.php:107 lib/app.php:111 msgid "Home" -msgstr "" +msgstr "Thuis" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobiel" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Stem" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pieper" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Dit is niet uw contactpersoon." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Deze kaart is niet RFC compatibel." -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Deze contact bevat geen foto." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Contact toevoegen" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "Adresboeken" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Groep" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Naam" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "Nummer" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "Type" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" -msgstr "" +msgstr "Postbus" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" -msgstr "" +msgstr "Uitgebreide" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" -msgstr "" +msgstr "Straat" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" -msgstr "" +msgstr "Stad" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" -msgstr "" +msgstr "Regio" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" -msgstr "" +msgstr "Postcode" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" -msgstr "" +msgstr "Land" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Contact aanmaken" -#: templates/part.addpropertyform.php:33 -msgid "Text" -msgstr "" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "Kies actief Adresboek" -#: templates/part.addpropertyform.php:34 -msgid "Voice" -msgstr "" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "Nieuw Adresboek" -#: templates/part.addpropertyform.php:35 -msgid "Fax" -msgstr "" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "CardDav Link" -#: templates/part.addpropertyform.php:36 -msgid "Video" -msgstr "" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "Download" -#: templates/part.addpropertyform.php:37 -msgid "Pager" -msgstr "" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Bewerken" -#: templates/part.details.php:33 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" -msgstr "" +msgstr "Verwijderen" -#: templates/part.details.php:34 -msgid "Add Property" -msgstr "" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "Verwijder contact" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "Voeg toe" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "Bewerk Adresboek" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "Weergavenaam" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "Actief" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "Opslaan" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "Opslaan" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "Anuleren" + +#: templates/part.property.php:3 msgid "Birthday" -msgstr "" +msgstr "Verjaardag" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "Voorkeur" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefoon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" -msgstr "" +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "Vernieuwe" diff --git a/l10n/nl/core.po b/l10n/nl/core.po index 0a296a3685d..82059730f37 100644 --- a/l10n/nl/core.po +++ b/l10n/nl/core.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-15 09:12+0000\n" -"Last-Translator: isama \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,6 +20,52 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"U ontvangt een link om je wachtwoord opnieuw in te stellen via e-mail." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Gevraagd" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Login mislukt!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Gebruikersnaam" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Resetaanvraag" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Je wachtwoord is geweizigd" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nieuw wachtwoord" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Reset wachtwoord" + #: strings.php:5 msgid "Personal" msgstr "Persoonlijk" @@ -48,54 +94,50 @@ msgstr "Cloud niet gevonden" msgid "Create an admin account" msgstr "Maak een beheerdersaccount aan" -#: templates/installation.php:21 -msgid "Username" -msgstr "Gebruikersnaam" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Wachtwoord" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Geavanceerd" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Gegevensmap" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configureer de databank" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "zal gebruikt worden" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Gebruiker databank" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Wachtwoord databank" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Naam databank" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Geavanceerd" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Database server" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Gegevensmap" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Installatie afronden" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "geeft u vrijheid en controle over uw eigen data" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -105,38 +147,22 @@ msgstr "Afmelden" msgid "Settings" msgstr "Instellingen" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Uw wachtwoord vergeten?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "onthoud gegevens" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "U bent afgemeld." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "U ontvangt een link om uw wachtwoord te wijzigen via Email" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Aangevraagd" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Aanmelden mislukt!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Gebruikersnaam of Email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Wachtwoordreset aanvragen" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "vorige" @@ -145,16 +171,4 @@ msgstr "vorige" msgid "next" msgstr "volgende" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Uw wachtwoord is opnieuw ingesteld" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nieuw wachtwoord" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Reset wachtwoord" - diff --git a/l10n/nl/files.po b/l10n/nl/files.po index 67178beb961..b3133780235 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -3,15 +3,17 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. +# , 2011. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +21,37 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Geen fout opgetreden, bestand successvol geupload." -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Het geüploade bestand is groter dan de upload_max_filesize instelling in " +"php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Het geüploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is " +"opgegeven in de HTML-formulier" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Het bestand is slechts gedeeltelijk geupload" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Geen bestand geüpload" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Een tijdelijke map mist" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Bestanden" @@ -53,43 +59,55 @@ msgstr "Bestanden" msgid "Maximum upload size" msgstr "Maximale bestandsgrootte voor uploads" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Upload" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nieuwe map" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Er bevindt zich hier niets. Upload een bestand!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Naam" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Download" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Bestandsgrootte" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Laatst aangepast" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Verwijder" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Bestanden te groot" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/nl/media.po b/l10n/nl/media.po index 21a797fe700..2a84b3f1689 100644 --- a/l10n/nl/media.po +++ b/l10n/nl/media.po @@ -2,14 +2,17 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# , 2011. # , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,39 +20,35 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muziek" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Afspelen" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" -msgstr "Pauze" +msgstr "Pauzeer" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Vorige" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "Volgende" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Dempen" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "nummers gescanned" +msgstr "Dempen uit" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Collectie opnieuw scannen" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index 174daa75507..4502ab58169 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -2,14 +2,17 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# , 2011. # , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:13+0200\n" -"PO-Revision-Date: 2011-08-27 23:13+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,33 +20,37 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Authenticatiefout." - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID is aangepast" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ongeldig verzoek" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID is aangepast" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Taal aangepast" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" -msgstr "" +msgstr "Voeg uw applicatie toe" #: templates/apps.php:21 msgid "Select an App" -msgstr "Selecteer een App" +msgstr "Selecteer een app" #: templates/apps.php:23 msgid "-licensed" -msgstr "-gelicenseerd" +msgstr "-gelicentieerd" #: templates/apps.php:23 msgid "by" @@ -53,15 +60,15 @@ msgstr "door" msgid "Ask a question" msgstr "Stel een vraag" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." -msgstr "" +msgstr "Problemen bij het verbinden met de helpdatabank." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." -msgstr "" +msgstr "Ga er zelf heen." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Beantwoord" @@ -79,7 +86,7 @@ msgstr "Uw wachtwoord is aangepast" #: templates/personal.php:14 msgid "Unable to change your password" -msgstr "" +msgstr "Niet in staat om uw wachtwoord te wijzigen" #: templates/personal.php:15 msgid "Current password" @@ -95,39 +102,55 @@ msgstr "weergeven" #: templates/personal.php:18 msgid "Change password" -msgstr "Verander wachtwoord" +msgstr "Wijzig wachtwoord" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Taal" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Help met vertalen" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" -"gebruik dit adres om verbinding te maken met ownCloud in uw bestandsbeheer " -"programa" +"gebruik dit adres om verbinding te maken met ownCloud in uw " +"bestandsbeheerprogramma" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Naam" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Wachtwoord" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Groepen" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Creëer" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "verwijderen" diff --git a/l10n/nn_NO/calendar.po b/l10n/nn_NO/calendar.po new file mode 100644 index 00000000000..faff7c6243c --- /dev/null +++ b/l10n/nn_NO/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "Endra tidssone" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Ugyldig førespurnad" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kalender" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Feil kalender" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Bursdag" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Forretning" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Telefonsamtale" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Klientar" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Forsending" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Høgtid" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Idear" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Reise" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Jubileum" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Møte" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Anna" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Personleg" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Prosjekt" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "SpørsmÃ¥l" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Arbeid" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Ikkje gjenta" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Kvar dag" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Kvar veke" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Kvar vekedag" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Annakvar veke" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "Kvar mÃ¥nad" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Kvart Ã¥r" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Ikkje ein matrise" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Heile dagen" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Tittel" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Veke" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "MÃ¥nad" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Liste" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "I dag" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kalendarar" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Feil ved tolking av fila." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Vel aktive kalendarar" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Ny kalender" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav-lenkje" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Last ned" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Endra" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Slett" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Ny kalender" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Endra kalendarar" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Visingsnamn" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktiv" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Kalenderfarge" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Lagra" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Lagra" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Avbryt" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Endra ein hending" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Tittel pÃ¥ hendinga" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategori" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Vel kategori" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Heildagshending" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "FrÃ¥" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Til" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Gjenta" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Stad" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Stad for hendinga" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Skildring" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Skildring av hendinga" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Opprett ei ny hending" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Tidssone" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "" + +#: templates/settings.php:34 +msgid "24h" +msgstr "" + +#: templates/settings.php:35 +msgid "12h" +msgstr "" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "" + + diff --git a/l10n/nn_NO/contacts.po b/l10n/nn_NO/contacts.po new file mode 100644 index 00000000000..fdf1c5d4c38 --- /dev/null +++ b/l10n/nn_NO/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Dette er ikkje di adressebok." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Fann ikkje kontakten." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "Klarte ikkje Ã¥ lesa vCard-et." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "Informasjonen om vCard-et er feil, ver venleg og last sida pÃ¥ nytt." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresse" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefonnummer" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Epost" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organisasjon" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Arbeid" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Heime" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Tale" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Personsøkjar" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Dette er ikkje din kontakt." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Dette kortet er ikkje RFC-kompatibelt" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Dette kortet har ingen bilete." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Legg til kontakt" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Gruppe" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Namn" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Postboks" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Utvida" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Gate" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Stad" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Region/fylke" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Postnummer" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Land" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Opprett kontakt" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Endra" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Slett" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Bursdag" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefonnummer" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/nn_NO/core.po b/l10n/nn_NO/core.po new file mode 100644 index 00000000000..fe829fc91d3 --- /dev/null +++ b/l10n/nn_NO/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Du vil fÃ¥ ei lenkje for Ã¥ nullstilla passordet via epost." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Førespurt" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Feil ved innlogging!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Brukarnamn" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Be om nullstilling" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Passordet ditt er nullstilt" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nytt passord" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Nullstill passord" + +#: strings.php:5 +msgid "Personal" +msgstr "Personleg" + +#: strings.php:6 +msgid "Users" +msgstr "Brukarar" + +#: strings.php:7 +msgid "Apps" +msgstr "Applikasjonar" + +#: strings.php:8 +msgid "Admin" +msgstr "Administrer" + +#: strings.php:9 +msgid "Help" +msgstr "Hjelp" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Fann ikkje skyen" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Lag ein admin-konto" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Passord" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avansert" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datamappe" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Konfigurer databasen" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "vil bli nytta" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Databasebrukar" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Databasepassord" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Databasenamn" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Databasetenar" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Fullfør oppsettet" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Logg ut" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Innstillingar" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Gløymt passordet?" + +#: templates/login.php:15 +msgid "remember" +msgstr "hugs" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Du er logga ut." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "førre" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "neste" + + diff --git a/l10n/nn_NO/files.po b/l10n/nn_NO/files.po new file mode 100644 index 00000000000..eb6d21f3b66 --- /dev/null +++ b/l10n/nn_NO/files.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Ingen feil, fila vart lasta opp" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"Den opplasta fila er større enn variabelen upload_max_filesize i php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Fila vart berre delvis lasta opp" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Ingen filer vart lasta opp" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Manglar ei mellombels mappe" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Filer" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimal opplastingsstorleik" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Last opp" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Ingenting her. Last noko opp!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Namn" + +#: templates/index.php:45 +msgid "Download" +msgstr "Last ned" + +#: templates/index.php:49 +msgid "Size" +msgstr "Storleik" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Endra" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Slett" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "For stor opplasting" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Filene du prøver Ã¥ laste opp er større enn maksgrensa til denne tenaren." + + diff --git a/l10n/nn_NO/media.po b/l10n/nn_NO/media.po new file mode 100644 index 00000000000..8ea54227031 --- /dev/null +++ b/l10n/nn_NO/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Musikk" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Spel" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pause" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Førre" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Neste" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Demp" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Skru pÃ¥ lyd" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Skann samlinga pÃ¥ nytt" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Artist" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Tittel" + + diff --git a/l10n/nn_NO/settings.po b/l10n/nn_NO/settings.po new file mode 100644 index 00000000000..7e87bd41237 --- /dev/null +++ b/l10n/nn_NO/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/team/nn_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Ugyldig førespurnad" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID endra" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "SprÃ¥k endra" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Legg til applikasjonen din" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Vel ein applikasjon" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-lisensiert" + +#: templates/apps.php:23 +msgid "by" +msgstr "av" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Spør om noko" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Problem ved tilkopling til hjelpedatabasen." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "GÃ¥ der pÃ¥ eigen hand." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Svar" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Du bruker" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "av dei tilgjengelege" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "Passordet ditt er endra" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Klarte ikkje Ã¥ endra passordet" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Passord" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Nytt passord" + +#: templates/personal.php:17 +msgid "show" +msgstr "vis" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Endra passord" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "SprÃ¥k" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "bruk denne adressa for Ã¥ kopla til ownCloud i filhandsamaren din" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Namn" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Passord" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Grupper" + +#: templates/users.php:23 +msgid "Create" +msgstr "Lag" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Slett" + + diff --git a/l10n/pl/contacts.po b/l10n/pl/contacts.po index a8793db4831..c0266c5da55 100644 --- a/l10n/pl/contacts.po +++ b/l10n/pl/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Marcin MaÅ‚ecki , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "To nie jest twoja książka adresowa." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Kontakt nie znaleziony." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "Nie można odczytać vCard." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Informacje o vCard sÄ… nieprawidÅ‚owe. ProszÄ™ odÅ›wieżyć stronÄ™." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adres" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizacja" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Praca" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Dom" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Komórka" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "PoÅ‚Ä…czenie gÅ‚osowe" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "PoÅ‚Ä…czenie wideo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "To nie jest twój kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Ta karta nie jest zgodna ze specyfikacjÄ… RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Ta karta nie zawiera zdjęć." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Dodaj kontakt" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupa" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nazwisko" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PO Box" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Rozszerzony" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulica" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Miasto" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Region" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Kod pocztowy" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Kraj" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Utwórz kontakt" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Edytuj" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "UsuÅ„" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Urodziny" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/pl/core.po b/l10n/pl/core.po index 4883af328b9..e8dd97a81f8 100644 --- a/l10n/pl/core.po +++ b/l10n/pl/core.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 09:18+0000\n" -"Last-Translator: mosslar \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,51 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Otrzymasz link do resetowania hasÅ‚a poprzez e-mail." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Żądane" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Logowanie nie powiodÅ‚o siÄ™!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Użytkownik" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Żądanie resetowania" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Twoje hasÅ‚o zostaÅ‚o zresetowane" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nowe hasÅ‚o" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Zresetuj hasÅ‚o" + #: strings.php:5 msgid "Personal" msgstr "Ustawienia osobiste" @@ -49,54 +94,50 @@ msgstr "Konta nie znaleziono " msgid "Create an admin account" msgstr "Stwórz jako konto administratora" -#: templates/installation.php:21 -msgid "Username" -msgstr "Użytkownik" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "HasÅ‚o" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Zaawansowane" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Katalog danych" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfiguracja bazy danych" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "zostanie użyte" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Użytkownik bazy danych" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "HasÅ‚o do bazy danych" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nazwa bazy danych" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Zaawansowane" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Host bazy danych" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Katalog danych" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "ZakoÅ„cz instalacjÄ™" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "zapewnia Ci wolność i kontrolÄ™ nad wÅ‚asnymi danymi" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -106,38 +147,22 @@ msgstr "Wyloguj siÄ™" msgid "Settings" msgstr "Ustawienia" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Nie pamiÄ™tasz hasÅ‚a?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "zapamiÄ™taj" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "ZostaÅ‚eÅ› wylogowany." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Otrzymasz link do resetowania hasÅ‚a poprzez e-mail." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Żądane" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Nie udaÅ‚o siÄ™ zalogować!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Użytkownik lub email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Zresetuj hasÅ‚o" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "wstecz" @@ -146,16 +171,4 @@ msgstr "wstecz" msgid "next" msgstr "dalej" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Twoje hasÅ‚o zostaÅ‚o zresetowane" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nowe hasÅ‚o" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Zresetuj hasÅ‚o" - diff --git a/l10n/pl/files.po b/l10n/pl/files.po index f7bf94df142..090e8b0a8f4 100644 --- a/l10n/pl/files.po +++ b/l10n/pl/files.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Marcin MaÅ‚ecki , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +19,36 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Brak bÅ‚Ä™du, plik przesÅ‚any z sukcesem" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"PrzesÅ‚any plik przekracza ustawienie upload_max_filesize w pliku php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"PrzesÅ‚any plik przekracza MAX_FILE_SIZE ustawienia, które zostaÅ‚o okreÅ›lono " +"w formularzu HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Plik zostaÅ‚ przesÅ‚any tylko częściowo." -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Å»aden plik nie zostaÅ‚ przesÅ‚any" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Brakuje folderu tymczasowego" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Pliki" @@ -52,43 +56,55 @@ msgstr "Pliki" msgid "Maximum upload size" msgstr "Maksymalna wielkość przesyÅ‚anego pliku" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "PrzeÅ›lij" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nowy katalog" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Nic tu nie ma. PrzeÅ›lij jakieÅ› pliki!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nazwa" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "ÅšciÄ…ganie" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Wielkość" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Zmodyfikowano" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Skasuj" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "PrzesyÅ‚any plik jest za duży" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/pl/media.po b/l10n/pl/media.po index 237da744eec..425dc07722e 100644 --- a/l10n/pl/media.po +++ b/l10n/pl/media.po @@ -2,14 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: +# Marcin MaÅ‚ecki , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-20 05:08+0200\n" -"PO-Revision-Date: 2011-08-20 03:08+0000\n" -"Last-Translator: JanCBorchardt \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,39 +19,35 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muzyka" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" -msgstr "" +msgstr "Odtwarzaj" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Zatrzymaj" #: templates/music.php:5 msgid "Previous" -msgstr "" +msgstr "Poprzedni" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" -msgstr "" +msgstr "NastÄ™pny" #: templates/music.php:7 msgid "Mute" -msgstr "" +msgstr "Wycisz" #: templates/music.php:8 msgid "Unmute" -msgstr "" - -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Przeskanowane utwory" +msgstr "WÅ‚Ä…cz" -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Przeskanuj kolekcjÄ™" diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po index dde3d9a7edf..713839d5ba3 100644 --- a/l10n/pl/settings.po +++ b/l10n/pl/settings.po @@ -2,16 +2,18 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Kamil DomaÅ„ski , 2011. -# , 2011. +# Marcin MaÅ‚ecki , 2011. # Marcin MaÅ‚ecki , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-23 10:15+0000\n" -"Last-Translator: mosslar \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,22 +21,26 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "BÅ‚Ä…d uwierzytelniania" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "Zmieniono OpenID" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "NieprawidÅ‚owe żądanie" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "Zmieniono OpenID" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "JÄ™zyk zmieniony" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Dodaj wÅ‚asnÄ… aplikacje" @@ -55,15 +61,15 @@ msgstr "przez" msgid "Ask a question" msgstr "Zadaj pytanie" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problem z poÅ‚Ä…czeniem z bazÄ… danych." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Przejdź na stronÄ™ rÄ™cznie." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Odpowiedź" @@ -79,6 +85,10 @@ msgstr "z dostÄ™pnych" msgid "Your password got changed" msgstr "Twoje hasÅ‚o zostaÅ‚o zmienione" +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Nie można zmienić hasÅ‚a" + #: templates/personal.php:15 msgid "Current password" msgstr "Bieżące hasÅ‚o" @@ -96,36 +106,52 @@ msgid "Change password" msgstr "ZmieÅ„ hasÅ‚o" #: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "JÄ™zyk" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Pomóż w tÅ‚umaczeniu" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "użyj tego adresu żeby poÅ‚Ä…czyć siÄ™ z twoim kontem ownCloud w menedżerze " "plików." -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nazwa" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "HasÅ‚o" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupy" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Stwórz" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Skasuj" diff --git a/l10n/pt_BR/contacts.po b/l10n/pt_BR/contacts.po index 4b44d17178d..39bf29a3f76 100644 --- a/l10n/pt_BR/contacts.po +++ b/l10n/pt_BR/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Van Der Fran , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/owncloud/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Este não é o seu agenda de endereços." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Contato não pôde ser encontrado." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard não pôde ser lida." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Informações sobre vCard é incorreta. Por favor, recarregue a página." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Endereço" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefone" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organização" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Trabalho" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Home" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Móvel" + +#: lib/app.php:114 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Este não é o seu contato." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Este cartão não é compatível com RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Este cartão não contém uma foto." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Adicionar Contato" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupo" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nome" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Caixa Postal" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Estendido" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Rua" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Cidade" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Região" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "CEP" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "País" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Criar Contato" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editar" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Excluir" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Aniversário" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefone" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po index 4fbf39e1fff..c1bac3b5b54 100644 --- a/l10n/pt_BR/core.po +++ b/l10n/pt_BR/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-06 12:04+0000\n" -"Last-Translator: vanderland \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/owncloud/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,51 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Você receberá um link para redefinir sua senha via e-mail." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Solicitado" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Falha ao fazer o login!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Nome de Usuário" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Pedido de reposição" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Sua senha foi mudada" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nova senha" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Mudar senha" + #: strings.php:5 msgid "Personal" msgstr "Pessoal" @@ -47,54 +92,50 @@ msgstr "Cloud não encontrado" msgid "Create an admin account" msgstr "Criar uma conta de administrador" -#: templates/installation.php:21 -msgid "Username" -msgstr "Nome de Usuário" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Senha" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avançado" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Pasta de dados" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configurar o banco de dados" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "será usado" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Usuário de banco de dados" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Senha do banco de dados" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Nome do banco de dados" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avançado" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Banco de dados do host" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Pasta de dados" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Concluir configuração" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "proporciona liberdade e controle sobre seus próprios dados" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -104,38 +145,22 @@ msgstr "Sair" msgid "Settings" msgstr "Configurações" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Esqueçeu sua senha?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "lembrete" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Você está desconectado." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Você receberá um link para redefinir sua senha via e-mail." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Solicitado" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Login sem sucesso" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Nome de usuário ou e-mail" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Pedido de troca" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "anterior" @@ -144,16 +169,4 @@ msgstr "anterior" msgid "next" msgstr "próximo" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Sua senha foi trocada" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nova senha" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Toca de senha" - diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po index e4fba97298b..2d41a6af2b3 100644 --- a/l10n/pt_BR/files.po +++ b/l10n/pt_BR/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/owncloud/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Não houve nenhum erro, o arquivo foi transferido com sucesso" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"O tamanho do arquivo excede o limed especifiicado em upload_max_filesize no " +"php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"O arquivo carregado excede o MAX_FILE_SIZE que foi especificado no " +"formulário HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "O arquivo foi transferido parcialmente" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Nenhum arquivo foi transferido" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Pasta temporária não encontrada" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Arquivos" @@ -52,43 +56,55 @@ msgstr "Arquivos" msgid "Maximum upload size" msgstr "Tamanho máximo para carregar" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Carregar" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nova Pasta" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Nada aqui.Carregar alguma coisa!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nome" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Baixar" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Tamanho" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modificado" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Excluir" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Arquivo muito grande" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/pt_BR/media.po b/l10n/pt_BR/media.po index 86ebcc103ff..30318ebf843 100644 --- a/l10n/pt_BR/media.po +++ b/l10n/pt_BR/media.po @@ -2,15 +2,16 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # -# Van Der Fran , 2011. +# Translators: # , 2011. +# Van Der Fran , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-08-28 01:11+0200\n" -"PO-Revision-Date: 2011-08-24 12:52+0000\n" -"Last-Translator: dudanogueira \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/owncloud/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +19,15 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Música" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Tocar" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pausa" @@ -34,7 +35,7 @@ msgstr "Pausa" msgid "Previous" msgstr "Anterior" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Próximo" @@ -46,11 +47,7 @@ msgstr "Mudo" msgid "Unmute" msgstr "Não Mudo" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Músicas encontradas" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Atualizar a Coleção" diff --git a/l10n/pt_BR/settings.po b/l10n/pt_BR/settings.po index 987459779e9..ab2a8825dd0 100644 --- a/l10n/pt_BR/settings.po +++ b/l10n/pt_BR/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-06 12:01+0000\n" -"Last-Translator: vanderland \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/owncloud/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,22 +19,26 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Erro de autenticação" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "Mudou OpenID" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Pedido inválido" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "Mudou OpenID" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Mudou Idioma" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Adicionar o seu aplicativo" @@ -55,15 +59,15 @@ msgstr "por" msgid "Ask a question" msgstr "Faça uma pergunta" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problemas ao conectar na base de dados." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Ir manualmente." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Resposta" @@ -99,37 +103,53 @@ msgstr "mostrar" msgid "Change password" msgstr "Alterar senha" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Idioma" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Ajuda na Tradução" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "use este endereço para se conectar ao seu ownCloud no seu gerenciador de " "arquvos" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nome" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Senha" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupos" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Criar" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Apagar" diff --git a/l10n/pt_PT/contacts.po b/l10n/pt_PT/contacts.po index fcc5bb2f7ed..2e93a42246f 100644 --- a/l10n/pt_PT/contacts.po +++ b/l10n/pt_PT/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/team/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,223 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Esta não é a sua lista de contactos" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "O contacto não foi encontrado" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "o vCard não pode ser lido" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" +"A informação sobre o vCard está incorreta. Por favor refresque a página" + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Morada" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefone" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organização" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Trabalho" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Casa" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Telemovel" -#: photo.php:53 +#: lib/app.php:114 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Este não é o seu contacto" + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Este cartão não é compativel com RFC" -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Este cartão não possui foto" -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Adicionar Contacto" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupo" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nome" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Apartado" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Extendido" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Rua" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Cidade" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Região" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Código Postal" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "País" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Criar Contacto" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editar" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Apagar" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Aniversário" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefone" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/pt_PT/core.po b/l10n/pt_PT/core.po index 8c79bfcd9c5..aaab9779385 100644 --- a/l10n/pt_PT/core.po +++ b/l10n/pt_PT/core.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-23 16:41+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/team/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +18,51 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + #: strings.php:5 msgid "Personal" msgstr "" @@ -45,53 +91,49 @@ msgstr "" msgid "Create an admin account" msgstr "" -#: templates/installation.php:21 -msgid "Username" +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" msgstr "" -#: templates/installation.php:22 -msgid "Password" +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avançado" + +#: templates/installation.php:34 +msgid "Data folder" msgstr "" -#: templates/installation.php:27 +#: templates/installation.php:41 msgid "Configure the database" msgstr "" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" +msgid "web services under your control" msgstr "" #: templates/layout.user.php:34 @@ -102,36 +144,20 @@ msgstr "" msgid "Settings" msgstr "" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "" -#: templates/logout.php:1 -msgid "You are logged out." -msgstr "" - -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "" - -#: templates/lostpassword.php:10 -msgid "Username or Email" +#: templates/login.php:16 +msgid "Log in" msgstr "" -#: templates/lostpassword.php:11 -msgid "Request reset" +#: templates/logout.php:1 +msgid "You are logged out." msgstr "" #: templates/part.pagenavi.php:3 @@ -142,16 +168,4 @@ msgstr "" msgid "next" msgstr "" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "" - diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index b41320ef456..7fd44b4f725 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/team/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,33 +17,33 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" msgstr "" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "" @@ -51,43 +51,55 @@ msgstr "" msgid "Maximum upload size" msgstr "" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 -msgid "Upload" +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" msgstr "" -#: templates/index.php:17 -msgid "New Folder" +#: templates/index.php:22 +msgid "Upload" msgstr "" -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/pt_PT/media.po b/l10n/pt_PT/media.po index ae7c1aba234..b248284c3dd 100644 --- a/l10n/pt_PT/media.po +++ b/l10n/pt_PT/media.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-23 16:42+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/team/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +17,15 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "" @@ -33,7 +33,7 @@ msgstr "" msgid "Previous" msgstr "" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "" @@ -45,11 +45,7 @@ msgstr "" msgid "Unmute" msgstr "" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "" diff --git a/l10n/pt_PT/settings.po b/l10n/pt_PT/settings.po index ba8649456a4..5b55ea33a78 100644 --- a/l10n/pt_PT/settings.po +++ b/l10n/pt_PT/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-23 16:42+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/team/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +17,26 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" +#: ajax/lostpassword.php:14 +msgid "email Changed" msgstr "" -#: ajax/openid.php:21 -msgid "OpenID Changed" +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 -msgid "Invalid request" +#: ajax/openid.php:15 +msgid "OpenID Changed" msgstr "" -#: ajax/setlanguage.php:21 +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "" @@ -53,15 +57,15 @@ msgstr "" msgid "Ask a question" msgstr "" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "" @@ -97,35 +101,51 @@ msgstr "" msgid "Change password" msgstr "" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "" -#: templates/personal.php:30 -msgid "Help translating" +#: templates/personal.php:38 +msgid "Help translate" msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "" diff --git a/l10n/ro/contacts.po b/l10n/ro/contacts.po index 95b3d705a3d..9464014f041 100644 --- a/l10n/ro/contacts.po +++ b/l10n/ro/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Claudiu , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:11+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/team/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Nu se găseÈ™te în agendă." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Contactul nu a putut fi găsit." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard nu poate fi citit." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "InformaÈ›iile despre vCard sunt incorecte. ReîncărcaÈ›i pagina." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresă" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "OrganizaÈ›ie" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Servici" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Acasă" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Text" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Nu este contactul tău" + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Nu este compatibil RFC" -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Nu conÈ›ine o fotografie" -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Adaugă contact" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grup" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Nume" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "CP" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Extins" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Stradă" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "OraÈ™" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regiune" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Cod poÈ™tal" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Èšară" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Crează contact" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Editează" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Șterge" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Zi de naÈ™tere" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/ro/core.po b/l10n/ro/core.po index df95994f468..e2733bcd92c 100644 --- a/l10n/ro/core.po +++ b/l10n/ro/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-05 11:11+0000\n" -"Last-Translator: rawbeef64 \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/team/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,52 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"VeÈ›i primi la adresa de email un link prin care veÈ›i putea reseta parola" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Cerută" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Autentificare eÈ™uată" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Utilizator" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Cerere trimisă" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Parola a fost resetată" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Noua parolă" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Resetează parola" + #: strings.php:5 msgid "Personal" msgstr "Personal" @@ -46,54 +92,50 @@ msgstr "Nu s-a găsit" msgid "Create an admin account" msgstr "Crează un cont de administrator" -#: templates/installation.php:21 -msgid "Username" -msgstr "Utilizator" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Parola" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avansat" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Directorul cu date" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Configurează baza de date" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "vor fi folosite" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Utilizatorul bazei de date" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Parola bazei de date" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Numele bazei de date" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avansat" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Baza de date" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Directorul cu date" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Finalizează instalarea" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "îți oferă libertatea de a-È›i controla datele" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +145,22 @@ msgstr "IeÈ™ire" msgid "Settings" msgstr "Setări" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Ai uitat parola?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "È›ine minte" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Ai ieÈ™it" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Vei primi prin email un link pentru resetarea parolei" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Cerută" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Autentificare eÈ™uată!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Utilizator sau email" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Cere schimbarea parolei" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "precedentul" @@ -143,16 +169,4 @@ msgstr "precedentul" msgid "next" msgstr "următorul" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Parola a fost schimbată" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Parola nouă" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Schimbă parola" - diff --git a/l10n/ro/files.po b/l10n/ro/files.po index 00676c5fca6..75238faf59a 100644 --- a/l10n/ro/files.po +++ b/l10n/ro/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/team/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,37 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Nu am întâmpinat nici eroare, fiÈ™ierul a fost încărcat cu success" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"FiÈ™ierul are o dimensiune mai mare decât cea specificată în variabila " +"upload_max_filesize din php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"FiÈ™ierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată" +" în formularul HTML" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "FiÈ™ierul a fost încărcat doar parÈ›ial" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Nu a fost încărcat nici un fiÈ™ier" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Lipsă folder temporar" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "FiÈ™iere" @@ -52,43 +56,55 @@ msgstr "FiÈ™iere" msgid "Maximum upload size" msgstr "Dimensiunea maximă" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "ÃŽncarcă" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Director nou" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Nici un fiÈ™ier, încarcă ceva!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Nume" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Descarcă" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Dimensiune" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Modificat" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Șterge" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "FiÈ™ierul este prea mare" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/ro/media.po b/l10n/ro/media.po index f6c99afa9b2..17f7d45cd18 100644 --- a/l10n/ro/media.po +++ b/l10n/ro/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Claudiu , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-08-31 08:19+0000\n" -"Last-Translator: rawbeef64 \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/team/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muzică" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Play" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pauză" @@ -33,7 +34,7 @@ msgstr "Pauză" msgid "Previous" msgstr "Precedent" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Următor" @@ -45,11 +46,7 @@ msgstr "Fără sonor" msgid "Unmute" msgstr "Cu sonor" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Melodii scanate" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Rescanează colecÈ›ia" diff --git a/l10n/ro/settings.po b/l10n/ro/settings.po index 76980cd737e..1dac0ec035e 100644 --- a/l10n/ro/settings.po +++ b/l10n/ro/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # Claudiu , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-08-31 08:24+0000\n" -"Last-Translator: rawbeef64 \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/team/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +18,26 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Eroare autentificare" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID schimbat" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Cerere eronată" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID schimbat" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Limba a fost schimbată" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Adaugă propria ta aplicaÈ›ie" @@ -53,15 +58,15 @@ msgstr "de" msgid "Ask a question" msgstr "ÃŽntreabă" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Sunt probleme cu conectarea la baza de date" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Manual" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Răspuns" @@ -97,37 +102,53 @@ msgstr "arată" msgid "Change password" msgstr "Schimbă parola" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Limba" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Ajută la traducere" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "foloseÈ™te această adresă pentru a te conecta la managerul tău de fiÈ™iere din" " ownCloud" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Nume" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Parola" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupuri" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Crează" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Șterge" diff --git a/l10n/ru/contacts.po b/l10n/ru/contacts.po index d571caba891..b61240bf43b 100644 --- a/l10n/ru/contacts.po +++ b/l10n/ru/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Это не ваша адреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Контакт не найден." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "Ðе удалоÑÑŒ прочеÑÑ‚ÑŒ vCard." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ vCard некорректна. ПожалуйÑта, обновите Ñтраницу." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "ÐдреÑ" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Телефон" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Ящик Ñл. почты" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "ОрганизациÑ" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Рабочий" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Домашний" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Мобильный" + +#: lib/app.php:114 +msgid "Text" +msgstr "ТекÑÑ‚" + +#: lib/app.php:115 +msgid "Voice" +msgstr "ГолоÑ" + +#: lib/app.php:116 +msgid "Fax" +msgstr "ФакÑ" + +#: lib/app.php:117 +msgid "Video" +msgstr "Видео" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Пейджер" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Это не контакт." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Эта карточка не ÑоответÑтвует RFC." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Эта карточка не Ñодержит фотографии." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Добавить Контакт" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Группа" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "ИмÑ" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "ÐО" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "РаÑширенный" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Улица" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Город" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "ОблаÑÑ‚ÑŒ" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Почтовый индекÑ" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Страна" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Создать Контакт" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Редактировать" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Удалить" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "День рождениÑ" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Телефон" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/ru/core.po b/l10n/ru/core.po index 49a8891db3b..550baa3e729 100644 --- a/l10n/ru/core.po +++ b/l10n/ru/core.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-04 17:42+0000\n" -"Last-Translator: jekader \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,51 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Ðа ваш Ð°Ð´Ñ€ÐµÑ Email выÑлана ÑÑылка Ð´Ð»Ñ ÑброÑа паролÑ." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Запрошено" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Ðе удалоÑÑŒ войти!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "ЗапроÑить ÑброÑ" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Ваш пароль был Ñброшен" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Ðовый пароль" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "СброÑить пароль" + #: strings.php:5 msgid "Personal" msgstr "Личное" @@ -47,54 +92,50 @@ msgstr "Облако не найдено" msgid "Create an admin account" msgstr "Создать учётную запиÑÑŒ админиÑтратора" -#: templates/installation.php:21 -msgid "Username" -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Пароль" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Дополнительно" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "ÐаÑтройка базы данных" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "будет иÑпользовано" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Пароль Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Ðазвание базы данных" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Дополнительно" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "ХоÑÑ‚ базы данных" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Завершить уÑтановку" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "даёт Вам Ñвободу и контроль над Вашими данными" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -104,38 +145,22 @@ msgstr "Выйти" msgid "Settings" msgstr "ÐаÑтройки" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Забыли пароль?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "запомнить" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Ð’Ñ‹ вышли." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Ð’Ñ‹ получите ÑÑылку Ð´Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° Ваш e-mail." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Запрошено" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Войти не удалоÑÑŒ!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ e-mail" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "ЗапроÑить ÑброÑ" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "пред" @@ -144,16 +169,4 @@ msgstr "пред" msgid "next" msgstr "Ñлед" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Пароль был Ñброшен" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Ðовый пароль" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "СброÑить пароль" - diff --git a/l10n/ru/files.po b/l10n/ru/files.po index 2345bd74ead..55cec9ff4f8 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,35 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Файл уÑпешно загружен" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Файл превышает допуÑтимые размеры (опиÑаны как upload_max_filesize в " +"php.ini)" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" -msgstr "" +msgstr "Файл превышает размер MAX_FILE_SIZE, указаный в HTML-форме" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Файл был чаÑтично загружен" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Файл не был загружен" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Ðевозможно найти временную директорию" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Файлы" @@ -52,43 +54,55 @@ msgstr "Файлы" msgid "Maximum upload size" msgstr "МакÑимальный размер файла" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Закачать" -#: templates/index.php:17 -msgid "New Folder" -msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "ЗдеÑÑŒ ничего нет. Закачайте что-нибудь!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Ðазвание" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Скачать" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Размер" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Изменен" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Удалить" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Файл Ñлишком большой" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/ru/media.po b/l10n/ru/media.po index 966ac2e46a7..7beb05be078 100644 --- a/l10n/ru/media.po +++ b/l10n/ru/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-09-03 12:59+0000\n" -"Last-Translator: tonymc \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Музыка" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Проиграть" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Пауза" @@ -33,7 +34,7 @@ msgstr "Пауза" msgid "Previous" msgstr "Предыдущий" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Следующий" @@ -45,11 +46,7 @@ msgstr "Отключить звук" msgid "Unmute" msgstr "Включить звук" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "ПеÑен проÑканировано" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "ПереÑканировать коллекцию" diff --git a/l10n/ru/settings.po b/l10n/ru/settings.po index 42149eb309a..54ecbef38e2 100644 --- a/l10n/ru/settings.po +++ b/l10n/ru/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-04 16:48+0200\n" -"PO-Revision-Date: 2011-09-03 13:59+0000\n" -"Last-Translator: tonymc \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +18,26 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Ошибка аутентификации" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID был изменён" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ðеверный запроÑ" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID был изменён" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Язык изменён" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Добавить ваше приложение" @@ -53,15 +58,15 @@ msgstr "от" msgid "Ask a question" msgstr "Задать вопроÑ" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Проблема ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ данных помощи." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Войти ÑамоÑтоÑтельно." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Ответ" @@ -97,37 +102,53 @@ msgstr "показать" msgid "Change password" msgstr "Сменить пароль" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Язык" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Помощь Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð¾Ð¼" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "иÑпользуйте данный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº ownCloud в вашем файловом " "менеджере" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "ИмÑ" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Пароль" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Группы" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Создать" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Удалить" diff --git a/l10n/sk_SK/calendar.po b/l10n/sk_SK/calendar.po new file mode 100644 index 00000000000..b1866548904 --- /dev/null +++ b/l10n/sk_SK/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "ÄŒasové pásmo zmenené" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Neplatná požiadavka" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kalendár" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Zlý kalendár" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Narodeniny" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Podnikanie" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Hovor" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Klienti" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "DoruÄovateľ" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Prázdniny" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Nápady" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Cesta" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Jubileá" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Stretnutia" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Ostatné" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Osobné" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projekty" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Otázky" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Práca" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "NeopakovaÅ¥" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Denne" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Týždenne" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Každý výkend" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Každý druhý týždeň" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "MesaÄne" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "RoÄne" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Nie je pole" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Celý deň" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Nevyplnené položky" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Nadpis" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "Od Dátumu" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "Od ÄŒasu" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Do Dátumu" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Do ÄŒasu" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "UdalosÅ¥ konÄí eÅ¡te pred tým než zaÄne" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Nastala chyba databázy" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Týždeň" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Mesiac" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Zoznam" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Dnes" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kalendáre" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Nastala chyba poÄas parsovania súboru." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Zvoľte aktívne kalendáre" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Nový kalendár" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav odkaz" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "StiahnuÅ¥" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "UpraviÅ¥" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "OdstrániÅ¥" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Nový kalendár" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "UpraviÅ¥ kalendár" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Zobrazené meno" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktívne" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Farba kalendáru" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "UložiÅ¥" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "OdoslaÅ¥" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "ZruÅ¡iÅ¥" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "UpraviÅ¥ udalosÅ¥" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "ExportovaÅ¥" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Nadpis Udalosti" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategória" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "VybraÅ¥ kategóriu" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Celodenná udalosÅ¥" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Od" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Do" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "PokroÄilé možnosti" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "OpakovaÅ¥" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Poloha" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Poloha Udalosti" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Popis" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Popis Udalosti" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "ImportovaÅ¥ Ical súbor" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Ako importovaÅ¥ nový kalendár?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "ImportovaÅ¥ do existujúceho kalendára" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "ImportovaÅ¥ do nového kalendára" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Prosím zvoľte kalendár" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "ImportovaÅ¥" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Späť" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Prosím vyplňte formulár" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "VytvoriÅ¥ udalosÅ¥" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "ÄŒasová zóna" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Formát Äasu" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24h" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12h" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "SynchronizaÄná adresa kalendára CalDAV: " + + diff --git a/l10n/sk_SK/contacts.po b/l10n/sk_SK/contacts.po new file mode 100644 index 00000000000..f4c36ea5054 --- /dev/null +++ b/l10n/sk_SK/contacts.po @@ -0,0 +1,238 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Toto nie je váš adresár." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Kontakt nebol nájdený." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "vCard nemôže byÅ¥ preÄítaná." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "Informácie o vCard sú neplatné. Prosím obnovte stránku." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresa" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefón" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizácia" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Práca" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Domov" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Odkazová schránka" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Toto nie je váš kontakt." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Táto karta nie je kompatibilná s RFC." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Táto karta neobsahuje fotografiu." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "PridaÅ¥ Kontakt." + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Skupina" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Meno" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PO Box" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Rozšírené" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulica" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Mesto" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Región" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PSÄŒ" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Krajina" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "VytvoriÅ¥ Kontakt." + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "UpraviÅ¥" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "OdstrániÅ¥" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Narodeniny" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefón" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/sk_SK/core.po b/l10n/sk_SK/core.po new file mode 100644 index 00000000000..51034c15311 --- /dev/null +++ b/l10n/sk_SK/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Odkaz pre obnovenie hesla obdržíte E-mailom." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Požiadané" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Prihlásenie zlyhalo!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Prihlasovacie meno" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "PožiadaÅ¥ o obnovenie" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "VaÅ¡e heslo bolo obnovené" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nové heslo" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Obnova hesla" + +#: strings.php:5 +msgid "Personal" +msgstr "Osobné" + +#: strings.php:6 +msgid "Users" +msgstr "Používatelia" + +#: strings.php:7 +msgid "Apps" +msgstr "Aplikácie" + +#: strings.php:8 +msgid "Admin" +msgstr "Administrácia" + +#: strings.php:9 +msgid "Help" +msgstr "Pomoc" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Nedokážem nájsÅ¥" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "VytvoriÅ¥ administrátorský úÄet" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Heslo" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "PokroÄilé" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "PrieÄinok dát" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "NastaviÅ¥ databázu" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "bude použité" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Hostiteľ databázy" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Heslo databázy" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Meno databázy" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Server databázy" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "DokonÄiÅ¥ inÅ¡taláciu" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "OdhlásiÅ¥" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Nastavenia" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Zabudli ste heslo?" + +#: templates/login.php:15 +msgid "remember" +msgstr "zapamätaÅ¥" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Ste odhlásený." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "späť" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "Äalej" + + diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po new file mode 100644 index 00000000000..645e9a11f2a --- /dev/null +++ b/l10n/sk_SK/files.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Nenastala žiadna chyba, súbor bol úspeÅ¡ne nahraný" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "Nahraný súbor presiahol direktívu upload_max_filesize v php.ini" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Nahrávaný súbor presiahol MAX_FILE_SIZE direktívu, ktorá bola Å¡pecifikovaná " +"v HTML formulári" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Nahrávaný súbor bol iba ÄiastoÄne nahraný" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Žiaden súbor nebol nahraný" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Chýbajúci doÄasný prieÄinok" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Súbory" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maximálna veľkosÅ¥ nahratia" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "NahraÅ¥" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "NiÄ tu nie je. Nahrakte nieÄo!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Meno" + +#: templates/index.php:45 +msgid "Download" +msgstr "StiahnuÅ¥" + +#: templates/index.php:49 +msgid "Size" +msgstr "VeľkosÅ¥" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Upravené" + +#: templates/index.php:50 +msgid "Delete" +msgstr "OdstrániÅ¥" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Nahrávanie príliÅ¡ veľké" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Súbory ktoré sa snažíte nahraÅ¥ presahujú maximálnu veľkosÅ¥ pre nahratie " +"súborov na tento server." + + diff --git a/l10n/sk_SK/media.po b/l10n/sk_SK/media.po new file mode 100644 index 00000000000..2718867142a --- /dev/null +++ b/l10n/sk_SK/media.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Hudba" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "PrehraÅ¥" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pauza" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Predchádzajúce" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "ÄŽalÅ¡ie" + +#: templates/music.php:7 +msgid "Mute" +msgstr "StlmiÅ¥" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Nahlas" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Znovu skenovaÅ¥ Zbierku" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Umelec" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Názov" + + diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po new file mode 100644 index 00000000000..17dd38a23ba --- /dev/null +++ b/l10n/sk_SK/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/team/sk_SK/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk_SK\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Neplatná požiadavka" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID zmenené" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Jazyk zmenený" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Pridajte svoju aplikáciu" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Vyberte Aplikáciu" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-licencované" + +#: templates/apps.php:23 +msgid "by" +msgstr "od" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Opýtajte sa otázku" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Problémy spojené s pomocnou databázou." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "PrejsÅ¥ tam ruÄne." + +#: templates/help.php:29 +msgid "Answer" +msgstr "OdpoveÄ" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Používate" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "z dostupných" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "VaÅ¡e heslo sa zmenilo" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Nedokážem zmeniÅ¥ vaÅ¡e heslo" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Aktuálne heslo" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Nové heslo" + +#: templates/personal.php:17 +msgid "show" +msgstr "zobraziÅ¥" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "ZmeniÅ¥ heslo" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Jazyk" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "použite túto adresu pre spojenie s vaším ownCloud v správcovi súborov" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Meno" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Heslo" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Skupiny" + +#: templates/users.php:23 +msgid "Create" +msgstr "VytvoriÅ¥" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "OdstrániÅ¥" + + diff --git a/l10n/sl/calendar.po b/l10n/sl/calendar.po new file mode 100644 index 00000000000..e0d14a1c09e --- /dev/null +++ b/l10n/sl/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "ÄŒasovna Cona spremenjena" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Neveljavna zahteva" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Kolendar" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "NapaÄen Kolendar" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "Rojstni Dan" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Poslovno" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "PokliÄi" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Stranke" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Dobavitelj" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Dopust" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Ideje" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Potovanje" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Obletnica" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Sestanek" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "Ostalo" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "Osebno" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projekt" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "VpraÅ¡anja" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Delo" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Se ne ponavlja" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Dnevno" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Tedensko" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Vsak dan v tednu" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Dvakrat Tedensko" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "MeseÄno" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Letno" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Not an array" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Cel dan" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "MankajoÄa polja" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "Naslov" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "od Datum" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "od ÄŒas" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "do Datum" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "do ÄŒas" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "Dogodek se konÄa preden se zaÄne" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Napaka v podatkovni bazi. Kontaktirajte Administratorja" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Teden" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Mesec" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Seznam" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Danes" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Kolendarji" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Pri razÄlenjevanju datoteke je priÅ¡lo do napake." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Izberi aktivni Kolendar" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Nov Kolendar" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav Povezava" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Naloži dol" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Uredi" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "IzbriÅ¡i" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Nov Kolendar" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Uredi Kolendar" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Prikazano Ime" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktivno" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Barva Kolendarja" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Shrani" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Potrdi" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "PrekliÄi" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Uredi Dogodek" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Izvozi" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Naslov" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategorija" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Izberi Kategorijo" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Celodnevni Dogodek" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Od" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Za" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "Napredne Možnosti" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Ponovi" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Lokacija" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Lokacija dogodka" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Opis" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Opis Dogodka" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Uvozi iCal datoteko" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Koko uvozim nov kolendar?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "Uvozi v obstojeÄi kolendar" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Uvozi v nov Kolendar" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Izberi kolendar" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "Uvozi" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Nazaj" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Prosim izpolnite obrazec" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Ustvari nov dogodek" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "ÄŒasovna Cona" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "ÄŒasovni format" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24ur" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12ur" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "Kolendarjev CalDAV sinhronizacijski naslov" + + diff --git a/l10n/sl/contacts.po b/l10n/sl/contacts.po new file mode 100644 index 00000000000..b492c8bb676 --- /dev/null +++ b/l10n/sl/contacts.po @@ -0,0 +1,240 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "To ni vaÅ¡ adresar." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "Kontakta ni bilo mogoÄe najti." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "vVizitko (vCard) ni bilo mogoÄe prebrati." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "" +"Informacije o vVizitki (vCard) niso pravilne, Prosimo ponovno naložite okno." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Naslov" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Email" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizacija" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Delo" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Doma" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobitel" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Glas- Voice" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pager" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "To ni vaÅ¡ kontakt" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Ta karta ni RFC kopatibilna." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Ta karta ne vsebuje slike." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "Dodaj Kontakt" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Skupina" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Ime" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PO Box" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "RazÅ¡irjeno." + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulica" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Mesto" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regija" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "PoÅ¡tna Å¡t." + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Dežela" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Ustvari Kontakt" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Uredi" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "IzbriÅ¡i" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "Rojstni Dan" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefon" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/sl/core.po b/l10n/sl/core.po new file mode 100644 index 00000000000..616829d650b --- /dev/null +++ b/l10n/sl/core.po @@ -0,0 +1,172 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" +"Preko email sporoÄila boste prejeli povezavo s katero lahko ponovno " +"nastavite geslo" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Zahtevano" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Prijava ni Uspela!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "UporabniÅ¡ko Ime" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Zahtevaj ponastavitev" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "VaÅ¡e geslo je bilo ponastavljeno" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "novo geslo" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Ponastavi Geslo" + +#: strings.php:5 +msgid "Personal" +msgstr "Osebno" + +#: strings.php:6 +msgid "Users" +msgstr "Uporabniki" + +#: strings.php:7 +msgid "Apps" +msgstr "Apps" + +#: strings.php:8 +msgid "Admin" +msgstr "Admin" + +#: strings.php:9 +msgid "Help" +msgstr "PomoÄ" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Ni najdeno" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Ustvari admin raÄun" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Geslo" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Napredno" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Data Mapa" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Nastavi Podatkovno Bazo" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "Bo uporabljeno" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Podatkovna Baza Uporabnik" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Podatkovna Baza Geslo" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Ime Podatkovne Baze" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Database host" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "KonÄaj instalacijo" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Odjava" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Nastavitve" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Ste pozabili vaÅ¡e geslo?" + +#: templates/login.php:15 +msgid "remember" +msgstr "zapomni" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Odjavljeni ste" + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "nazaj" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "naprej" + + diff --git a/l10n/sl/files.po b/l10n/sl/files.po new file mode 100644 index 00000000000..22dd51da6b1 --- /dev/null +++ b/l10n/sl/files.po @@ -0,0 +1,114 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "datoteka je bila naložena uspeÅ¡no." + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"Velikost željene naložene datoteke je prevelika. (upload_max_filesize - " +"php.ini) Kontaktirajte Administratorja." + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" +"Velikost željene naložene datoteke je prevelika. (MAX_FILE_SIZE - html " +"formi) Kontaktirajte Administratorja." + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Datoteka je bila le delno naložena." + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Naloženih ni bilo niÄ Datotek." + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Ni potrebne zaÄasne datoteke. (temporary folder)" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Datoteke" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimalna velikost" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Naloži gor" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Naloženih Å¡e ni bilo niÄ datotek." + +#: templates/index.php:43 +msgid "Name" +msgstr "Ime" + +#: templates/index.php:45 +msgid "Download" +msgstr "Naloži dol" + +#: templates/index.php:49 +msgid "Size" +msgstr "Velikost" + +#: templates/index.php:50 +msgid "Modified" +msgstr "Urejeno" + +#: templates/index.php:50 +msgid "Delete" +msgstr "IzbriÅ¡i" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Nalaganje ni mogoÄe, ker je preveliko." + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Datoteke ki jih želiÅ¡ naložiti presegajo maksimalno velikost na tem " +"strežniku. Kontaktirajte Administratorja." + + diff --git a/l10n/sl/media.po b/l10n/sl/media.po new file mode 100644 index 00000000000..d9049fe094f --- /dev/null +++ b/l10n/sl/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Glasba" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Predvajaj" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Pavza" + +#: templates/music.php:5 +msgid "Previous" +msgstr "PrejÅ¡nja" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Naslednja" + +#: templates/music.php:7 +msgid "Mute" +msgstr "IzkljuÄi zvok" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "VkljuÄi zvok" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Skeniraj zbirko" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Izvajalec" + +#: templates/music.php:38 +msgid "Album" +msgstr "Album" + +#: templates/music.php:39 +msgid "Title" +msgstr "Naslov" + + diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po new file mode 100644 index 00000000000..13af55c4a9a --- /dev/null +++ b/l10n/sl/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/team/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Neveljavna zahteva" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID spremenjen" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Jezik je bil spremenjen" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Dodaj vaÅ¡o aplikacijo" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Izberi aplikacijo" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-licenca" + +#: templates/apps.php:23 +msgid "by" +msgstr "od" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "VpraÅ¡aj" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Težave pri povezovanju z zbirko podatkov." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Pojdi tja roÄno." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Odgovor" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Uporabljate" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "od narazpolago" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "VaÅ¡e geslo je bilo spremenjeno." + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "VaÅ¡ega geslo ni bilo mogoÄe spremeniti." + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Trenutno Geslo" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Novo geslo" + +#: templates/personal.php:17 +msgid "show" +msgstr "prikaži" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Spremeni Geslo" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Jezik" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "uporabi ta naslov za povezavo k \"mojoblak\" v vaÅ¡em urejevalniku datotek" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Ime" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Geslo" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Skupine" + +#: templates/users.php:23 +msgid "Create" +msgstr "Ustvari" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "IzbriÅ¡i" + + diff --git a/l10n/sr/contacts.po b/l10n/sr/contacts.po index 780af00702d..5f2a473f540 100644 --- a/l10n/sr/contacts.po +++ b/l10n/sr/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Slobodan Terzić , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Ово није ваш адреÑар." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Контакт Ñе не може наћи." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "вКарта Ñе не може читати." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Подаци о вКарти Ñу неиÑправни. Поново учитајте Ñтраницу." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "ÐдреÑа" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Телефон" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Е-маил" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Организација" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "ПоÑао" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Кућа" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Мобилни" + +#: lib/app.php:114 +msgid "Text" +msgstr "ТекÑÑ‚" + +#: lib/app.php:115 +msgid "Voice" +msgstr "ГлаÑ" + +#: lib/app.php:116 +msgid "Fax" +msgstr "ФакÑ" + +#: lib/app.php:117 +msgid "Video" +msgstr "Видео" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Пејџер" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Ово није ваш контакт." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Ова карта није ÑаглаÑна Ñа РФЦ-ом." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Ова карта не Ñадржи фотографију." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Додај контакт" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Група" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Име" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "ПоштанÑки број" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Прошири" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Улица" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Град" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Регија" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Зип код" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Земља" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Ðаправи контакт" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Уреди" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Обриши" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Рођендан" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Телефон" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/sr/core.po b/l10n/sr/core.po index 77abd798989..9bf02eedf6e 100644 --- a/l10n/sr/core.po +++ b/l10n/sr/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-14 11:23+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Добићете везу за реÑетовање лозинке путем е-поште." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Захтевано" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "ÐеÑупела пријава!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "КориÑничко име" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Захтевај реÑетовање" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Ваша лозинка је реÑетована" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Ðова лозинка" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "РеÑетуј лозинку" + #: strings.php:5 msgid "Personal" msgstr "Лична" @@ -46,54 +91,50 @@ msgstr "Облак није нађен" msgid "Create an admin account" msgstr "Ðаправи админиÑтративни налог" -#: templates/installation.php:21 -msgid "Username" -msgstr "КориÑничко име" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Лозинка" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Ðапредно" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Фацикла података" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Подешавање базе" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "ће бити коришћен" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "КориÑник базе" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Лозинка базе" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Име базе" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Ðапредно" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Домаћин базе" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Фацикла података" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Заврши подешавање" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "вам даје Ñлободу и контролу над вашим подацима" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +144,22 @@ msgstr "Одјава" msgid "Settings" msgstr "Подешавања" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Изгубили Ñте лозинку?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "упамти" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Одјављени Ñте." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Добићете везу за реÑетовање лозинке путем е-поште." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Захтев поÑлат" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "ÐеуÑпешно пријављивање!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "КориÑничко име или адреÑа е-поште" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Захтев за реÑетовање" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "претходно" @@ -143,16 +168,4 @@ msgstr "претходно" msgid "next" msgstr "Ñледеће" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Ваша лозинка је реÑетована" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Ðова лозинка" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "РеÑетуј лозинку" - diff --git a/l10n/sr/files.po b/l10n/sr/files.po index 778a30135e7..9dc152c94aa 100644 --- a/l10n/sr/files.po +++ b/l10n/sr/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,35 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Ðема грешке, фајл је уÑпешно поÑлат" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "ПоÑлати фајл превазилази директиву upload_max_filesize из " -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"ПоÑлати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ " +"форми" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "ПоÑлати фајл је Ñамо делимично отпремљен!" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Ðиједан фајл није поÑлат" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "ÐедоÑтаје привремена фаÑцикла" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Фајлови" @@ -52,43 +54,55 @@ msgstr "Фајлови" msgid "Maximum upload size" msgstr "МакÑимална величина пошиљке" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "Пошаљи" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Ðова фаÑцикла" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Овде нема ничег. Пошаљите нешто!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Име" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Преузми" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Величина" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Задња измена" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Обриши" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "Пошиљка је превелика" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/sr/media.po b/l10n/sr/media.po index aaab3c163d9..331a8bc9f06 100644 --- a/l10n/sr/media.po +++ b/l10n/sr/media.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-13 22:01+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +18,15 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Музика" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "ПуÑти" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Паузирај" @@ -34,7 +34,7 @@ msgstr "Паузирај" msgid "Previous" msgstr "Претходна" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Следећа" @@ -46,11 +46,7 @@ msgstr "ИÑкључи звук" msgid "Unmute" msgstr "Укључи звук" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Претражених пеÑама" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Поново претражи збирку" diff --git a/l10n/sr/settings.po b/l10n/sr/settings.po index a81b25b9474..dd68b115b43 100644 --- a/l10n/sr/settings.po +++ b/l10n/sr/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-13 22:02+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/team/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +18,26 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Грешка аутентификације" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID је измењен" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "ÐеиÑправан захтев" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID је измењен" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Језик је измењен" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Додајте Ñвој програм" @@ -54,15 +58,15 @@ msgstr "од" msgid "Ask a question" msgstr "ПоÑтавите питање" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Проблем у повезивању Ñа базом помоћи" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "Отиђите тамо ручно." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Одговор" @@ -98,36 +102,52 @@ msgstr "прикажи" msgid "Change password" msgstr "Измени лозинку" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Језик" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Помозите у превођењу" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "кориÑтите ову адреÑу да би Ñе повезали на ownCloud путем менаџњера фајлова" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Име" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Лозинка" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Групе" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Ðаправи" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Обриши" diff --git a/l10n/sr@latin/contacts.po b/l10n/sr@latin/contacts.po index 3066a8fc090..428c4453ead 100644 --- a/l10n/sr@latin/contacts.po +++ b/l10n/sr@latin/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Slobodan Terzić , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/team/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Ovo nije vaÅ¡ adresar." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Kontakt se ne može naći." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vKarta se ne može Äitati." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Podaci o vKarti su neispravni. Ponovo uÄitajte stranicu." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adresa" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-mail" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizacija" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Posao" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Kuća" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobilni" + +#: lib/app.php:114 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Glas" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Pejdžer" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Ovo nije vaÅ¡ kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Ova karta nije saglasna sa RFC-om." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Ova karta ne sadrži fotografiju." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Dodaj kontakt" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupa" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Ime" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "PoÅ¡tanski broj" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "ProÅ¡iri" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Ulica" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Grad" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Regija" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Zip kod" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Zemlja" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Napravi kontakt" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Uredi" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "ObriÅ¡i" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "RoÄ‘endan" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/sr@latin/core.po b/l10n/sr@latin/core.po index 33bd96a4c3d..93b14cb49ad 100644 --- a/l10n/sr@latin/core.po +++ b/l10n/sr@latin/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-14 11:23+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/team/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Dobićete vezu za resetovanje lozinke putem e-poÅ¡te." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Zahtevano" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Nesupela prijava!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "KorisniÄko ime" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Zahtevaj resetovanje" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "VaÅ¡a lozinka je resetovana" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nova lozinka" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Resetuj lozinku" + #: strings.php:5 msgid "Personal" msgstr "LiÄna" @@ -46,54 +91,50 @@ msgstr "Oblak nije naÄ‘en" msgid "Create an admin account" msgstr "Napravi administrativni nalog" -#: templates/installation.php:21 -msgid "Username" -msgstr "KorisniÄko ime" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Lozinka" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Napredno" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Facikla podataka" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "PodeÅ¡avanje baze" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "će biti korišćen" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Korisnik baze" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Lozinka baze" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Ime baze" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Napredno" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Domaćin baze" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Facikla podataka" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "ZavrÅ¡i podeÅ¡avanje" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "vam daje slobodu i kontrolu nad vaÅ¡im podacima" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +144,22 @@ msgstr "Odjava" msgid "Settings" msgstr "PodeÅ¡avanja" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "Izgubili ste lozinku?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "upamti" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Odjavljeni ste." -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Dobićete vezu za resetovanje lozinke putem e-poÅ¡te." - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Zahtev poslat" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "NeuspeÅ¡no prijavljivanje!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "KorisniÄko ime ili adresa e-poÅ¡te" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Zahtev za resetovanje" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "prethodno" @@ -143,16 +168,4 @@ msgstr "prethodno" msgid "next" msgstr "sledeće" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "VaÅ¡a lozinka je resetovana" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nova lozinka" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Resetuj lozinku" - diff --git a/l10n/sr@latin/files.po b/l10n/sr@latin/files.po index f9af37cbada..261d61c800d 100644 --- a/l10n/sr@latin/files.po +++ b/l10n/sr@latin/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/team/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,35 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Nema greÅ¡ke, fajl je uspeÅ¡no poslat" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "Poslati fajl prevazilazi direktivu upload_max_filesize iz " -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Poslati fajl prevazilazi direktivu MAX_FILE_SIZE koja je navedena u HTML " +"formi" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Poslati fajl je samo delimiÄno otpremljen!" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Nijedan fajl nije poslat" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Nedostaje privremena fascikla" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Fajlovi" @@ -52,43 +54,55 @@ msgstr "Fajlovi" msgid "Maximum upload size" msgstr "Maksimalna veliÄina poÅ¡iljke" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "PoÅ¡alji" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Nova fascikla" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "Ovde nema niÄeg. PoÅ¡aljite neÅ¡to!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Ime" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Preuzmi" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "VeliÄina" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Zadnja izmena" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "ObriÅ¡i" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "PoÅ¡iljka je prevelika" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/sr@latin/media.po b/l10n/sr@latin/media.po index a647feac32c..e9d968b7493 100644 --- a/l10n/sr@latin/media.po +++ b/l10n/sr@latin/media.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-13 22:12+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/team/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,15 +18,15 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Muzika" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Pusti" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Pauziraj" @@ -34,7 +34,7 @@ msgstr "Pauziraj" msgid "Previous" msgstr "Prethodna" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Sledeća" @@ -46,11 +46,7 @@ msgstr "IskljuÄi zvuk" msgid "Unmute" msgstr "UkljuÄi zvuk" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Pretraženih pesama" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Ponovo pretraži zbirku" diff --git a/l10n/sr@latin/settings.po b/l10n/sr@latin/settings.po index cb8b76399c1..d70e5ea94a6 100644 --- a/l10n/sr@latin/settings.po +++ b/l10n/sr@latin/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-13 22:13+0000\n" -"Last-Translator: Xabre \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/team/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +18,26 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "GreÅ¡ka autentifikacije" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID je izmenjen" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Neispravan zahtev" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID je izmenjen" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "Jezik je izmenjen" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Dodajte svoj program" @@ -54,15 +58,15 @@ msgstr "od" msgid "Ask a question" msgstr "Postavite pitanje" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problem u povezivanju sa bazom pomoći" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "OtiÄ‘ite tamo ruÄno." -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Odgovor" @@ -98,36 +102,52 @@ msgstr "prikaži" msgid "Change password" msgstr "Izmeni lozinku" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "Jezik" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Pomozite u prevoÄ‘enju" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" "koristite ovu adresu da bi se povezali na ownCloud putem menadžnjera fajlova" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Ime" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Lozinka" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupe" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Napravi" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "ObriÅ¡i" diff --git a/l10n/sv/contacts.po b/l10n/sv/contacts.po index f492fa61d7d..ad78ed44871 100644 --- a/l10n/sv/contacts.po +++ b/l10n/sv/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "Det här är inte din adressbok." -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "Kontakt kunde inte hittas." -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard kunde inte läsas in." -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "Information om vCard är felaktigt. Vänligen ladda om sidan." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adress" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "E-post" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organisation" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Arbete" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Hem" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Text" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Röst" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Personsökare" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Det här är inte din kontakt." + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "Detta kort är inte RFC-kompatibelt." -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "Detta kort innehÃ¥ller inte nÃ¥got foto." -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "Lägg till kontakt" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "Grupp" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "Namn" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Postbox" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Utökad" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Gata" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Stad" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Län" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Postnummer" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Land" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "Skapa kontakt" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Redigera" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Radera" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "Födelsedag" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "Telefon" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/sv/core.po b/l10n/sv/core.po index 0870f7efb7e..1d822e5fbd8 100644 --- a/l10n/sv/core.po +++ b/l10n/sv/core.po @@ -4,13 +4,14 @@ # # Translators: # , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-12 07:50+0000\n" -"Last-Translator: HakanS \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +19,51 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Du fÃ¥r en länk att Ã¥terställa ditt lösenord via e-post." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Begärd" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "Inloggning misslyckades!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Användarnamn" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Begär Ã¥terställning" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Ditt lösenord har Ã¥terställts" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Nytt lösenord" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Ã…terställ lösenordet" + #: strings.php:5 msgid "Personal" msgstr "Personlig" @@ -46,54 +92,50 @@ msgstr "Hittade inget moln" msgid "Create an admin account" msgstr "Skapa ett administratörskonto" -#: templates/installation.php:21 -msgid "Username" -msgstr "Användarnamn" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "Lösenord" -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "Avancerat" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Datamapp" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "Konfigurera databasen" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "kommer att användas" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "Databas-användare" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "Lösenord för databasen" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "Databasens namn" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "Avancerat" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "Databasserver" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "Datamapp" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "Avsluta installation" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "ger dig frihet och kontroll över din egen data" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +145,22 @@ msgstr "Logga ut" msgid "Settings" msgstr "Inställningar" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" -msgstr "Tappat bort ditt lösenord?" +msgstr "Glömt ditt lösenord?" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "kom ihÃ¥g" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "Du är utloggad" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "Du kommer fÃ¥ en länk, via e-post, där du kan Ã¥terställ ditt lösenord" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "Begärd" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "Inloggning misslyckades!" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "Användarnamn eller e-post" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "Begär Ã¥terställning" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "föregÃ¥ende" @@ -143,16 +169,4 @@ msgstr "föregÃ¥ende" msgid "next" msgstr "nästa" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "Ditt lösenord har Ã¥terställts" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "Nytt lösenord" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "Ã…terställ lösenord" - diff --git a/l10n/sv/files.po b/l10n/sv/files.po index 64566d0b29b..a43ea6cdb9d 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,33 +18,36 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "Inga fel uppstod. Filen laddades upp utan problem" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" +"Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" +"Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-" +"formulär" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "Den uppladdade filen var endast delvist uppladdad" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "Ingen fil blev uppladdad" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "Saknar en tillfällig mapp" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "Filer" @@ -51,48 +55,60 @@ msgstr "Filer" msgid "Maximum upload size" msgstr "Maximal storlek att lägga upp" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 -msgid "Upload" -msgstr "Lägg upp" +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" -#: templates/index.php:17 -msgid "New Folder" -msgstr "Ny katalog" +#: templates/index.php:22 +msgid "Upload" +msgstr "Ladda upp" -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" -msgstr "Ingenting här. Lägg upp nÃ¥got!" +msgstr "Ingenting här. Ladda upp nÃ¥got!" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "Namn" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "Ladda ned" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "Storlek" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "Ändrad" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "Ta bort" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" -msgstr "För stor överföring" +msgstr "För stor uppladdning" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -"Filerna du försöker lägga upp överstiger den maximala storleken för " +"Filerna du försöker ladda upp överstiger den maximala storleken för " "filöverföringar pÃ¥ servern." diff --git a/l10n/sv/media.po b/l10n/sv/media.po index 9c01948ed29..31728e350b8 100644 --- a/l10n/sv/media.po +++ b/l10n/sv/media.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-12 06:24+0000\n" -"Last-Translator: HakanS \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "Musik" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "Spela" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "Paus" @@ -33,7 +34,7 @@ msgstr "Paus" msgid "Previous" msgstr "FöregÃ¥ende" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "Nästa" @@ -45,11 +46,7 @@ msgstr "Ljudlös" msgid "Unmute" msgstr "Ljud pÃ¥" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "Skannade lÃ¥tar" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "Sök igenom samlingen" diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po index 4ffc833e868..95b886d8c72 100644 --- a/l10n/sv/settings.po +++ b/l10n/sv/settings.po @@ -4,13 +4,14 @@ # # Translators: # , 2011. +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-12 07:57+0000\n" -"Last-Translator: HakanS \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,22 +19,26 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "Autentiseringsfel" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID ändrat" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "Ogiltig begäran" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID ändrat" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "SprÃ¥k ändrades" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "Lägg till din applikation" @@ -54,15 +59,15 @@ msgstr "av" msgid "Ask a question" msgstr "Ställ en frÃ¥ga" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "Problem med att ansluta till hjälp-databasen." -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "GÃ¥ dit manuellt" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "Svar" @@ -98,36 +103,51 @@ msgstr "visa" msgid "Change password" msgstr "Ändra lösenord" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "SprÃ¥k" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "Hjälp till att översätta" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" -msgstr "" -"använd denna adress för att ansluta till ditt ownCloud i din filhanterare" +msgstr "använd denna adress för att ansluta ownCloud till din filhanterare" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "Namn" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "Lösenord" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "Grupper" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "Skapa" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "Ta bort" diff --git a/l10n/templates/calendar.pot b/l10n/templates/calendar.pot index 7941082926b..9bcac2da988 100644 --- a/l10n/templates/calendar.pot +++ b/l10n/templates/calendar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/contacts.pot b/l10n/templates/contacts.pot index b0426f2bb59..bc72053cd50 100644 --- a/l10n/templates/contacts.pot +++ b/l10n/templates/contacts.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,162 +17,220 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." msgstr "" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." msgstr "" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." msgstr "" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: photo.php:53 -msgid "This card is not RFC compatible." +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" msgstr "" -#: photo.php:90 -msgid "This card does not contain a photo." +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" msgstr "" -#: templates/index.php:8 -msgid "Add Contact" +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" msgstr "" -#: templates/part.addcardform.php:5 -msgid "Group" +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" msgstr "" -#: templates/part.addcardform.php:12 templates/part.property.php:3 -msgid "Name" +#: lib/app.php:106 lib/app.php:113 +msgid "Work" msgstr "" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: lib/app.php:107 lib/app.php:111 +msgid "Home" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: lib/app.php:112 +msgid "Mobile" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" +#: lib/app.php:114 +msgid "Text" msgstr "" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" +#: lib/app.php:115 +msgid "Voice" msgstr "" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" +#: lib/app.php:116 +msgid "Fax" msgstr "" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" +#: lib/app.php:117 +msgid "Video" msgstr "" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" +#: lib/app.php:118 +msgid "Pager" +msgstr "" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "" + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "" + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "" + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "" + +#: templates/part.addcardform.php:19 +msgid "Name" msgstr "" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 msgid "PO Box" msgstr "" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 msgid "Extended" msgstr "" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 msgid "Street" msgstr "" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 msgid "City" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 msgid "Region" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 msgid "Zipcode" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 msgid "Country" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.addcardform.php:97 +msgid "Create Contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" msgstr "" -#: templates/part.details.php:31 +#: templates/part.chooseaddressbook.rowfields.php:5 msgid "Delete" msgstr "" -#: templates/part.details.php:32 -msgid "Add Property" +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.property.php:9 +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 msgid "Birthday" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" msgstr "" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 98b310f2d14..cf13c461196 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,51 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "" + #: strings.php:5 msgid "Personal" msgstr "" @@ -45,53 +90,49 @@ msgstr "" msgid "Create an admin account" msgstr "" -#: templates/installation.php:21 -msgid "Username" +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" msgstr "" -#: templates/installation.php:22 -msgid "Password" +#: templates/installation.php:32 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:34 +msgid "Data folder" msgstr "" -#: templates/installation.php:27 +#: templates/installation.php:41 msgid "Configure the database" msgstr "" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "" -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" +msgid "web services under your control" msgstr "" #: templates/layout.user.php:34 @@ -102,36 +143,20 @@ msgstr "" msgid "Settings" msgstr "" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "" -#: templates/logout.php:1 -msgid "You are logged out." -msgstr "" - -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "" - -#: templates/lostpassword.php:5 -msgid "Requested" +#: templates/login.php:16 +msgid "Log in" msgstr "" -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "" - -#: templates/lostpassword.php:11 -msgid "Request reset" +#: templates/logout.php:1 +msgid "You are logged out." msgstr "" #: templates/part.pagenavi.php:3 @@ -141,15 +166,3 @@ msgstr "" #: templates/part.pagenavi.php:20 msgid "next" msgstr "" - -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "" - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 5b57ccec9a2..82e2f1832f1 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,33 +17,33 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" msgstr "" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgstr "" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" msgstr "" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" msgstr "" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" msgstr "" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" msgstr "" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "" @@ -51,43 +51,55 @@ msgstr "" msgid "Maximum upload size" msgstr "" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 -msgid "Upload" +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" msgstr "" -#: templates/index.php:17 -msgid "New Folder" +#: templates/index.php:22 +msgid "Upload" msgstr "" -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/templates/media.pot b/l10n/templates/media.pot index 0a2757a306e..400e39c3f24 100644 --- a/l10n/templates/media.pot +++ b/l10n/templates/media.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,15 +17,15 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "" @@ -33,7 +33,7 @@ msgstr "" msgid "Previous" msgstr "" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "" @@ -45,11 +45,7 @@ msgstr "" msgid "Unmute" msgstr "" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index b1444319153..6f5b1a4daae 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,22 +17,26 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" +#: ajax/lostpassword.php:14 +msgid "email Changed" msgstr "" -#: ajax/openid.php:21 -msgid "OpenID Changed" +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 -msgid "Invalid request" +#: ajax/openid.php:15 +msgid "OpenID Changed" msgstr "" -#: ajax/setlanguage.php:21 +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "" @@ -53,15 +57,15 @@ msgstr "" msgid "Ask a question" msgstr "" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "" -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "" @@ -97,34 +101,50 @@ msgstr "" msgid "Change password" msgstr "" -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "" -#: templates/personal.php:30 -msgid "Help translating" +#: templates/personal.php:38 +msgid "Help translate" msgstr "" -#: templates/personal.php:37 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "" -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "" diff --git a/l10n/tr/calendar.po b/l10n/tr/calendar.po new file mode 100644 index 00000000000..6b98fe02158 --- /dev/null +++ b/l10n/tr/calendar.po @@ -0,0 +1,637 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-07 18:29+0100\n" +"PO-Revision-Date: 2012-01-08 08:41+0000\n" +"Last-Translator: george \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/guesstimezone.php:42 +msgid "New Timezone:" +msgstr "" + +#: ajax/settimezone.php:22 +msgid "Timezone changed" +msgstr "Zaman dilimi deÄŸiÅŸtirildi" + +#: ajax/settimezone.php:24 +msgid "Invalid request" +msgstr "Geçersiz istek" + +#: appinfo/app.php:20 templates/calendar.php:13 +#: templates/part.eventform.php:20 +msgid "Calendar" +msgstr "Takvim" + +#: lib/app.php:19 +msgid "Wrong calendar" +msgstr "Yanlış takvim" + +#: lib/app.php:60 lib/object.php:332 +msgid "Birthday" +msgstr "DoÄŸum günü" + +#: lib/app.php:61 lib/object.php:333 +msgid "Business" +msgstr "Ä°ÅŸ" + +#: lib/app.php:62 lib/object.php:334 +msgid "Call" +msgstr "Arama" + +#: lib/app.php:63 lib/object.php:335 +msgid "Clients" +msgstr "Müşteriler" + +#: lib/app.php:64 lib/object.php:336 +msgid "Deliverer" +msgstr "Teslimatçı" + +#: lib/app.php:65 lib/object.php:337 +msgid "Holidays" +msgstr "Tatil günleri" + +#: lib/app.php:66 lib/object.php:338 +msgid "Ideas" +msgstr "Fikirler" + +#: lib/app.php:67 lib/object.php:339 +msgid "Journey" +msgstr "Seyahat" + +#: lib/app.php:68 lib/object.php:340 +msgid "Jubilee" +msgstr "Yıl dönümü" + +#: lib/app.php:69 lib/object.php:341 +msgid "Meeting" +msgstr "Toplantı" + +#: lib/app.php:70 lib/object.php:342 +msgid "Other" +msgstr "DiÄŸer" + +#: lib/app.php:71 lib/object.php:343 +msgid "Personal" +msgstr "KiÅŸisel" + +#: lib/app.php:72 lib/object.php:344 +msgid "Projects" +msgstr "Projeler" + +#: lib/app.php:73 lib/object.php:345 +msgid "Questions" +msgstr "Sorular" + +#: lib/app.php:74 lib/object.php:346 +msgid "Work" +msgstr "Ä°ÅŸ" + +#: lib/object.php:353 +msgid "Does not repeat" +msgstr "Tekrar etmiyor" + +#: lib/object.php:354 +msgid "Daily" +msgstr "Günlük" + +#: lib/object.php:355 +msgid "Weekly" +msgstr "Haftalı" + +#: lib/object.php:356 +msgid "Every Weekday" +msgstr "Haftaiçi Her gün" + +#: lib/object.php:357 +msgid "Bi-Weekly" +msgstr "Ä°ki haftada bir" + +#: lib/object.php:358 +msgid "Monthly" +msgstr "Aylık" + +#: lib/object.php:359 +msgid "Yearly" +msgstr "Yıllı" + +#: lib/object.php:366 +msgid "never" +msgstr "" + +#: lib/object.php:367 +msgid "by occurrences" +msgstr "" + +#: lib/object.php:368 +msgid "by date" +msgstr "" + +#: lib/object.php:375 +msgid "by monthday" +msgstr "" + +#: lib/object.php:376 +msgid "by weekday" +msgstr "" + +#: lib/object.php:383 templates/lAfix.php:3 +msgid "Monday" +msgstr "" + +#: lib/object.php:384 templates/lAfix.php:4 +msgid "Tuesday" +msgstr "" + +#: lib/object.php:385 templates/lAfix.php:5 +msgid "Wednesday" +msgstr "" + +#: lib/object.php:386 templates/lAfix.php:6 +msgid "Thursday" +msgstr "" + +#: lib/object.php:387 templates/lAfix.php:7 +msgid "Friday" +msgstr "" + +#: lib/object.php:388 templates/lAfix.php:8 +msgid "Saturday" +msgstr "" + +#: lib/object.php:389 templates/lAfix.php:2 +msgid "Sunday" +msgstr "" + +#: lib/object.php:396 +msgid "events week of month" +msgstr "" + +#: lib/object.php:397 +msgid "first" +msgstr "" + +#: lib/object.php:398 +msgid "second" +msgstr "" + +#: lib/object.php:399 +msgid "third" +msgstr "" + +#: lib/object.php:400 +msgid "fourth" +msgstr "" + +#: lib/object.php:401 +msgid "fifth" +msgstr "" + +#: lib/object.php:402 +msgid "last" +msgstr "" + +#: lib/object.php:424 templates/lAfix.php:16 +msgid "January" +msgstr "" + +#: lib/object.php:425 templates/lAfix.php:17 +msgid "February" +msgstr "" + +#: lib/object.php:426 templates/lAfix.php:18 +msgid "March" +msgstr "" + +#: lib/object.php:427 templates/lAfix.php:19 +msgid "April" +msgstr "" + +#: lib/object.php:428 templates/lAfix.php:20 +msgid "May" +msgstr "" + +#: lib/object.php:429 templates/lAfix.php:21 +msgid "June" +msgstr "" + +#: lib/object.php:430 templates/lAfix.php:22 +msgid "July" +msgstr "" + +#: lib/object.php:431 templates/lAfix.php:23 +msgid "August" +msgstr "" + +#: lib/object.php:432 templates/lAfix.php:24 +msgid "September" +msgstr "" + +#: lib/object.php:433 templates/lAfix.php:25 +msgid "October" +msgstr "" + +#: lib/object.php:434 templates/lAfix.php:26 +msgid "November" +msgstr "" + +#: lib/object.php:435 templates/lAfix.php:27 +msgid "December" +msgstr "" + +#: lib/object.php:441 +msgid "by events date" +msgstr "" + +#: lib/object.php:442 +msgid "by yearday(s)" +msgstr "" + +#: lib/object.php:443 +msgid "by weeknumber(s)" +msgstr "" + +#: lib/object.php:444 +msgid "by day and month" +msgstr "" + +#: lib/object.php:467 +msgid "Not an array" +msgstr "Bir dizi deÄŸil" + +#: lib/search.php:32 lib/search.php:34 lib/search.php:37 +msgid "Date" +msgstr "" + +#: lib/search.php:40 +msgid "Cal." +msgstr "" + +#: templates/calendar.php:10 +msgid "All day" +msgstr "Tüm gün" + +#: templates/calendar.php:11 +msgid "Missing fields" +msgstr "Eksik alanlar" + +#: templates/calendar.php:12 templates/part.eventform.php:3 +msgid "Title" +msgstr "BaÅŸlık" + +#: templates/calendar.php:14 +msgid "From Date" +msgstr "Bu Tarihten" + +#: templates/calendar.php:15 +msgid "From Time" +msgstr "Bu Saatten" + +#: templates/calendar.php:16 +msgid "To Date" +msgstr "Bu Tarihe" + +#: templates/calendar.php:17 +msgid "To Time" +msgstr "Bu Saate" + +#: templates/calendar.php:18 +msgid "The event ends before it starts" +msgstr "Olay baÅŸlamadan önce bitiyor" + +#: templates/calendar.php:19 +msgid "There was a database fail" +msgstr "Bir veritabanı baÅŸarısızlığı oluÅŸtu" + +#: templates/calendar.php:38 +msgid "Week" +msgstr "Hafta" + +#: templates/calendar.php:39 +msgid "Month" +msgstr "Ay" + +#: templates/calendar.php:40 +msgid "List" +msgstr "Liste" + +#: templates/calendar.php:45 +msgid "Today" +msgstr "Bugün" + +#: templates/calendar.php:46 +msgid "Calendars" +msgstr "Takvimler" + +#: templates/calendar.php:64 +msgid "There was a fail, while parsing the file." +msgstr "Dosya okunurken baÅŸarısızlık oldu." + +#: templates/lAfix.php:9 +msgid "Sun." +msgstr "" + +#: templates/lAfix.php:10 +msgid "Mon." +msgstr "" + +#: templates/lAfix.php:11 +msgid "Tue." +msgstr "" + +#: templates/lAfix.php:12 +msgid "Wed." +msgstr "" + +#: templates/lAfix.php:13 +msgid "Thu." +msgstr "" + +#: templates/lAfix.php:14 +msgid "Fri." +msgstr "" + +#: templates/lAfix.php:15 +msgid "Sat." +msgstr "" + +#: templates/lAfix.php:28 +msgid "Jan." +msgstr "" + +#: templates/lAfix.php:29 +msgid "Feb." +msgstr "" + +#: templates/lAfix.php:30 +msgid "Mar." +msgstr "" + +#: templates/lAfix.php:31 +msgid "Apr." +msgstr "" + +#: templates/lAfix.php:32 +msgid "May." +msgstr "" + +#: templates/lAfix.php:33 +msgid "Jun." +msgstr "" + +#: templates/lAfix.php:34 +msgid "Jul." +msgstr "" + +#: templates/lAfix.php:35 +msgid "Aug." +msgstr "" + +#: templates/lAfix.php:36 +msgid "Sep." +msgstr "" + +#: templates/lAfix.php:37 +msgid "Oct." +msgstr "" + +#: templates/lAfix.php:38 +msgid "Nov." +msgstr "" + +#: templates/lAfix.php:39 +msgid "Dec." +msgstr "" + +#: templates/part.choosecalendar.php:1 +msgid "Choose active calendars" +msgstr "Aktif takvimleri seçin" + +#: templates/part.choosecalendar.php:15 +msgid "New Calendar" +msgstr "Yeni Takvim" + +#: templates/part.choosecalendar.php:20 +#: templates/part.choosecalendar.rowfields.php:4 +msgid "CalDav Link" +msgstr "CalDav BaÄŸlantısı" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Download" +msgstr "Ä°ndir" + +#: templates/part.choosecalendar.rowfields.php:4 +msgid "Edit" +msgstr "Düzenle" + +#: templates/part.choosecalendar.rowfields.php:4 +#: templates/part.editevent.php:9 +msgid "Delete" +msgstr "Sil" + +#: templates/part.editcalendar.php:9 +msgid "New calendar" +msgstr "Yeni takvim" + +#: templates/part.editcalendar.php:9 +msgid "Edit calendar" +msgstr "Takvimi düzenle" + +#: templates/part.editcalendar.php:12 templates/part.import.php:29 +msgid "Displayname" +msgstr "Görünümadı" + +#: templates/part.editcalendar.php:23 +msgid "Active" +msgstr "Aktif" + +#: templates/part.editcalendar.php:29 +msgid "Calendar color" +msgstr "Takvim rengi" + +#: templates/part.editcalendar.php:42 +msgid "Save" +msgstr "Kaydet" + +#: templates/part.editcalendar.php:42 templates/part.editevent.php:8 +#: templates/part.newevent.php:6 +msgid "Submit" +msgstr "Gönder" + +#: templates/part.editcalendar.php:43 +msgid "Cancel" +msgstr "Ä°ptal" + +#: templates/part.editevent.php:1 +msgid "Edit an event" +msgstr "Bir olay düzenle" + +#: templates/part.editevent.php:10 +msgid "Export" +msgstr "Dışa aktar" + +#: templates/part.eventform.php:5 +msgid "Title of the Event" +msgstr "Olayın BaÅŸlığı" + +#: templates/part.eventform.php:11 +msgid "Category" +msgstr "Kategori" + +#: templates/part.eventform.php:13 +msgid "Select category" +msgstr "Kategori seçin" + +#: templates/part.eventform.php:37 +msgid "All Day Event" +msgstr "Tüm Gün Olay" + +#: templates/part.eventform.php:41 +msgid "From" +msgstr "Kimden" + +#: templates/part.eventform.php:49 +msgid "To" +msgstr "Kime" + +#: templates/part.eventform.php:57 +msgid "Advanced options" +msgstr "GeliÅŸmiÅŸ opsiyonlar" + +#: templates/part.eventform.php:61 +msgid "Repeat" +msgstr "Tekrar" + +#: templates/part.eventform.php:68 +msgid "Advanced" +msgstr "" + +#: templates/part.eventform.php:112 +msgid "Select weekdays" +msgstr "" + +#: templates/part.eventform.php:125 templates/part.eventform.php:138 +msgid "Select days" +msgstr "" + +#: templates/part.eventform.php:130 +msgid "and the events day of year." +msgstr "" + +#: templates/part.eventform.php:143 +msgid "and the events day of month." +msgstr "" + +#: templates/part.eventform.php:151 +msgid "Select months" +msgstr "" + +#: templates/part.eventform.php:164 +msgid "Select weeks" +msgstr "" + +#: templates/part.eventform.php:169 +msgid "and the events week of year." +msgstr "" + +#: templates/part.eventform.php:175 +msgid "Interval" +msgstr "" + +#: templates/part.eventform.php:181 +msgid "End" +msgstr "" + +#: templates/part.eventform.php:193 +msgid "occurrences" +msgstr "" + +#: templates/part.eventform.php:208 +msgid "Location" +msgstr "Konum" + +#: templates/part.eventform.php:210 +msgid "Location of the Event" +msgstr "Olayın Konumu" + +#: templates/part.eventform.php:216 +msgid "Description" +msgstr "Açıklama" + +#: templates/part.eventform.php:218 +msgid "Description of the Event" +msgstr "Olayın Açıklaması" + +#: templates/part.import.php:1 +msgid "Import Ical File" +msgstr "Ical Dosyası Al" + +#: templates/part.import.php:4 +msgid "How to import the new calendar?" +msgstr "Yeni takvim nasıl alınsın?" + +#: templates/part.import.php:6 +msgid "Import into an existing calendar" +msgstr "Mevcut bir takvimin içine al" + +#: templates/part.import.php:7 +msgid "Import into a new calendar" +msgstr "Yeni bir takvim içine al" + +#: templates/part.import.php:10 +msgid "Please choose the calendar" +msgstr "Lütfen takvimi seçin" + +#: templates/part.import.php:20 templates/part.import.php:37 +msgid "Import" +msgstr "İçe Al" + +#: templates/part.import.php:22 templates/part.import.php:39 +msgid "Back" +msgstr "Geri" + +#: templates/part.import.php:25 +msgid "Please fill out the form" +msgstr "Lütfen formu doldurun" + +#: templates/part.newevent.php:1 +msgid "Create a new event" +msgstr "Yeni olay oluÅŸtur" + +#: templates/settings.php:13 +msgid "Timezone" +msgstr "Zaman dilimi" + +#: templates/settings.php:30 +msgid "Check always for changes of the timezone" +msgstr "" + +#: templates/settings.php:32 +msgid "Timeformat" +msgstr "Saat biçimi" + +#: templates/settings.php:34 +msgid "24h" +msgstr "24s" + +#: templates/settings.php:35 +msgid "12h" +msgstr "12s" + +#: templates/settings.php:41 +msgid "Calendar CalDAV syncing address:" +msgstr "CalDAV Takvim senkron adresi:" + + diff --git a/l10n/tr/contacts.po b/l10n/tr/contacts.po new file mode 100644 index 00000000000..b512c14d33f --- /dev/null +++ b/l10n/tr/contacts.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: lib/app.php:42 +msgid "This is not your addressbook." +msgstr "Bu sizin adres defteriniz deÄŸil." + +#: lib/app.php:51 photo.php:34 +msgid "Contact could not be found." +msgstr "KiÅŸi bulunamadı." + +#: lib/app.php:65 +msgid "vCard could not be read." +msgstr "vCard okunamadı." + +#: lib/app.php:79 +msgid "Information about vCard is incorrect. Please reload the page." +msgstr "vCard bilgileri doÄŸru deÄŸil. Lütfen sayfayı yenileyin." + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "Adres" + +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "Telefon" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "Eposta" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "Organizasyon" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "Ä°ÅŸ" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "Ev" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:114 +msgid "Text" +msgstr "Metin" + +#: lib/app.php:115 +msgid "Voice" +msgstr "Ses" + +#: lib/app.php:116 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:117 +msgid "Video" +msgstr "Video" + +#: lib/app.php:118 +msgid "Pager" +msgstr "Sayfalayıcı" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "Bu sizin kiÅŸiniz deÄŸil." + +#: photo.php:48 +msgid "This card is not RFC compatible." +msgstr "Bu kart RFC uyumlu deÄŸil." + +#: photo.php:85 +msgid "This card does not contain a photo." +msgstr "Bu kart resim içermiyor." + +#: templates/index.php:13 +msgid "Add Contact" +msgstr "KiÅŸi Ekle" + +#: templates/index.php:14 +msgid "Address Books" +msgstr "" + +#: templates/part.addcardform.php:8 +msgid "Group" +msgstr "Grup" + +#: templates/part.addcardform.php:19 +msgid "Name" +msgstr "Ad" + +#: templates/part.addcardform.php:41 +msgid "Number" +msgstr "" + +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" +msgstr "" + +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "Posta Kutusu" + +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "Uzatılmış" + +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "Sokak" + +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "Åžehir" + +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "Bölge" + +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "Posta kodu" + +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "Ãœlke" + +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "KiÅŸi OluÅŸtur" + +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" +msgstr "" + +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" +msgstr "" + +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" +msgstr "" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "Düzenle" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "Sil" + +#: templates/part.details.php:3 +msgid "Delete contact" +msgstr "" + +#: templates/part.details.php:33 +msgid "Add" +msgstr "" + +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" +msgstr "" + +#: templates/part.editaddressbook.php:12 +msgid "Displayname" +msgstr "" + +#: templates/part.editaddressbook.php:23 +msgid "Active" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Save" +msgstr "" + +#: templates/part.editaddressbook.php:29 +msgid "Submit" +msgstr "" + +#: templates/part.editaddressbook.php:30 +msgid "Cancel" +msgstr "" + +#: templates/part.property.php:3 +msgid "Birthday" +msgstr "DoÄŸum günü" + +#: templates/part.property.php:23 +msgid "Preferred" +msgstr "" + +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 +msgid "Phone" +msgstr "Telefon" + +#: templates/part.setpropertyform.php:57 +msgid "Update" +msgstr "" + + diff --git a/l10n/tr/core.po b/l10n/tr/core.po new file mode 100644 index 00000000000..64d503eecf2 --- /dev/null +++ b/l10n/tr/core.po @@ -0,0 +1,171 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "Parolanızı sıfırlamak için bir baÄŸlantı Eposta olarak gönderilecek." + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "Ä°stendi" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "GiriÅŸ baÅŸarısız!" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "Kullanıcı adı" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "Sıfırlama iste" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "Parolanız sıfırlandı" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "Yeni parola" + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "Parolayı sıfırla" + +#: strings.php:5 +msgid "Personal" +msgstr "KiÅŸisel" + +#: strings.php:6 +msgid "Users" +msgstr "Kullanıcılar" + +#: strings.php:7 +msgid "Apps" +msgstr "Uygulamalar" + +#: strings.php:8 +msgid "Admin" +msgstr "Yönetici" + +#: strings.php:9 +msgid "Help" +msgstr "Yardı" + +#: templates/404.php:12 +msgid "Cloud not found" +msgstr "Bulut bulunamadı" + +#: templates/installation.php:20 +msgid "Create an admin account" +msgstr "Bir yönetici hesabı oluÅŸturun" + +#: templates/installation.php:26 templates/login.php:12 +msgid "Password" +msgstr "Parola" + +#: templates/installation.php:32 +msgid "Advanced" +msgstr "GeliÅŸmiÅŸ" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "Veri klasörü" + +#: templates/installation.php:41 +msgid "Configure the database" +msgstr "Veritabanını ayarla" + +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 +msgid "will be used" +msgstr "kullanılacak" + +#: templates/installation.php:79 +msgid "Database user" +msgstr "Veritabanı kullanıcı adı" + +#: templates/installation.php:83 +msgid "Database password" +msgstr "Veritabanı parolası" + +#: templates/installation.php:87 +msgid "Database name" +msgstr "Veritabanı adı" + +#: templates/installation.php:93 +msgid "Database host" +msgstr "Veritabanı sunucusu" + +#: templates/installation.php:98 +msgid "Finish setup" +msgstr "Kurulumu tamamla" + +#: templates/layout.guest.php:35 +msgid "web services under your control" +msgstr "" + +#: templates/layout.user.php:34 +msgid "Log out" +msgstr "Çıkış yap" + +#: templates/layout.user.php:46 templates/layout.user.php:47 +msgid "Settings" +msgstr "Ayarlar" + +#: templates/login.php:5 +msgid "Lost your password?" +msgstr "Parolanızı mı unuttunuz?" + +#: templates/login.php:15 +msgid "remember" +msgstr "hatırla" + +#: templates/login.php:16 +msgid "Log in" +msgstr "" + +#: templates/logout.php:1 +msgid "You are logged out." +msgstr "Çıkış yaptınız." + +#: templates/part.pagenavi.php:3 +msgid "prev" +msgstr "önceki" + +#: templates/part.pagenavi.php:20 +msgid "next" +msgstr "sonraki" + + diff --git a/l10n/tr/files.po b/l10n/tr/files.po new file mode 100644 index 00000000000..3330007801e --- /dev/null +++ b/l10n/tr/files.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/upload.php:19 +msgid "There is no error, the file uploaded with success" +msgstr "Bir hata yok, dosya baÅŸarıyla yüklendi" + +#: ajax/upload.php:20 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" +msgstr "" +"Yüklenen dosya php.ini de belirtilen upload_max_filesize sınırını aşıyor" + +#: ajax/upload.php:21 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "Yüklenen dosya HTML formundaki MAX_FILE_SIZE sınırını aşıyor" + +#: ajax/upload.php:22 +msgid "The uploaded file was only partially uploaded" +msgstr "Yüklenen dosyanın sadece bir kısmı yüklendi" + +#: ajax/upload.php:23 +msgid "No file was uploaded" +msgstr "Hiç dosya yüklenmedi" + +#: ajax/upload.php:24 +msgid "Missing a temporary folder" +msgstr "Geçici bir klasör eksik" + +#: appinfo/app.php:8 +msgid "Files" +msgstr "Dosyalar" + +#: templates/admin.php:5 +msgid "Maximum upload size" +msgstr "Maksimum yükleme boyutu" + +#: templates/index.php:7 +msgid "New" +msgstr "" + +#: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 +msgid "Upload" +msgstr "Yükle" + +#: templates/index.php:35 +msgid "Nothing in here. Upload something!" +msgstr "Burada hiçbir ÅŸey yok. BirÅŸeyler yükleyin!" + +#: templates/index.php:43 +msgid "Name" +msgstr "Ad" + +#: templates/index.php:45 +msgid "Download" +msgstr "Ä°ndir" + +#: templates/index.php:49 +msgid "Size" +msgstr "Boyut" + +#: templates/index.php:50 +msgid "Modified" +msgstr "DeÄŸiÅŸtirilme" + +#: templates/index.php:50 +msgid "Delete" +msgstr "Sil" + +#: templates/index.php:58 +msgid "Upload too large" +msgstr "Yüklemeniz çok büyük" + +#: templates/index.php:60 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" +"Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu " +"aşıyor." + + diff --git a/l10n/tr/media.po b/l10n/tr/media.po new file mode 100644 index 00000000000..03f15722ccd --- /dev/null +++ b/l10n/tr/media.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: appinfo/app.php:32 +msgid "Music" +msgstr "Müzik" + +#: templates/music.php:3 templates/player.php:13 +msgid "Play" +msgstr "Oynat" + +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 +msgid "Pause" +msgstr "Beklet" + +#: templates/music.php:5 +msgid "Previous" +msgstr "Önceki" + +#: templates/music.php:6 templates/player.php:15 +msgid "Next" +msgstr "Sonraki" + +#: templates/music.php:7 +msgid "Mute" +msgstr "Sesi kapat" + +#: templates/music.php:8 +msgid "Unmute" +msgstr "Sesi aç" + +#: templates/music.php:25 +msgid "Rescan Collection" +msgstr "Koleksiyonu Tara" + +#: templates/music.php:37 +msgid "Artist" +msgstr "Sanatç" + +#: templates/music.php:38 +msgid "Album" +msgstr "Albüm" + +#: templates/music.php:39 +msgid "Title" +msgstr "BaÅŸlık" + + diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po new file mode 100644 index 00000000000..58aefca15f5 --- /dev/null +++ b/l10n/tr/settings.po @@ -0,0 +1,153 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aranel Surion , 2011. +msgid "" +msgstr "" +"Project-Id-Version: ownCloud\n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" +"Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/team/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" + +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 +msgid "Invalid request" +msgstr "Geçersiz istek" + +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID DeÄŸiÅŸtirildi" + +#: ajax/setlanguage.php:14 +msgid "Language changed" +msgstr "Dil deÄŸiÅŸtirildi" + +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + +#: templates/apps.php:8 +msgid "Add your application" +msgstr "Uygulamanızı ekleyin" + +#: templates/apps.php:21 +msgid "Select an App" +msgstr "Bir uygulama seçin" + +#: templates/apps.php:23 +msgid "-licensed" +msgstr "-lisanslı" + +#: templates/apps.php:23 +msgid "by" +msgstr "yapan" + +#: templates/help.php:8 +msgid "Ask a question" +msgstr "Bir soru sorun" + +#: templates/help.php:20 +msgid "Problems connecting to help database." +msgstr "Yardım veritabanına baÄŸlanmada sorunlar var." + +#: templates/help.php:21 +msgid "Go there manually." +msgstr "Oraya elle gidin." + +#: templates/help.php:29 +msgid "Answer" +msgstr "Cevap" + +#: templates/personal.php:8 +msgid "You use" +msgstr "Kullanıyorsunuz" + +#: templates/personal.php:8 +msgid "of the available" +msgstr "mevcut olandan" + +#: templates/personal.php:13 +msgid "Your password got changed" +msgstr "Parolanız deÄŸiÅŸtirildi" + +#: templates/personal.php:14 +msgid "Unable to change your password" +msgstr "Parolanız deÄŸiÅŸtirilemiyor" + +#: templates/personal.php:15 +msgid "Current password" +msgstr "Mevcut parola" + +#: templates/personal.php:16 +msgid "New password" +msgstr "Yeni parola" + +#: templates/personal.php:17 +msgid "show" +msgstr "göster" + +#: templates/personal.php:18 +msgid "Change password" +msgstr "Parola deÄŸiÅŸtir" + +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 +msgid "Language" +msgstr "Dil" + +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:45 +msgid "use this address to connect to your ownCloud in your file manager" +msgstr "bu adresi kullanarak ownCloud unuza dosya yöneticinizle baÄŸlanın" + +#: templates/users.php:15 templates/users.php:30 +msgid "Name" +msgstr "Ad" + +#: templates/users.php:16 templates/users.php:31 +msgid "Password" +msgstr "Parola" + +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 +msgid "Groups" +msgstr "Gruplar" + +#: templates/users.php:23 +msgid "Create" +msgstr "OluÅŸtur" + +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 +msgid "Delete" +msgstr "Sil" + + diff --git a/l10n/zh_CN/contacts.po b/l10n/zh_CN/contacts.po index 1fd7ecb9646..ead574ce084 100644 --- a/l10n/zh_CN/contacts.po +++ b/l10n/zh_CN/contacts.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 20:10+0200\n" -"PO-Revision-Date: 2011-09-23 18:10+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:18+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,164 +18,222 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/addcard.php:31 ajax/addproperty.php:31 ajax/deletebook.php:32 -#: ajax/deletecard.php:32 ajax/deleteproperty.php:34 ajax/getdetails.php:32 -#: ajax/setproperty.php:32 ajax/showaddcard.php:30 ajax/showaddproperty.php:31 -#: ajax/showsetproperty.php:32 photo.php:32 -msgid "You need to log in." -msgstr "" - -#: ajax/addcard.php:37 +#: lib/app.php:42 msgid "This is not your addressbook." -msgstr "" +msgstr "è¿™ä¸æ˜¯æ‚¨çš„地å€ç°¿ã€‚" -#: ajax/addproperty.php:37 ajax/deletecard.php:39 ajax/deleteproperty.php:41 -#: ajax/getdetails.php:39 ajax/setproperty.php:38 ajax/showaddproperty.php:37 -#: ajax/showsetproperty.php:38 photo.php:39 +#: lib/app.php:51 photo.php:34 msgid "Contact could not be found." -msgstr "" +msgstr "无法找到è”系人。" -#: ajax/addproperty.php:43 ajax/deletebook.php:38 ajax/deletecard.php:45 -#: ajax/deleteproperty.php:47 ajax/getdetails.php:45 ajax/setproperty.php:44 -#: ajax/showaddproperty.php:43 ajax/showsetproperty.php:44 photo.php:45 -msgid "This is not your contact." -msgstr "" - -#: ajax/addproperty.php:50 ajax/deleteproperty.php:54 ajax/getdetails.php:52 -#: ajax/setproperty.php:51 ajax/showsetproperty.php:51 +#: lib/app.php:65 msgid "vCard could not be read." -msgstr "" +msgstr "vCard 无法读å–。" -#: ajax/deleteproperty.php:65 ajax/setproperty.php:62 -#: ajax/showsetproperty.php:62 +#: lib/app.php:79 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "" +msgstr "vCard çš„ä¿¡æ¯ä¸æ­£ç¡®ã€‚请é‡æ–°åŠ è½½é¡µé¢ã€‚" + +#: lib/app.php:91 templates/part.addcardform.php:56 +#: templates/part.property.php:45 templates/part.setpropertyform.php:7 +msgid "Address" +msgstr "地å€" -#: photo.php:53 +#: lib/app.php:92 templates/part.addcardform.php:37 +msgid "Telephone" +msgstr "电è¯" + +#: lib/app.php:93 templates/part.addcardform.php:31 +#: templates/part.property.php:16 templates/part.setpropertyform.php:51 +msgid "Email" +msgstr "电å­é‚®ä»¶" + +#: lib/app.php:94 templates/part.addcardform.php:23 +#: templates/part.property.php:9 templates/part.setpropertyform.php:54 +msgid "Organization" +msgstr "组织" + +#: lib/app.php:106 lib/app.php:113 +msgid "Work" +msgstr "工作" + +#: lib/app.php:107 lib/app.php:111 +msgid "Home" +msgstr "家庭" + +#: lib/app.php:112 +msgid "Mobile" +msgstr "移动电è¯" + +#: lib/app.php:114 +msgid "Text" +msgstr "文本" + +#: lib/app.php:115 +msgid "Voice" +msgstr "语音" + +#: lib/app.php:116 +msgid "Fax" +msgstr "传真" + +#: lib/app.php:117 +msgid "Video" +msgstr "视频" + +#: lib/app.php:118 +msgid "Pager" +msgstr "传呼机" + +#: photo.php:40 +msgid "This is not your contact." +msgstr "è¿™ä¸æ˜¯æ‚¨çš„è”系人。" + +#: photo.php:48 msgid "This card is not RFC compatible." -msgstr "" +msgstr "这张å片和RFC 标准ä¸å…¼å®¹ã€‚" -#: photo.php:90 +#: photo.php:85 msgid "This card does not contain a photo." -msgstr "" +msgstr "这张å片ä¸åŒ…å«ç…§ç‰‡ã€‚" -#: templates/index.php:8 +#: templates/index.php:13 msgid "Add Contact" +msgstr "添加è”系人" + +#: templates/index.php:14 +msgid "Address Books" msgstr "" -#: templates/part.addcardform.php:5 +#: templates/part.addcardform.php:8 msgid "Group" -msgstr "" +msgstr "分组" -#: templates/part.addcardform.php:12 templates/part.property.php:3 +#: templates/part.addcardform.php:19 msgid "Name" -msgstr "" +msgstr "å称" -#: templates/part.addcardform.php:14 -msgid "Create Contact" +#: templates/part.addcardform.php:41 +msgid "Number" msgstr "" -#: templates/part.addpropertyform.php:4 templates/part.property.php:40 -msgid "Address" +#: templates/part.addcardform.php:45 templates/part.addcardform.php:59 +#: templates/part.details.php:42 templates/part.details.php:78 +#: templates/part.setpropertyform.php:10 templates/part.setpropertyform.php:47 +msgid "Type" msgstr "" -#: templates/part.addpropertyform.php:5 -msgid "Telephone" -msgstr "" +#: templates/part.addcardform.php:65 templates/part.details.php:48 +#: templates/part.setpropertyform.php:16 +msgid "PO Box" +msgstr "邮箱" -#: templates/part.addpropertyform.php:6 templates/part.property.php:22 -msgid "Email" -msgstr "" +#: templates/part.addcardform.php:69 templates/part.details.php:52 +#: templates/part.setpropertyform.php:20 +msgid "Extended" +msgstr "扩展" -#: templates/part.addpropertyform.php:7 templates/part.property.php:15 -msgid "Organization" -msgstr "" +#: templates/part.addcardform.php:73 templates/part.details.php:56 +#: templates/part.setpropertyform.php:24 +msgid "Street" +msgstr "è¡—é“" -#: templates/part.addpropertyform.php:17 templates/part.addpropertyform.php:32 -msgid "Work" -msgstr "" +#: templates/part.addcardform.php:77 templates/part.details.php:60 +#: templates/part.setpropertyform.php:28 +msgid "City" +msgstr "城市" -#: templates/part.addpropertyform.php:18 templates/part.addpropertyform.php:30 -msgid "Home" -msgstr "" +#: templates/part.addcardform.php:81 templates/part.details.php:64 +#: templates/part.setpropertyform.php:32 +msgid "Region" +msgstr "地区" -#: templates/part.addpropertyform.php:20 templates/part.property.php:48 -#: templates/part.setpropertyform.php:5 -msgid "PO Box" -msgstr "" +#: templates/part.addcardform.php:85 templates/part.details.php:68 +#: templates/part.setpropertyform.php:36 +msgid "Zipcode" +msgstr "邮编" -#: templates/part.addpropertyform.php:21 templates/part.property.php:51 -#: templates/part.setpropertyform.php:6 -msgid "Extended" -msgstr "" +#: templates/part.addcardform.php:89 templates/part.details.php:72 +#: templates/part.setpropertyform.php:40 +msgid "Country" +msgstr "国家" -#: templates/part.addpropertyform.php:22 templates/part.property.php:54 -#: templates/part.setpropertyform.php:7 -msgid "Street" -msgstr "" +#: templates/part.addcardform.php:97 +msgid "Create Contact" +msgstr "创建è”系人" -#: templates/part.addpropertyform.php:23 templates/part.property.php:57 -#: templates/part.setpropertyform.php:8 -msgid "City" +#: templates/part.chooseaddressbook.php:1 +msgid "Choose active Address Books" msgstr "" -#: templates/part.addpropertyform.php:24 templates/part.property.php:60 -#: templates/part.setpropertyform.php:9 -msgid "Region" +#: templates/part.chooseaddressbook.php:16 +#: templates/part.editaddressbook.php:9 +msgid "New Address Book" msgstr "" -#: templates/part.addpropertyform.php:25 templates/part.property.php:63 -#: templates/part.setpropertyform.php:10 -msgid "Zipcode" +#: templates/part.chooseaddressbook.php:21 +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "CardDav Link" msgstr "" -#: templates/part.addpropertyform.php:26 templates/part.property.php:66 -#: templates/part.setpropertyform.php:11 -msgid "Country" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Download" msgstr "" -#: templates/part.addpropertyform.php:31 -msgid "Mobile" +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Edit" +msgstr "编辑" + +#: templates/part.chooseaddressbook.rowfields.php:5 +msgid "Delete" +msgstr "删除" + +#: templates/part.details.php:3 +msgid "Delete contact" msgstr "" -#: templates/part.addpropertyform.php:33 -msgid "Text" +#: templates/part.details.php:33 +msgid "Add" msgstr "" -#: templates/part.addpropertyform.php:34 -msgid "Voice" +#: templates/part.editaddressbook.php:9 +msgid "Edit Address Book" msgstr "" -#: templates/part.addpropertyform.php:35 -msgid "Fax" +#: templates/part.editaddressbook.php:12 +msgid "Displayname" msgstr "" -#: templates/part.addpropertyform.php:36 -msgid "Video" +#: templates/part.editaddressbook.php:23 +msgid "Active" msgstr "" -#: templates/part.addpropertyform.php:37 -msgid "Pager" +#: templates/part.editaddressbook.php:29 +msgid "Save" msgstr "" -#: templates/part.details.php:33 -msgid "Delete" +#: templates/part.editaddressbook.php:29 +msgid "Submit" msgstr "" -#: templates/part.details.php:34 -msgid "Add Property" +#: templates/part.editaddressbook.php:30 +msgid "Cancel" msgstr "" -#: templates/part.property.php:9 +#: templates/part.property.php:3 msgid "Birthday" +msgstr "生日" + +#: templates/part.property.php:23 +msgid "Preferred" msgstr "" -#: templates/part.property.php:29 +#: templates/part.property.php:23 templates/part.setpropertyform.php:45 msgid "Phone" -msgstr "" +msgstr "电è¯" -#: templates/part.setpropertyform.php:17 -msgid "Edit" +#: templates/part.setpropertyform.php:57 +msgid "Update" msgstr "" diff --git a/l10n/zh_CN/core.po b/l10n/zh_CN/core.po index 1d6281a1f51..147d4a8dd65 100644 --- a/l10n/zh_CN/core.po +++ b/l10n/zh_CN/core.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-23 18:17+0200\n" -"PO-Revision-Date: 2011-09-04 17:07+0000\n" -"Last-Translator: csslayer \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +18,51 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" +#: lostpassword/index.php:24 +msgid "Owncloud password reset" +msgstr "" + +#: lostpassword/templates/email.php:1 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:3 +msgid "You will receive a link to reset your password via Email." +msgstr "您将会收到包å«å¯ä»¥é‡ç½®å¯†ç é“¾æŽ¥çš„邮件。" + +#: lostpassword/templates/lostpassword.php:5 +msgid "Requested" +msgstr "已请求" + +#: lostpassword/templates/lostpassword.php:8 +msgid "Login failed!" +msgstr "登录失败ï¼" + +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:22 +#: templates/login.php:8 +msgid "Username" +msgstr "用户å" + +#: lostpassword/templates/lostpassword.php:14 +msgid "Request reset" +msgstr "请求é‡ç½®" + +#: lostpassword/templates/resetpassword.php:4 +msgid "Your password was reset" +msgstr "您的密ç å·²é‡ç½®" + +#: lostpassword/templates/resetpassword.php:5 +msgid "To login page" +msgstr "" + +#: lostpassword/templates/resetpassword.php:8 +msgid "New password" +msgstr "新密ç " + +#: lostpassword/templates/resetpassword.php:11 +msgid "Reset password" +msgstr "é‡ç½®å¯†ç " + #: strings.php:5 msgid "Personal" msgstr "个人" @@ -46,54 +91,50 @@ msgstr "未找到云" msgid "Create an admin account" msgstr "创建管ç†å‘˜è´¦å·" -#: templates/installation.php:21 -msgid "Username" -msgstr "用户å" - -#: templates/installation.php:22 +#: templates/installation.php:26 templates/login.php:12 msgid "Password" msgstr "密ç " -#: templates/installation.php:27 +#: templates/installation.php:32 +msgid "Advanced" +msgstr "高级" + +#: templates/installation.php:34 +msgid "Data folder" +msgstr "æ•°æ®ç›®å½•" + +#: templates/installation.php:41 msgid "Configure the database" msgstr "é…置数æ®åº“" -#: templates/installation.php:32 templates/installation.php:43 -#: templates/installation.php:53 +#: templates/installation.php:46 templates/installation.php:57 +#: templates/installation.php:67 msgid "will be used" msgstr "将被使用" -#: templates/installation.php:64 +#: templates/installation.php:79 msgid "Database user" msgstr "æ•°æ®åº“用户" -#: templates/installation.php:65 +#: templates/installation.php:83 msgid "Database password" msgstr "æ•°æ®åº“密ç " -#: templates/installation.php:66 +#: templates/installation.php:87 msgid "Database name" msgstr "æ•°æ®åº“å" -#: templates/installation.php:72 -msgid "Advanced" -msgstr "高级" - -#: templates/installation.php:75 +#: templates/installation.php:93 msgid "Database host" msgstr "æ•°æ®åº“主机" -#: templates/installation.php:76 -msgid "Data folder" -msgstr "æ•°æ®ç›®å½•" - -#: templates/installation.php:79 +#: templates/installation.php:98 msgid "Finish setup" msgstr "安装完æˆ" #: templates/layout.guest.php:35 -msgid "gives you freedom and control over your own data" -msgstr "自由掌控您的数æ®" +msgid "web services under your control" +msgstr "" #: templates/layout.user.php:34 msgid "Log out" @@ -103,38 +144,22 @@ msgstr "注销" msgid "Settings" msgstr "设置" -#: templates/login.php:4 +#: templates/login.php:5 msgid "Lost your password?" msgstr "忘记密ç ï¼Ÿ" -#: templates/login.php:9 templates/login.php:13 +#: templates/login.php:15 msgid "remember" msgstr "è®°ä½" +#: templates/login.php:16 +msgid "Log in" +msgstr "" + #: templates/logout.php:1 msgid "You are logged out." msgstr "您已注销。" -#: templates/lostpassword.php:3 -msgid "You will receive a link to reset your password via Email." -msgstr "您将通过邮件收到一个用于é‡ç½®å¯†ç çš„链接" - -#: templates/lostpassword.php:5 -msgid "Requested" -msgstr "请求已å‘é€" - -#: templates/lostpassword.php:8 -msgid "Login failed!" -msgstr "登陆失败ï¼" - -#: templates/lostpassword.php:10 -msgid "Username or Email" -msgstr "用户å或电å­é‚®ä»¶" - -#: templates/lostpassword.php:11 -msgid "Request reset" -msgstr "请求é‡ç½®" - #: templates/part.pagenavi.php:3 msgid "prev" msgstr "上一页" @@ -143,16 +168,4 @@ msgstr "上一页" msgid "next" msgstr "下一页" -#: templates/resetpassword.php:4 -msgid "Your password was reset" -msgstr "您的密ç å·²é‡ç½®" - -#: templates/resetpassword.php:6 -msgid "New password" -msgstr "新密ç " - -#: templates/resetpassword.php:7 -msgid "Reset password" -msgstr "é‡ç½®å¯†ç " - diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index 4a30d9d0c1f..89831a4b081 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" -"POT-Creation-Date: 2011-09-24 23:05+0200\n" -"PO-Revision-Date: 2011-09-24 21:05+0000\n" -"Last-Translator: JanCBorchardt \n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,33 +18,33 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/upload.php:24 +#: ajax/upload.php:19 msgid "There is no error, the file uploaded with success" -msgstr "" +msgstr "没有å‘生错误,文件上传æˆåŠŸã€‚" -#: ajax/upload.php:25 +#: ajax/upload.php:20 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini" -msgstr "" +msgstr "上传的文件大å°è¶…过了php.ini 中指定的upload_max_filesize" -#: ajax/upload.php:26 +#: ajax/upload.php:21 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form" -msgstr "" +msgstr "上传的文件超过了在HTML 表å•ä¸­æŒ‡å®šçš„MAX_FILE_SIZE" -#: ajax/upload.php:27 +#: ajax/upload.php:22 msgid "The uploaded file was only partially uploaded" -msgstr "" +msgstr "åªä¸Šä¼ äº†æ–‡ä»¶çš„一部分" -#: ajax/upload.php:28 +#: ajax/upload.php:23 msgid "No file was uploaded" -msgstr "" +msgstr "文件没有上传" -#: ajax/upload.php:29 +#: ajax/upload.php:24 msgid "Missing a temporary folder" -msgstr "" +msgstr "缺少临时目录" -#: appinfo/app.php:7 +#: appinfo/app.php:8 msgid "Files" msgstr "文件" @@ -52,43 +52,55 @@ msgstr "文件" msgid "Maximum upload size" msgstr "最大上传大å°" +#: templates/index.php:7 +msgid "New" +msgstr "" + #: templates/index.php:10 +msgid "Text file" +msgstr "" + +#: templates/index.php:11 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From the web" +msgstr "" + +#: templates/index.php:22 msgid "Upload" msgstr "上传" -#: templates/index.php:17 -msgid "New Folder" -msgstr "新建文件夹" - -#: templates/index.php:31 +#: templates/index.php:35 msgid "Nothing in here. Upload something!" msgstr "这里还什么都没有。上传些东西å§ï¼" -#: templates/index.php:39 +#: templates/index.php:43 msgid "Name" msgstr "å称" -#: templates/index.php:41 +#: templates/index.php:45 msgid "Download" msgstr "下载" -#: templates/index.php:45 +#: templates/index.php:49 msgid "Size" msgstr "大å°" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Modified" msgstr "修改日期" -#: templates/index.php:46 +#: templates/index.php:50 msgid "Delete" msgstr "删除" -#: templates/index.php:54 +#: templates/index.php:58 msgid "Upload too large" msgstr "上传文件过大" -#: templates/index.php:56 +#: templates/index.php:60 msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." diff --git a/l10n/zh_CN/media.po b/l10n/zh_CN/media.po index f80f1839a1d..868e222190d 100644 --- a/l10n/zh_CN/media.po +++ b/l10n/zh_CN/media.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 14:50+0200\n" -"PO-Revision-Date: 2011-09-03 12:53+0000\n" -"Last-Translator: csslayer \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +18,15 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: appinfo/app.php:31 +#: appinfo/app.php:32 msgid "Music" msgstr "音ä¹" -#: templates/music.php:3 +#: templates/music.php:3 templates/player.php:13 msgid "Play" msgstr "播放" -#: templates/music.php:4 templates/music.php:30 +#: templates/music.php:4 templates/music.php:26 templates/player.php:14 msgid "Pause" msgstr "æš‚åœ" @@ -33,7 +34,7 @@ msgstr "æš‚åœ" msgid "Previous" msgstr "å‰ä¸€é¦–" -#: templates/music.php:6 +#: templates/music.php:6 templates/player.php:15 msgid "Next" msgstr "åŽä¸€é¦–" @@ -45,11 +46,7 @@ msgstr "é™éŸ³" msgid "Unmute" msgstr "å–消é™éŸ³" -#: templates/music.php:28 -msgid "Songs scanned" -msgstr "歌曲已扫æ" - -#: templates/music.php:29 +#: templates/music.php:25 msgid "Rescan Collection" msgstr "é‡æ–°æ‰«æ收è—" diff --git a/l10n/zh_CN/settings.po b/l10n/zh_CN/settings.po index f960000e2fc..7a6daf187ec 100644 --- a/l10n/zh_CN/settings.po +++ b/l10n/zh_CN/settings.po @@ -2,14 +2,15 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # +# Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.kde.org/buglist.cgi?product=owncloud\n" -"POT-Creation-Date: 2011-09-03 15:07+0200\n" -"PO-Revision-Date: 2011-09-03 13:29+0000\n" -"Last-Translator: csslayer \n" +"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n" +"POT-Creation-Date: 2012-01-11 00:19+0100\n" +"PO-Revision-Date: 2012-01-10 23:43+0000\n" +"Last-Translator: icewind \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +18,26 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ajax/openid.php:13 ajax/setlanguage.php:13 -msgid "Authentication error" -msgstr "验è¯é”™è¯¯" - -#: ajax/openid.php:21 -msgid "OpenID Changed" -msgstr "OpenID 已修改" +#: ajax/lostpassword.php:14 +msgid "email Changed" +msgstr "" -#: ajax/openid.php:23 ajax/setlanguage.php:23 +#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:16 msgid "Invalid request" msgstr "éžæ³•è¯·æ±‚" -#: ajax/setlanguage.php:21 +#: ajax/openid.php:15 +msgid "OpenID Changed" +msgstr "OpenID 已修改" + +#: ajax/setlanguage.php:14 msgid "Language changed" msgstr "语言已修改" +#: templates/admin.php:13 +msgid "Log level" +msgstr "" + #: templates/apps.php:8 msgid "Add your application" msgstr "加入您的应用程åº" @@ -53,15 +58,15 @@ msgstr "ç”±" msgid "Ask a question" msgstr "æé—®" -#: templates/help.php:17 +#: templates/help.php:20 msgid "Problems connecting to help database." msgstr "连接帮助数æ®åº“错误 " -#: templates/help.php:18 +#: templates/help.php:21 msgid "Go there manually." msgstr "手动访问" -#: templates/help.php:26 +#: templates/help.php:29 msgid "Answer" msgstr "回答" @@ -97,35 +102,51 @@ msgstr "显示" msgid "Change password" msgstr "修改密ç " -#: templates/personal.php:24 templates/personal.php:25 +#: templates/personal.php:24 +msgid "Email" +msgstr "" + +#: templates/personal.php:25 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:26 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:32 templates/personal.php:33 msgid "Language" msgstr "语言" -#: templates/personal.php:30 -msgid "Help translating" -msgstr "帮助翻译" +#: templates/personal.php:38 +msgid "Help translate" +msgstr "" -#: templates/personal.php:36 +#: templates/personal.php:45 msgid "use this address to connect to your ownCloud in your file manager" msgstr "在文件管ç†å™¨ä¸­ä½¿ç”¨è¿™ä¸ªåœ°å€æ¥è¿žæŽ¥åˆ°æ‚¨çš„ ownCloud" -#: templates/users.php:16 +#: templates/users.php:15 templates/users.php:30 msgid "Name" msgstr "å称" -#: templates/users.php:17 +#: templates/users.php:16 templates/users.php:31 msgid "Password" msgstr "密ç " -#: templates/users.php:18 templates/users.php:36 +#: templates/users.php:17 templates/users.php:32 templates/users.php:46 msgid "Groups" msgstr "组" -#: templates/users.php:24 +#: templates/users.php:23 msgid "Create" msgstr "创建" -#: templates/users.php:48 +#: templates/users.php:33 +msgid "Quota" +msgstr "" + +#: templates/users.php:58 msgid "Delete" msgstr "删除" diff --git a/settings/l10n/ar.php b/settings/l10n/ar.php new file mode 100644 index 00000000000..a65dc2fe9bd --- /dev/null +++ b/settings/l10n/ar.php @@ -0,0 +1,28 @@ + "طلبك غير Ù…Ùهوم", +"OpenID Changed" => "تم تغيير ال OpenID", +"Language changed" => "تم تغيير اللغة", +"Add your application" => "أض٠تطبيقاتك", +"Select an App" => "إختر تطبيقاً", +"-licensed" => "-مسجل", +"by" => "من قبل", +"Ask a question" => "إسأل سؤال", +"Problems connecting to help database." => "الاتصال بقاعدة بيانات المساعدة لم يتم بنجاح", +"Go there manually." => "إذهب هنالك بنÙسك", +"Answer" => "الجواب", +"You use" => "أنت تستخدم", +"of the available" => "من الموجود", +"Your password got changed" => "لقد تم تغيير كلمات السر", +"Unable to change your password" => "لم يتم تعديل كلمة السر بنجاح", +"Current password" => "كلمات السر الحالية", +"New password" => "كلمات سر جديدة", +"show" => "أظهر", +"Change password" => "عدل كلمة السر", +"Language" => "اللغة", +"use this address to connect to your ownCloud in your file manager" => "إستخدم هذا العنوان للإتصال ب ownCloud داخل نظام الملÙات ", +"Name" => "الاسم", +"Password" => "كلمات السر", +"Groups" => "مجموعات", +"Create" => "انشئ", +"Delete" => "حذÙ" +); diff --git a/settings/l10n/bg_BG.php b/settings/l10n/bg_BG.php index 31afbf93485..0e8c79010a4 100644 --- a/settings/l10n/bg_BG.php +++ b/settings/l10n/bg_BG.php @@ -1,7 +1,6 @@ "Проблем Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñта", -"OpenID Changed" => "OpenID е Ñменено", "Invalid request" => "Ðевалидна заÑвка", +"OpenID Changed" => "OpenID е Ñменено", "Language changed" => "Езика е Ñменен", "Add your application" => "Добавете Ваша програма", "Select an App" => "Изберете програма", @@ -20,7 +19,6 @@ "show" => "показва", "Change password" => "ПромÑна на парола", "Language" => "Език", -"Help translating" => "Помогнете Ñ Ð¿Ñ€ÐµÐ²Ð¾Ð´Ð°", "use this address to connect to your ownCloud in your file manager" => "ползвай този Ð°Ð´Ñ€ÐµÑ Ð·Ð° връзка Ñ Ð’Ð°ÑˆÐ¸Ñ ownCloud във Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ Ð¼ÐµÐ½Ð¸Ð´Ð¶ÑŠÑ€", "Name" => "Име", "Password" => "Парола", diff --git a/settings/l10n/ca.php b/settings/l10n/ca.php index 95d84eeed9f..5f584c9b6c1 100644 --- a/settings/l10n/ca.php +++ b/settings/l10n/ca.php @@ -1,10 +1,9 @@ "Error d'autenticació", -"OpenID Changed" => "OpenID ha canviat", "Invalid request" => "Sol.licitud no vàlida", +"OpenID Changed" => "OpenID ha canviat", "Language changed" => "S'ha canviat l'idioma", "Add your application" => "Afegir una aplicació", -"Select an App" => "Sel·leccioneu una aplicació", +"Select an App" => "Seleccioneu una aplicació", "-licensed" => "- amb llicència", "by" => "per", "Ask a question" => "Feu una pregunta", @@ -14,12 +13,12 @@ "You use" => "Esteu usant", "of the available" => "del disponible", "Your password got changed" => "La contrasenya ha canviat", +"Unable to change your password" => "No s'ha pogut canviar la contrasenya", "Current password" => "contrasenya actual", "New password" => "Contrasenya nova", "show" => "mostra", "Change password" => "canvia la contrasenya", "Language" => "Idioma", -"Help translating" => "Ajudeu amb la traducció", "use this address to connect to your ownCloud in your file manager" => "useu aquesta adreça per connectar-vos a ownCloud des del gestor de fitxers", "Name" => "Nom", "Password" => "Contrasenya", diff --git a/settings/l10n/cs_CZ.php b/settings/l10n/cs_CZ.php index 8bbef78c038..3da0ef58525 100644 --- a/settings/l10n/cs_CZ.php +++ b/settings/l10n/cs_CZ.php @@ -1,7 +1,6 @@ "Chyba pÅ™i ověření", -"OpenID Changed" => "OpenID zmÄ›nÄ›n", "Invalid request" => "Chybný dotaz", +"OpenID Changed" => "OpenID zmÄ›nÄ›n", "Language changed" => "Jazyk byl zmÄ›nÄ›n", "Add your application" => "PÅ™idejte svou aplikaci", "Select an App" => "Vyberte aplikaci", @@ -20,7 +19,6 @@ "show" => "zobrazit", "Change password" => "ZmÄ›nit heslo", "Language" => "Jazyk", -"Help translating" => "Pomozte s pÅ™ekladem", "use this address to connect to your ownCloud in your file manager" => "tuto adresu použijte pro pÅ™ipojení k ownCloud ve VaÅ¡em správci souborů", "Name" => "Jméno", "Password" => "Heslo", diff --git a/settings/l10n/da.php b/settings/l10n/da.php index cb51f709a47..2362159f07f 100644 --- a/settings/l10n/da.php +++ b/settings/l10n/da.php @@ -1,25 +1,24 @@ "Godkendelsesfejl", -"OpenID Changed" => "OpenID ændret", "Invalid request" => "Ugyldig forespørgsel", +"OpenID Changed" => "OpenID ændret", "Language changed" => "Sprog ændret", "Add your application" => "Tilføj dit program", "Select an App" => "Vælg en App", "-licensed" => "-licenseret", "by" => "af", "Ask a question" => "Stil et spørgsmÃ¥l", -"Problems connecting to help database." => "Problemer med at forbinde til hjælpe-databasen", +"Problems connecting to help database." => "Problemer med at forbinde til hjælpe-databasen.", "Go there manually." => "GÃ¥ derhen manuelt.", "Answer" => "Svar", "You use" => "Du benytter", "of the available" => "af det tilgængelige", "Your password got changed" => "Din adgangskode er blevet ændret", +"Unable to change your password" => "Ude af stand til at ændre dit kodeord", "Current password" => "Nuværende adgangskode", "New password" => "Ny adgangskode", "show" => "vis", -"Change password" => "Skift password", +"Change password" => "Skift kodeord", "Language" => "Sprog", -"Help translating" => "Hjælp med at oversætte", "use this address to connect to your ownCloud in your file manager" => "benyt denne adresse til at forbinde til din ownCloud i din filbrowser", "Name" => "Navn", "Password" => "Kodeord", diff --git a/settings/l10n/de.php b/settings/l10n/de.php index 21f3a8f8aa0..ccc84a988a6 100644 --- a/settings/l10n/de.php +++ b/settings/l10n/de.php @@ -1,7 +1,6 @@ "Berechtigungsfehler", -"OpenID Changed" => "OpenID geändert", "Invalid request" => "Ungültige Anfrage", +"OpenID Changed" => "OpenID geändert", "Language changed" => "Sprache geändert", "Add your application" => "Eigene Anwendung hinzufügen", "Select an App" => "Wähle eine Anwendung aus", @@ -14,12 +13,12 @@ "You use" => "Du nutzt", "of the available" => "der verfügbaren", "Your password got changed" => "Dein Passwort wurde geändert", +"Unable to change your password" => "Passwort konnte nicht geändert werden", "Current password" => "Aktuelles Passwort", "New password" => "Neues Passwort", "show" => "zeigen", "Change password" => "Passwort ändern", "Language" => "Sprache", -"Help translating" => "Hilf bei der Ãœbersetzung", "use this address to connect to your ownCloud in your file manager" => "benutze diese Adresse, um deine ownCloud mit deinem Dateiverwalter zu verbinden", "Name" => "Name", "Password" => "Passwort", diff --git a/settings/l10n/el.php b/settings/l10n/el.php index 8d55698e0aa..cebc56d1200 100644 --- a/settings/l10n/el.php +++ b/settings/l10n/el.php @@ -1,8 +1,8 @@ "Σφάλμα ταυτοποίησης", -"OpenID Changed" => "Το OpenID άλλαξε", "Invalid request" => "ΆκυÏα αίτημα", +"OpenID Changed" => "Το OpenID άλλαξε", "Language changed" => "Η γλώσσα άλλαξε", +"Add your application" => "ΠÏοσθέστε την δική σας εφαÏμογή", "Select an App" => "Επιλέξτε μια εφαÏμογή", "-licensed" => "-με άδεια", "by" => "με", @@ -13,12 +13,12 @@ "You use" => "ΧÏησιμοποιείτε", "of the available" => "από τα διαθέσιμα", "Your password got changed" => "Ο κωδικός Ï€Ïόσβασής σας άλαλαξε", +"Unable to change your password" => "Δεν ήταν δυνατή η αλλαγή του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης", "Current password" => "ΤÏέχοντα κωδικό Ï€Ïόσβασης", "New password" => "Îέος κωδικός", "show" => "Εμφάνιση", "Change password" => "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης", "Language" => "Γλώσσα", -"Help translating" => "Βοηθήστε στη μετάφÏαση", "use this address to connect to your ownCloud in your file manager" => "χÏησιμοποιήστε αυτή τη διεÏθυνση για να συνδεθείτε στο ownCloud σας από το διαχειÏιστή αÏχείων σας", "Name" => "Όνομα", "Password" => "Κωδικός", diff --git a/settings/l10n/eo.php b/settings/l10n/eo.php new file mode 100644 index 00000000000..e1af753798d --- /dev/null +++ b/settings/l10n/eo.php @@ -0,0 +1,28 @@ + "Nevalida peto", +"OpenID Changed" => "La agordo de OpenID estas ÅanÄita", +"Language changed" => "La lingvo estas ÅanÄita", +"Add your application" => "Aldonu vian aplikaĵon", +"Select an App" => "Elekti aplikaĵon", +"-licensed" => "-permesila", +"by" => "de", +"Ask a question" => "Faru demandon", +"Problems connecting to help database." => "Problemoj okazis dum konektado al la helpa datumbazo.", +"Go there manually." => "Iri tien mane.", +"Answer" => "Respondi", +"You use" => "Vi uzas", +"of the available" => "el la disponeblaj", +"Your password got changed" => "Via pasvorto ÅanÄiÄis", +"Unable to change your password" => "Ne eblis ÅanÄi vian pasvorton", +"Current password" => "Nuna pasvorto", +"New password" => "Nova pasvorto", +"show" => "montri", +"Change password" => "ÅœanÄi la pasvorton", +"Language" => "Lingvo", +"use this address to connect to your ownCloud in your file manager" => "uzu ĉi tiun adreson por konektiÄi al via ownCloud per via dosieradministrilo", +"Name" => "Nomo", +"Password" => "Pasvorto", +"Groups" => "Grupoj", +"Create" => "Krei", +"Delete" => "Forigi" +); diff --git a/settings/l10n/es.php b/settings/l10n/es.php index 0459ae45366..526dc75793b 100644 --- a/settings/l10n/es.php +++ b/settings/l10n/es.php @@ -1,7 +1,6 @@ "Error de autentificación", -"OpenID Changed" => "OpenID Cambiado", "Invalid request" => "Solicitud no válida", +"OpenID Changed" => "OpenID Cambiado", "Language changed" => "Idioma cambiado", "Add your application" => "Añadir tu aplicación", "Select an App" => "Seleccionar una aplicación", @@ -14,13 +13,13 @@ "You use" => "Estás utilizando", "of the available" => "del total disponible de", "Your password got changed" => "Tu contraseña ha sido cambiada", +"Unable to change your password" => "No se pudo cambiar su contraseña", "Current password" => "Contraseña actual", "New password" => "Nueva contraseña:", "show" => "mostrar", "Change password" => "Cambiar contraseña", "Language" => "Idioma", -"Help translating" => "Ayuda a traducir", -"use this address to connect to your ownCloud in your file manager" => "usar esta dirección para conectar tu ownCloud en tu explorador de archivos", +"use this address to connect to your ownCloud in your file manager" => "utiliza esta dirección para conectar a tu ownCloud desde tu explorador de archivos", "Name" => "Nombre", "Password" => "Contraseña", "Groups" => "Grupos", diff --git a/settings/l10n/et_EE.php b/settings/l10n/et_EE.php index 0e849f9d82f..c01c8400ca8 100644 --- a/settings/l10n/et_EE.php +++ b/settings/l10n/et_EE.php @@ -1,7 +1,6 @@ "Autentimise viga", -"OpenID Changed" => "OpenID on muudetud", "Invalid request" => "Vigane päring", +"OpenID Changed" => "OpenID on muudetud", "Language changed" => "Keel on muudetud", "Add your application" => "Lisa oma programm", "Select an App" => "Vali programm", @@ -20,7 +19,6 @@ "show" => "näita", "Change password" => "Muuda parooli", "Language" => "Keel", -"Help translating" => "Abiinfo tõlkimine", "use this address to connect to your ownCloud in your file manager" => "kasuta seda aadressi oma ownCloudiga ühendamiseks failihalduriga", "Name" => "Nimi", "Password" => "Parool", diff --git a/settings/l10n/eu.php b/settings/l10n/eu.php new file mode 100644 index 00000000000..9926393dec3 --- /dev/null +++ b/settings/l10n/eu.php @@ -0,0 +1,28 @@ + "Baliogabeko eskaria", +"OpenID Changed" => "OpenID aldatuta", +"Language changed" => "Hizkuntza aldatuta", +"Add your application" => "Gehitu zure programa", +"Select an App" => "Aukeratu Programa bat", +"-licensed" => "lizentziarekin.", +"by" => " Egilea:", +"Ask a question" => "Egin galdera bat", +"Problems connecting to help database." => "Arazoak daude laguntza datubasera konektatzeko.", +"Go there manually." => "Joan hara eskuz.", +"Answer" => "Erantzun", +"You use" => "Erabiltzen ari zara ", +"of the available" => "eta guztira erabil dezakezu ", +"Your password got changed" => "Zure pasahitza aldatu da", +"Unable to change your password" => "Ezin izan da zure pasahitza aldatu", +"Current password" => "Uneko pasahitza", +"New password" => "Pasahitz berria", +"show" => "erakutsi", +"Change password" => "Aldatu pasahitza", +"Language" => "Hizkuntza", +"use this address to connect to your ownCloud in your file manager" => "erabili helbide hau zure fitxategi kudeatzailean zure ownCloudera konektatzeko", +"Name" => "Izena", +"Password" => "Pasahitza", +"Groups" => "Taldeak", +"Create" => "Sortu", +"Delete" => "Ezabatu" +); diff --git a/settings/l10n/fr.php b/settings/l10n/fr.php index 74efb60fca2..10b4b703e75 100644 --- a/settings/l10n/fr.php +++ b/settings/l10n/fr.php @@ -1,7 +1,6 @@ "Erreur d'authentification", -"OpenID Changed" => "Identifiant OpenID changé", "Invalid request" => "Requête invalide", +"OpenID Changed" => "Identifiant OpenID changé", "Language changed" => "Langue changée", "Add your application" => "Ajoutez votre application", "Select an App" => "Sélectionner une Application", @@ -12,7 +11,7 @@ "Go there manually." => "S'y rendre manuellement.", "Answer" => "Réponse", "You use" => "Vous utilisez", -"of the available" => "sur un total de", +"of the available" => "d'espace de stockage sur un total de", "Your password got changed" => "Votre mot de passe a été changé", "Unable to change your password" => "Impossible de changer votre mot de passe", "Current password" => "Mot de passe actuel", @@ -20,7 +19,6 @@ "show" => "Afficher", "Change password" => "Changer de mot de passe", "Language" => "Langue", -"Help translating" => "Aider à traduire", "use this address to connect to your ownCloud in your file manager" => "utilisez cette adresse pour vous connecter à votre ownCloud depuis un explorateur de fichiers", "Name" => "Nom", "Password" => "Mot de passe", diff --git a/settings/l10n/he.php b/settings/l10n/he.php new file mode 100644 index 00000000000..beec6ed4eb9 --- /dev/null +++ b/settings/l10n/he.php @@ -0,0 +1,28 @@ + "בקשה ×œ× ×—×•×§×™×ª", +"OpenID Changed" => "OpenID השתנה", +"Language changed" => "שפה השתנתה", +"Add your application" => "הוספת ×”×™×™×©×•× ×©×œ×š", +"Select an App" => "בחירת יישו×", +"-licensed" => "רשיון", +"by" => "מ×ת", +"Ask a question" => "ש×ל ש×לה", +"Problems connecting to help database." => "בעיות בהתחברות לבסיס נתוני העזרה", +"Go there manually." => "גש ×œ×©× ×‘×ופן ידני", +"Answer" => "מענה", +"You use" => "הנך משתמש ", +"of the available" => "מתוך ", +"Your password got changed" => "הססמה שלך שונתה", +"Unable to change your password" => "×œ× × ×™×ª×Ÿ לשנות ×ת הססמה שלך", +"Current password" => "ססמה נוכחית", +"New password" => "ססמה חדשה", +"show" => "הצגה", +"Change password" => "שינוי ססמה", +"Language" => "פה", +"use this address to connect to your ownCloud in your file manager" => "השתמש בכתובת זו כדי להתחבר ל־ownCloude שלך ממנהל הקבצי×", +"Name" => "ש×", +"Password" => "ססמה", +"Groups" => "קבוצות", +"Create" => "יצירה", +"Delete" => "מחיקה" +); diff --git a/settings/l10n/hr.php b/settings/l10n/hr.php new file mode 100644 index 00000000000..4e5ed4bc1bc --- /dev/null +++ b/settings/l10n/hr.php @@ -0,0 +1,28 @@ + "Neispravan zahtjev", +"OpenID Changed" => "OpenID promijenjen", +"Language changed" => "Jezik promijenjen", +"Add your application" => "Dodajte vaÅ¡u aplikaciju", +"Select an App" => "Odaberite Aplikaciju", +"-licensed" => "-licencirano", +"by" => "od", +"Ask a question" => "Postavite pitanje", +"Problems connecting to help database." => "Problem pri spajanju na bazu podataka pomoći", +"Go there manually." => "Idite tamo ruÄno.", +"Answer" => "Odgovor", +"You use" => "Koristite", +"of the available" => "od dostupno", +"Your password got changed" => "VaÅ¡a lozinka je promijenjena", +"Unable to change your password" => "Nemoguće promijeniti lozinku", +"Current password" => "Trenutna lozinka", +"New password" => "Nova lozinka", +"show" => "prikaz", +"Change password" => "Izmjena lozinke", +"Language" => "Jezik", +"use this address to connect to your ownCloud in your file manager" => "koristite ovu adresu za spajanje na Cloud u vaÅ¡em upravitelju datoteka", +"Name" => "Ime", +"Password" => "Lozinka", +"Groups" => "Grupe", +"Create" => "Izradi", +"Delete" => "ObriÅ¡i" +); diff --git a/settings/l10n/hu_HU.php b/settings/l10n/hu_HU.php new file mode 100644 index 00000000000..a2e468e5170 --- /dev/null +++ b/settings/l10n/hu_HU.php @@ -0,0 +1,25 @@ + "Érvénytelen kérés", +"OpenID Changed" => "OpenID megváltozott", +"Language changed" => "A nyelv megváltozott", +"Add your application" => "Alkalmazásod hozzáadása", +"Select an App" => "Egy App kiválasztása", +"-licensed" => "-licenszelt", +"Ask a question" => "Tégy fel egy kérdést", +"Go there manually." => "Menj oda kézzel", +"Answer" => "Válasz", +"of the available" => "a rendelkezésre álló", +"Your password got changed" => "A jelszó megváltozott", +"Unable to change your password" => "Nem lehet megváltoztatni a jelszavad", +"Current password" => "Jelenlegi jelszó", +"New password" => "Új jelszó", +"show" => "Mutatás", +"Change password" => "Jelszó megváltoztatása", +"Language" => "Nyelv", +"use this address to connect to your ownCloud in your file manager" => "Használd ezt a címet hogy csatlakozz a saját ownCloud rendszeredhez a fájlkezelÅ‘dben", +"Name" => "Név", +"Password" => "Jelszó", +"Groups" => "Csoportok", +"Create" => "Létrehozás", +"Delete" => "Törlés" +); diff --git a/settings/l10n/ia.php b/settings/l10n/ia.php new file mode 100644 index 00000000000..85ff0696ef8 --- /dev/null +++ b/settings/l10n/ia.php @@ -0,0 +1,21 @@ + "OpenID cambiate", +"Language changed" => "Linguage cambiate", +"Add your application" => "Adder tu application", +"Select an App" => "Selectionar un app", +"by" => "per", +"Ask a question" => "Facer un question", +"Answer" => "Responsa", +"Your password got changed" => "Tu contrasigno esseva cambiate", +"Unable to change your password" => "Non pote cambiar tu contrasigno", +"Current password" => "Contrasigno currente", +"New password" => "Nove contrasigno", +"show" => "monstrar", +"Change password" => "Cambiar contrasigno", +"Language" => "Linguage", +"Name" => "Nomine", +"Password" => "Contrasigno", +"Groups" => "Gruppos", +"Create" => "Crear", +"Delete" => "Deler" +); diff --git a/settings/l10n/id.php b/settings/l10n/id.php index b6909f914f9..c361b504d74 100644 --- a/settings/l10n/id.php +++ b/settings/l10n/id.php @@ -1,7 +1,6 @@ "Otentikasi bermasalah", -"OpenID Changed" => "OpenID telah dirubah", "Invalid request" => "Permintaan tidak valid", +"OpenID Changed" => "OpenID telah dirubah", "Language changed" => "Bahasa telah diganti", "Add your application" => "Tambahkan aplikasi anda", "Select an App" => "Pilih satu aplikasi", @@ -14,12 +13,12 @@ "You use" => "Anda menggunakan", "of the available" => "dari yang tersedia", "Your password got changed" => "Password anda telah dirubah", +"Unable to change your password" => "Tidak dapat merubah password anda", "Current password" => "Password saat ini", "New password" => "Password baru", "show" => "perlihatkan", "Change password" => "Rubah password", "Language" => "Bahasa", -"Help translating" => "Bantu terjemahkan", "use this address to connect to your ownCloud in your file manager" => "gunakan alamat ini untuk terhubung dengan ownCloud anda dalam file manager anda", "Name" => "Nama", "Password" => "Password", diff --git a/settings/l10n/it.php b/settings/l10n/it.php index 54f6c019ba2..59b341851e6 100644 --- a/settings/l10n/it.php +++ b/settings/l10n/it.php @@ -1,11 +1,10 @@ "Errore nell'autenticazione", -"OpenID Changed" => "OpenID Modificato", "Invalid request" => "Richiesta non valida", +"OpenID Changed" => "OpenID Modificato", "Language changed" => "Lingua modificata", "Add your application" => "Aggiungi un applicazione", "Select an App" => "Seleziona un applicazione", -"-licensed" => "-licensed", +"-licensed" => "-rilasciato", "by" => "da", "Ask a question" => "Fai una domanda", "Problems connecting to help database." => "Problemi di connessione al database di aiuto", @@ -20,7 +19,6 @@ "show" => "mostra", "Change password" => "Modifica password", "Language" => "Lingua", -"Help translating" => "Aiuta nella traduzione", "use this address to connect to your ownCloud in your file manager" => "usa questo indirizzo per connettersi al proprio ownCloud nel tuo file manager", "Name" => "Nome", "Password" => "Password", diff --git a/settings/l10n/ja_JP.php b/settings/l10n/ja_JP.php new file mode 100644 index 00000000000..fe4eda3a13a --- /dev/null +++ b/settings/l10n/ja_JP.php @@ -0,0 +1,28 @@ + "無効ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã§ã™", +"OpenID Changed" => "OpenIDãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ", +"Language changed" => "言語ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ", +"Add your application" => "アプリを追加ã—ã¦ãã ã•ã„", +"Select an App" => "アプリをé¸æŠžã—ã¦ãã ã•ã„", +"-licensed" => "権利をä¿æŒã•ã‚Œã¦ã„ã¾ã™", +"by" => "ã«ã‚ˆã£ã¦", +"Ask a question" => "質å•ã—ã¦ãã ã•ã„", +"Problems connecting to help database." => "ヘルプ用データベース接続ã«å•é¡ŒãŒç”Ÿã˜ã¾ã—ãŸ", +"Go there manually." => "手動ã§ç§»å‹•ã—ã¦ãã ã•ã„", +"Answer" => "解答", +"You use" => "ã‚ãªãŸãŒä½¿ã£ã¦ã„ã‚‹ã®ã¯", +"of the available" => "ã§ã™ã€‚利用å¯èƒ½å®¹é‡ã¯", +"Your password got changed" => "パスワードã¯å¤‰æ›´ã•ã‚Œã¾ã—ãŸ", +"Unable to change your password" => "パスワードを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“", +"Current password" => "ç¾åœ¨ã®ãƒ‘スワード", +"New password" => "æ–°ã—ã„パスワード", +"show" => "表示", +"Change password" => "パスワードを変更ã™ã‚‹", +"Language" => "言語", +"use this address to connect to your ownCloud in your file manager" => "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§ã‚ãªãŸã®ownCloudã«æŽ¥ç¶šã™ã‚‹ã¨ãã¯ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’使用ã—ã¦ãã ã•ã„", +"Name" => "åå‰", +"Password" => "パスワード", +"Groups" => "グループ", +"Create" => "作æˆ", +"Delete" => "削除" +); diff --git a/settings/l10n/lb.php b/settings/l10n/lb.php index f6188cec626..03d15e31184 100644 --- a/settings/l10n/lb.php +++ b/settings/l10n/lb.php @@ -1,7 +1,6 @@ "Authentifikatioun's Feeler", -"OpenID Changed" => "OpenID huet geännert", "Invalid request" => "Ongülteg Requête", +"OpenID Changed" => "OpenID huet geännert", "Language changed" => "Sprooch huet geännert", "Add your application" => "Sätz deng Applikatioun bäi", "Select an App" => "Wiel eng Applikatioun aus", @@ -20,7 +19,6 @@ "show" => "weisen", "Change password" => "Passwuert änneren", "Language" => "Sprooch", -"Help translating" => "Hëllef ze Iwwersetzen", "use this address to connect to your ownCloud in your file manager" => "benotz dës Adress fir dech un deng ownCloud iwwert däin Datei Manager ze verbannen", "Name" => "Numm", "Password" => "Passwuert", diff --git a/settings/l10n/lt_LT.php b/settings/l10n/lt_LT.php new file mode 100644 index 00000000000..3d01d0788ac --- /dev/null +++ b/settings/l10n/lt_LT.php @@ -0,0 +1,26 @@ + "Klaidinga užklausa", +"OpenID Changed" => "OpenID pakeistas", +"Language changed" => "Kalba pakeista", +"Add your application" => "PridÄ—ti jÅ«sų programÄ…", +"Select an App" => "Pasirinkite programÄ…", +"-licensed" => "-licencijuota", +"Ask a question" => "Užduoti klausimÄ…", +"Problems connecting to help database." => "Problemos jungiantis prie duomenų bazÄ—s", +"Answer" => "Atsakyti", +"You use" => "JÅ«s naudojate", +"of the available" => "iÅ¡ galimų", +"Your password got changed" => "JÅ«sų slaptažodis buvo pakeistas", +"Unable to change your password" => "Neįmanoma pakeisti slaptažodžio", +"Current password" => "Dabartinis slaptažodis", +"New password" => "Naujas slaptažodis", +"show" => "rodyti", +"Change password" => "Pakeisti slaptažodį", +"Language" => "Kalba", +"use this address to connect to your ownCloud in your file manager" => "naudokite šį adresÄ…, jei norite pasiekti savo ownCloud per failų tvarkyklÄ™", +"Name" => "Vardas", +"Password" => "Slaptažodis", +"Groups" => "GrupÄ—s", +"Create" => "Sukurti", +"Delete" => "IÅ¡trinti" +); diff --git a/settings/l10n/ms_MY.php b/settings/l10n/ms_MY.php index fbe910ff219..3533a804d20 100644 --- a/settings/l10n/ms_MY.php +++ b/settings/l10n/ms_MY.php @@ -1,7 +1,6 @@ "Ralat pengesahan", -"OpenID Changed" => "OpenID ditukar", "Invalid request" => "Permintaan tidak sah", +"OpenID Changed" => "OpenID ditukar", "Language changed" => "Bahasa ditukar", "Add your application" => "Tambah aplikasi anda", "Select an App" => "Pilih aplikasi", @@ -20,7 +19,6 @@ "show" => "Papar", "Change password" => "Tukar kata laluan", "Language" => "Bahasa", -"Help translating" => "Bantu perterjemahan", "use this address to connect to your ownCloud in your file manager" => "guna alamat ini untuk menyambung owncloud anda dalam pengurus fail anda", "Name" => "Nama", "Password" => "Kata laluan ", diff --git a/settings/l10n/nb_NO.php b/settings/l10n/nb_NO.php index 8d2d1506327..c27124bde0d 100644 --- a/settings/l10n/nb_NO.php +++ b/settings/l10n/nb_NO.php @@ -1,7 +1,6 @@ "Autentifikasjonsfeil", -"OpenID Changed" => "OpenID endret", "Invalid request" => "Ugyldig forespørsel", +"OpenID Changed" => "OpenID endret", "Language changed" => "SprÃ¥k endret", "Add your application" => "Legg til din applikasjon", "Select an App" => "Velg en app", @@ -20,7 +19,6 @@ "show" => "vis", "Change password" => "Endre passord", "Language" => "SprÃ¥k", -"Help translating" => "Hjelp oss Ã¥ oversett", "use this address to connect to your ownCloud in your file manager" => "bruk denne adressen for Ã¥ koble til din ownCloud gjennom filhÃ¥ndtereren", "Name" => "Navn", "Password" => "Passord", diff --git a/settings/l10n/nl.php b/settings/l10n/nl.php index 36b37ca720b..2061e8f6f6d 100644 --- a/settings/l10n/nl.php +++ b/settings/l10n/nl.php @@ -1,23 +1,25 @@ "Authenticatiefout.", -"OpenID Changed" => "OpenID is aangepast", "Invalid request" => "Ongeldig verzoek", +"OpenID Changed" => "OpenID is aangepast", "Language changed" => "Taal aangepast", -"Select an App" => "Selecteer een App", -"-licensed" => "-gelicenseerd", +"Add your application" => "Voeg uw applicatie toe", +"Select an App" => "Selecteer een app", +"-licensed" => "-gelicentieerd", "by" => "door", "Ask a question" => "Stel een vraag", +"Problems connecting to help database." => "Problemen bij het verbinden met de helpdatabank.", +"Go there manually." => "Ga er zelf heen.", "Answer" => "Beantwoord", "You use" => "U gebruikt", "of the available" => "van de beschikbare", "Your password got changed" => "Uw wachtwoord is aangepast", +"Unable to change your password" => "Niet in staat om uw wachtwoord te wijzigen", "Current password" => "Huidig wachtwoord", "New password" => "Nieuw wachtwoord", "show" => "weergeven", -"Change password" => "Verander wachtwoord", +"Change password" => "Wijzig wachtwoord", "Language" => "Taal", -"Help translating" => "Help met vertalen", -"use this address to connect to your ownCloud in your file manager" => "gebruik dit adres om verbinding te maken met ownCloud in uw bestandsbeheer programa", +"use this address to connect to your ownCloud in your file manager" => "gebruik dit adres om verbinding te maken met ownCloud in uw bestandsbeheerprogramma", "Name" => "Naam", "Password" => "Wachtwoord", "Groups" => "Groepen", diff --git a/settings/l10n/nn_NO.php b/settings/l10n/nn_NO.php new file mode 100644 index 00000000000..8ce46caa89a --- /dev/null +++ b/settings/l10n/nn_NO.php @@ -0,0 +1,28 @@ + "Ugyldig førespurnad", +"OpenID Changed" => "OpenID endra", +"Language changed" => "SprÃ¥k endra", +"Add your application" => "Legg til applikasjonen din", +"Select an App" => "Vel ein applikasjon", +"-licensed" => "-lisensiert", +"by" => "av", +"Ask a question" => "Spør om noko", +"Problems connecting to help database." => "Problem ved tilkopling til hjelpedatabasen.", +"Go there manually." => "GÃ¥ der pÃ¥ eigen hand.", +"Answer" => "Svar", +"You use" => "Du bruker", +"of the available" => "av dei tilgjengelege", +"Your password got changed" => "Passordet ditt er endra", +"Unable to change your password" => "Klarte ikkje Ã¥ endra passordet", +"Current password" => "Passord", +"New password" => "Nytt passord", +"show" => "vis", +"Change password" => "Endra passord", +"Language" => "SprÃ¥k", +"use this address to connect to your ownCloud in your file manager" => "bruk denne adressa for Ã¥ kopla til ownCloud i filhandsamaren din", +"Name" => "Namn", +"Password" => "Passord", +"Groups" => "Grupper", +"Create" => "Lag", +"Delete" => "Slett" +); diff --git a/settings/l10n/pl.php b/settings/l10n/pl.php index cfd52cb3475..3f65a6b928e 100644 --- a/settings/l10n/pl.php +++ b/settings/l10n/pl.php @@ -1,7 +1,6 @@ "BÅ‚Ä…d uwierzytelniania", -"OpenID Changed" => "Zmieniono OpenID", "Invalid request" => "NieprawidÅ‚owe żądanie", +"OpenID Changed" => "Zmieniono OpenID", "Language changed" => "JÄ™zyk zmieniony", "Add your application" => "Dodaj wÅ‚asnÄ… aplikacje", "Select an App" => "Zaznacz aplikacje", @@ -14,12 +13,12 @@ "You use" => "Używasz", "of the available" => "z dostÄ™pnych", "Your password got changed" => "Twoje hasÅ‚o zostaÅ‚o zmienione", +"Unable to change your password" => "Nie można zmienić hasÅ‚a", "Current password" => "Bieżące hasÅ‚o", "New password" => "Nowe hasÅ‚o", "show" => "pokaż", "Change password" => "ZmieÅ„ hasÅ‚o", "Language" => "JÄ™zyk", -"Help translating" => "Pomóż w tÅ‚umaczeniu", "use this address to connect to your ownCloud in your file manager" => "użyj tego adresu żeby poÅ‚Ä…czyć siÄ™ z twoim kontem ownCloud w menedżerze plików.", "Name" => "Nazwa", "Password" => "HasÅ‚o", diff --git a/settings/l10n/pt_BR.php b/settings/l10n/pt_BR.php index f0988e9a8e6..51fa7e65a2c 100644 --- a/settings/l10n/pt_BR.php +++ b/settings/l10n/pt_BR.php @@ -1,7 +1,6 @@ "Erro de autenticação", -"OpenID Changed" => "Mudou OpenID", "Invalid request" => "Pedido inválido", +"OpenID Changed" => "Mudou OpenID", "Language changed" => "Mudou Idioma", "Add your application" => "Adicionar o seu aplicativo", "Select an App" => "Selecione uma Aplicação", @@ -20,7 +19,6 @@ "show" => "mostrar", "Change password" => "Alterar senha", "Language" => "Idioma", -"Help translating" => "Ajuda na Tradução", "use this address to connect to your ownCloud in your file manager" => "use este endereço para se conectar ao seu ownCloud no seu gerenciador de arquvos", "Name" => "Nome", "Password" => "Senha", diff --git a/settings/l10n/ro.php b/settings/l10n/ro.php index 861bd42961b..e8fe39a2fa6 100644 --- a/settings/l10n/ro.php +++ b/settings/l10n/ro.php @@ -1,7 +1,6 @@ "Eroare autentificare", -"OpenID Changed" => "OpenID schimbat", "Invalid request" => "Cerere eronată", +"OpenID Changed" => "OpenID schimbat", "Language changed" => "Limba a fost schimbată", "Add your application" => "Adaugă propria ta aplicaÈ›ie", "Select an App" => "Selectează o aplicaÈ›ie", @@ -20,7 +19,6 @@ "show" => "arată", "Change password" => "Schimbă parola", "Language" => "Limba", -"Help translating" => "Ajută la traducere", "use this address to connect to your ownCloud in your file manager" => "foloseÈ™te această adresă pentru a te conecta la managerul tău de fiÈ™iere din ownCloud", "Name" => "Nume", "Password" => "Parola", diff --git a/settings/l10n/ru.php b/settings/l10n/ru.php index 96ca95e583f..a8faeb780f8 100644 --- a/settings/l10n/ru.php +++ b/settings/l10n/ru.php @@ -1,7 +1,6 @@ "Ошибка аутентификации", -"OpenID Changed" => "OpenID был изменён", "Invalid request" => "Ðеверный запроÑ", +"OpenID Changed" => "OpenID был изменён", "Language changed" => "Язык изменён", "Add your application" => "Добавить ваше приложение", "Select an App" => "Выберите приложение", @@ -20,7 +19,6 @@ "show" => "показать", "Change password" => "Сменить пароль", "Language" => "Язык", -"Help translating" => "Помощь Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð¾Ð¼", "use this address to connect to your ownCloud in your file manager" => "иÑпользуйте данный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº ownCloud в вашем файловом менеджере", "Name" => "ИмÑ", "Password" => "Пароль", diff --git a/settings/l10n/sk_SK.php b/settings/l10n/sk_SK.php new file mode 100644 index 00000000000..08424ab24c8 --- /dev/null +++ b/settings/l10n/sk_SK.php @@ -0,0 +1,28 @@ + "Neplatná požiadavka", +"OpenID Changed" => "OpenID zmenené", +"Language changed" => "Jazyk zmenený", +"Add your application" => "Pridajte svoju aplikáciu", +"Select an App" => "Vyberte Aplikáciu", +"-licensed" => "-licencované", +"by" => "od", +"Ask a question" => "Opýtajte sa otázku", +"Problems connecting to help database." => "Problémy spojené s pomocnou databázou.", +"Go there manually." => "PrejsÅ¥ tam ruÄne.", +"Answer" => "OdpoveÄ", +"You use" => "Používate", +"of the available" => "z dostupných", +"Your password got changed" => "VaÅ¡e heslo sa zmenilo", +"Unable to change your password" => "Nedokážem zmeniÅ¥ vaÅ¡e heslo", +"Current password" => "Aktuálne heslo", +"New password" => "Nové heslo", +"show" => "zobraziÅ¥", +"Change password" => "ZmeniÅ¥ heslo", +"Language" => "Jazyk", +"use this address to connect to your ownCloud in your file manager" => "použite túto adresu pre spojenie s vaším ownCloud v správcovi súborov", +"Name" => "Meno", +"Password" => "Heslo", +"Groups" => "Skupiny", +"Create" => "VytvoriÅ¥", +"Delete" => "OdstrániÅ¥" +); diff --git a/settings/l10n/sl.php b/settings/l10n/sl.php new file mode 100644 index 00000000000..9cd2d99fe3b --- /dev/null +++ b/settings/l10n/sl.php @@ -0,0 +1,28 @@ + "Neveljavna zahteva", +"OpenID Changed" => "OpenID spremenjen", +"Language changed" => "Jezik je bil spremenjen", +"Add your application" => "Dodaj vaÅ¡o aplikacijo", +"Select an App" => "Izberi aplikacijo", +"-licensed" => "-licenca", +"by" => "od", +"Ask a question" => "VpraÅ¡aj", +"Problems connecting to help database." => "Težave pri povezovanju z zbirko podatkov.", +"Go there manually." => "Pojdi tja roÄno.", +"Answer" => "Odgovor", +"You use" => "Uporabljate", +"of the available" => "od narazpolago", +"Your password got changed" => "VaÅ¡e geslo je bilo spremenjeno.", +"Unable to change your password" => "VaÅ¡ega geslo ni bilo mogoÄe spremeniti.", +"Current password" => "Trenutno Geslo", +"New password" => "Novo geslo", +"show" => "prikaži", +"Change password" => "Spremeni Geslo", +"Language" => "Jezik", +"use this address to connect to your ownCloud in your file manager" => "uporabi ta naslov za povezavo k \"mojoblak\" v vaÅ¡em urejevalniku datotek", +"Name" => "Ime", +"Password" => "Geslo", +"Groups" => "Skupine", +"Create" => "Ustvari", +"Delete" => "IzbriÅ¡i" +); diff --git a/settings/l10n/sr.php b/settings/l10n/sr.php index 33bd039a2fc..ea61815a619 100644 --- a/settings/l10n/sr.php +++ b/settings/l10n/sr.php @@ -1,7 +1,6 @@ "Грешка аутентификације", -"OpenID Changed" => "OpenID је измењен", "Invalid request" => "ÐеиÑправан захтев", +"OpenID Changed" => "OpenID је измењен", "Language changed" => "Језик је измењен", "Add your application" => "Додајте Ñвој програм", "Select an App" => "Изаберите програм", @@ -20,7 +19,6 @@ "show" => "прикажи", "Change password" => "Измени лозинку", "Language" => "Језик", -"Help translating" => "Помозите у превођењу", "use this address to connect to your ownCloud in your file manager" => "кориÑтите ову адреÑу да би Ñе повезали на ownCloud путем менаџњера фајлова", "Name" => "Име", "Password" => "Лозинка", diff --git a/settings/l10n/sr@latin.php b/settings/l10n/sr@latin.php index 4787dd3fa71..ba3572802f3 100644 --- a/settings/l10n/sr@latin.php +++ b/settings/l10n/sr@latin.php @@ -1,7 +1,6 @@ "GreÅ¡ka autentifikacije", -"OpenID Changed" => "OpenID je izmenjen", "Invalid request" => "Neispravan zahtev", +"OpenID Changed" => "OpenID je izmenjen", "Language changed" => "Jezik je izmenjen", "Add your application" => "Dodajte svoj program", "Select an App" => "Izaberite program", @@ -20,7 +19,6 @@ "show" => "prikaži", "Change password" => "Izmeni lozinku", "Language" => "Jezik", -"Help translating" => "Pomozite u prevoÄ‘enju", "use this address to connect to your ownCloud in your file manager" => "koristite ovu adresu da bi se povezali na ownCloud putem menadžnjera fajlova", "Name" => "Ime", "Password" => "Lozinka", diff --git a/settings/l10n/sv.php b/settings/l10n/sv.php index 13ccd3826e3..7a39a1a9437 100644 --- a/settings/l10n/sv.php +++ b/settings/l10n/sv.php @@ -1,7 +1,6 @@ "Autentiseringsfel", -"OpenID Changed" => "OpenID ändrat", "Invalid request" => "Ogiltig begäran", +"OpenID Changed" => "OpenID ändrat", "Language changed" => "SprÃ¥k ändrades", "Add your application" => "Lägg till din applikation", "Select an App" => "Välj en App", @@ -20,8 +19,7 @@ "show" => "visa", "Change password" => "Ändra lösenord", "Language" => "SprÃ¥k", -"Help translating" => "Hjälp till att översätta", -"use this address to connect to your ownCloud in your file manager" => "använd denna adress för att ansluta till ditt ownCloud i din filhanterare", +"use this address to connect to your ownCloud in your file manager" => "använd denna adress för att ansluta ownCloud till din filhanterare", "Name" => "Namn", "Password" => "Lösenord", "Groups" => "Grupper", diff --git a/settings/l10n/tr.php b/settings/l10n/tr.php new file mode 100644 index 00000000000..7d6b25612f2 --- /dev/null +++ b/settings/l10n/tr.php @@ -0,0 +1,28 @@ + "Geçersiz istek", +"OpenID Changed" => "OpenID DeÄŸiÅŸtirildi", +"Language changed" => "Dil deÄŸiÅŸtirildi", +"Add your application" => "Uygulamanızı ekleyin", +"Select an App" => "Bir uygulama seçin", +"-licensed" => "-lisanslı", +"by" => "yapan", +"Ask a question" => "Bir soru sorun", +"Problems connecting to help database." => "Yardım veritabanına baÄŸlanmada sorunlar var.", +"Go there manually." => "Oraya elle gidin.", +"Answer" => "Cevap", +"You use" => "Kullanıyorsunuz", +"of the available" => "mevcut olandan", +"Your password got changed" => "Parolanız deÄŸiÅŸtirildi", +"Unable to change your password" => "Parolanız deÄŸiÅŸtirilemiyor", +"Current password" => "Mevcut parola", +"New password" => "Yeni parola", +"show" => "göster", +"Change password" => "Parola deÄŸiÅŸtir", +"Language" => "Dil", +"use this address to connect to your ownCloud in your file manager" => "bu adresi kullanarak ownCloud unuza dosya yöneticinizle baÄŸlanın", +"Name" => "Ad", +"Password" => "Parola", +"Groups" => "Gruplar", +"Create" => "OluÅŸtur", +"Delete" => "Sil" +); diff --git a/settings/l10n/zh_CN.php b/settings/l10n/zh_CN.php index dc9ffeafe7b..22ffce3b57e 100644 --- a/settings/l10n/zh_CN.php +++ b/settings/l10n/zh_CN.php @@ -1,7 +1,6 @@ "验è¯é”™è¯¯", -"OpenID Changed" => "OpenID 已修改", "Invalid request" => "éžæ³•è¯·æ±‚", +"OpenID Changed" => "OpenID 已修改", "Language changed" => "语言已修改", "Add your application" => "加入您的应用程åº", "Select an App" => "选择一个应用", @@ -20,7 +19,6 @@ "show" => "显示", "Change password" => "修改密ç ", "Language" => "语言", -"Help translating" => "帮助翻译", "use this address to connect to your ownCloud in your file manager" => "在文件管ç†å™¨ä¸­ä½¿ç”¨è¿™ä¸ªåœ°å€æ¥è¿žæŽ¥åˆ°æ‚¨çš„ ownCloud", "Name" => "å称", "Password" => "密ç ", -- GitLab From 3c910b812bd044109691627b493639f8663572ff Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Jan 2012 01:26:27 +0100 Subject: [PATCH 217/546] also use translated string for music navigation entry when showing inline controls --- apps/media/templates/player.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/media/templates/player.php b/apps/media/templates/player.php index 295f33ab9e0..146c743250e 100644 --- a/apps/media/templates/player.php +++ b/apps/media/templates/player.php @@ -6,7 +6,7 @@ if(!isset($_)){//allow the template to be loaded standalone exit; } ?> -Music +t('Music');?>
    + + + +
    + -- GitLab From eae3e134ff9005e50ea4e611b2c2daba94ad49ea Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 11 Jan 2012 06:20:06 +0100 Subject: [PATCH 222/546] Make sure VERSION is set. Set REV for each edit. Download single VCard. --- apps/contacts/css/styles.css | 3 ++- apps/contacts/export.php | 2 +- apps/contacts/js/interface.js | 4 +++- apps/contacts/lib/vcard.php | 21 +++++++++++++++++---- apps/contacts/templates/part.details.php | 1 + 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css index dfc296a221b..4fcd8fc1131 100644 --- a/apps/contacts/css/styles.css +++ b/apps/contacts/css/styles.css @@ -4,7 +4,8 @@ #contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;} #contacts_details_photo { margin:.5em 0em .5em 25%; } -#contacts_deletecard {position:absolute;top:15px;right:15px;} +#contacts_deletecard {position:absolute;top:15px;right:25px;} +#contacts_downloadcard {position:absolute;top:15px;right:50px;} #contacts_details_list { list-style:none; } #contacts_details_list li { overflow:visible; } #contacts_details_list li p.contacts_property_name { width:25%; float:left;text-align:right;padding-right:0.3em;color:#666; } diff --git a/apps/contacts/export.php b/apps/contacts/export.php index a1e974c962b..735d1c5b631 100644 --- a/apps/contacts/export.php +++ b/apps/contacts/export.php @@ -33,7 +33,7 @@ if(isset($book)){ exit; } header('Content-Type: text/directory'); - header('Content-Disposition: inline; filename=' . $data['fullname'] . '.vcf'); + header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $data['fullname']) . '.vcf'); echo $data['carddata']; } ?> diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 9547c581c87..741483633da 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -197,6 +197,7 @@ $(document).ready(function(){ * Delete currently selected contact (and clear form?) */ $('#contacts_deletecard').live('click',function(){ + $('#contacts_deletecard').tipsy('hide'); var id = $('#rightcontent').data('id'); $.getJSON('ajax/deletecard.php',{'id':id},function(jsondata){ if(jsondata.status == 'success'){ @@ -401,7 +402,8 @@ $(document).ready(function(){ } }); - $('.action').tipsy(); + $('#contacts_deletecard').tipsy(); + $('#contacts_downloadcard').tipsy(); $('.button').tipsy(); //Contacts.UI.messageBox('Hello','Sailor'); }); diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index 401f9622547..726927013c6 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -111,16 +111,21 @@ class OC_Contacts_VCard{ if(is_null($uid)){ $card->setUID(); $uid = $card->getAsString('UID'); - $data = $card->serialize(); + //$data = $card->serialize(); }; $uri = $uid.'.vcf'; // VCARD must have a version $version = $card->getAsString('VERSION'); // Add version if needed - if(is_null($version)){ + if(!$version){ $card->add(new Sabre_VObject_Property('VERSION','3.0')); - $data = $card->serialize(); - } + //$data = $card->serialize(); + }/* else { + OC_Log::write('contacts','OC_Contacts_VCard::add. Version already set as: '.$version,OC_Log::DEBUG); + }*/ + $now = new DateTime; + $card->setString('REV', $now->format(DateTime::W3C)); + $data = $card->serialize(); } else{ // that's hard. Creating a UID and not saving it @@ -182,7 +187,12 @@ class OC_Contacts_VCard{ break; } } + } else { + return false; } + $now = new DateTime; + $card->setString('REV', $now->format(DateTime::W3C)); + $data = $card->serialize(); $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($fn,$data,time(),$id)); @@ -212,6 +222,9 @@ class OC_Contacts_VCard{ } } } + $now = new DateTime; + $card->setString('REV', $now->format(DateTime::W3C)); + $data = $card->serialize(); $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($fn,$data,time(),$oldcard['id'])); diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index 1482c063685..fe0dac235b8 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -1,5 +1,6 @@ inc('part.property.FN', array('property' => $_['details']['FN'][0])); ?> + -- GitLab From 237ba65a20edfbd346405e03583a96808602a2ca Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 11 Jan 2012 20:07:15 +0100 Subject: [PATCH 223/546] Localizin strings and adding error checking. --- apps/contacts/ajax/activation.php | 9 +++++++- apps/contacts/ajax/addcard.php | 7 ++++++ apps/contacts/ajax/addproperty.php | 6 ++++- apps/contacts/ajax/createaddressbook.php | 14 ++++++++++-- apps/contacts/ajax/deleteproperty.php | 8 ++++++- apps/contacts/ajax/setproperty.php | 7 +++++- apps/contacts/ajax/updateaddressbook.php | 17 +++++++++++--- apps/contacts/js/interface.js | 22 +++++++++---------- apps/contacts/l10n/xgettextfiles | 21 ++++++++++++++++++ apps/contacts/lib/addressbook.php | 1 + apps/contacts/lib/vcard.php | 2 ++ apps/contacts/templates/index.php | 2 +- apps/contacts/templates/part.addcardform.php | 10 ++------- .../part.chooseaddressbook.rowfields.php | 2 +- .../templates/part.editaddressbook.php | 2 +- apps/contacts/templates/settings.php | 4 ++-- 16 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 apps/contacts/l10n/xgettextfiles diff --git a/apps/contacts/ajax/activation.php b/apps/contacts/ajax/activation.php index f4a2c94a148..fda63a528a4 100644 --- a/apps/contacts/ajax/activation.php +++ b/apps/contacts/ajax/activation.php @@ -10,10 +10,17 @@ require_once ("../../../lib/base.php"); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); +$l=new OC_L10N('contacts'); + $bookid = $_POST['bookid']; -OC_Contacts_Addressbook::setActive($bookid, $_POST['active']); +if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { + OC_JSON::error(array('data' => array('message' => $l->t('Error (de)activating addressbook.')))); + OC_Log::write('contacts','ajax/activation.php: Error activating addressbook: '.$bookid, OC_Log::ERROR); + exit(); +} $book = OC_Contacts_App::getAddressbook($bookid); + /* is there an OC_JSON::error() ? */ OC_JSON::success(array( 'active' => OC_Contacts_Addressbook::isActive($bookid), diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php index 9d9a99de33c..7e47659d23b 100644 --- a/apps/contacts/ajax/addcard.php +++ b/apps/contacts/ajax/addcard.php @@ -26,6 +26,7 @@ require_once('../../../lib/base.php'); // Check if we are a user OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); +$l=new OC_L10N('contacts'); $aid = $_POST['id']; $addressbook = OC_Contacts_App::getAddressbook( $aid ); @@ -74,5 +75,11 @@ foreach( $add as $propname){ } } $id = OC_Contacts_VCard::add($aid,$vcard->serialize()); +if(!$id) { + OC_JSON::error(array('data' => array('message' => $l->t('There was an error adding the contact.')))); + OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$name, OC_Log::ERROR); + exit(); +} +// NOTE: Why is this in OC_Contacts_App? OC_Contacts_App::renderDetails($id, $vcard); diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index 74f1c3d0e9e..6e3ba3566c0 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -61,7 +61,11 @@ foreach ($parameters as $key=>$element) { } } -OC_Contacts_VCard::edit($id,$vcard->serialize()); +if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) { + OC_JSON::error(array('data' => array('message' => $l->t('Error adding contact property.')))); + OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR); + exit(); +} $adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php index f94ad34e8dc..edcf794f497 100644 --- a/apps/contacts/ajax/createaddressbook.php +++ b/apps/contacts/ajax/createaddressbook.php @@ -1,6 +1,6 @@ + * Copyright (c) 2011-2012 Thomas Tanghus * Copyright (c) 2011 Bart Visscher * This file is licensed under the Affero General Public License version 3 or * later. @@ -16,7 +16,17 @@ OC_JSON::checkAppEnabled('contacts'); $userid = OC_User::getUser(); $bookid = OC_Contacts_Addressbook::add($userid, $_POST['name'], null); -OC_Contacts_Addressbook::setActive($bookid, 1); +if(!$bookid) { + OC_JSON::error(array('data' => array('message' => $l->t('Error adding addressbook.')))); + OC_Log::write('contacts','ajax/createaddressbook.php: Error adding addressbook: '.$_POST['name'], OC_Log::ERROR); + exit(); +} + +if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { + OC_JSON::error(array('data' => array('message' => $l->t('Error activating addressbook.')))); + OC_Log::write('contacts','ajax/createaddressbook.php: Error activating addressbook: '.$bookid, OC_Log::ERROR); + //exit(); +} $addressbook = OC_Contacts_App::getAddressbook($bookid); $tmpl = new OC_Template('contacts', 'part.chooseaddressbook.rowfields'); $tmpl->assign('addressbook', $addressbook); diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/deleteproperty.php index f69735e61c6..89cf292f4f8 100644 --- a/apps/contacts/ajax/deleteproperty.php +++ b/apps/contacts/ajax/deleteproperty.php @@ -26,6 +26,7 @@ require_once('../../../lib/base.php'); // Check if we are a user OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); +$l10n = new OC_L10N('contacts'); $id = $_GET['id']; $checksum = $_GET['checksum']; @@ -35,5 +36,10 @@ $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); unset($vcard->children[$line]); -OC_Contacts_VCard::edit($id,$vcard->serialize()); +if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) { + OC_JSON::error(array('data' => array('message' => $l->t('Error deleting contact property.')))); + OC_Log::write('contacts','ajax/deleteproperty.php: Error deleting contact property', OC_Log::ERROR); + exit(); +} + OC_JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/setproperty.php b/apps/contacts/ajax/setproperty.php index bcc4c161cc0..e0cd70236c8 100644 --- a/apps/contacts/ajax/setproperty.php +++ b/apps/contacts/ajax/setproperty.php @@ -72,9 +72,14 @@ foreach($missingparameters as $i){ } // Do checksum and be happy +// NOTE: This checksum is not used..? $checksum = md5($vcard->children[$line]->serialize()); -OC_Contacts_VCard::edit($id,$vcard->serialize()); +if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) { + OC_JSON::error(array('data' => array('message' => $l->t('Error updating contact property.')))); + OC_Log::write('contacts','ajax/setproperty.php: Error updating contact property: '.$value, OC_Log::ERROR); + exit(); +} $adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php index 516736cc502..7d9e2aea917 100644 --- a/apps/contacts/ajax/updateaddressbook.php +++ b/apps/contacts/ajax/updateaddressbook.php @@ -1,6 +1,6 @@ + * Copyright (c) 2011-2012 Thomas Tanghus * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. @@ -15,8 +15,19 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); $bookid = $_POST['id']; -OC_Contacts_Addressbook::edit($bookid, $_POST['name'], null); -OC_Contacts_Addressbook::setActive($bookid, $_POST['active']); + +if(!OC_Contacts_Addressbook::edit($bookid, $_POST['name'], null)) { + OC_JSON::error(array('data' => array('message' => $l->t('Error updating addressbook.')))); + OC_Log::write('contacts','ajax/updateaddressbook.php: Error adding addressbook: ', OC_Log::ERROR); + //exit(); +} + +if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { + OC_JSON::error(array('data' => array('message' => $l->t('Error (de)activating addressbook.')))); + OC_Log::write('contacts','ajax/updateaddressbook.php: Error (de)activating addressbook: '.$bookid, OC_Log::ERROR); + //exit(); +} + $addressbook = OC_Contacts_App::getAddressbook($bookid); $tmpl = new OC_Template('contacts', 'part.chooseaddressbook.rowfields'); $tmpl->assign('addressbook', $addressbook); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 741483633da..8a1de3051a6 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -106,7 +106,7 @@ Contacts={ Contacts.UI.Contacts.update(); Contacts.UI.Addressbooks.overview(); } else { - Contacts.UI.messageBox('Error', data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), data.message); //alert('Error: ' + data.message); } }); @@ -145,7 +145,7 @@ Contacts={ $('#contacts').html(jsondata.data.page); } else{ - Contacts.UI.messageBox('Error',jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'),jsondata.data.message); //alert(jsondata.data.message); } }); @@ -186,7 +186,7 @@ $(document).ready(function(){ $('#leftcontent li[data-id="'+jsondata.data.id+'"]').addClass('active'); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }); @@ -206,7 +206,7 @@ $(document).ready(function(){ $('#rightcontent').empty(); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }); @@ -225,7 +225,7 @@ $(document).ready(function(){ $('#contacts_addproperty').hide(); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); alert('From handler: '+jsondata.data.message); } }); @@ -258,7 +258,7 @@ $(document).ready(function(){ $('#contacts_addpropertyform').before(jsondata.data.page); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); } }, 'json'); return false; @@ -283,7 +283,7 @@ $(document).ready(function(){ .find('select').chosen(); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }); @@ -313,7 +313,7 @@ $(document).ready(function(){ } } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }, 'json'); @@ -332,7 +332,7 @@ $(document).ready(function(){ .find('select').chosen(); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }); @@ -348,7 +348,7 @@ $(document).ready(function(){ $('.contacts_property[data-checksum="'+jsondata.data.oldchecksum+'"]').replaceWith(jsondata.data.page); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } },'json'); @@ -363,7 +363,7 @@ $(document).ready(function(){ $('.contacts_property[data-checksum="'+checksum+'"]').remove(); } else{ - Contacts.UI.messageBox('Error', jsondata.data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert(jsondata.data.message); } }); diff --git a/apps/contacts/l10n/xgettextfiles b/apps/contacts/l10n/xgettextfiles new file mode 100644 index 00000000000..91d5da46db0 --- /dev/null +++ b/apps/contacts/l10n/xgettextfiles @@ -0,0 +1,21 @@ +../appinfo/app.php +../ajax/activation.php +../ajax/addbook.php +../ajax/addcard.php +../ajax/addproperty.php +../ajax/createaddressbook.php +../ajax/deletebook.php +../ajax/deleteproperty.php +../ajax/getdetails.php +../ajax/setproperty.php +../ajax/updateaddressbook.php +../lib/app.php +../templates/index.php +../templates/part.addcardform.php +../templates/part.chooseaddressbook.php +../templates/part.chooseaddressbook.rowfields.php +../templates/part.details.php +../templates/part.editaddressbook.php +../templates/part.property.php +../templates/part.setpropertyform.php +../templates/settings.php diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php index 41d488c09f9..052c19e55fe 100644 --- a/apps/contacts/lib/addressbook.php +++ b/apps/contacts/lib/addressbook.php @@ -256,6 +256,7 @@ class OC_Contacts_Addressbook{ * @return boolean */ public static function delete($id){ + // FIXME: There's no error checking at all. self::setActive($id, false); $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); $stmt->execute(array($id)); diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index 726927013c6..c61f0dfc114 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -240,6 +240,7 @@ class OC_Contacts_VCard{ * @return boolean */ public static function delete($id){ + // FIXME: Add error checking. $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); $stmt->execute(array($id)); @@ -261,6 +262,7 @@ class OC_Contacts_VCard{ * @return boolean */ public static function deleteFromDAVData($aid,$uri){ + // FIXME: Add error checking. Deleting a card gives an Kontact/Akonadi error. $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri=?' ); $stmt->execute(array($aid,$uri)); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php index d548f17172d..5d9c312712f 100644 --- a/apps/contacts/templates/index.php +++ b/apps/contacts/templates/index.php @@ -4,7 +4,7 @@
    - +
    diff --git a/apps/contacts/templates/part.addcardform.php b/apps/contacts/templates/part.addcardform.php index 510096a9e81..53b32188ddf 100644 --- a/apps/contacts/templates/part.addcardform.php +++ b/apps/contacts/templates/part.addcardform.php @@ -5,7 +5,7 @@
    - +
    - - -
    + diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php index f612e39ecaf..0cbfe2bf803 100644 --- a/apps/contacts/templates/part.chooseaddressbook.rowfields.php +++ b/apps/contacts/templates/part.chooseaddressbook.rowfields.php @@ -1,5 +1,5 @@ "; echo ""; echo "t("CardDav Link") . "\" class=\"action\">t("Download") . "\" class=\"action\">t("Edit") . "\" class=\"action\" onclick=\"Contacts.UI.Addressbooks.editAddressbook(this, " . $_['addressbook']["id"] . ");\">t("Delete") . "\" class=\"action\">"; diff --git a/apps/contacts/templates/part.editaddressbook.php b/apps/contacts/templates/part.editaddressbook.php index cb1371731b1..48fe5c3b378 100644 --- a/apps/contacts/templates/part.editaddressbook.php +++ b/apps/contacts/templates/part.editaddressbook.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ ?> -t("Edit Address Book"); ?>" colspan="6"> +t("Edit Addressbook"); ?>" colspan="6"> diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php index d9130625200..c647e44c25b 100644 --- a/apps/contacts/templates/settings.php +++ b/apps/contacts/templates/settings.php @@ -1,7 +1,7 @@
    - Contacts
    - CardDAV syncing address: + t('Contacts'); ?>
    + t('CardDAV syncing address:'); ?>
    -- GitLab From dddcd66ead1aa5d528180d96a95ed876eaaa6093 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Wed, 11 Jan 2012 22:06:23 +0100 Subject: [PATCH 224/546] using new image backend, moving ajax calls to one file, using generated thumnails to speedup covers loading --- apps/gallery/ajax/galleryOp.php | 29 ++++++++- apps/gallery/ajax/getCovers.php | 99 ----------------------------- apps/gallery/ajax/scanForAlbums.php | 31 --------- apps/gallery/css/styles.css | 2 +- apps/gallery/js/album_cover.js | 2 +- apps/gallery/js/albums.js | 2 +- 6 files changed, 29 insertions(+), 136 deletions(-) delete mode 100644 apps/gallery/ajax/getCovers.php delete mode 100644 apps/gallery/ajax/scanForAlbums.php diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 3d1ed1f33cb..5686c0faa78 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -23,17 +23,34 @@ require_once('../../../lib/base.php'); require_once(OC::$CLASSPATH['OC_Gallery_Album']); -OC_JSON::checkLoggedIn(); +require_once(OC::$CLASSPATH['OC_Gallery_Scanner']); OC_JSON::checkAppEnabled('gallery'); function handleRename($oldname, $newname) { + OC_JSON::checkLoggedIn(); OC_Gallery_Album::rename($oldname, $newname, OC_User::getUser()); } function handleRemove($name) { + OC_JSON::checkLoggedIn(); OC_Gallery_Album::remove(OC_User::getUser(), $name); } +function handleGetThumbnails($albumname) +{ + OC_JSON::checkLoggedIn(); + $photo = new OC_Image(); + $photo->loadFromFile(OC::$CONFIG_DATADIRECTORY.'/../gallery/'.$albumname.'.png'); + $photo->show(); +} + +function handleGalleryScanning() +{ + OC_JSON::checkLoggedIn(); + OC_Gallery_Scanner::cleanup(); + OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan('/'))); +} + if ($_GET['operation']) { switch($_GET['operation']) { case "rename": @@ -43,8 +60,14 @@ if ($_GET['operation']) { case "remove": handleRemove($_GET['name']); OC_JSON::success(); - break; - default: + break; + case "get_covers": + handleGetThumbnails($_GET['albumname']); + break; + case "scan": + handleGalleryScanning(); + break; + default: OC_JSON::error(array('cause' => "Unknown operation")); } } diff --git a/apps/gallery/ajax/getCovers.php b/apps/gallery/ajax/getCovers.php deleted file mode 100644 index 4db73d0fbf3..00000000000 --- a/apps/gallery/ajax/getCovers.php +++ /dev/null @@ -1,99 +0,0 @@ -. -* -*/ - -require_once('../../../lib/base.php'); -OC_JSON::checkLoggedIn(); -OC_JSON::checkAppEnabled('gallery'); - -function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height, $tgtImg, $shift) { - //getting the image dimensions - list($width_orig, $height_orig) = getimagesize($imgSrc); - switch (strtolower(substr($imgSrc, strrpos($imgSrc, '.')+1))) { - case "jpeg": - case "jpg": - case "tiff": - $myImage = imagecreatefromjpeg($imgSrc); - break; - case "png": - $myImage = imagecreatefrompng($imgSrc); - break; - default: - exit(); - } - if(!$myImage) exit(); - $ratio_orig = $width_orig/$height_orig; - - if ($thumbnail_width/$thumbnail_height > $ratio_orig) { - $new_height = $thumbnail_width/$ratio_orig; - $new_width = $thumbnail_width; - } else { - $new_width = $thumbnail_height*$ratio_orig; - $new_height = $thumbnail_height; - } - - $x_mid = $new_width/2; //horizontal middle - $y_mid = $new_height/2; //vertical middle - - $process = imagecreatetruecolor(round($new_width), round($new_height)); - - imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); - imagecopyresampled($tgtImg, $process, $shift, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); - - imagedestroy($process); - imagedestroy($myImage); -} - -$box_size = 200; -$album_name= $_GET['album_name']; - -$result = OC_Gallery_Photo::findForAlbum(OC_User::getUser(), $album_name); - -$numOfItems = min($result->numRows(),10); - -if ($numOfItems){ - $targetImg = imagecreatetruecolor($numOfItems*$box_size, $box_size); -} -else{ - $targetImg = imagecreatetruecolor($box_size, $box_size); -} -$counter = 0; -while (($i = $result->fetchRow()) && $counter < $numOfItems) { - $imagePath = OC_Filesystem::getLocalFile($i['file_path']); - if(file_exists($imagePath)) - { - CroppedThumbnail($imagePath, $box_size, $box_size, $targetImg, $counter*$box_size); - $counter++; - } -} - -header('Content-Type: image/png'); - -$offset = 3600 * 24; -// calc the string in GMT not localtime and add the offset -header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"); -header('Cache-Control: max-age='.$offset.', must-revalidate'); -header('Pragma: public'); - -imagepng($targetImg); -imagedestroy($targetImg); -?> diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php deleted file mode 100644 index b8ed639d9dc..00000000000 --- a/apps/gallery/ajax/scanForAlbums.php +++ /dev/null @@ -1,31 +0,0 @@ -. -* -*/ - -require_once('../../../lib/base.php'); -OC_JSON::checkLoggedIn(); -OC_JSON::checkAppEnabled('gallery'); - -OC_Gallery_Scanner::cleanUp(); -OC_JSON::success(array('albums' => OC_Gallery_Scanner::scan('/'))); - -?> diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css index cc343ba0d08..b253eeef223 100644 --- a/apps/gallery/css/styles.css +++ b/apps/gallery/css/styles.css @@ -1,5 +1,5 @@ div#gallery_list { margin: 90pt 20pt; } -div#gallery_list.leftcontent { padding-top: 15px; margin: 0; text-align: center; } +div#gallery_list.leftcontent { padding-top: 15pt; margin: 0; height: 80%; text-align: center; overflow: scroll; } div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; border: solid 1px black; position: relative; overflow: hidden; color: #999; } div#gallery_album_box:hover { color: black; } .leftcontent div#gallery_album_box { margin: 5px; } diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js index f6cb2da3103..84a89c5a91f 100644 --- a/apps/gallery/js/album_cover.js +++ b/apps/gallery/js/album_cover.js @@ -33,7 +33,7 @@ function createNewAlbum() { function scanForAlbums() { $("#notification").fadeIn(); $("#notification").slideDown(); - $.getJSON('ajax/scanForAlbums.php', function(r) { + $.getJSON('ajax/galleryOp.php?operation=scan', function(r) { $("#notification").fadeOut(); $("#notification").slideUp(); if (r.status == 'success') { diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js index ae7d1fac500..2fb1ac89bab 100644 --- a/apps/gallery/js/albums.js +++ b/apps/gallery/js/albums.js @@ -63,7 +63,7 @@ Albums={ var local = $(displayTemplate.replace(/\*NAME\*/g, a.name)); $("#gallery_album_cover", local).css('background-repeat', 'no-repeat'); $("#gallery_album_cover", local).css('background-position', '0'); - $("#gallery_album_cover", local).css('background-image','url("ajax/getCovers.php?album_name='+a.name+'")'); + $("#gallery_album_cover", local).css('background-image','url("ajax/galleryOp.php?operation=get_covers&albumname='+a.name+'")'); local.mouseover(function(e) { $("#gallery_control_overlay", this).css('visibility','visible'); }); -- GitLab From 24dc1aec8e68e6d588a56e1ebc9bd1bd62785ae0 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 11 Jan 2012 23:03:55 +0100 Subject: [PATCH 225/546] Tweaked some tipsys. --- apps/contacts/js/interface.js | 2 -- apps/contacts/templates/part.details.php | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 8a1de3051a6..fe58a46d247 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -402,8 +402,6 @@ $(document).ready(function(){ } }); - $('#contacts_deletecard').tipsy(); - $('#contacts_downloadcard').tipsy(); $('.button').tipsy(); //Contacts.UI.messageBox('Hello','Sailor'); }); diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index fe0dac235b8..9af7f0654dd 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -89,6 +89,7 @@ -- GitLab From afa07beda01dbdc0530ad172cbb22067da522c38 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Wed, 11 Jan 2012 23:41:24 +0100 Subject: [PATCH 226/546] resolving depricated script opening --- apps/gallery/ajax/galleryOp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 5686c0faa78..0224977e633 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -1,4 +1,4 @@ - Date: Wed, 11 Jan 2012 23:54:02 +0100 Subject: [PATCH 227/546] user suggested style change --- apps/gallery/css/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css index b253eeef223..6bfd756e5f1 100644 --- a/apps/gallery/css/styles.css +++ b/apps/gallery/css/styles.css @@ -1,9 +1,9 @@ div#gallery_list { margin: 90pt 20pt; } div#gallery_list.leftcontent { padding-top: 15pt; margin: 0; height: 80%; text-align: center; overflow: scroll; } -div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; border: solid 1px black; position: relative; overflow: hidden; color: #999; } +div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; position: relative; overflow: hidden; color: #999; } div#gallery_album_box:hover { color: black; } .leftcontent div#gallery_album_box { margin: 5px; } -div#gallery_album_box h1 { font-size: 12pt; font-family: Verdana; } +div#gallery_album_box h1 { font-size: 9pt; font-family: Verdana; } div#gallery_album_cover { width: 199px; height: 199px; border: solid 1pt #999; padding: 0; } div#gallery_control_overlay { border: 0; position:absolute; right: 10pt; background-color: #333; opacity: 0.5; visibility:hidden; padding: 0 5pt; } div#gallery_control_overlay a { color:white; } -- GitLab From f4338f631b40868fbcec99c35a6f1b405d15d866 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Jan 2012 00:54:29 +0100 Subject: [PATCH 228/546] fix searching music --- apps/media/lib_collection.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php index 1240f1de2f0..ed8aebb6328 100644 --- a/apps/media/lib_collection.php +++ b/apps/media/lib_collection.php @@ -159,20 +159,21 @@ class OC_MEDIA_COLLECTION{ * @return array the list of albums found */ static public function getAlbums($artist=0,$search='%',$exact=false){ - $cmd="SELECT DISTINCT *PREFIX*media_albums.album_name AS album_name , *PREFIX*media_albums.album_artist AS album_artist , *PREFIX*media_albums.album_id AS album_id - FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? ORDER BY album_name"; + $cmd="SELECT DISTINCT album_name, album_artist, album_id + FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON album_id=song_album WHERE song_user=? "; $params=array(self::$uid); if($artist!=0){ - $cmd.="AND *PREFIX*media_albums.album_artist = ? "; + $cmd.="AND album_artist = ? "; array_push($params,$artist); } if($search!='%'){ - $cmd.="AND *PREFIX*media_albums.album_name LIKE ? "; + $cmd.="AND album_name LIKE ? "; if(!$exact){ $search="%$search%"; } array_push($params,$search); } + $cmd.=' ORDER BY album_name'; $query=OC_DB::prepare($cmd); return $query->execute($params)->fetchAll(); } -- GitLab From 1b5d206ca77c68542ab381fb6529a5648ddf9713 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Jan 2012 01:14:16 +0100 Subject: [PATCH 229/546] fix expending artists and albums in collection view --- apps/media/js/collection.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js index 576f567faef..b55bbe5107c 100644 --- a/apps/media/js/collection.js +++ b/apps/media/js/collection.js @@ -132,7 +132,7 @@ Collection={ }, showArtist:function(artist){ var tr=Collection.parent.find('tr[data-artist="'+artist+'"]'); - var nextRow=tr.next(); + var lastRow=tr; var artist=tr.data('artistData'); var first=true; $.each(artist.albums,function(j,album){ @@ -185,9 +185,10 @@ Collection={ newRow.attr('data-artist',artist.name); newRow.data('albumData',album); if(!first){ - nextRow.before(newRow); + lastRow.after(newRow); } first=false; + lastRow=newRow; }); }); tr.removeClass('collapsed'); @@ -215,11 +216,11 @@ Collection={ }, showAlbum:function(artist,album){ var tr = Collection.parent.find('tr[data-artist="'+artist+'"][data-album="'+album+'"]'); + var lastRow=tr; var albumData=tr.data('albumData'); tr.find('td.album a.expander').data('expanded',true); tr.find('td.album a.expander').addClass('expanded'); tr.find('td.album a.expander').text('v'); - var nextRow=tr.next(); $.each(albumData.songs,function(i,song){ if(i>0){ var newRow=tr.clone(); @@ -231,8 +232,9 @@ Collection={ } newRow.find('td.title a').text(song.name); if(i>0){ - nextRow.before(newRow); + lastRow.after(newRow); } + lastRow=newRow; }); }, hideAlbum:function(artist,album){ -- GitLab From 25213a790d79c7d8f5c35c757ffd531243b2bc99 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Jan 2012 01:18:27 +0100 Subject: [PATCH 230/546] fix event handler after re-expanding an artist in collection view --- apps/media/js/collection.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js index b55bbe5107c..6525df55c71 100644 --- a/apps/media/js/collection.js +++ b/apps/media/js/collection.js @@ -231,6 +231,13 @@ Collection={ var newRow=tr; } newRow.find('td.title a').text(song.name); + newRow.find('td.title a').click(function(event){ + event.preventDefault(); + PlayList.add(song); + PlayList.play(0); + Collection.parent.find('tr').removeClass('active'); + $('tr[data-title="'+song.name+'"]').addClass('active'); + }); if(i>0){ lastRow.after(newRow); } -- GitLab From 8de4163ba234a2eca124e2f389e9d4c999f06c00 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Jan 2012 02:01:59 +0100 Subject: [PATCH 231/546] fix searching artists and albums --- apps/media/lib_collection.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php index ed8aebb6328..d8dda1212e4 100644 --- a/apps/media/lib_collection.php +++ b/apps/media/lib_collection.php @@ -121,14 +121,19 @@ class OC_MEDIA_COLLECTION{ * @return array the list of artists found */ static public function getArtists($search='%',$exact=false){ + $uid=self::$uid; + if(empty($uid)){ + $uid=self::$uid=$_SESSION['user_id']; + } if(!$exact and $search!='%'){ $search="%$search%"; }elseif($search==''){ $search='%'; } - $query=OC_DB::prepare("SELECT DISTINCT *PREFIX*media_artists.artist_name AS artist_name , *PREFIX*media_artists.artist_id AS artist_id FROM *PREFIX*media_artists - INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=? ORDER BY artist_name"); - return $query->execute(array($search,self::$uid))->fetchAll(); + $query=OC_DB::prepare("SELECT DISTINCT artist_name, artist_id FROM *PREFIX*media_artists + INNER JOIN *PREFIX*media_songs ON artist_id=song_artist WHERE artist_name LIKE ? AND song_user=? ORDER BY artist_name"); + $result=$query->execute(array($search,self::$uid)); + return $result->fetchAll(); } /** @@ -159,6 +164,10 @@ class OC_MEDIA_COLLECTION{ * @return array the list of albums found */ static public function getAlbums($artist=0,$search='%',$exact=false){ + $uid=self::$uid; + if(empty($uid)){ + $uid=self::$uid=$_SESSION['user_id']; + } $cmd="SELECT DISTINCT album_name, album_artist, album_id FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON album_id=song_album WHERE song_user=? "; $params=array(self::$uid); -- GitLab From b71ea287aac37237c948ae9f8c825ddda0601857 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Jan 2012 02:02:45 +0100 Subject: [PATCH 232/546] reimplement auto playing music from location hash (like from search results) --- apps/media/js/music.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/media/js/music.js b/apps/media/js/music.js index bf082207829..3373cbac257 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -26,18 +26,25 @@ $(document).ready(function(){ button.tipsy({gravity:'n', fade:true, delayIn: 400, live:true}); } Collection.display(); + + Collection.load(function(){ + var urlVars=getUrlVars(); + if(urlVars.artist){ + var song=Collection.find(urlVars.artist,urlVars.album,urlVars.song); + PlayList.add(song); + PlayList.play(0); + } + }) }); function getUrlVars(){ - var vars = [], hash; - var hashes = window.location.href.slice(window.location.href.indexOf('#') + 1).split('&'); - for(var i = 0; i < hashes.length; i++) - { + var vars = {}, hash; + var hashes = window.location.hash.substr(1).split('&'); + for(var i = 0; i < hashes.length; i++){ hash = hashes[i].split('='); - vars.push(hash[0]); - vars[hash[0]] = hash[1].replace(/\+/g,' '); + vars[hash[0]] = decodeURIComponent(hash[1]).replace(/\+/g,' '); } return vars; } -- GitLab From c6eeb4a8080487075fca587653879a3308f7597a Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 02:34:22 +0100 Subject: [PATCH 233/546] Don't add address if none of the fields are filled out. --- apps/contacts/ajax/addproperty.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index 6e3ba3566c0..0050f5f49aa 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -35,10 +35,22 @@ $name = $_POST['name']; $value = $_POST['value']; if(!is_array($value)){ $value = trim($value); - if(!$value && in_array($name, array('TEL', 'EMAIL'))) { + if(!$value && in_array($name, array('TEL', 'EMAIL', 'ORG'))) { OC_JSON::error(array('data' => array('message' => $l->t('Cannot add empty property.')))); exit(); } +} elseif($name === 'ADR') { // only add if non-empty elements. + $empty = true; + foreach($value as $part) { + if(trim($part) != '') { + $empty = false; + break; + } + } + if($empty) { + OC_JSON::error(array('data' => array('message' => $l->t('At least one of the address fields has to be filled out.')))); + exit(); + } } $parameters = isset($_POST['parameters']) ? $_POST['parameters'] : array(); @@ -49,7 +61,7 @@ $line = count($vcard->children) - 1; // Apparently Sabre_VObject_Parameter doesn't do well with multiple values or I don't know how to do it. Tanghus. foreach ($parameters as $key=>$element) { if(is_array($element) && strtoupper($key) == 'TYPE') { - // FIXME: Maybe this doesn't only apply for TYPE? + // NOTE: Maybe this doesn't only apply for TYPE? // And it probably shouldn't be done here anyways :-/ foreach($element as $e){ if($e != '' && !is_null($e)){ -- GitLab From 0b45d19ea0af15a440c0d39725ab34f9d70d7528 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 12 Jan 2012 16:50:49 +0100 Subject: [PATCH 234/546] change app icon --- apps/calendar/img/Icon License | 2 ++ apps/calendar/img/icon.png | Bin 398 -> 423 bytes apps/calendar/img/icon.svg | 14 ++++++++++++++ 3 files changed, 16 insertions(+) create mode 100644 apps/calendar/img/Icon License create mode 100755 apps/calendar/img/icon.svg diff --git a/apps/calendar/img/Icon License b/apps/calendar/img/Icon License new file mode 100644 index 00000000000..b1b292ace66 --- /dev/null +++ b/apps/calendar/img/Icon License @@ -0,0 +1,2 @@ +http://thenounproject.com/noun/calendar/#icon-No404 +Creative Commons BY 3.0 \ No newline at end of file diff --git a/apps/calendar/img/icon.png b/apps/calendar/img/icon.png index ee0249b2c9be86e86b9951b1a1876d5e1c9af579..eb9e07cbb10df41ae8439c4475ca585a6f36445f 100644 GIT binary patch delta 412 zcmV;N0b~A-1E&KaiBL{Q4GJ0x0000DNk~Le0000E0000G2nGNE049`9I*}n3fByjg z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru+yM*?8YjbHJRbl60VhdB zK~yNuozlHZTwxH#@t^Biuo3)-g`mwUNQ_0$PA$EG^ww7P7Ft+Z>Me+OAa=IiKm=2{ z%|Z}FO>l*Py4pMkUOyn{z;Mp|f9HA6%$aw1X?s}o)|Rkaf-28RG%fOibxVH}--X>^B)MAmROK4h0v0meOMDL-i!T(qa%PpOwu`TK z@EhY{?Npm7biE3XI1X6G3C=TJ$xY?*Yu#goM%s`na~O)aZhs=VTGyzub}Ip`?Bx}{ zh4o`Jxs`HNZ;PwhE-L+q3)?Pqw~Y+vqt=6icXsoCzW)rO9$6M)1lltI0000ERLtqy<2jgAGW^fBv61QBkZO$Yfyn>AV}n;4JWn zEM{Qf76xHPhFNnYfP(BLp1!W^x7j5*C5;(m3r_%rI7(b2N}Tg^b5rw57`~mEwjU_= z%hSa%#NzbYNgK0T97J5-`-r)in>8MB@QOWnD=J{aH}gNsezF`q<(HGA^S9})mg1Rn zOFS&4d+KMMde9~iP`o;PPqpRuj}5&_3<;6f3VS0t3Kv9kmN7i2lnWDjP|u-ubKBnU zwg1l<^vo4-+M4@YZ|NV8%U5QWNhB}d`Mm2uq0Hu0tBR+ko}csCTY%;J(gQ`-cQZ>QtH)l?kGZ}#viI>1!}Fh~?`K+ + + + + + + -- GitLab From a0ff21a2326e415bb1c0147ba2d96179d4036ca2 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 12 Jan 2012 18:26:13 +0100 Subject: [PATCH 235/546] added a file to fix wrong recognised mime-types --- lib/filestorage/local.php | 9 ++++++++- lib/mimetypes.fixlist.php | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 lib/mimetypes.fixlist.php diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index cfc27159786..1261bd3aa83 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -132,6 +132,13 @@ class OC_Filestorage_Local extends OC_Filestorage{ public function getMimeType($fspath){ if($this->is_readable($fspath)){ $mimeType='application/octet-stream'; + if ($mimeType=='application/octet-stream') { + self::$mimetypes = include('mimetypes.fixlist.php'); + $extention=strtolower(strrchr(basename($fspath), ".")); + $extention=substr($extention,1);//remove leading . + $mimeType=(isset(self::$mimetypes[$extention]))?self::$mimetypes[$extention]:'application/octet-stream'; + + } if (@is_dir($this->datadir.$fspath)) { // directories are easy return "httpd/unix-directory"; @@ -158,7 +165,7 @@ class OC_Filestorage_Local extends OC_Filestorage{ } if ($mimeType=='application/octet-stream') { // Fallback solution: (try to guess the type by the file extension - if(!self::$mimetypes){ + if(!self::$mimetypes || self::$mimetypes == include('mimetypes.list.php')){ self::$mimetypes=include('mimetypes.list.php'); } $extention=strtolower(strrchr(basename($fspath), ".")); diff --git a/lib/mimetypes.fixlist.php b/lib/mimetypes.fixlist.php new file mode 100644 index 00000000000..f2d86d0db1e --- /dev/null +++ b/lib/mimetypes.fixlist.php @@ -0,0 +1,12 @@ +'text/calendar', + 'ical'=>'text/calendar', + 'js'=>'application/javascript', + 'odt'=>'application/vnd.oasis.opendocument.text', + 'ods'=>'application/vnd.oasis.opendocument.spreadsheet', + 'odg'=>'application/vnd.oasis.opendocument.graphics', + 'odp'=>'application/vnd.oasis.opendocument.presentation', + 'pl'=>'text/x-script.perl', + 'py'=>'text/x-script.phyton', +); -- GitLab From 0fb73ec49d4adb3272b2939f10498ca446f7ffb6 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 12 Jan 2012 21:54:58 +0100 Subject: [PATCH 236/546] fix previous change --- lib/filestorage/local.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index 1261bd3aa83..b8a0563c134 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -165,7 +165,7 @@ class OC_Filestorage_Local extends OC_Filestorage{ } if ($mimeType=='application/octet-stream') { // Fallback solution: (try to guess the type by the file extension - if(!self::$mimetypes || self::$mimetypes == include('mimetypes.list.php')){ + if(!self::$mimetypes || self::$mimetypes != include('mimetypes.list.php')){ self::$mimetypes=include('mimetypes.list.php'); } $extention=strtolower(strrchr(basename($fspath), ".")); -- GitLab From cd8f54ade2a961c5f55d0b137caa7f707c2d73e8 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 12 Jan 2012 22:06:53 +0100 Subject: [PATCH 237/546] update js of calendar import --- apps/calendar/js/loader.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js index 6eafec8b10d..c21c20275e2 100644 --- a/apps/calendar/js/loader.js +++ b/apps/calendar/js/loader.js @@ -1,16 +1,19 @@ -function importdialog(directory, filename){ - $("body").append("
    "); - $("#importdialogholder").load(OC.filePath('calendar', 'ajax', 'importdialog.php?filename=' + filename + '&path=' + directory)); +Calendar_Import={ + importdialog: function(filename){ + var path = $('#dir').val(); + $('body').append('
    '); + $('#calendar_import').load(OC.filePath('calendar', 'ajax', 'importdialog.php'), {filename:filename, path:path}, Calendar_Import.initdialog()); + }, + initdialog: function(){ + + }, + getimportstatus: function(){ + + } } - $(document).ready(function(){ - $('tr[data-file$=".ics"]').attr("data-mime", "text/calendar"); - $('tr[data-file$=".vcs"]').attr("data-mime", "text/calendar"); - $('tr[data-file$=".ical"]').attr("data-mime", "text/calendar"); - if(typeof FileActions!=='undefined'){ - FileActions.register('text/calendar','Import to Calendar','',function(filename){ - importdialog($('#dir').val(),filename); - }); - FileActions.setDefault('text/calendar','Import to Calendar'); - } + if(typeof FileActions !== 'undefined'){ + FileActions.register('text/calendar','importcal', '', Calendar_Import.importdialog); + FileActions.setDefault('text/calendar','importcal'); + }; }); \ No newline at end of file -- GitLab From 0d120efda591a8405373309b0ac887415c5e94a6 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 11:26:11 +0100 Subject: [PATCH 238/546] Add PRODID to vcards created by ownCloud. --- apps/contacts/lib/vcard.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index c61f0dfc114..04b59a040fb 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -114,6 +114,14 @@ class OC_Contacts_VCard{ //$data = $card->serialize(); }; $uri = $uid.'.vcf'; + + // Add product ID. + $prodid = trim($card->getAsString('PRODID')); + if(!$prodid) { + $appinfo = $info=OC_App::getAppInfo('contacts'); + $prodid = 'PRODID:-//ownCloud//NONSGML '.$appinfo['name'].' '.$appinfo['version'].'//EN'; + $card->setString('PRODID', $prodid); + } // VCARD must have a version $version = $card->getAsString('VERSION'); // Add version if needed -- GitLab From 22356533a0529197d8a4c383307b566f94ed6fc4 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 16:06:27 +0100 Subject: [PATCH 239/546] Added search. Thanks to icewind it was mostly copy/paste :-) --- apps/contacts/appinfo/app.php | 4 +++- apps/contacts/lib/search.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 apps/contacts/lib/search.php diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index 524cc640bc9..1e9f8811722 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -1,4 +1,5 @@ 10, 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), 'icon' => OC_Helper::imagePath( 'settings', 'users.svg' ), - 'name' => 'Contacts' )); + 'name' => $l->t('Contacts') )); OC_APP::registerPersonal('contacts','settings'); +require_once('apps/contacts/lib/search.php'); \ No newline at end of file diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php new file mode 100644 index 00000000000..97638821007 --- /dev/null +++ b/apps/contacts/lib/search.php @@ -0,0 +1,29 @@ + 0){ + $searchquery = explode(' ', $query); + }else{ + $searchquery[] = $query; + } + $l = new OC_l10n('contacts'); + foreach($addressbooks as $addressbook){ + $vcards = OC_Contacts_VCard::all($addressbook['id']); + foreach($vcards as $vcard){ + if(substr_count(strtolower($vcard['fullname']), strtolower($query)) > 0){ + $link = OC_Helper::linkTo('apps/contacts', 'index.php?id='.urlencode($vcard['id'])); + $results[]=new OC_Search_Result($vcard['fullname'],'', $link,$l->t('Contact'));//$name,$text,$link,$type + } + } + } + return $results; + } +} +new OC_Search_Provider_Contacts(); -- GitLab From e60860148cbe9e97cd898712b63302da3df82ed0 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 18:04:23 +0100 Subject: [PATCH 240/546] Don't chunk_split encoded image string. Don't return json error but null if card can't be parsed. Small check for non-parsable card in index.php. --- apps/contacts/index.php | 12 +++++------- apps/contacts/lib/app.php | 9 ++++----- lib/image.php | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/apps/contacts/index.php b/apps/contacts/index.php index 6f65ac1c605..b179d9bbfe5 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -44,19 +44,17 @@ OC_App::setActiveNavigationEntry( 'contacts_index' ); $id = isset( $_GET['id'] ) ? $_GET['id'] : null; $details = array(); -// FIXME: This cannot work..? if(is_null($id) && count($contacts) > 0) { $id = $contacts[0]['id']; } +$vcard = null; +$details = null; if(!is_null($id)) { $vcard = OC_Contacts_App::getContactVCard($id); - $details = OC_Contacts_VCard::structureContact($vcard); + if(!is_null($vcard) { + $details = OC_Contacts_VCard::structureContact($vcard); + } } -// if( !is_null($id)/* || count($contacts)*/){ -// if(is_null($id)) $id = $contacts[0]['id']; -// $vcard = OC_Contacts_App::getContactVCard($id); -// $details = OC_Contacts_VCard::structureContact($vcard); -// } // Include Style and Script OC_Util::addScript('contacts','interface'); diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index 907ce82c76a..00a830d5e5f 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -56,15 +56,14 @@ class OC_Contacts_App{ return $card; } + /** + * @brief Gets the VCard as text + * @returns The card or null if the card could not be parsed. + */ public static function getContactVCard($id){ $card = self::getContactObject( $id ); $vcard = OC_VObject::parse($card['carddata']); - // Check if the card is valid - if(is_null($vcard)){ - OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('vCard could not be read.')))); - exit(); - } return $vcard; } diff --git a/lib/image.php b/lib/image.php index bdfa1fefd7d..70ad3f5969e 100644 --- a/lib/image.php +++ b/lib/image.php @@ -196,7 +196,7 @@ class OC_Image { if (!$res) { OC_Log::write('core','OC_Image::_string. Error writing image',OC_Log::ERROR); } - return chunk_split(base64_encode(ob_get_clean())); + return base64_encode(ob_get_clean()); } /** -- GitLab From 16973470457b31398c3a8b582e04b587e5b9862a Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 22:55:43 +0100 Subject: [PATCH 241/546] Oops. Missing ')' :-P --- apps/contacts/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/index.php b/apps/contacts/index.php index b179d9bbfe5..9012e5d8af8 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -51,7 +51,7 @@ $vcard = null; $details = null; if(!is_null($id)) { $vcard = OC_Contacts_App::getContactVCard($id); - if(!is_null($vcard) { + if(!is_null($vcard)) { $details = OC_Contacts_VCard::structureContact($vcard); } } -- GitLab From 0ba472c18a0dee5404b9b8a458bf571ea6e8fec0 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 12 Jan 2012 23:43:00 +0100 Subject: [PATCH 242/546] Too quick on the copy/paste trigger... --- apps/contacts/appinfo/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index 1e9f8811722..df7e8cec6e0 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -1,5 +1,5 @@ Date: Thu, 12 Jan 2012 20:35:50 +0100 Subject: [PATCH 243/546] Connect to the newly created database when checking if it needs to be filled. --- lib/setup.php | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index ce7ee24e134..eb32e84713f 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -189,16 +189,29 @@ class OC_Setup { self::pg_createDatabase($dbname, $dbuser, $connection); } - //fill the database if needed - $query = "select count(*) FROM pg_class WHERE relname='{$dbtableprefix}users' limit 1"; - $result = pg_query($connection, $query); - if($result){ - $row = pg_fetch_row($result); - } - if(!$result or $row[0]==0) { - OC_DB::createDbFromStructure('db_structure.xml'); - } + // the connection to dbname=postgres is not needed anymore pg_close($connection); + + // connect to the ownCloud database (dbname=$dbname) an check if it needs to be filled + $dbuser = OC_CONFIG::getValue('dbuser'); + $dbpass = OC_CONFIG::getValue('dbpassword'); + $connection_string = "host=$dbhost dbname=$dbname user=$dbuser password=$dbpass"; + $connection = @pg_connect($connection_string); + if(!$connection) { + $error[] = array( + 'error' => 'PostgreSQL username and/or password not valid', + 'hint' => 'You need to enter either an existing account or the administrator.' + ); + } else { + $query = "select count(*) FROM pg_class WHERE relname='{$dbtableprefix}users' limit 1"; + $result = pg_query($connection, $query); + if($result) { + $row = pg_fetch_row($result); + } + if(!$result or $row[0]==0) { + OC_DB::createDbFromStructure('db_structure.xml'); + } + } } } else { -- GitLab From f9c4975a456940bb24cacd6723a37f2857fbc65c Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Fri, 13 Jan 2012 13:57:46 +0100 Subject: [PATCH 244/546] improve import form for calendar --- apps/calendar/js/loader.js | 39 ++++++++++++- apps/calendar/templates/part.import.php | 75 ++++--------------------- 2 files changed, 48 insertions(+), 66 deletions(-) diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js index c21c20275e2..50a7b082d98 100644 --- a/apps/calendar/js/loader.js +++ b/apps/calendar/js/loader.js @@ -2,10 +2,43 @@ Calendar_Import={ importdialog: function(filename){ var path = $('#dir').val(); $('body').append('
    '); - $('#calendar_import').load(OC.filePath('calendar', 'ajax', 'importdialog.php'), {filename:filename, path:path}, Calendar_Import.initdialog()); + $('#calendar_import').load(OC.filePath('calendar', 'ajax', 'importdialog.php'), {filename:filename, path:path}, function(){Calendar_Import.initdialog(filename);}); }, - initdialog: function(){ - + initdialog: function(filename){ + $("#calendar_import_dialog").dialog({ + width : 500, + close : function() { + $(this).dialog('destroy').remove(); + $("#calendar_import").remove(); + } + }); + $('#progressbar').progressbar({value: 87}); + $('#startimport').click(function(){ + var filename = $('#filename').val(); + var path = $('#path').val(); + if($('#calendar option:selected').val() == 'newcal'){ + var method = 'new'; + var calname = $('#newcalendar').val(); + var calname = $.trim(calname); + if(calname == ''){ + $('#newcalendar').css('background-color', '#FF2626'); + return false; + } + }else{ + var method = 'old'; + } + $('#newcalendar').attr('readonly', 'readonly'); + $('#calendar').attr('disabled', 'disabled'); + $.post(OC.filePath('calendar', '', 'import.php'), {'method':method, 'calname':calname, 'path':path, 'file':filename}, function(){}); + $('#progressbar').slideDown('slow'); + }); + $('#calendar').change(function(){ + if($('#calendar option:selected').val() == 'newcal'){ + $('#newcalform').slideDown('slow'); + }else{ + $('#newcalform').slideUp('slow'); + } + }); }, getimportstatus: function(){ diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php index b8805e6b6ef..13685cfb273 100644 --- a/apps/calendar/templates/part.import.php +++ b/apps/calendar/templates/part.import.php @@ -1,69 +1,18 @@ -
    "> +
    "> "> "> -
    t("How to import the new calendar?");?> -

    -" onclick="$('#first').css('display', 'none');$('#existingcal').css('display', 'block');"> -" onclick="$('#first').css('display', 'none');$('#newcal').css('display', 'block');"> -
    -
    t('Displayname') ?>
    - - - - -
    t('Displayname') ?> - -
    - +!" id="startimport">

    -!" onclick="importcal('new');"> -

    -" onclick="$('#newcal').css('display', 'none');$('#first').css('display', 'block');"> -
    -
    - \ No newline at end of file + +
    \ No newline at end of file -- GitLab From 1b1c4889fc249e8cd27e2c3357868990abb2aa1e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 13 Jan 2012 20:04:59 +0100 Subject: [PATCH 245/546] fix some warning in the pgsql driver --- 3rdparty/MDB2/Driver/Manager/pgsql.php | 6 +++--- 3rdparty/MDB2/Driver/pgsql.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/3rdparty/MDB2/Driver/Manager/pgsql.php b/3rdparty/MDB2/Driver/Manager/pgsql.php index 490f697aa5b..7542e9e8329 100644 --- a/3rdparty/MDB2/Driver/Manager/pgsql.php +++ b/3rdparty/MDB2/Driver/Manager/pgsql.php @@ -499,7 +499,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common * @return mixed array of view names on success, a MDB2 error on failure * @access public */ - function listViews() + function listViews($database = null) { $db =& $this->getDBInstance(); if (PEAR::isError($db)) { @@ -631,7 +631,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common * @return mixed array of table names on success, a MDB2 error on failure * @access public */ - function listTables() + function listTables($database = null) { $db =& $this->getDBInstance(); if (PEAR::isError($db)) { @@ -922,7 +922,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common * @return mixed array of sequence names on success, a MDB2 error on failure * @access public */ - function listSequences() + function listSequences($database = null) { $db =& $this->getDBInstance(); if (PEAR::isError($db)) { diff --git a/3rdparty/MDB2/Driver/pgsql.php b/3rdparty/MDB2/Driver/pgsql.php index 6108f18dec1..13fea690680 100644 --- a/3rdparty/MDB2/Driver/pgsql.php +++ b/3rdparty/MDB2/Driver/pgsql.php @@ -1193,7 +1193,7 @@ class MDB2_Result_pgsql extends MDB2_Result_Common if ($object_class == 'stdClass') { $row = (object) $row; } else { - $row = &new $object_class($row); + $row = new $object_class($row); } } ++$this->rownum; -- GitLab From 6e0ea7aaaef50b7d7a48477995094da7aa745e4a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 13 Jan 2012 20:05:24 +0100 Subject: [PATCH 246/546] use absolute path for db_structure.xml when updating --- lib/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index e0f14b703dc..9531f7ed74f 100644 --- a/lib/base.php +++ b/lib/base.php @@ -156,7 +156,7 @@ class OC{ $installedVersion=OC_Config::getValue('version','0.0.0'); $currentVersion=implode('.',OC_Util::getVersion()); if (version_compare($currentVersion, $installedVersion, '>')) { - OC_DB::updateDbFromStructure('../db_structure.xml'); + OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml'); OC_Config::setValue('version',implode('.',OC_Util::getVersion())); } -- GitLab From 7d53b6f106fe7e6f0c56820ea18da4ac270b27a8 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 13 Jan 2012 20:05:44 +0100 Subject: [PATCH 247/546] remove temporary files after updating --- lib/db.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/db.php b/lib/db.php index b901cc8b513..f6eddf7825c 100644 --- a/lib/db.php +++ b/lib/db.php @@ -371,6 +371,10 @@ class OC_DB { } file_put_contents( $file2, $content ); $op = self::$schema->updateDatabase($file2, $previousSchema, array(), false); + + // Delete our temporary file + unlink( $file2 ); + if (PEAR::isError($op)) { $error = $op->getMessage(); OC_Log::write('core','Failed to update database structure ('.$error.')',OC_Log::FATAL); -- GitLab From a9878dca6d16258ac7ce3d1e7415b88ef30e9491 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 14 Jan 2012 11:19:24 +0100 Subject: [PATCH 248/546] content divs alignment --- apps/gallery/css/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css index 6bfd756e5f1..4ada23b0b06 100644 --- a/apps/gallery/css/styles.css +++ b/apps/gallery/css/styles.css @@ -1,5 +1,5 @@ div#gallery_list { margin: 90pt 20pt; } -div#gallery_list.leftcontent { padding-top: 15pt; margin: 0; height: 80%; text-align: center; overflow: scroll; } +div#gallery_list.leftcontent { padding-top: 15pt; margin: 0; position: absolute; bottom:0px; text-align: center; overflow: scroll; } div#gallery_album_box { width: 200px; text-align: center; border: 0; display: inline-block; margin: 5pt; vertical-align: top; padding: 10px; position: relative; overflow: hidden; color: #999; } div#gallery_album_box:hover { color: black; } .leftcontent div#gallery_album_box { margin: 5px; } @@ -7,5 +7,5 @@ div#gallery_album_box h1 { font-size: 9pt; font-family: Verdana; } div#gallery_album_cover { width: 199px; height: 199px; border: solid 1pt #999; padding: 0; } div#gallery_control_overlay { border: 0; position:absolute; right: 10pt; background-color: #333; opacity: 0.5; visibility:hidden; padding: 0 5pt; } div#gallery_control_overlay a { color:white; } -#gallery_images { padding:10px 5px; } +#gallery_images.rightcontent { padding:10px 5px; position:absolute; bottom: 0px; overflow: scroll; } -- GitLab From 06388e13394e026c5dd70b36c1ab65238d1cc254 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 14 Jan 2012 13:52:24 +0100 Subject: [PATCH 249/546] handling directory renaming and thumbnail move on gallery name chenge --- apps/gallery/ajax/galleryOp.php | 1 + apps/gallery/js/album_cover.js | 2 +- apps/gallery/lib/album.php | 11 ++++ apps/gallery/lib/hooks_handlers.php | 85 +++++++++++++++++------------ 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 0224977e633..a62f0fe3f5b 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -29,6 +29,7 @@ OC_JSON::checkAppEnabled('gallery'); function handleRename($oldname, $newname) { OC_JSON::checkLoggedIn(); OC_Gallery_Album::rename($oldname, $newname, OC_User::getUser()); + OC_Gallery_Album::changeThumbnailPath($oldname, $newname); } function handleRemove($name) { diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js index 84a89c5a91f..0009eb04e4f 100644 --- a/apps/gallery/js/album_cover.js +++ b/apps/gallery/js/album_cover.js @@ -58,7 +58,7 @@ function galleryRemove(albumName) { } function galleryRename(name) { - var result = window.prompt("Input new gallery name", ""); + var result = window.prompt("Input new gallery name", name); if (result) { if (Albums.find(result)) { alert("Album named '" + result + "' already exists"); diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index a94eff3acd7..a708ba83ea4 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -58,6 +58,17 @@ class OC_Gallery_Album { return $stmt->execute($args); } + public static function changePath($oldname, $newname, $owner) { + $stmt = OC_DB::prepare('UPDATE OR IGNORE *PREFIX*gallery_albums SET album_path=? WHERE uid_owner=? AND album_path=?'); + $stmt->execute(array($newname, $owner, $oldname)); + } + + public static function changeThumbnailPath($oldname, $newname) { + require_once('../../../lib/base.php'); + $thumbpath = OC::$CONFIG_DATADIRECTORY.'/../gallery/'; + rename($thumbpath.$oldname.'.png', $thumbpath.$newname.'.png'); + } + } ?> diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 65f3faaeeaf..ee17c0df7df 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -34,8 +34,19 @@ class OC_Gallery_Hooks_Handlers { private static function isPhoto($filename) { OC_Log::write(self::$APP_TAG, "Checking file ".$filename." with mimetype ".OC_Filesystem::getMimeType($filename), OC_Log::DEBUG); if (substr(OC_Filesystem::getMimeType($filename), 0, 6) == "image/") - return 1; - return 0; + return true; + return false; + } + + private static function directoryContainsPhotos($dirpath) { + $dirhandle = opendir(OC::$CONFIG_DATADIRECTORY.$dirpath); + if ($dirhandle != FALSE) { + while (($filename = readdir($dirhandle)) != FALSE) { + if ($filename[0] == '.') continue; + if (self::isPhoto($dirpath.'/'.$filename)) return true; + } + } + return false; } private static function createAlbum($path) { @@ -77,41 +88,45 @@ class OC_Gallery_Hooks_Handlers { } public static function renamePhoto($params) { - $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); - $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); - if ($olddir == '') $olddir = '/'; - if ($newdir == '') $newdir = '/'; - if (!self::isPhoto($params['newpath'])) return; - OC_Log::write(self::$APP_TAG, 'Moving photo from '.$params['oldpath'].' to '.$params['newpath'], OC_Log::DEBUG); - $album; - $newAlbumId; - $oldAlbumId; - if ($olddir == $newdir) { - // album changing is not needed - $album = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); - if ($album->numRows() == 0) { - $album = self::createAlbum($newdir); - } - $album = $album->fetchRow(); - $newAlbumId = $oldAlbumId = $album['album_id']; - } else { - $newalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $newdir); - $oldalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); - - if ($newalbum->numRows() == 0) { - $newalbum = self::createAlbum($newdir); - } - $newalbum = $newalbum->fetchRow(); - if ($oldalbum->numRows() == 0) { - OC_Gallery_Photo::create($newalbum['album_id'], $params['newpath']); - return; - } - $oldalbum = $oldalbum->fetchRow(); - $newAlbumId = $newalbum['album_id']; - $oldAlbumId = $oldalbum['album_id']; + if (OC_Filesystem::is_dir($params['newpath']) && self::directoryContainsPhotos($params['newpath'])) { + OC_Gallery_Album::changePath($params['oldpath'], $params['newpath'], OC_User::getUser()); + } elseif (!self::isPhoto($params['newpath'])) { + $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); + $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); + if ($olddir == '') $olddir = '/'; + if ($newdir == '') $newdir = '/'; + if (!self::isPhoto($params['newpath'])) return; + OC_Log::write(self::$APP_TAG, 'Moving photo from '.$params['oldpath'].' to '.$params['newpath'], OC_Log::DEBUG); + $album; + $newAlbumId; + $oldAlbumId; + if ($olddir == $newdir) { + // album changing is not needed + $album = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); + if ($album->numRows() == 0) { + $album = self::createAlbum($newdir); + } + $album = $album->fetchRow(); + $newAlbumId = $oldAlbumId = $album['album_id']; + } else { + $newalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $newdir); + $oldalbum = OC_Gallery_Album::find(OC_User::getUser(), null, $olddir); + + if ($newalbum->numRows() == 0) { + $newalbum = self::createAlbum($newdir); + } + $newalbum = $newalbum->fetchRow(); + if ($oldalbum->numRows() == 0) { + OC_Gallery_Photo::create($newalbum['album_id'], $params['newpath']); + return; + } + $oldalbum = $oldalbum->fetchRow(); + $newAlbumId = $newalbum['album_id']; + $oldAlbumId = $oldalbum['album_id']; + } + OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $params['oldpath'], $params['newpath']); } - OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $params['oldpath'], $params['newpath']); } } -- GitLab From 868cf4629051c557312b63acbb3e6facd8f0f86e Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sat, 14 Jan 2012 14:22:30 +0100 Subject: [PATCH 250/546] improve import function --- apps/calendar/ajax/importdialog.php | 13 +-- apps/calendar/import.php | 132 +++++++++++++++++++----- apps/calendar/import_tmp/Info | 2 + apps/calendar/js/loader.js | 43 ++++++-- apps/calendar/templates/part.import.php | 19 +++- 5 files changed, 161 insertions(+), 48 deletions(-) create mode 100644 apps/calendar/import_tmp/Info diff --git a/apps/calendar/ajax/importdialog.php b/apps/calendar/ajax/importdialog.php index 983a3d95a84..f6b8453fc22 100644 --- a/apps/calendar/ajax/importdialog.php +++ b/apps/calendar/ajax/importdialog.php @@ -1,20 +1,17 @@ + * Copyright (c) 2012 Georg Ehrke * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ require_once('../../../lib/base.php'); - +OC_JSON::checkLoggedIn(); +OC_Util::checkAppEnabled('calendar'); $l10n = new OC_L10N('calendar'); - -if(!OC_USER::isLoggedIn()) { - die(''); -} -OC_JSON::checkAppEnabled('calendar'); - $tmpl = new OC_Template('calendar', 'part.import'); +$tmpl->assign('path', $_POST['path']); +$tmpl->assign('filename', $_POST['filename']); $tmpl->printpage(); ?> diff --git a/apps/calendar/import.php b/apps/calendar/import.php index 759726b8d10..d1186e691e5 100644 --- a/apps/calendar/import.php +++ b/apps/calendar/import.php @@ -1,46 +1,122 @@ + * Copyright (c) 2012 Georg Ehrke * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ - +//check for calendar rights or create new one +ob_start(); require_once ('../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_Util::checkAppEnabled('calendar'); - -if($_GET["import"] == "existing"){ - $calid = $_GET["calid"]; - $calendar = OC_Calendar_App::getCalendar($calid); - if($_GET["path"] != ""){ - $filename = $_GET["path"] . "/" . $_GET["file"]; - }else{ - $filename = "/" . $_GET["file"]; - } -}else{ +$progressfile = 'import_tmp/' . md5(session_id()) . '.txt'; +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '10'); + fclose($progressfopen); +} +$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); +if($_POST['method'] == 'new'){ $id = OC_Calendar_Calendar::addCalendar(OC_User::getUser(), $_POST['calname']); OC_Calendar_Calendar::setCalendarActive($id, 1); - $calid = $id; - if($_POST["path"] != ""){ - $filename = $_POST["path"] . "/" . $_POST["file"]; +}else{ + $calendar = OC_Calendar_App::getCalendar($_POST['id']); + if($calendar['userid'] != OC_USER::getUser()){ + OC_JSON::error(); + exit(); + } + $id = $_POST['id']; +} +//analyse the calendar file +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '20'); + fclose($progressfopen); +} +$searchfor = array('VEVENT', 'VTODO', 'VJOURNAL'); +$parts = $searchfor; +$filearr = explode(' +', $file); +$inelement = false; +$parts = array(); +$i = 0; +foreach($filearr as $line){ + foreach($searchfor as $search){ + if(substr_count($line, $search) == 1){ + list($attr, $val) = explode(':', $line); + if($attr == 'BEGIN'){ + $parts[]['begin'] = $i; + $inelement = true; + } + if($attr == 'END'){ + $parts[count($parts) - 1]['end'] = $i; + $inelement = false; + } + } + } + $i++; +} +//import the calendar +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '40'); + fclose($progressfopen); +} +$start = ''; +$nl = ' +'; +for ($i = 0; $i < $parts[0]['begin']; $i++) { + if($i == 0){ + $start = $filearr[0]; }else{ - $filename = "/" . $_POST["file"]; + $start .= $nl . $filearr[$i]; } } -$vcalendar = OC_Filesystem::file_get_contents($filename); -$vcalendar = explode("BEGIN:VEVENT", $vcalendar); -for($i = 1;$i < count($vcalendar);$i++){ - $vcalendar[$i] = "BEGIN:VEVENT" . $vcalendar[$i]; +$end = ''; +for($i = $parts[count($parts) - 1]['end'] + 1;$i <= count($filearr) - 1; $i++){ + if($i == $parts[count($parts) - 1]['end'] + 1){ + $end = $filearr[$parts[count($parts) - 1]['end'] + 1]; + }else{ + $end .= $nl . $filearr[$i]; + } } -for($i = 1;$i < count($vcalendar) - 1;$i++){ - $vcalendar[$i] = $vcalendar[$i] . "END:VCALENDAR"; +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '50'); + fclose($progressfopen); +} +$importready = array(); +foreach($parts as $part){ + for($i = $part['begin']; $i <= $part['end'];$i++){ + if($i == $part['begin']){ + $content = $filearr[$i]; + }else{ + $content .= $nl . $filearr[$i]; + } + } + $importready[] = $start . $nl . $content . $nl . $end; +} +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '70'); + fclose($progressfopen); +} +if(count($parts) == 1){ + OC_Calendar_Object::add($id, $file); +}else{ + foreach($importready as $import){ + OC_Calendar_Object::add($id, $import); + } } -for($i = 1;$i < count($vcalendar);$i++){ - $vcalendar[$i] = $vcalendar[0] . $vcalendar[$i]; +//done the import +if(is_writable('import_tmp/')){ + $progressfopen = fopen($progressfile, 'w'); + fwrite($progressfopen, '100'); + fclose($progressfopen); } -for($i = 1;$i < count($vcalendar);$i++){ - OC_Calendar_Object::add($calid, $vcalendar[$i]); +sleep(3); +if(is_writable('import_tmp/')){ + unlink($progressfile); } -OC_JSON::success(); -?> +OC_JSON::success(); \ No newline at end of file diff --git a/apps/calendar/import_tmp/Info b/apps/calendar/import_tmp/Info new file mode 100644 index 00000000000..abafbce435c --- /dev/null +++ b/apps/calendar/import_tmp/Info @@ -0,0 +1,2 @@ +This folder contains static files with the percentage of the import. +Requires write permission diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js index 50a7b082d98..4e483f9864e 100644 --- a/apps/calendar/js/loader.js +++ b/apps/calendar/js/loader.js @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2012 Georg Ehrke + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ Calendar_Import={ importdialog: function(filename){ var path = $('#dir').val(); @@ -5,23 +11,31 @@ Calendar_Import={ $('#calendar_import').load(OC.filePath('calendar', 'ajax', 'importdialog.php'), {filename:filename, path:path}, function(){Calendar_Import.initdialog(filename);}); }, initdialog: function(filename){ - $("#calendar_import_dialog").dialog({ + $('#calendar_import_dialog').dialog({ width : 500, close : function() { $(this).dialog('destroy').remove(); - $("#calendar_import").remove(); + $('#calendar_import').remove(); } }); - $('#progressbar').progressbar({value: 87}); + $('#import_done_button').click(function(){ + $('#calendar_import_dialog').dialog('destroy').remove(); + $('#calendar_import').remove(); + }); + $('#progressbar').progressbar({value: 0}); $('#startimport').click(function(){ var filename = $('#filename').val(); var path = $('#path').val(); + var calid = $('#calendar option:selected').val(); if($('#calendar option:selected').val() == 'newcal'){ var method = 'new'; var calname = $('#newcalendar').val(); var calname = $.trim(calname); if(calname == ''){ $('#newcalendar').css('background-color', '#FF2626'); + $('#newcalendar').focus(function(){ + $('#newcalendar').css('background-color', '#F8F8F8'); + }); return false; } }else{ @@ -29,8 +43,16 @@ Calendar_Import={ } $('#newcalendar').attr('readonly', 'readonly'); $('#calendar').attr('disabled', 'disabled'); - $.post(OC.filePath('calendar', '', 'import.php'), {'method':method, 'calname':calname, 'path':path, 'file':filename}, function(){}); - $('#progressbar').slideDown('slow'); + var progressfile = $('#progressfile').val(); + $.post(OC.filePath('calendar', '', 'import.php'), {method: String (method), calname: String (calname), path: String (path), file: String (filename), id: String (calid)}, function(data){ + if(data.status == 'success'){ + $('#progressbar').progressbar('option', 'value', 100); + $('#import_done').css('display', 'block'); + } + }); + $('#form_container').css('display', 'none'); + $('#progressbar_container').css('display', 'block'); + window.setTimeout('Calendar_Import.getimportstatus(\'' + progressfile + '\')', 500); }); $('#calendar').change(function(){ if($('#calendar option:selected').val() == 'newcal'){ @@ -40,8 +62,15 @@ Calendar_Import={ } }); }, - getimportstatus: function(){ - + getimportstatus: function(progressfile){ + $.get(OC.filePath('calendar', 'import_tmp', progressfile), function(percent){ + $('#progressbar').progressbar('option', 'value', parseInt(percent)); + if(percent < 100){ + window.setTimeout('Calendar_Import.getimportstatus(\'' + progressfile + '\')', 500); + }else{ + $('#import_done').css('display', 'block'); + } + }); } } $(document).ready(function(){ diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php index 13685cfb273..8f46484b42b 100644 --- a/apps/calendar/templates/part.import.php +++ b/apps/calendar/templates/part.import.php @@ -1,7 +1,9 @@
    "> -"> -"> -

    t('Please choose the calendar'); ?> +

    + + + +

    t('Please choose the calendar'); ?> !" id="startimport"> -

    -

    +
    +
    \ No newline at end of file -- GitLab From e0dc8b8ab2c1803357e6bd4fbb477effe5d4c599 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 14 Jan 2012 14:59:18 +0100 Subject: [PATCH 251/546] handle gallery remove when removing dir via webinterface --- apps/gallery/lib/album.php | 7 +++++++ apps/gallery/lib/hooks_handlers.php | 7 +++++-- apps/gallery/lib/photo.php | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index a708ba83ea4..6adff196071 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -42,6 +42,13 @@ class OC_Gallery_Album { $stmt = OC_DB::prepare($sql); return $stmt->execute($args); } + + public static function removeByPath($path, $owner) { + $album = self::find($owner, null, $path); + $album = $album->fetchRow(); + self::remove($owner, $album['album_name']); + OC_Gallery_Photo::removeByAlbumId($album['album_id']); + } public static function find($owner, $name=null, $path=null){ $sql = 'SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?'; diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index ee17c0df7df..534f76896d7 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -83,8 +83,11 @@ class OC_Gallery_Hooks_Handlers { public static function removePhoto($params) { $path = $params['path']; - if (!self::isPhoto($path)) return; - OC_Gallery_Photo::removeByPath($path); + if (OC_Filesystem::is_dir($path) && self::directoryContainsPhotos($path)) { + OC_Gallery_Album::removeByPath($path, OC_User::getUser()); + } elseif (self::isPhoto($path)) { + OC_Gallery_Photo::removeByPath($path); + } } public static function renamePhoto($params) { diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php index 23887098e0f..14b0c4b2a07 100644 --- a/apps/gallery/lib/photo.php +++ b/apps/gallery/lib/photo.php @@ -56,6 +56,11 @@ class OC_Gallery_Photo{ $stmt->execute(array($id)); } + public static function removeByAlbumId($albumid) { + $stmt = OC_DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE album_id = ?'); + $stmt->execute(array($albumid)); + } + public static function changePath($oldAlbumId, $newAlbumId, $oldpath, $newpath) { $stmt = OC_DB::prepare("UPDATE *PREFIX*gallery_photos SET file_path = ?, album_id = ? WHERE album_id = ? and file_path = ?"); $stmt->execute(array($newpath, $newAlbumId, $oldAlbumId, $oldpath)); -- GitLab From 34a47840778240612a2c970cf0de89827794fe2d Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 14 Jan 2012 15:41:02 +0100 Subject: [PATCH 252/546] =?UTF-8?q?don=C2=B4t=20show=20warnings=20for=20mi?= =?UTF-8?q?ssing=20language=20name=20definitions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings/personal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 settings/personal.php diff --git a/settings/personal.php b/settings/personal.php old mode 100644 new mode 100755 index c27ca0aed63..7035f1b07d4 --- a/settings/personal.php +++ b/settings/personal.php @@ -31,7 +31,7 @@ array_unshift($languageCodes,$lang); $languageNames=include 'languageCodes.php'; $languages=array(); foreach($languageCodes as $lang){ - $languages[]=array('code'=>$lang,'name'=>$languageNames[$lang]); + $languages[]=array('code'=>$lang,'name'=>@$languageNames[$lang]); } // Return template -- GitLab From e979aa0c323481c68c0328f4ec0d790583be3e47 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sat, 14 Jan 2012 15:36:57 +0000 Subject: [PATCH 253/546] fix editor js --- apps/files_texteditor/js/editor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 54f781cd9b3..72e4c0e4c41 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -58,7 +58,7 @@ function showControls(filename,writeperms){ // Loads the control bar at the top. $('.actions,#file_action_panel').fadeOut('slow').promise().done(function() { // Load the new toolbar. - var savebtnhtml; + var editorcontrols; if(writeperms=="true"){ var editorcontrols = '
    '; } @@ -181,7 +181,7 @@ function showFileEditor(dir,filename){ result = jQuery.parseJSON(data.responseText); if(result.status == 'success'){ // Save mtime - $('#editor').attr('data-mtime', result.data.mtime); + $('#editor').attr('data-mtime', result.data.mtime); // Initialise the editor showControls(filename,result.data.write); $('table').fadeOut('slow', function() { -- GitLab From bfdbcbee127062d1e9415047617370e424ab9631 Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sat, 14 Jan 2012 15:45:19 +0000 Subject: [PATCH 254/546] Fix breadcrumb issue when closing editor --- apps/files_texteditor/js/editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 72e4c0e4c41..b36a3a692cd 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -216,7 +216,7 @@ function showFileEditor(dir,filename){ // Fades out the editor. function hideFileEditor(){ // Fades out editor controls - $('#controls > :not(.actions,#file_access_panel),#breadcrumb_file').fadeOut('slow',function(){ + $('#controls > :not(.actions,#file_access_panel,.crumb),#breadcrumb_file').fadeOut('slow',function(){ $(this).remove(); }); // Fade out editor -- GitLab From 5c179e6255141f33eae6a1520651bec0131127fb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 18:10:22 +0100 Subject: [PATCH 255/546] fix another warning in pgsql --- 3rdparty/MDB2/Driver/Manager/pgsql.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/MDB2/Driver/Manager/pgsql.php b/3rdparty/MDB2/Driver/Manager/pgsql.php index 7542e9e8329..a2e80caa5ce 100644 --- a/3rdparty/MDB2/Driver/Manager/pgsql.php +++ b/3rdparty/MDB2/Driver/Manager/pgsql.php @@ -633,7 +633,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common */ function listTables($database = null) { - $db =& $this->getDBInstance(); + $db =$this->getDBInstance(); if (PEAR::isError($db)) { return $db; } -- GitLab From 469a80ac09d3dac7674c0dae9a7bb3d2e6aed0b6 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 18:11:21 +0100 Subject: [PATCH 256/546] fix some sqlite2 upgrade issues --- 3rdparty/MDB2/Driver/Manager/sqlite.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/3rdparty/MDB2/Driver/Manager/sqlite.php b/3rdparty/MDB2/Driver/Manager/sqlite.php index 650910174e7..1b7239876f1 100644 --- a/3rdparty/MDB2/Driver/Manager/sqlite.php +++ b/3rdparty/MDB2/Driver/Manager/sqlite.php @@ -600,7 +600,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common } $constraints = array_flip($constraints); foreach ($constraints as $constraint => $value) { - if (!empty($definition['primary'])) { + if (!empty($definition['primary'])) { if (!array_key_exists('primary', $options)) { $options['primary'] = $definition['fields']; //remove from the $constraint array, it's already handled by createTable() @@ -682,7 +682,9 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common } foreach ($constraints as $constraint => $definition) { - $this->createConstraint($name_new, $constraint, $definition); + if(empty($definition['primary']) and empty($definition['foreign'])){ + $this->createConstraint($name_new, $constraint, $definition); + } } if (!empty($select_fields) && !empty($data)) { -- GitLab From f4ce399162b2708fd72ea21be9d1f8dc8da15217 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 21:13:46 +0100 Subject: [PATCH 257/546] fix issue with moving music files --- lib/files.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/files.php b/lib/files.php index 88b559059f0..9ae5320ad1d 100644 --- a/lib/files.php +++ b/lib/files.php @@ -183,8 +183,8 @@ class OC_Files { */ public static function move($sourceDir,$source,$targetDir,$target){ if(OC_User::isLoggedIn()){ - $targetFile=$targetDir.'/'.$target; - $sourceFile=$sourceDir.'/'.$source; + $targetFile=self::normalizePath($targetDir.'/'.$target); + $sourceFile=self::normalizePath($sourceDir.'/'.$source); return OC_Filesystem::rename($sourceFile,$targetFile); } } @@ -305,4 +305,19 @@ class OC_Files { $content.= "Options -Indexes\n"; @file_put_contents(OC::$SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it } + + /** + * normalize a path, removing any double, add leading /, etc + * @param string $path + * @return string + */ + static public function normalizePath($path){ + $path='/'.$path; + $old=''; + while($old!=$path){//replace any multiplicity of slashes with a single one + $old=$path; + $path=str_replace('//','/',$path); + } + return $path; + } } -- GitLab From 4cc68eac6d132f31782800efc4b8742ad7a72598 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 21:38:33 +0100 Subject: [PATCH 258/546] make pdf viewer work a bit better with the rest of owncloud --- apps/files_pdfviewer/appinfo/app.php | 2 -- apps/files_pdfviewer/js/pdfview.js | 25 +++++++++++++++++++++++++ apps/files_pdfviewer/js/viewer.js | 21 +++++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/apps/files_pdfviewer/appinfo/app.php b/apps/files_pdfviewer/appinfo/app.php index a446b4caa41..0f0b40764d9 100755 --- a/apps/files_pdfviewer/appinfo/app.php +++ b/apps/files_pdfviewer/appinfo/app.php @@ -1,7 +1,5 @@ Loading... 0%
    '); showPDFviewer.lastTitle = document.title; - PDFView.Ptitle = filename; - PDFView.open(url,1.00); + if(!showPDFviewer.loaded){ + OC.addScript( 'files_pdfviewer', 'pdfjs/build/pdf',function(){ + OC.addScript( 'files_pdfviewer', 'pdfview',function(){ + showPDFviewer.loaded=true; + PDFJS.workerSrc = OC.filePath('files_pdfviewer','js','pdfjs/build/pdf.js'); + PDFView.Ptitle = filename; + PDFView.open(url,1.00); + PDFView.active=true; + }); + }); + }else{ + PDFView.Ptitle = filename; + PDFView.open(url,1.00); + PDFView.active=true; + } $("#pageWidthOption").attr("selected","selected"); showPDFviewer.shown = true; } @@ -30,8 +44,7 @@ function showPDFviewer(dir,filename){ showPDFviewer.shown=false; showPDFviewer.oldCode=''; showPDFviewer.lastTitle=''; - -var extrahtml = ''; +showPDFviewer.loaded=false; $(document).ready(function(){ if(location.href.indexOf("files")!=-1) { -- GitLab From 352d73f1e077c2687be15fe1fab409d9a2283dae Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 21:58:16 +0100 Subject: [PATCH 259/546] some minor changes to the text editor loading --- apps/files_texteditor/js/editor.js | 65 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index b36a3a692cd..cb1af3dd6db 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -174,41 +174,40 @@ function giveEditorFocus(){ function showFileEditor(dir,filename){ if(!editorIsShown()){ // Loads the file editor and display it. - var data = $.ajax({ - url: OC.filePath('files_texteditor','ajax','loadfile.php'), - data: 'file='+encodeURIComponent(filename)+'&dir='+encodeURIComponent(dir), - complete: function(data){ - result = jQuery.parseJSON(data.responseText); - if(result.status == 'success'){ - // Save mtime - $('#editor').attr('data-mtime', result.data.mtime); - // Initialise the editor - showControls(filename,result.data.write); - $('table').fadeOut('slow', function() { - // Update document title - document.title = filename; - $('#editor').text(result.data.filecontents); - $('#editor').attr('data-dir', dir); - $('#editor').attr('data-filename', filename); - window.aceEditor = ace.edit("editor"); - aceEditor.setShowPrintMargin(false); - if(result.data.write=='false'){ - aceEditor.setReadOnly(true); - } - setEditorSize(); - setSyntaxMode(getFileExtension(filename)); - OC.addScript('files_texteditor','aceeditor/theme-clouds', function(){ - window.aceEditor.setTheme("ace/theme/clouds"); - }); + var data = $.getJSON( + OC.filePath('files_texteditor','ajax','loadfile.php'), + {file:filename,dir:dir}, + function(result){ + if(result.status == 'success'){ + // Save mtime + $('#editor').attr('data-mtime', result.data.mtime); + // Initialise the editor + showControls(filename,result.data.write); + $('table').fadeOut('slow', function() { + // Update document title + document.title = filename; + $('#editor').text(result.data.filecontents); + $('#editor').attr('data-dir', dir); + $('#editor').attr('data-filename', filename); + window.aceEditor = ace.edit("editor"); + aceEditor.setShowPrintMargin(false); + if(result.data.write=='false'){ + aceEditor.setReadOnly(true); + } + setEditorSize(); + setSyntaxMode(getFileExtension(filename)); + OC.addScript('files_texteditor','aceeditor/theme-clouds', function(){ + window.aceEditor.setTheme("ace/theme/clouds"); }); - } else { - // Failed to get the file. - alert(result.data.message); - } - // End success + }); + } else { + // Failed to get the file. + alert(result.data.message); } - // End ajax - }); + // End success + } + // End ajax + ); is_editor_shown = true; } } -- GitLab From 36a2649e371093eb9961c5ee95fd75ded98c9394 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 22:02:26 +0100 Subject: [PATCH 260/546] use admin icon for log menu enty untill we have a proper icon --- lib/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app.php b/lib/app.php index de7d82ce959..3cf00464d37 100644 --- a/lib/app.php +++ b/lib/app.php @@ -232,7 +232,7 @@ class OC_App{ // admin apps menu $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php?installed" ), "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); // admin log menu - $settings[] = array( "id" => "core_log", "order" => 4, "href" => OC_Helper::linkTo( "settings", "log.php" ), "name" => $l->t("Log"), "icon" => OC_Helper::imagePath( "settings", "log.svg" )); + $settings[] = array( "id" => "core_log", "order" => 4, "href" => OC_Helper::linkTo( "settings", "log.php" ), "name" => $l->t("Log"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); $settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "admin.php" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); } -- GitLab From 0615d096cea5af65291f040bb287e45ea1b0d02c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 22:25:07 +0100 Subject: [PATCH 261/546] make pdf viewer work with text editor --- apps/files_pdfviewer/js/viewer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/files_pdfviewer/js/viewer.js b/apps/files_pdfviewer/js/viewer.js index 03288ebe420..7f6766c67dd 100755 --- a/apps/files_pdfviewer/js/viewer.js +++ b/apps/files_pdfviewer/js/viewer.js @@ -4,8 +4,10 @@ function hidePDFviewer() { $('#controls').html(showPDFviewer.oldcode); $("#viewer").remove(); $("#loading").remove() + $("#editor").show(); document.title = showPDFviewer.lastTitle; PDFView.active=false; + $('iframe').remove(); } function showPDFviewer(dir,filename){ -- GitLab From b10668638250196b5d86865e68606f6d1d24fc22 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 22:27:20 +0100 Subject: [PATCH 262/546] remove ununsed copy-paste leftovers --- apps/files_pdfviewer/css/style.css | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100755 apps/files_pdfviewer/css/style.css diff --git a/apps/files_pdfviewer/css/style.css b/apps/files_pdfviewer/css/style.css deleted file mode 100755 index 9ad6eeaa814..00000000000 --- a/apps/files_pdfviewer/css/style.css +++ /dev/null @@ -1,27 +0,0 @@ -#editor{ - position: absoloute; - display: block; - top: 80px; - left: 160px; -} -#editorwrapper{ - position: absoloute; - height: 0; - width: 0; - top: 41px; - left: 160px; - display: none; -} -#editor_close{ - margin-left: auto; - margin-right: 167px; - display: block; -} -#editor_save{ - margin-left: 7px; - float: left; -} -#saving_icon{ - margin-top: 3px; - float: left; -} \ No newline at end of file -- GitLab From 5eb6071b049bf67ebbbcd99c3424f4635134b864 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 22:38:00 +0100 Subject: [PATCH 263/546] make the minimum width of the multiselect configurable --- core/css/multiselect.css | 1 + core/js/multiselect.js | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/css/multiselect.css b/core/css/multiselect.css index ee426351769..1202ea18427 100644 --- a/core/css/multiselect.css +++ b/core/css/multiselect.css @@ -1,4 +1,5 @@ ul.multiselectoptions { z-index:49; position:absolute; background-color:#fff; padding-top:.5em; border:1px solid #ddd; border-top:none; -moz-border-radius-bottomleft:.5em; -webkit-border-bottom-left-radius:.5em; border-bottom-left-radius:.5em; -moz-border-radius-bottomright:.5em; -webkit-border-bottom-right-radius:.5em; border-bottom-right-radius:.5em; -moz-box-shadow:0 1px 1px #ddd; -webkit-box-shadow:0 1px 1px #ddd; box-shadow:0 1px 1px #ddd; } +ul.multiselectoptions>li{ white-space:nowrap; overflow: hidden; } div.multiselect { padding-right:.6em; display:inline; position:relative; display:inline-block; vertical-align: bottom; } div.multiselect.active { background-color:#fff; border-bottom:none; border-bottom-left-radius:0; border-bottom-right-radius:0; z-index:50; position:relative } div.multiselect>span:first-child { margin-right:2em; float:left; } diff --git a/core/js/multiselect.js b/core/js/multiselect.js index 26380824047..610e9193bb7 100644 --- a/core/js/multiselect.js +++ b/core/js/multiselect.js @@ -9,23 +9,26 @@ 'checked':[], 'oncheck':false, 'onuncheck':false, + 'minWidth': 'default;', }; - $.extend(settings,options); + $.extend(settings,options); var button=$('
    '+settings.title+'â–¾
    '); - if(settings.checked.length>0){ - button.children('span').first().text(settings.checked.join(', ')); - } var span=$(''); span.append(button); button.data('id',multiSelectId); button.selectedItems=[]; this.hide(); this.before(span); - settings.minWidth=button.width(); + if(settings.minWidth=='default'){ + settings.minWidth=button.width(); + } button.css('min-width',settings.minWidth); settings.minOuterWidth=button.outerWidth()-2; button.data('settings',settings); - + if(settings.checked.length>0){ + button.children('span').first().text(settings.checked.join(', ')); + } + button.click(function(event){ var button=$(this); if(button.parent().children('ul').length>0){ @@ -83,13 +86,14 @@ } var newOuterWidth=Math.max((button.outerWidth()-2),settings.minOuterWidth)+'px'; var newWidth=Math.max(button.width(),settings.minWidth); + var pos=button.position(); button.css('height',button.height()); button.css('white-space','nowrap'); button.css('width',oldWidth); button.animate({'width':newWidth},undefined,undefined,function(){ button.css('width',''); }); - list.animate({'width':newOuterWidth}); + list.animate({'width':newOuterWidth,'left':pos.left+3}); }); var li=$('
  • '); li.append(input).append(label); -- GitLab From 2d25bb3b0104ca9150fbf316517f686fa89729a3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 23:10:38 +0100 Subject: [PATCH 264/546] add min width to multiselect in user management --- settings/js/users.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/settings/js/users.js b/settings/js/users.js index 79b4e80870a..b45038e5b04 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -30,9 +30,10 @@ $(document).ready(function(){ } element.multiSelect({ createText:'add group', - checked:checked, - oncheck:checkHandeler, - onuncheck:checkHandeler + checked:checked, + oncheck:checkHandeler, + onuncheck:checkHandeler, + minWidth: 100, }); } $('select[multiple]').each(function(index,element){ -- GitLab From ef69abd4dc696305474e45d7cd2661dcb51bdb8a Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 14 Jan 2012 23:12:32 +0100 Subject: [PATCH 265/546] constans for signals handling --- apps/gallery/lib/hooks_handlers.php | 34 ++++---- lib/filesystem.php | 125 +++++++++++++++++++++++----- 2 files changed, 124 insertions(+), 35 deletions(-) diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 534f76896d7..7248e67f0a2 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -21,9 +21,9 @@ * */ -OC_Hook::connect("OC_Filesystem", "post_write", "OC_Gallery_Hooks_Handlers", "addPhotoFromPath"); -OC_Hook::connect("OC_Filesystem", "delete", "OC_Gallery_Hooks_Handlers", "removePhoto"); -OC_Hook::connect("OC_Filesystem", "post_rename", "OC_Gallery_Hooks_Handlers", "renamePhoto"); +OC_Hook::connect(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_write, "OC_Gallery_Hooks_Handlers", "addPhotoFromPath"); +OC_Hook::connect(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_delete, "OC_Gallery_Hooks_Handlers", "removePhoto"); +OC_Hook::connect(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_rename, "OC_Gallery_Hooks_Handlers", "renamePhoto"); require_once(OC::$CLASSPATH['OC_Gallery_Album']); require_once(OC::$CLASSPATH['OC_Gallery_Photo']); @@ -61,8 +61,10 @@ class OC_Gallery_Hooks_Handlers { } public static function addPhotoFromPath($params) { - if (!self::isPhoto($params['path'])) return; - $fullpath = $params['path']; + $fullpath = $params[OC_Filesystem::signal_param_path]; + + if (!self::isPhoto($fullpath)) return; + OC_Log::write(self::$APP_TAG, 'Adding file with path '. $fullpath, OC_Log::DEBUG); $path = substr($fullpath, 0, strrpos($fullpath, '/')); if ($path == '') $path = '/'; @@ -82,7 +84,7 @@ class OC_Gallery_Hooks_Handlers { } public static function removePhoto($params) { - $path = $params['path']; + $path = $params[OC_Filesystem::signal_param_path]; if (OC_Filesystem::is_dir($path) && self::directoryContainsPhotos($path)) { OC_Gallery_Album::removeByPath($path, OC_User::getUser()); } elseif (self::isPhoto($path)) { @@ -91,15 +93,17 @@ class OC_Gallery_Hooks_Handlers { } public static function renamePhoto($params) { - if (OC_Filesystem::is_dir($params['newpath']) && self::directoryContainsPhotos($params['newpath'])) { - OC_Gallery_Album::changePath($params['oldpath'], $params['newpath'], OC_User::getUser()); - } elseif (!self::isPhoto($params['newpath'])) { - $olddir = substr($params['oldpath'], 0, strrpos($params['oldpath'], '/')); - $newdir = substr($params['newpath'], 0, strrpos($params['newpath'], '/')); + $oldpath = $params[OC_Filesystem::signal_param_oldpath]; + $newpath = $params[OC_Filesystem::signal_param_newpath]; + if (OC_Filesystem::is_dir($newpath) && self::directoryContainsPhotos($newpath)) { + OC_Gallery_Album::changePath($oldpath, $newpath, OC_User::getUser()); + } elseif (!self::isPhoto($newpath)) { + $olddir = substr($oldpath, 0, strrpos($oldpath, '/')); + $newdir = substr($newpath, 0, strrpos($newpath, '/')); if ($olddir == '') $olddir = '/'; if ($newdir == '') $newdir = '/'; - if (!self::isPhoto($params['newpath'])) return; - OC_Log::write(self::$APP_TAG, 'Moving photo from '.$params['oldpath'].' to '.$params['newpath'], OC_Log::DEBUG); + if (!self::isPhoto($newpath)) return; + OC_Log::write(self::$APP_TAG, 'Moving photo from '.$oldpath.' to '.$newpath, OC_Log::DEBUG); $album; $newAlbumId; $oldAlbumId; @@ -120,7 +124,7 @@ class OC_Gallery_Hooks_Handlers { } $newalbum = $newalbum->fetchRow(); if ($oldalbum->numRows() == 0) { - OC_Gallery_Photo::create($newalbum['album_id'], $params['newpath']); + OC_Gallery_Photo::create($newalbum['album_id'], $newpath); return; } $oldalbum = $oldalbum->fetchRow(); @@ -128,7 +132,7 @@ class OC_Gallery_Hooks_Handlers { $oldAlbumId = $oldalbum['album_id']; } - OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $params['oldpath'], $params['newpath']); + OC_Gallery_Photo::changePath($oldAlbumId, $newAlbumId, $oldpath, $newpath); } } } diff --git a/lib/filesystem.php b/lib/filesystem.php index 44401260c5e..fd0ac3b6215 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -47,8 +47,93 @@ class OC_Filesystem{ static private $mounts=array(); static private $fakeRoot=''; static private $storageTypes=array(); + + /** + * classname which used for hooks handling + * used as signalclass in OC_Hooks::emit() + */ + const CLASSNAME = 'OC_Filesystem'; + + /** + * signalname emited before file renaming + * @param oldpath + * @param newpath + */ + const signal_rename = 'rename'; + + /** + * signal emited after file renaming + * @param oldpath + * @param newpath + */ + const signal_post_rename = 'post_rename'; + /** + * signal emited before file/dir creation + * @param path + * @param run changing this flag to false in hook handler will cancel event + */ + const signal_create = 'create'; + + /** + * signal emited after file/dir creation + * @param path + * @param run changing this flag to false in hook handler will cancel event + */ + const signal_post_create = 'post_create'; + + /** + * signal emits before file/dir copy + * @param oldpath + * @param newpath + * @param run changing this flag to false in hook handler will cancel event + */ + const signal_copy = 'copy'; + + /** + * signal emits after file/dir copy + * @param oldpath + * @param newpath + */ + const signal_post_copy = 'post_copy'; + + /** + * signal emits before file/dir save + * @param path + * @param run changing this flag to false in hook handler will cancel event + */ + const signal_write = 'write'; + + /** + * signal emits after file/dir save + * @param path + */ + const signal_post_write = 'post_write'; + /** + * signal emits when reading file/dir + * @param path + */ + const signal_read = 'read'; + + /** + * signal emits when removing file/dir + * @param path + */ + const signal_delete = 'delete'; + + /** + * parameters definitions for signals + */ + const signal_param_path = 'path'; + const signal_param_oldpath = 'oldpath'; + const signal_param_newpath = 'newpath'; + + /** + * run - changing this flag to false in hook handler will cancel event + */ + const signal_param_run = 'run'; + /** * register a storage type * @param string type @@ -285,7 +370,7 @@ class OC_Filesystem{ static public function rename($path1,$path2){ if(OC_FileProxy::runPreProxies('rename',$path1,$path2) and self::is_writeable($path1) and self::isValidPath($path2)){ $run=true; - OC_Hook::emit( 'OC_Filesystem', 'rename', array( 'oldpath' => $path1 ,'newpath'=>$path2, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_rename, array( self::signal_param_oldpath => $path1 , self::signal_param_newpath=>$path2, self::signal_param_run => &$run)); if($run){ $mp1=self::getMountPoint($path1); $mp2=self::getMountPoint($path2); @@ -298,7 +383,7 @@ class OC_Filesystem{ $result=$storage2->fromTmpFile($tmpFile,self::getInternalPath($path2)); $storage1->unlink(self::getInternalPath($path1)); } - OC_Hook::emit( 'OC_Filesystem', 'post_rename', array( 'oldpath' => $path1, 'newpath'=>$path2)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_rename, array( self::signal_param_oldpath => $path1, self::signal_param_newpath=>$path2)); return $result; } } @@ -306,13 +391,13 @@ class OC_Filesystem{ static public function copy($path1,$path2){ if(OC_FileProxy::runPreProxies('copy',$path1,$path2) and self::is_readable($path1) and self::isValidPath($path2)){ $run=true; - OC_Hook::emit( 'OC_Filesystem', 'copy', array( 'oldpath' => $path1 ,'newpath'=>$path2, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_copy, array( self::signal_param_oldpath => $path1 , self::signal_param_newpath=>$path2, self::signal_param_run => &$run)); $exists=self::file_exists($path2); if($run and !$exists){ - OC_Hook::emit( 'OC_Filesystem', 'create', array( 'path' => $path2, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_create, array( self::signal_param_path => $path2, self::signal_param_run => &$run)); } if($run){ - OC_Hook::emit( 'OC_Filesystem', 'write', array( 'path' => $path2, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_write, array( self::signal_param_path => $path2, self::signal_param_run => &$run)); } if($run){ $mp1=self::getMountPoint($path1); @@ -325,11 +410,11 @@ class OC_Filesystem{ $tmpFile=$storage1->toTmpFile(self::getInternalPath($path1)); $result=$storage2->fromTmpFile($tmpFile,self::getInternalPath($path2)); } - OC_Hook::emit( 'OC_Filesystem', 'post_copy', array( 'oldpath' => $path1 ,'newpath'=>$path2)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_copy, array( self::signal_param_oldpath => $path1 , self::signal_param_newpath=>$path2)); if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'post_create', array( 'path' => $path2)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_create, array( self::signal_param_path => $path2)); } - OC_Hook::emit( 'OC_Filesystem', 'post_write', array( 'path' => $path2)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_write, array( self::signal_param_path => $path2)); return $result; } } @@ -360,7 +445,7 @@ class OC_Filesystem{ } static public function toTmpFile($path){ if(OC_FileProxy::runPreProxies('toTmpFile',$path) and self::isValidPath($path) and $storage=self::getStorage($path)){ - OC_Hook::emit( 'OC_Filesystem', 'read', array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, self::signal_read, array( self::signal_param_path => $path)); return $storage->toTmpFile(self::getInternalPath($path)); } } @@ -369,17 +454,17 @@ class OC_Filesystem{ $run=true; $exists=self::file_exists($path); if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'create', array( 'path' => $path, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_create, array( self::signal_param_path => $path, self::signal_param_run => &$run)); } if($run){ - OC_Hook::emit( 'OC_Filesystem', 'write', array( 'path' => $path, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_write, array( self::signal_param_path => $path, self::signal_param_run => &$run)); } if($run){ $result=$storage->fromTmpFile($tmpFile,self::getInternalPath($path)); if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'post_create', array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_create, array( self::signal_param_path => $path)); } - OC_Hook::emit( 'OC_Filesystem', 'post_write', array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_write, array( self::signal_param_path => $path)); return $result; } } @@ -389,17 +474,17 @@ class OC_Filesystem{ $run=true; $exists=self::file_exists($path); if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'create', array( 'path' => $path, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_create, array( self::signal_param_path => $path, self::signal_param_run => &$run)); } if($run){ - OC_Hook::emit( 'OC_Filesystem', 'write', array( 'path' => $path, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, self::signal_write, array( self::signal_param_path => $path, self::signal_param_run => &$run)); } if($run){ $result=$storage->fromUploadedFile($tmpFile,self::getInternalPath($path)); if(!$exists){ - OC_Hook::emit( 'OC_Filesystem', 'post_create', array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_create, array( self::signal_param_path => $path)); } - OC_Hook::emit( 'OC_Filesystem', 'post_write', array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, self::signal_post_write, array( self::signal_param_path => $path)); return $result; } } @@ -453,9 +538,9 @@ class OC_Filesystem{ $run=true; foreach($hooks as $hook){ if($hook!='read'){ - OC_Hook::emit( 'OC_Filesystem', $hook, array( 'path' => $path, 'run' => &$run)); + OC_Hook::emit( self::CLASSNAME, $hook, array( self::signal_param_path => $path, self::signal_param_run => &$run)); }else{ - OC_Hook::emit( 'OC_Filesystem', $hook, array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, $hook, array( self::signal_param_path => $path)); } } if($run){ @@ -467,7 +552,7 @@ class OC_Filesystem{ $result=OC_FileProxy::runPostProxies($operation,$path,$result); foreach($hooks as $hook){ if($hook!='read'){ - OC_Hook::emit( 'OC_Filesystem', 'post_'.$hook, array( 'path' => $path)); + OC_Hook::emit( self::CLASSNAME, 'post_'.$hook, array( self::signal_param_path => $path)); } } return $result; -- GitLab From 0c76884f9884fe0bbc0479f7380a0429adba80c3 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sat, 14 Jan 2012 23:39:05 +0100 Subject: [PATCH 266/546] add icon for log app --- lib/app.php | 2 +- settings/img/log Icon License | 2 + settings/img/log.png | Bin 0 -> 441 bytes settings/img/log.svg | 86 ++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 settings/img/log Icon License create mode 100644 settings/img/log.png create mode 100755 settings/img/log.svg diff --git a/lib/app.php b/lib/app.php index 3cf00464d37..de7d82ce959 100644 --- a/lib/app.php +++ b/lib/app.php @@ -232,7 +232,7 @@ class OC_App{ // admin apps menu $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php?installed" ), "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); // admin log menu - $settings[] = array( "id" => "core_log", "order" => 4, "href" => OC_Helper::linkTo( "settings", "log.php" ), "name" => $l->t("Log"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); + $settings[] = array( "id" => "core_log", "order" => 4, "href" => OC_Helper::linkTo( "settings", "log.php" ), "name" => $l->t("Log"), "icon" => OC_Helper::imagePath( "settings", "log.svg" )); $settings[]=array( "id" => "admin", "order" => 1000, "href" => OC_Helper::linkTo( "settings", "admin.php" ), "name" => $l->t("Admin"), "icon" => OC_Helper::imagePath( "settings", "admin.svg" )); } diff --git a/settings/img/log Icon License b/settings/img/log Icon License new file mode 100644 index 00000000000..b5c3167d733 --- /dev/null +++ b/settings/img/log Icon License @@ -0,0 +1,2 @@ +CC BY 3.0 +http://thenounproject.com/en-us/noun/printer/#icon-No109 \ No newline at end of file diff --git a/settings/img/log.png b/settings/img/log.png new file mode 100644 index 0000000000000000000000000000000000000000..c84b3b29f19419f271756505087250057f1bb9dd GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k>5cfu>k`x;TbdoL)M4 zqZhNIK-+%H^^

    GkGNJQFXd`%e$wHA#1h>2hIEzC9V5L$K?Y11mB5XJ`cG)IK=E4 zBbMB7TC`JoHg`;)sQ#07&9wA?_2vKPifVaW{?f>{;hJ0(w=c^pTgGgstS-iYKZiLR zoI>jxGFPl(ci^j8zvHL40Ux8wlWS4cySS`TIuJxLxC>Yf)9K$vsTT4>&U{pZ6`+u=@R&<$9sa{?)IPFEHNX z=D+3OAKI+q$t76%*>#di>ngv7xRZ(uX5xxUpLI@~od4_}pAxz3KuKq?@khVV?c$a5 zp8r1lupsR9PI(?S_c&qKCGk}oxdqxDvhg0<^y{>p%MxZEssF6^leXW!tJ(EPvO@Rx ep03ERT>CwoCdS8a(#ZmbD}$%2pUXO@geCwCKdX@d literal 0 HcmV?d00001 diff --git a/settings/img/log.svg b/settings/img/log.svg new file mode 100755 index 00000000000..72d4758aceb --- /dev/null +++ b/settings/img/log.svg @@ -0,0 +1,86 @@ + + + +image/svg+xml + + + + + + + + \ No newline at end of file -- GitLab From 0ac9e56da929fdac9507b386139c7e24f131cdf1 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 23:37:50 +0100 Subject: [PATCH 267/546] small fix for server svg mimetype detection --- core/js/js.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/js/js.js b/core/js/js.js index 5846d289880..2bb6cff0cb0 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -191,11 +191,13 @@ SVGSupport.checkMimeType=function(){ $.each(headerParts,function(i,text){ if(text){ var parts=text.split(':',2); - var value=parts[1].trim(); - if(value[0]=='"'){ - value=value.substr(1,value.length-2); + if(parts.length==2){ + var value=parts[1].trim(); + if(value[0]=='"'){ + value=value.substr(1,value.length-2); + } + headers[parts[0]]=value; } - headers[parts[0]]=value; } }); if(headers["Content-Type"]!='image/svg+xml'){ -- GitLab From 56af6ee752bc2e15a87b44f724d37e2622d675ca Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 14 Jan 2012 23:47:31 +0100 Subject: [PATCH 268/546] fix some of the styling issues on opera --- core/css/styles.css | 2 +- files/css/files.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/css/styles.css b/core/css/styles.css index b0f83c9b065..76e1e5760b8 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -57,7 +57,7 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text- #controls .button { display:inline-block; } #content { margin:3.5em 0 0 12.5em; } #leftcontent, .leftcontent { position:fixed; overflow: auto; top:6.4em; width:20em; background:#f8f8f8; border-right:1px solid #ddd; } -#leftcontent li, .leftcontent li { padding:.3em .8em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; } +#leftcontent li, .leftcontent li { background:#f8f8f8; padding:.3em .8em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; } #leftcontent li:hover, #leftcontent li:active, #leftcontent li.active, .leftcontent li:hover, .leftcontent li:active, .leftcontent li.active { background:#eee; } #rightcontent, .rightcontent { position:absolute; top:6.4em; left:33em; } diff --git a/files/css/files.css b/files/css/files.css index 22f4810d0a6..b384fef0b78 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -36,6 +36,7 @@ #emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; } table { position:relative; top:37px; width:100%; } tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; height:1em; } +tbody tr { background-color:#fff; } tbody tr.selected { background-color:#eee; } tbody a { color:#000; } span.extention, td.date { color:#999; } -- GitLab From b1433119cc0abf4bffed1a901bace0ca9e92e328 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Sun, 15 Jan 2012 00:06:26 +0100 Subject: [PATCH 269/546] highlight the current view --- apps/calendar/js/calendar.js | 13 ++++++++++++- apps/calendar/templates/calendar.php | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index ae586661ccc..33a78b3e322 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011 Georg Ehrke + * Copyright (c) 2012 Georg Ehrke * Copyright (c) 2011 Bart Visscher * This file is licensed under the Affero General Public License version 3 or * later. @@ -345,6 +345,11 @@ Calendar={ } }, + reseticonhighlight: function(){ + $('#oneweekview_radio').css('color', '#000000'); + $('#onemonthview_radio').css('color', '#000000'); + $('#listview_radio').css('color', '#000000'); + }, Calendar:{ overview:function(){ if($('#choosecalendar_dialog').dialog('isOpen') == true){ @@ -669,12 +674,18 @@ $(document).ready(function(){ }); $('#oneweekview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'agendaWeek'); + Calendar.UI.reseticonhighlight(); + $('#oneweekview_radio').css('color', '#6193CF'); }); $('#onemonthview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'month'); + Calendar.UI.reseticonhighlight(); + $('#onemonthview_radio').css('color', '#6193CF'); }); $('#listview_radio').click(function(){ $('#calendar_holder').fullCalendar('changeView', 'list'); + Calendar.UI.reseticonhighlight(); + $('#listview_radio').css('color', '#6193CF'); }); $('#today_input').click(function(){ $('#calendar_holder').fullCalendar('today'); diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 50d3d70347a..6b2cd68c6fb 100755 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -27,6 +27,20 @@ echo '$(\'#calendar_holder\').fullCalendar(\'gotoDate\', ' . $year . ', ' . --$month . ', ' . $day . ');'; echo '$(\'#dialog_holder\').load(OC.filePath(\'calendar\', \'ajax\', \'editeventform.php\') + \'?id=\' + ' . $_['showevent'] . ' , Calendar.UI.startEventDialog);'; } + + switch(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month')){ + case 'agendaWeek': + echo '$(\'#oneweekview_radio\').css(\'color\', \'#6193CF\');'; + break; + case 'month': + echo '$(\'#onemonthview_radio\').css(\'color\', \'#6193CF\');'; + break; + case 'list': + echo '$(\'#listview_radio\').css(\'color\', \'#6193CF\');'; + break; + default: + break; + } ?> }); -- GitLab From 5cd6e0f4d98b98809eb17366ca90e79b09a05115 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 15 Jan 2012 00:11:26 +0100 Subject: [PATCH 270/546] remove some of the flickering in opera --- apps/media/css/music.css | 4 ++-- core/css/styles.css | 1 + files/css/files.css | 1 + files/js/fileactions.js | 12 ++++++++---- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/media/css/music.css b/apps/media/css/music.css index 41ade44a66f..da0407fca58 100644 --- a/apps/media/css/music.css +++ b/apps/media/css/music.css @@ -20,8 +20,8 @@ div.jp-volume-bar-value { background:#ccc; width:0; height:0.4em; } #collection { padding-top:1em; position:relative; width:100%; float:left; } #collection li.album,#collection li.song { margin-left:3em; } -#leftcontent img.remove { display:none; float:right; cursor:pointer; } -#leftcontent li:hover img.remove { display:inline; } +#leftcontent img.remove { display:none; float:right; cursor:pointer; opacity: 0; } +#leftcontent li:hover img.remove { display:inline; opacity: .3; } #leftcontent li div.label { float: left; width: 200px; overflow: hidden; text-overflow: ellipsis; } #collection li button { float:right; } #collection li,#playlist li { list-style-type:none; } diff --git a/core/css/styles.css b/core/css/styles.css index 76e1e5760b8..53af8b383e3 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -106,6 +106,7 @@ label.infield { cursor: text !important; } #notification { z-index:101; cursor:pointer; background-color:#fc4; border:0; padding:0 .7em .3em; display:none; position:fixed; left:50%; top:0; -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; -moz-border-radius-bottomright:1em; -webkit-border-bottom-right-radius:1em; border-bottom-right-radius:1em; } .action, .selectedActions a, #logout { opacity:.3; -webkit-transition:opacity 500ms; -moz-transition:opacity 500ms; -o-transition:opacity 500ms; transition:opacity 500ms; } +.action { width: 16px; height: 16px; } .action:hover, .selectedActions a:hover, #logout:hover { opacity:1; } table:not(.nostyle) tr { -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; } diff --git a/files/css/files.css b/files/css/files.css index b384fef0b78..6c4d603b4a6 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -70,6 +70,7 @@ table thead.fixed { height:2em; } #select_all { float:left; margin:.3em 0.6em 0 .5em; } #uploadsize-message,#delete-confirm { display:none; } .selectedActions a,#fileList a.action { float:right; display:inline; margin:0 .5em; padding:.3em .3em 0 .3em !important; } +a.action>img{ max-height:16px; max-width:16px; } .selectedActions { display:none; } /* add breadcrumb divider to the File item in navigation panel */ diff --git a/files/js/fileactions.js b/files/js/fileactions.js index 6f0729e43b6..b5dd3982803 100644 --- a/files/js/fileactions.js +++ b/files/js/fileactions.js @@ -66,7 +66,7 @@ FileActions={ if(img.call){ img=img(file); } - var html=''; + var html=''; + var html='

    '; + var displayTemplate = ''; for (var i in Albums.albums) { var a = Albums.albums[i]; var local=$(displayTemplate); local.attr('data-album',a.name); - $(".gallery_control_overlay a.rename", local).click(function(name,event){ + $(".gallery_album_decoration a.rename", local).click(function(name,event){ event.preventDefault(); galleryRename(name); }.bind(null,a.name)); - $(".gallery_control_overlay a.remove", local).click(function(name,event){ + $(".gallery_album_decoration a.remove", local).click(function(name,event){ event.preventDefault(); galleryRemove(name); }.bind(null,a.name)); @@ -66,8 +66,9 @@ Albums={ if (albumMetadata == undefined) { return; } - var x = Math.min(Math.floor((e.layerX - this.offsetLeft)/(this.offsetWidth/albumMetadata.numOfCovers)), albumMetadata.numOfCovers-1); - x *= this.offsetWidth-1; + var x = Math.floor((e.layerX - this.offsetLeft)/(this.offsetWidth/albumMetadata.numOfCovers)); + x *= this.offsetWidth; + if (x < 0) x=0; $(this).css('background-position', -x+'px 0'); }); $(element).append(local); diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php index eb6ebd1bb7b..4c2fbcfe6c6 100644 --- a/apps/gallery/templates/index.php +++ b/apps/gallery/templates/index.php @@ -7,8 +7,24 @@ $l = new OC_L10N('gallery');
    - -
    +
    +
    + +
    + + + + + diff --git a/apps/gallery/templates/view_album.php b/apps/gallery/templates/view_album.php index 55a2ee09e4a..6b513a672d5 100644 --- a/apps/gallery/templates/view_album.php +++ b/apps/gallery/templates/view_album.php @@ -32,3 +32,16 @@ foreach ($_['photos'] as $a) { } ?> + + + + -- GitLab From 45038af948cd07ffc74efc8d4b0282fa11b7de7e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 30 Jan 2012 20:19:51 +0100 Subject: [PATCH 362/546] provide small wrapper around server side events and provide a fallback for IE --- core/js/eventsource.js | 94 ++++++++++++++++++++++++++++++++++++++++++ lib/base.php | 1 + lib/eventsource.php | 73 ++++++++++++++++++++++++++++++++ 3 files changed, 168 insertions(+) create mode 100644 core/js/eventsource.js create mode 100644 lib/eventsource.php diff --git a/core/js/eventsource.js b/core/js/eventsource.js new file mode 100644 index 00000000000..422f97657bd --- /dev/null +++ b/core/js/eventsource.js @@ -0,0 +1,94 @@ +/** + * ownCloud + * + * @author Robin Appelman + * @copyright 2012 Robin Appelman icewind1991@gmail.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +/** + * wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events) + * includes a fallback for older browsers and IE + * + * use server side events with causion, to many open requests can hang the server + */ + +OC.EventSource=function(src){ + if(!this.useFallBack && typeof EventSource !='undefined'){ + this.source=new EventSource(src); + this.source.onmessage=function(e){ + for(var i=0;i'); + this.iframe.attr('id',iframeId); + this.iframe.hide(); + this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount); + $('body').append(this.iframe); + this.useFallBack=true; + OC.EventSource.iframeCount++ + + } +} +OC.EventSource.fallBackSources=[]; +OC.EventSource.iframeCount=0;//number of fallback iframes +OC.EventSource.fallBackCallBack=function(id,type,data){ + OC.EventSource.fallBackSources[id].fallBackCallBack(type,JSON.parse(data)); +} +OC.EventSource.prototype={ + typelessListeners:[], + iframe:null, + listeners:{},//only for fallback + useFallBack:false, + fallBackCallBack:function(type,data){ + if(type){ + for(var i=0;i. +* +*/ + +/** + * wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events) + * includes a fallback for older browsers and IE + * + * use server side events with causion, to many open requests can hang the server + */ +class OC_EventSource{ + private $fallback; + private $fallBackId=0; + + public function __construct(){ + ob_end_clean(); + header('Cache-Control: no-cache'); + $this->fallback=isset($_GET['fallback']) and $_GET['fallback']=='true'; + if($this->fallback){ + $fallBackId=$_GET['fallback_id']; + header("Content-Type: text/html"); + echo str_repeat(''.PHP_EOL,10); //dummy data to keep IE happy + }else{ + header("Content-Type: text/event-stream"); + } + flush(); + + } + + /** + * send a message to the client + * @param string type + * @param object data + * + * if only one paramater is given, a typeless message will be send with that paramater as data + */ + public function send($type,$data=null){ + if(is_null($data)){ + $data=$type; + $type=null; + } + if($this->fallback){ + $response=''.PHP_EOL; + echo $response; + }else{ + if($type){ + echo 'event: '.$type.PHP_EOL; + } + echo 'data: '.json_encode($data).PHP_EOL; + } + echo PHP_EOL; + flush(); + } +} \ No newline at end of file -- GitLab From 0ba315912ba99c4fb7c30134754846cf7b66c8a0 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Mon, 30 Jan 2012 22:05:31 +0100 Subject: [PATCH 363/546] fix outdated README file --- README | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README b/README index 60b18defd59..cd562b66c6c 100644 --- a/README +++ b/README @@ -1,10 +1,9 @@ ownCloud gives you freedom and control over your own data. A personal cloud which runs on your own server. -It is alpha software in development and should be treated accordingly. http://ownCloud.org -Installation instructions: http://owncloud.org/install +Installation instructions: http://owncloud.org/support Source code: http://gitorious.org/owncloud Mailing list: http://mail.kde.org/mailman/listinfo/owncloud -- GitLab From e0f655fb707e1c632602319a6b989e8f58866953 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Mon, 30 Jan 2012 16:49:24 -0500 Subject: [PATCH 364/546] Sharing app needs to be loaded for public link of file in Shared folder - fixes bug 113 --- apps/files_sharing/get.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/files_sharing/get.php b/apps/files_sharing/get.php index ca95a68c6ce..c80b0c2ef03 100644 --- a/apps/files_sharing/get.php +++ b/apps/files_sharing/get.php @@ -1,5 +1,4 @@ Date: Mon, 30 Jan 2012 23:19:43 +0100 Subject: [PATCH 365/546] provide server side close option for EventStream --- core/js/eventsource.js | 7 ++++++- lib/eventsource.php | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 422f97657bd..30b942f59e8 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -44,8 +44,13 @@ OC.EventSource=function(src){ $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ - } + //add close listener + this.listen('__internal__',function(data){ + if(data=='close'){ + this.close(); + } + }.bind(this)); } OC.EventSource.fallBackSources=[]; OC.EventSource.iframeCount=0;//number of fallback iframes diff --git a/lib/eventsource.php b/lib/eventsource.php index c123eb4b837..b0450ff3d55 100644 --- a/lib/eventsource.php +++ b/lib/eventsource.php @@ -70,4 +70,11 @@ class OC_EventSource{ echo PHP_EOL; flush(); } + + /** + * close the connection of the even source + */ + public function close(){ + $this->send('__internal__','close');//server side closing can be an issue, let the client do it + } } \ No newline at end of file -- GitLab From 8543e797132a0b99127d7813e24dbb9c024a4fe8 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 30 Jan 2012 23:26:01 +0100 Subject: [PATCH 366/546] add option to send get data along with an eventsource request --- core/js/eventsource.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 30b942f59e8..dece1a69d04 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -26,9 +26,18 @@ * use server side events with causion, to many open requests can hang the server */ -OC.EventSource=function(src){ +/** + * create a new event source + * @param string src + * @param object data to be send as GET + */ +OC.EventSource=function(src,data){ + var dataStr=''; + for(name in data){ + dataStr+=name+'='+encodeURIComponent(data[name])+'&'; + } if(!this.useFallBack && typeof EventSource !='undefined'){ - this.source=new EventSource(src); + this.source=new EventSource(src+'?'+dataStr); this.source.onmessage=function(e){ for(var i=0;i'); this.iframe.attr('id',iframeId); this.iframe.hide(); - this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount); + this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ -- GitLab From ffecc3e4341102714a89ab6b5643c666c1feb0ee Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 30 Jan 2012 23:32:55 +0100 Subject: [PATCH 367/546] start of proper feedback during filessytem scan --- files/ajax/scan.php | 11 +++++++---- files/js/files.js | 12 ++++++++---- lib/filecache.php | 6 ++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/files/ajax/scan.php b/files/ajax/scan.php index dec949a819b..01236c83da1 100644 --- a/files/ajax/scan.php +++ b/files/ajax/scan.php @@ -2,15 +2,18 @@ require_once '../../lib/base.php'; +$eventSource=new OC_EventSource(); + $force=isset($_GET['force']) and $_GET['force']=='true'; $checkOnly=isset($_GET['checkonly']) and $_GET['checkonly']=='true'; //create the file cache if necesary if($force or !OC_FileCache::inCache('')){ if(!$checkOnly){ - OC_FileCache::scan(''); + OC_FileCache::scan('',false,$eventSource); } - OC_JSON::success(array("data" => array( "done" => true))); + $eventSource->send('success',true); }else{ - OC_JSON::success(array("data" => array( "done" => false))); -} \ No newline at end of file + $eventSource->send('success',false); +} +$eventSource->close(); \ No newline at end of file diff --git a/files/js/files.js b/files/js/files.js index 649f193aa2d..28259606cea 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -348,13 +348,17 @@ $(document).ready(function() { function scanFiles(force){ force=!!force; //cast to bool $('#scanning-message').show(); - $.get(OC.filePath('files','ajax','scan.php'),{force:force}, function(response) { - if(response && response.data && response.data.done){ + var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force}); + scannerEventSource.listen('scanned',function(file){ + console.log(file);//TODO: make this into proper feedback + }); + scannerEventSource.listen('success',function(success){ + if(success){ window.location.reload(); }else{ - alert('error') + alert('error while scanning'); } - }, "json"); + }); } function boolOperationFinished(data, callback) { diff --git a/lib/filecache.php b/lib/filecache.php index 928fc02e669..4e458ad929a 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -288,8 +288,9 @@ class OC_FileCache{ * recursively scan the filesystem and fill the cache * @param string $path * @param bool $onlyChilds + * @param OC_EventSource $enventSource */ - public static function scan($path,$onlyChilds=false){//PROBLEM due to the order things are added, all parents are -1 + public static function scan($path,$onlyChilds,$eventSource){//PROBLEM due to the order things are added, all parents are -1 $dh=OC_Filesystem::opendir($path); $stat=OC_Filesystem::stat($path); $mimetype=OC_Filesystem::getMimeType($path); @@ -305,12 +306,13 @@ class OC_FileCache{ if($filename != '.' and $filename != '..'){ $file=$path.'/'.$filename; if(OC_Filesystem::is_dir($file)){ - self::scan($file,true); + self::scan($file,true,$eventSource); }else{ $stat=OC_Filesystem::stat($file); $mimetype=OC_Filesystem::getMimeType($file); $stat['mimetype']=$mimetype; self::put($file,$stat); + $eventSource->send('scanned',$file); $totalSize+=$stat['size']; } } -- GitLab From 803f86e0fcd77e3888daa387142fd197083d5fd3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 12:44:01 +0100 Subject: [PATCH 368/546] dont try to use the filesystem when it isnt setup yet --- apps/files_sharing/sharedstorage.php | 2 +- lib/filesystem.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php index 529a82b830a..fa6fe7913f2 100644 --- a/apps/files_sharing/sharedstorage.php +++ b/apps/files_sharing/sharedstorage.php @@ -22,7 +22,7 @@ require_once( 'lib_share.php' ); -if (!OC_Filesystem::is_dir('/Shared')) { +if (OC_Filesystem::$loaded and !OC_Filesystem::is_dir('/Shared')) { OC_Filesystem::mkdir('/Shared'); } OC_Filesystem::mount('OC_Filestorage_Shared',array('datadir'=>'/'.OC_User::getUser().'/files/Shared'),'/'.OC_User::getUser().'/files/Shared/'); diff --git a/lib/filesystem.php b/lib/filesystem.php index 60d3f56a24c..8502cfc08bb 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -47,6 +47,7 @@ class OC_Filesystem{ static private $storages=array(); static private $mounts=array(); static private $storageTypes=array(); + public static $loaded=false; private $fakeRoot=''; static private $defaultInstance; @@ -200,6 +201,7 @@ class OC_Filesystem{ return false; } self::$defaultInstance=new OC_FilesystemView($root); + self::$loaded=true; } /** -- GitLab From 7ff86cfebe27c6cf3fc1926faeea541b84b5eff9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 13:56:58 +0100 Subject: [PATCH 369/546] provide live feedback while scanning files --- files/js/files.js | 7 ++++++- files/templates/index.php | 5 ++++- lib/filecache.php | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/files/js/files.js b/files/js/files.js index 28259606cea..a896314faf0 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -347,10 +347,15 @@ $(document).ready(function() { function scanFiles(force){ force=!!force; //cast to bool + var fileCount=0; $('#scanning-message').show(); + $('#fileList').remove(); var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force}); + scanFiles.cancel=scannerEventSource.close.bind(scannerEventSource); scannerEventSource.listen('scanned',function(file){ - console.log(file);//TODO: make this into proper feedback + fileCount++; + $('#scan-count').text(fileCount+' files scanned'); + $('#scan-current').text(file); }); scannerEventSource.listen('success',function(success){ if(success){ diff --git a/files/templates/index.php b/files/templates/index.php index 92c579c2442..fa4643de75a 100644 --- a/files/templates/index.php +++ b/files/templates/index.php @@ -61,7 +61,10 @@

    +

    + t('Files are being scanned, please wait.');?> +

    - t('Files are being scanned, please wait.');?> + t('Current scanning');?>

    diff --git a/lib/filecache.php b/lib/filecache.php index 4e458ad929a..6dbaef4bbfa 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -290,7 +290,7 @@ class OC_FileCache{ * @param bool $onlyChilds * @param OC_EventSource $enventSource */ - public static function scan($path,$onlyChilds,$eventSource){//PROBLEM due to the order things are added, all parents are -1 + public static function scan($path,$onlyChilds,$eventSource){ $dh=OC_Filesystem::opendir($path); $stat=OC_Filesystem::stat($path); $mimetype=OC_Filesystem::getMimeType($path); -- GitLab From df67c35017d8794a4b1c83fd4e41658b2e6d0e75 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 16:12:38 +0100 Subject: [PATCH 370/546] some fixes to scanning --- db_structure.xml | 9 +++++++++ files/ajax/scan.php | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index 13d5732a8d5..5ef22b595cf 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -81,6 +81,15 @@ true 512 + + + user + text + + + true + 64 + size diff --git a/files/ajax/scan.php b/files/ajax/scan.php index 01236c83da1..37ce7ab71f0 100644 --- a/files/ajax/scan.php +++ b/files/ajax/scan.php @@ -2,17 +2,25 @@ require_once '../../lib/base.php'; -$eventSource=new OC_EventSource(); +set_time_limit(0);//scanning can take ages $force=isset($_GET['force']) and $_GET['force']=='true'; $checkOnly=isset($_GET['checkonly']) and $_GET['checkonly']=='true'; +if(!$checkOnly){ + $eventSource=new OC_EventSource(); +} + + //create the file cache if necesary if($force or !OC_FileCache::inCache('')){ if(!$checkOnly){ OC_FileCache::scan('',false,$eventSource); + $eventSource->send('success',true); + }else{ + OC_JSON::success(array('data'=>array('done'=>true))); + exit; } - $eventSource->send('success',true); }else{ $eventSource->send('success',false); } -- GitLab From c46f701771db9285e70a5b1d5a4b641046bf703c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 16:12:49 +0100 Subject: [PATCH 371/546] use filesystem cache for searching --- lib/filecache.php | 25 +++++++++++++++++++------ lib/filesystem.php | 2 +- lib/filesystemview.php | 17 ----------------- lib/search/provider/file.php | 11 ++++++----- 4 files changed, 26 insertions(+), 29 deletions(-) diff --git a/lib/filecache.php b/lib/filecache.php index 6dbaef4bbfa..689680624a4 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -79,8 +79,9 @@ class OC_FileCache{ $data['versioned']=false; } $mimePart=dirname($data['mimetype']); - $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart) VALUES(?,?,?,?,?,?,?,?)'); - $query->execute(array($parent,basename($path),$path,$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart)); + $user=OC_User::getUser(); + $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart,user) VALUES(?,?,?,?,?,?,?,?,?)'); + $query->execute(array($parent,basename($path),$path,$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$user)); } @@ -133,14 +134,26 @@ class OC_FileCache{ /** * return array of filenames matching the querty * @param string $query + * @param boolean $returnData * @return array of filepaths */ - public static function search($search){ - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ?'); - $result=$query->execute(array("%$search%")); + public static function search($search,$returnData=false){ + $root=OC_Filesystem::getRoot(); + $rootLen=strlen($root); + if(!$returnData){ + $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ? AND user=?'); + }else{ + $query=OC_DB::prepare('SELECT * FROM *PREFIX*fscache WHERE name LIKE ? AND user=?'); + } + $result=$query->execute(array("%$search%",OC_User::getUser())); $names=array(); while($row=$result->fetchRow()){ - $names[]=$row['path']; + if(!$returnData){ + $names[]=substr($row['path'],$rootLen); + }else{ + $row['path']=substr($row['path'],$rootLen); + $names[]=$row; + } } return $names; } diff --git a/lib/filesystem.php b/lib/filesystem.php index 8502cfc08bb..5062ecf5c18 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -374,7 +374,7 @@ class OC_Filesystem{ } static public function search($query){ - return self::$defaultInstance->search($query); + return OC_FileCache::search($query); } } diff --git a/lib/filesystemview.php b/lib/filesystemview.php index 9687a8bceb4..6c2ca916310 100644 --- a/lib/filesystemview.php +++ b/lib/filesystemview.php @@ -279,23 +279,6 @@ class OC_FilesystemView { return $this->basicOperation('free_space',$path); } - public function search($query){ - $files=array(); - $fakeRoot=$this->$fakeRoot; - $fakeRootLength=strlen($fakeRoot); - $results=OC_FileCache::search($query); - if(is_array($results)){ - foreach($results as $result){ - $file=str_replace('//','/',$mountpoint.$result); - if(substr($file,0,$fakeRootLength)==$fakeRoot){ - $file=substr($file,$fakeRootLength); - $files[]=$file; - } - } - } - return $files; - } - /** * abstraction for running most basic operations * @param string $operation diff --git a/lib/search/provider/file.php b/lib/search/provider/file.php index 5fd35fa3e52..c3dc2942aef 100644 --- a/lib/search/provider/file.php +++ b/lib/search/provider/file.php @@ -2,14 +2,15 @@ class OC_Search_Provider_File extends OC_Search_Provider{ function search($query){ - $files=OC_Filesystem::search($query); + $files=OC_FileCache::search($query,true); $results=array(); - foreach($files as $file){ - if(OC_Filesystem::is_dir($file)){ + foreach($files as $fileData){ + $file=$fileData['path']; + if($fileData['mime']=='httpd/unix-directory'){ $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'index.php?dir='.$file ),'Files'); }else{ - $mime=OC_Filesystem::getMimeType($file); - $mimeBase=substr($mime,0,strpos($mime,'/')); + $mime=$fileData['mime']; + $mimeBase=$fileData['mimepart']; switch($mimeBase){ case 'audio': break; -- GitLab From f1c5dce75c5f1bc2c9d7022a8b43577a3dec9629 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 16:33:16 +0100 Subject: [PATCH 372/546] dont try to use something that isn't there --- files/ajax/scan.php | 6 +++++- lib/filecache.php | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/files/ajax/scan.php b/files/ajax/scan.php index 37ce7ab71f0..f7e75d5f8ba 100644 --- a/files/ajax/scan.php +++ b/files/ajax/scan.php @@ -22,6 +22,10 @@ if($force or !OC_FileCache::inCache('')){ exit; } }else{ - $eventSource->send('success',false); + if(isset($eventSource)){ + $eventSource->send('success',false); + }else{ + exit; + } } $eventSource->close(); \ No newline at end of file diff --git a/lib/filecache.php b/lib/filecache.php index 689680624a4..b4cafe8b311 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -325,7 +325,9 @@ class OC_FileCache{ $mimetype=OC_Filesystem::getMimeType($file); $stat['mimetype']=$mimetype; self::put($file,$stat); - $eventSource->send('scanned',$file); + if($eventSource){ + $eventSource->send('scanned',$file); + } $totalSize+=$stat['size']; } } -- GitLab From 371b4642bb21697a06424f1440f4b90ad4e59b9d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 31 Jan 2012 16:33:47 +0100 Subject: [PATCH 373/546] proper file sorting --- lib/files.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/files.php b/lib/files.php index 5686287ecc4..457c8ea38f2 100644 --- a/lib/files.php +++ b/lib/files.php @@ -41,7 +41,7 @@ class OC_Files { $file['directory']=$directory; $file['type']=($file['mimetype']=='httpd/unix-directory')?'dir':'file'; } - uksort($files, "strnatcasecmp"); + usort($files, "fileCmp");//TODO: remove this once ajax is merged return $files; } @@ -290,3 +290,13 @@ class OC_Files { return $path; } } + +function fileCmp($a,$b){ + if($a['type']=='dir' and $b['type']!='dir'){ + return -1; + }elseif($a['type']!='dir' and $b['type']=='dir'){ + return 1; + }else{ + return strnatcasecmp($a['name'],$b['name']); + } +} -- GitLab From fdf3df3de591845df5255b04eabe12e794faa1f1 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 30 Jan 2012 23:26:01 +0100 Subject: [PATCH 374/546] add option to send get data along with an eventsource request --- core/js/eventsource.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/js/eventsource.js b/core/js/eventsource.js index 30b942f59e8..dece1a69d04 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -26,9 +26,18 @@ * use server side events with causion, to many open requests can hang the server */ -OC.EventSource=function(src){ +/** + * create a new event source + * @param string src + * @param object data to be send as GET + */ +OC.EventSource=function(src,data){ + var dataStr=''; + for(name in data){ + dataStr+=name+'='+encodeURIComponent(data[name])+'&'; + } if(!this.useFallBack && typeof EventSource !='undefined'){ - this.source=new EventSource(src); + this.source=new EventSource(src+'?'+dataStr); this.source.onmessage=function(e){ for(var i=0;i'); this.iframe.attr('id',iframeId); this.iframe.hide(); - this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount); + this.iframe.attr('src',src+'?fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr); $('body').append(this.iframe); this.useFallBack=true; OC.EventSource.iframeCount++ -- GitLab From db1f77e4f51b1172aabe12defdd8228e9dd3b93b Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Wed, 25 Jan 2012 01:10:56 +0100 Subject: [PATCH 375/546] Some reminders in the code of what I have to change post OC3.0 --- apps/contacts/ajax/addproperty.php | 8 ++++++++ apps/contacts/lib/app.php | 1 + apps/contacts/lib/vcard.php | 2 ++ 3 files changed, 11 insertions(+) diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index f016820ce5f..a4b5c591197 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -74,6 +74,14 @@ foreach ($parameters as $key=>$element) { } $checksum = md5($vcard->children[$line]->serialize()); +/* FIXME: OC_Contacts_App::getPropertyLineByChecksum throws an OC_JSON error when doing this check. + Fix for v. 3.1 +if(!is_null(OC_Contacts_App::getPropertyLineByChecksum($id, $checksum))) { + OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property.')))); + OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name, OC_Log::DEBUG); + exit(); +} +*/ if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) { OC_JSON::error(array('data' => array('message' => $l->t('Error adding contact property.')))); OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR); diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index bc1e4974b30..39df497043b 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -85,6 +85,7 @@ class OC_Contacts_App{ break; } } + // FIXME: I'm not sure this should throw a JSON error as it might just be used to check for dupes. /Tanghus. if(is_null($line)){ OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('Information about vCard is incorrect. Please reload the page.')))); exit(); diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index ceac2dcfad2..aefa2c74114 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -320,6 +320,8 @@ class OC_Contacts_VCard{ * ['value'] htmlspecialchars escaped value of property * ['parameters'] associative array name=>value * ['checksum'] checksum of whole property + * NOTE: $value is not escaped anymore. It shouldn't make any difference + * but we should look out for any problems. */ public static function structureProperty($property){ $value = $property->value; -- GitLab From 3f1486534f687fdcad219b97072ed71a2998de87 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 31 Jan 2012 19:26:26 +0100 Subject: [PATCH 376/546] - Fixed http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-93 Property was added multiple times. - Fixed http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-8 "Missing "N" field: Contacts app not compatible with vcard 3.0 format" - Almost sure I've fixed http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-27 "Full name in Contacts app doesn't sync to iOS 5 contacts" because it is caused by oc-8 --- apps/contacts/ajax/addcard.php | 23 +++++- apps/contacts/ajax/addproperty.php | 23 ++++-- apps/contacts/ajax/deleteproperty.php | 5 ++ apps/contacts/ajax/setproperty.php | 6 +- apps/contacts/ajax/showsetproperty.php | 5 ++ apps/contacts/css/styles.css | 58 +++---------- apps/contacts/lib/app.php | 5 -- apps/contacts/templates/part.addcardform.php | 75 ++++++++++++----- apps/contacts/templates/part.details.php | 1 + apps/contacts/templates/part.property.N.php | 4 + .../templates/part.setpropertyform.php | 81 +++++++++++++------ 11 files changed, 175 insertions(+), 111 deletions(-) create mode 100644 apps/contacts/templates/part.property.N.php diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php index 7e47659d23b..140d6a48095 100644 --- a/apps/contacts/ajax/addcard.php +++ b/apps/contacts/ajax/addcard.php @@ -22,6 +22,11 @@ // Init owncloud require_once('../../../lib/base.php'); +function bailOut($msg) { + OC_JSON::error(array('data' => array('message' => $msg))); + OC_Log::write('contacts','ajax/addcard.php: '.$msg, OC_Log::DEBUG); + exit(); +} // Check if we are a user OC_JSON::checkLoggedIn(); @@ -31,12 +36,22 @@ $l=new OC_L10N('contacts'); $aid = $_POST['id']; $addressbook = OC_Contacts_App::getAddressbook( $aid ); -$fn = $_POST['fn']; +$fn = trim($_POST['fn']); $values = $_POST['value']; $parameters = $_POST['parameters']; $vcard = new OC_VObject('VCARD'); $vcard->setUID(); + +$n = isset($values['N'][0])?trim($values['N'][0]).';':';'; +$n .= isset($values['N'][1])?trim($values['N'][1]).';':';'; +$n .= isset($values['N'][2])?trim($values['N'][2]).';;':';;'; + +if(!$fn || ($n == ';;;;')) { + bailOut('You have to enter both the extended name and the display name.'); +} + +$vcard->setString('N',$n); $vcard->setString('FN',$fn); // Data to add ... @@ -58,6 +73,10 @@ foreach( $add as $propname){ } else { $prop_parameters = array(); } + if(is_array($value)){ + ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! + $value = OC_VObject::escapeSemicolons($value); + } $vcard->addProperty($propname, $value); //, $prop_parameters); $line = count($vcard->children) - 1; foreach ($prop_parameters as $key=>$element) { @@ -77,7 +96,7 @@ foreach( $add as $propname){ $id = OC_Contacts_VCard::add($aid,$vcard->serialize()); if(!$id) { OC_JSON::error(array('data' => array('message' => $l->t('There was an error adding the contact.')))); - OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$name, OC_Log::ERROR); + OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$id, OC_Log::ERROR); exit(); } diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index a4b5c591197..c90af217c87 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -54,6 +54,21 @@ if(!is_array($value)){ } $parameters = isset($_POST['parameters']) ? $_POST['parameters'] : array(); +// Prevent setting a duplicate entry +$current = $vcard->select($name); +foreach($current as $item) { + $tmpvalue = (is_array($value)?implode(';', $value):$value); + if($tmpvalue == $item->value) { + OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property: ').$name.': '.$tmpvalue))); + OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name.': '.$tmpvalue, OC_Log::DEBUG); + exit(); + } +} + +if(is_array($value)) { + ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! +} + $property = $vcard->addProperty($name, $value); //, $parameters); $line = count($vcard->children) - 1; @@ -74,14 +89,6 @@ foreach ($parameters as $key=>$element) { } $checksum = md5($vcard->children[$line]->serialize()); -/* FIXME: OC_Contacts_App::getPropertyLineByChecksum throws an OC_JSON error when doing this check. - Fix for v. 3.1 -if(!is_null(OC_Contacts_App::getPropertyLineByChecksum($id, $checksum))) { - OC_JSON::error(array('data' => array('message' => $l->t('Trying to add duplicate property.')))); - OC_Log::write('contacts','ajax/addproperty.php: Trying to add duplicate property: '.$name, OC_Log::DEBUG); - exit(); -} -*/ if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) { OC_JSON::error(array('data' => array('message' => $l->t('Error adding contact property.')))); OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR); diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/deleteproperty.php index 89cf292f4f8..d745d3271db 100644 --- a/apps/contacts/ajax/deleteproperty.php +++ b/apps/contacts/ajax/deleteproperty.php @@ -33,6 +33,11 @@ $checksum = $_GET['checksum']; $vcard = OC_Contacts_App::getContactVCard( $id ); $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); +if(is_null($line)){ + $l=new OC_L10N('contacts'); + OC_JSON::error(array('data' => array( 'message' => $l->t('Information about vCard is incorrect. Please reload the page.')))); + exit(); +} unset($vcard->children[$line]); diff --git a/apps/contacts/ajax/setproperty.php b/apps/contacts/ajax/setproperty.php index cdc6d34c524..cf3fe582247 100644 --- a/apps/contacts/ajax/setproperty.php +++ b/apps/contacts/ajax/setproperty.php @@ -36,8 +36,9 @@ $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); // Set the value $value = $_POST['value']; if(is_array($value)){ - $value = OC_VObject::escapeSemicolons($value); + ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! } +OC_Log::write('contacts','ajax/setproperty.php: setting: '.$vcard->children[$line]->name.': '.$value, OC_Log::DEBUG); $vcard->children[$line]->setValue($value); // Add parameters @@ -87,6 +88,9 @@ $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); if ($vcard->children[$line]->name == 'FN'){ $tmpl = new OC_Template('contacts','part.property.FN'); } +elseif ($vcard->children[$line]->name == 'N'){ + $tmpl = new OC_Template('contacts','part.property.N'); +} else{ $tmpl = new OC_Template('contacts','part.property'); } diff --git a/apps/contacts/ajax/showsetproperty.php b/apps/contacts/ajax/showsetproperty.php index e23fa21c56b..577230e4566 100644 --- a/apps/contacts/ajax/showsetproperty.php +++ b/apps/contacts/ajax/showsetproperty.php @@ -33,6 +33,11 @@ $checksum = $_GET['checksum']; $vcard = OC_Contacts_App::getContactVCard( $id ); $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); +if(is_null($line)){ + $l=new OC_L10N('contacts'); + OC_JSON::error(array('data' => array( 'message' => $l->t('Information about vCard is incorrect. Please reload the page.')))); + exit(); +} $adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css index 4fcd8fc1131..58e1bf6c93e 100644 --- a/apps/contacts/css/styles.css +++ b/apps/contacts/css/styles.css @@ -2,6 +2,7 @@ #leftcontent a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; } #chooseaddressbook {margin-right: 170px; float: right;} #contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;} +#contacts_details_name_n { font-size:0.8em;margin-left:25%;color:#666;} #contacts_details_photo { margin:.5em 0em .5em 25%; } #contacts_deletecard {position:absolute;top:15px;right:25px;} @@ -12,41 +13,15 @@ #contacts_details_list li p.contacts_property_data, #contacts_details_list li ul.contacts_property_data { width:72%;float:left; clear: right; } #contacts_setproperty_button { margin-left:25%; } -dl.form -{ - width: 100%; - float: left; - clear: right; - margin: 1em; - padding: 0; -} +#contacts_addcardform legend,label { font-weight: bold; width: 10em; overflow: ellipsis; } +#contacts_addcardform legend { padding-left: 3em; font-size:1.1em; } +#contacts_addcardform input[type="text"] { width: 25em; } +#contacts_addcardform input[type="email"] { width: 15em; } +#contacts_addcardform input[type="tel"] { width: 15em; } -.form dt -{ - display: table-cell; - clear: left; - float: left; - min-width: 10em; - margin: 0; - padding-top: 0.5em; - padding-right: 1em; - font-weight: bold; - text-align:right; - vertical-align: text-bottom; - bottom: 0px; -} - -.form dd -{ - display: table-cell; - clear: right; - float: left; - min-width: 20em; - margin: 0; - padding: 0; - white-space: nowrap; - top: 0px; -} +dl.form { width: 100%; float: left; clear: right; margin: 1em; padding: 0; } +.form dt { display: table-cell; clear: left; float: left; min-width: 10em; margin: 0; padding-top: 0.5em; padding-right: 1em;font-weight: bold; text-align:right; vertical-align: text-bottom; bottom: 0px; } +.form dd { display: table-cell; clear: right; float: left; min-width: 20em; margin: 0; padding: 0; white-space: nowrap; top: 0px; } .form input { position: relative; width: 20em; } .contacts_property_data ul, ol.contacts_property_data { list-style:none; } @@ -60,18 +35,3 @@ dl.form .chzn-container.chzn-container-active .chzn-choices { border-bottom-left-radius: 0;border-bottom-right-radius: 0; } .chzn-container .chzn-drop { border-bottom-left-radius: 0.5em;border-bottom-right-radius: 0.5em; } -/* Form setup ----------------------------------------------------------------*/ -/* .forme {} */ -/* .forme ul, .forme ol { list-style:none; } */ -/* .forme .inputs, .forme .buttons { overflow: hidden; } */ - -/* Labels --------------------------------------------------------------------*/ -/* .forme .input .label { width:25%; float:left; display:block; } */ - -/* Inputs --------------------------------------------------------------------*/ -/* .forme .stringish input { width:72%; } */ -/* .forme .text textarea { width:72%; } */ - -/* Buttons -------------------------------------------------------------------*/ -/* .forme .buttons { padding-left:25%; } */ -/* .forme .button { float:left; padding-left:0.5em; } */ diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index 39df497043b..580cc72d5eb 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -85,11 +85,6 @@ class OC_Contacts_App{ break; } } - // FIXME: I'm not sure this should throw a JSON error as it might just be used to check for dupes. /Tanghus. - if(is_null($line)){ - OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('Information about vCard is incorrect. Please reload the page.')))); - exit(); - } return $line; } diff --git a/apps/contacts/templates/part.addcardform.php b/apps/contacts/templates/part.addcardform.php index 11457ff2697..17207d2ebcb 100644 --- a/apps/contacts/templates/part.addcardform.php +++ b/apps/contacts/templates/part.addcardform.php @@ -1,11 +1,14 @@ -
    + +
    - +

    +
    - + + +
    + +
    +
    + + +
    + + + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    @@ -34,16 +61,16 @@
    - +
    - +
    - + @@ -54,7 +81,7 @@ t('Address'); ?>
    - +
    - +
    - +
    -
    +
    - +
    - + + +
    - +
    - + + +
    - +
    - +
    -
    +
    - +
    diff --git a/apps/contacts/templates/part.details.php b/apps/contacts/templates/part.details.php index 679ae5ede2f..5badd816155 100644 --- a/apps/contacts/templates/part.details.php +++ b/apps/contacts/templates/part.details.php @@ -1,5 +1,6 @@ inc('part.property.FN', array('property' => $_['details']['FN'][0])); ?> + inc('part.property.N', array('property' => $_['details']['N'][0])); ?> diff --git a/apps/contacts/templates/part.property.N.php b/apps/contacts/templates/part.property.N.php new file mode 100644 index 00000000000..73d599ad7b4 --- /dev/null +++ b/apps/contacts/templates/part.property.N.php @@ -0,0 +1,4 @@ +

    + () + +

    diff --git a/apps/contacts/templates/part.setpropertyform.php b/apps/contacts/templates/part.setpropertyform.php index 3e0b8d49b52..49fa9662146 100644 --- a/apps/contacts/templates/part.setpropertyform.php +++ b/apps/contacts/templates/part.setpropertyform.php @@ -1,46 +1,79 @@ - + +

    +

    +
    +
    +
    +
    +
    +
    + + +
    +
    +

    +

    -
      -
    1. +
      +
      +
      +
      -
    2. -
    3. +
    +
    +
    +
    - -
  • +
  • + +
    - - -
  • +
  • +
    + + +
    +
    - - -
  • +
  • +
    + + + +
    +
    +
    +
    - -
  • +
  • + +
    - - - +
    +
    + +
    +

    -- GitLab From 6c340416d9020f40031119d1d76bf797066895ec Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 27 Jan 2012 21:34:56 +0100 Subject: [PATCH 377/546] Resize profile picture if bigger than 200px on either x or y. Bolded text on message box. --- apps/contacts/photo.php | 3 +++ apps/contacts/templates/part.messagebox.php | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php index 478ef829cae..756aae63c4d 100644 --- a/apps/contacts/photo.php +++ b/apps/contacts/photo.php @@ -63,6 +63,9 @@ if( is_null($content)){ } } if($image->loadFromBase64($child->value)) { + if($image->width() > 200 || $image->height() > 200) { + $image->resize(200); + } header('Content-Type: '.$mime); $image(); exit(); diff --git a/apps/contacts/templates/part.messagebox.php b/apps/contacts/templates/part.messagebox.php index 3681bb6e3f3..5db10e7e6c5 100644 --- a/apps/contacts/templates/part.messagebox.php +++ b/apps/contacts/templates/part.messagebox.php @@ -1,7 +1,3 @@

    - - - - -
    +
    -- GitLab From 4145e3b2651312b5949de3aae4f34c1be5332eb8 Mon Sep 17 00:00:00 2001 From: Thomas Schmidt Date: Wed, 1 Feb 2012 12:00:38 +0100 Subject: [PATCH 378/546] pre-select current language, sort available languages --- settings/personal.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/settings/personal.php b/settings/personal.php index 787957f246f..3b90827ed99 100755 --- a/settings/personal.php +++ b/settings/personal.php @@ -23,8 +23,10 @@ $relative=round(($used/$total)*10000)/100; $email=OC_Preferences::getValue(OC_User::getUser(), 'settings','email',''); -$lang=OC_Preferences::getValue( OC_User::getUser(), 'core', 'lang', 'en' ); +$lang=OC_Preferences::getValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() ); $languageCodes=OC_L10N::findAvailableLanguages(); +sort ($languageCodes); + //put the current language in the front unset($languageCodes[array_search($lang,$languageCodes)]); array_unshift($languageCodes,$lang); -- GitLab From a69d3c3346b7b254e3e0ab6766f40842a4ad3878 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 1 Feb 2012 15:25:00 +0100 Subject: [PATCH 379/546] only show what folder we are scanning to save bandwith --- files/js/files.js | 8 +++----- lib/filecache.php | 11 ++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/files/js/files.js b/files/js/files.js index a896314faf0..0eca0959def 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -347,15 +347,13 @@ $(document).ready(function() { function scanFiles(force){ force=!!force; //cast to bool - var fileCount=0; $('#scanning-message').show(); $('#fileList').remove(); var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force}); scanFiles.cancel=scannerEventSource.close.bind(scannerEventSource); - scannerEventSource.listen('scanned',function(file){ - fileCount++; - $('#scan-count').text(fileCount+' files scanned'); - $('#scan-current').text(file); + scannerEventSource.listen('scanning',function(data){ + $('#scan-count').text(data.count+' files scanned'); + $('#scan-current').text(data.file+'/'); }); scannerEventSource.listen('success',function(success){ if(success){ diff --git a/lib/filecache.php b/lib/filecache.php index b4cafe8b311..a67ac669a76 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -303,7 +303,7 @@ class OC_FileCache{ * @param bool $onlyChilds * @param OC_EventSource $enventSource */ - public static function scan($path,$onlyChilds,$eventSource){ + public static function scan($path,$onlyChilds=false,$eventSource=false,&$count=0){ $dh=OC_Filesystem::opendir($path); $stat=OC_Filesystem::stat($path); $mimetype=OC_Filesystem::getMimeType($path); @@ -319,15 +319,16 @@ class OC_FileCache{ if($filename != '.' and $filename != '..'){ $file=$path.'/'.$filename; if(OC_Filesystem::is_dir($file)){ - self::scan($file,true,$eventSource); + if($eventSource){ + $eventSource->send('scanning',array('file'=>$file,'count'=>$count)); + } + self::scan($file,true,$eventSource,$count); }else{ $stat=OC_Filesystem::stat($file); $mimetype=OC_Filesystem::getMimeType($file); $stat['mimetype']=$mimetype; self::put($file,$stat); - if($eventSource){ - $eventSource->send('scanned',$file); - } + $count++; $totalSize+=$stat['size']; } } -- GitLab From 0124809a42dd72d9c6d9b550687fa0013a88b6da Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 1 Feb 2012 15:33:12 +0100 Subject: [PATCH 380/546] prevent sharing from making aditional http requests while scanning additional requests to the server can block feedback of scannning depending on server configuration --- apps/files_sharing/js/share.js | 1 + files/js/files.js | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 4457dddbe15..d01a07447a6 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -2,6 +2,7 @@ $(document).ready(function() { var shared_status = {}; if (typeof FileActions !== 'undefined') { FileActions.register('all', 'Share', function(filename) { + if (scanFiles.scanning){return;}//workaround to prevent aditional http request block scanning feedback var icon; var file = $('#dir').val()+'/'+filename; if(shared_status[file]) diff --git a/files/js/files.js b/files/js/files.js index 0eca0959def..bebcf4e97a4 100644 --- a/files/js/files.js +++ b/files/js/files.js @@ -347,6 +347,7 @@ $(document).ready(function() { function scanFiles(force){ force=!!force; //cast to bool + scanFiles.scanning=true; $('#scanning-message').show(); $('#fileList').remove(); var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force}); @@ -356,6 +357,7 @@ function scanFiles(force){ $('#scan-current').text(data.file+'/'); }); scannerEventSource.listen('success',function(success){ + scanFiles.scanning=false; if(success){ window.location.reload(); }else{ @@ -363,6 +365,7 @@ function scanFiles(force){ } }); } +scanFiles.scanning=false; function boolOperationFinished(data, callback) { result = jQuery.parseJSON(data.responseText); -- GitLab From e229a6adecde57d919b6b1385729cbf8cd41fe89 Mon Sep 17 00:00:00 2001 From: David Iwanowitsch Date: Sun, 29 Jan 2012 19:32:33 +0100 Subject: [PATCH 381/546] Added searchprovider for bookmarks, initial l10n support for bookmark plugin moved some code from updateList.php to bookmarks.php, to make it reusable --- apps/bookmarks/ajax/updateList.php | 60 ++------------ apps/bookmarks/appinfo/app.php | 7 +- apps/bookmarks/js/bookmarksearch.js | 22 ++++++ apps/bookmarks/l10n/xgettextfiles | 5 ++ apps/bookmarks/lib/bookmarks.php | 117 ++++++++++++++++++++++++++++ apps/bookmarks/lib/search.php | 50 ++++++++++++ 6 files changed, 205 insertions(+), 56 deletions(-) create mode 100644 apps/bookmarks/js/bookmarksearch.js create mode 100644 apps/bookmarks/l10n/xgettextfiles create mode 100644 apps/bookmarks/lib/bookmarks.php create mode 100644 apps/bookmarks/lib/search.php diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php index d2a5397452f..487e0d290e3 100644 --- a/apps/bookmarks/ajax/updateList.php +++ b/apps/bookmarks/ajax/updateList.php @@ -5,6 +5,7 @@ * * @author Arthur Schiwon * @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de +* @copyright 2012 David Iwanowitsch * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -30,71 +31,20 @@ require_once('../../../lib/base.php'); OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('bookmarks'); -$params=array(OC_User::getUser()); -$CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' ); //Filter for tag? -$filterTag = isset($_GET['tag']) ? '%' . htmlspecialchars_decode($_GET['tag']) . '%' : false; -if($filterTag){ - $sqlFilterTag = 'HAVING tags LIKE ?'; - $params[] = $filterTag; - if($CONFIG_DBTYPE == 'pgsql' ) { - $sqlFilterTag = 'HAVING array_to_string(array_agg(tag), \' \') LIKE ?'; - } -} else { - $sqlFilterTag = ''; -} +$filterTag = isset($_GET['tag']) ? htmlspecialchars_decode($_GET['tag']) : false; $offset = isset($_GET['page']) ? intval($_GET['page']) * 10 : 0; $sort = isset($_GET['sort']) ? ($_GET['sort']) : 'bookmarks_sorting_recent'; if($sort == 'bookmarks_sorting_clicks') { - $sqlSort = 'clickcount DESC'; + $sqlSortColumn = 'clickcount'; } else { - $sqlSort = 'id DESC'; + $sqlSortColumn = 'id'; } -if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_gc_separator = ', \' \''; -} else { - $_gc_separator = 'SEPARATOR \' \''; -} - -if($CONFIG_DBTYPE == 'pgsql' ){ - $params[] = $offset; - $query = OC_DB::prepare(' - SELECT id, url, title, array_to_string(array_agg(tag), \' \') as tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - WHERE - *PREFIX*bookmarks.user_id = ? - GROUP BY id, url, title - '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSort.' - LIMIT 10 - OFFSET ?'); -} else { - $query = OC_DB::prepare(' - SELECT id, url, title, - CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) - ELSE \' \' - END - AS tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 - WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - OR *PREFIX*bookmarks.id NOT IN ( - SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags - ) - ) - AND *PREFIX*bookmarks.user_id = ? - GROUP BY url - '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSort.' - LIMIT '.$offset.', 10'); -} -$bookmarks = $query->execute($params)->fetchAll(); +$bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $filterTag, true); OC_JSON::success(array('data' => $bookmarks)); diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php index 44a1e47dff9..479d8ed4767 100644 --- a/apps/bookmarks/appinfo/app.php +++ b/apps/bookmarks/appinfo/app.php @@ -7,8 +7,13 @@ * See the COPYING-README file. */ +OC::$CLASSPATH['OC_Bookmarks_Bookmarks'] = 'apps/bookmarks/lib/bookmarks.php'; + OC_App::register( array( 'order' => 70, 'id' => 'bookmark', 'name' => 'Bookmarks' )); -OC_App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OC_Helper::linkTo( 'bookmarks', 'index.php' ), 'icon' => OC_Helper::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => 'Bookmarks' )); +$l = new OC_l10n('bookmarks'); +OC_App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OC_Helper::linkTo( 'bookmarks', 'index.php' ), 'icon' => OC_Helper::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => $l->t('Bookmarks'))); OC_App::registerPersonal('bookmarks', 'settings'); +require_once('apps/bookmarks/lib/search.php'); +OC_Util::addScript('bookmarks','bookmarksearch'); diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js new file mode 100644 index 00000000000..39874aa0b29 --- /dev/null +++ b/apps/bookmarks/js/bookmarksearch.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2012 David Iwanowitsch + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +$(document).ready(function(){ + OC.search.customResults.Bookm.=function(row,item){ + var a=row.find('a'); + a.attr('target','_blank'); + a.click(recordClick); + } +}); + +function recordClick(event) { + var jsFileLocation = $('script[src*=bookmarksearch]').attr('src'); + jsFileLocation = jsFileLocation.replace('js/bookmarksearch.js', ''); + $.ajax({ + url: jsFileLocation + 'ajax/recordClick.php', + data: 'url=' + encodeURI($(this).attr('href')), + }); +} diff --git a/apps/bookmarks/l10n/xgettextfiles b/apps/bookmarks/l10n/xgettextfiles new file mode 100644 index 00000000000..cd555432390 --- /dev/null +++ b/apps/bookmarks/l10n/xgettextfiles @@ -0,0 +1,5 @@ +../appinfo/app.php +../lib/search.php +../templates/settings.php +../templates/addBm.php +../templates/list.php diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php new file mode 100644 index 00000000000..81c1b03981a --- /dev/null +++ b/apps/bookmarks/lib/bookmarks.php @@ -0,0 +1,117 @@ +. + * + */ + +/** + * This class manages bookmarks + */ +class OC_Bookmarks_Bookmarks{ + + /** + * @brief Finds all bookmarks, matching the filter + * @param offset result offset + * @param sqlSortColumn sort result with this column + * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings + * @param filterTagOnly if true, filter affacts only tags, else filter affects url, title and tags + * @return void + */ + public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){ + //OC_Log::write('bookmarks', 'findBookmarks ' .$offset. ' '.$sqlSortColumn.' '. $filter.' '. $filterTagOnly ,OC_Log::DEBUG); + $CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' ); + + $params=array(OC_User::getUser()); + + if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ + $_gc_separator = ', \' \''; + } else { + $_gc_separator = 'SEPARATOR \' \''; + } + + if($filter){ + if($CONFIG_DBTYPE == 'pgsql' ) + $tagString = 'array_to_string(array_agg(tag), \' \')'; + else + $tagString = 'tags'; + + $sqlFilterTag = 'HAVING '; + if(is_array($filter)){ + $first = true; + $filterstring = ''; + foreach ($filter as $singleFilter){ + $filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? '; + $params[] = '%'.$singleFilter.'%'; + $first=false; + } + $sqlFilterTag = $sqlFilterTag . $filterstring; + } else{ + $sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? '; + $params[] = '%'.$filter.'%'; + } + } else { + $sqlFilterTag = ''; + } + + if($CONFIG_DBTYPE == 'pgsql' ){ + $query = OC_DB::prepare(' + SELECT id, url, title, '.($filterTagOnly?'':'url || title ||').' array_to_string(array_agg(tag), \' \') as tags + FROM *PREFIX*bookmarks + LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + WHERE + *PREFIX*bookmarks.user_id = ? + GROUP BY id, url, title + '.$sqlFilterTag.' + ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC + LIMIT 10 + OFFSET '. $offset); + } else { + if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ) + $concatFunction = '(url || title || '; + else + $concatFunction = 'Concat(Concat( url, title), '; + + $query = OC_DB::prepare(' + SELECT id, url, title, ' + .($filterTagOnly?'':$concatFunction). + 'CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) + ELSE \' \' + END ' + .($filterTagOnly?'':')').' + AS tags + FROM *PREFIX*bookmarks + LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 + WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + OR *PREFIX*bookmarks.id NOT IN ( + SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags + ) + ) + AND *PREFIX*bookmarks.user_id = ? + GROUP BY url + '.$sqlFilterTag.' + ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC + LIMIT '.$offset.', 10'); + } + + $bookmarks = $query->execute($params)->fetchAll(); + return $bookmarks; + } +} +?> diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php new file mode 100644 index 00000000000..59495db82ea --- /dev/null +++ b/apps/bookmarks/lib/search.php @@ -0,0 +1,50 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +class OC_Search_Provider_Bookmarks extends OC_Search_Provider{ + function search($query){ + $results=array(); + + $offset = 0; + $sqlSortColumn = 'id'; + + $searchquery=array(); + if(substr_count($query, ' ') > 0){ + $searchquery = explode(' ', $query); + }else{ + $searchquery = $query; + } + +// OC_Log::write('bookmarks', 'search ' .$query ,OC_Log::DEBUG); + $bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $searchquery, false); +// OC_Log::write('bookmarks', 'found ' .count($bookmarks) ,OC_Log::DEBUG); + //$l = new OC_l10n('bookmarks'); //resulttype can't be localized, javascript relies on that type + foreach($bookmarks as $bookmark){ + $results[]=new OC_Search_Result($bookmark['title'],'', $bookmark['url'],'Bookm.'); + } + + return $results; + } +} +new OC_Search_Provider_Bookmarks(); + +?> -- GitLab From 6583d30e26d752c5ddccb1e350e075f59b7ba75d Mon Sep 17 00:00:00 2001 From: David Iwanowitsch Date: Mon, 30 Jan 2012 18:14:09 +0100 Subject: [PATCH 382/546] fix javascript --- apps/bookmarks/js/bookmarksearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js index 39874aa0b29..e7a4fb18393 100644 --- a/apps/bookmarks/js/bookmarksearch.js +++ b/apps/bookmarks/js/bookmarksearch.js @@ -5,7 +5,7 @@ * See the COPYING-README file. */ $(document).ready(function(){ - OC.search.customResults.Bookm.=function(row,item){ + OC.search.customResults['Bookm.'] = function(row,item){ var a=row.find('a'); a.attr('target','_blank'); a.click(recordClick); -- GitLab From e4faea8f9007667ee77ddd114440747539a0b843 Mon Sep 17 00:00:00 2001 From: Marvin Thomas Rabe Date: Wed, 1 Feb 2012 20:58:04 +0100 Subject: [PATCH 383/546] Fixed upload button display error --- files/css/files.css | 3 ++- files/templates/index.php | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/files/css/files.css b/files/css/files.css index 6c4d603b4a6..13ed7fb33e4 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -27,7 +27,8 @@ .file_upload_start { opacity:0; filter:alpha(opacity=0); z-index:1; position:absolute; left:0; top:0; width:100%; cursor:pointer;} .file_upload_filename.active { border-bottom-right-radius:0 } -.file_upload_filename { z-index:100; cursor:pointer; border-top-left-radius:0; border-bottom-left-radius:0; padding:.3em; } +.file_upload_filename { position: relative; z-index:100; padding-left: 0.8em; padding-right: 0.8em; cursor:pointer; border-top-left-radius:0; border-bottom-left-radius:0; } +.file_upload_filename img { position: absolute; top: 0.4em; left: 0.4em; } .file_upload_form, .file_upload_wrapper, .file_upload_start, .file_upload_filename, #file_upload_submit { cursor:pointer; } diff --git a/files/templates/index.php b/files/templates/index.php index 9ebfa41cef2..38a3274ff31 100644 --- a/files/templates/index.php +++ b/files/templates/index.php @@ -3,13 +3,10 @@
    - - t('New');?> - + t('New');?>
    @@ -17,7 +14,7 @@ - + -- GitLab From bbd10a3c94fdd0f8ac41d6d60651c7468360e487 Mon Sep 17 00:00:00 2001 From: Marvin Thomas Rabe Date: Wed, 1 Feb 2012 21:19:31 +0100 Subject: [PATCH 384/546] Bookmark layout updated --- apps/bookmarks/css/bookmarks.css | 33 ++++++++++++++------------------ apps/bookmarks/js/bookmarks.js | 4 ++-- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css index 233d4a02944..ef0ec68fcce 100644 --- a/apps/bookmarks/css/bookmarks.css +++ b/apps/bookmarks/css/bookmarks.css @@ -18,7 +18,7 @@ } .bookmarks_list { - margin-top: 45px; + margin-top: 2.8em; } .bookmarks_addBml { @@ -36,38 +36,33 @@ } .bookmark_actions { + position: absolute; + right: 1em; + top: 0.7em; display: none; - font-size: smaller; - color: #666; - padding-left: 4em; -} - -.bookmark_actions span:hover { - cursor: pointer; - text-decoration: underline; } +.bookmark_actions span { margin: 0 0.4em; } +.bookmark_actions img { opacity: 0.3; } +.bookmark_actions img:hover { opacity: 1; cursor: pointer; } .bookmark_single { + position: relative; padding: 0.5em 1em; + border-bottom: 1px solid #DDD; + -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; } .bookmark_single:hover { - background-color: #EAEAEA; + background-color:#f8f8f8 } .bookmark_single:hover .bookmark_actions { display: block; } -.bookmark_title { - font-size: larger; - color: blue; - text-decoration: underline; -} - -.bookmark_url { - color: green; -} +.bookmark_title { font-weight: bold; display: inline-block; margin-right: 0.8em; } +.bookmark_url { display: none; color: #999; } +.bookmark_single:hover .bookmark_url { display: inline; } .bookmark_tag { color: #ff3333; diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js index 51646e5382b..86bb71ac725 100644 --- a/apps/bookmarks/js/bookmarks.js +++ b/apps/bookmarks/js/bookmarks.js @@ -85,10 +85,10 @@ function addOrEditBookmark(event) { $('.bookmarks_add').children('p').children('.bookmarks_input').val(''); $('.bookmarks_list').prepend( '
    ' + + '

     

    ' + '

    ' + title + '

    ' + '

    ' + url + '

    ' + '

    ' + tagshtml + '

    ' + - '

    Delete Edit

    ' + '
    ' ); } @@ -153,10 +153,10 @@ function updateBookmarksList(bookmark) { } $('.bookmarks_list').append( '
    ' + + '

     

    ' + '

    ' + encodeEntities(bookmark.title) + '

    ' + '

    ' + encodeEntities(bookmark.url) + '

    ' + '

    ' + taglist + '

    ' + - '

    Delete Edit

    ' + '
    ' ); } -- GitLab From f999fbf81a142b2695bf3fffcf66e430efb71c44 Mon Sep 17 00:00:00 2001 From: Marvin Thomas Rabe Date: Wed, 1 Feb 2012 22:02:06 +0100 Subject: [PATCH 385/546] Bookmark layout updated --- apps/bookmarks/css/bookmarks.css | 18 +++++++++++++++--- apps/bookmarks/js/bookmarks.js | 10 ++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css index ef0ec68fcce..48f0bede110 100644 --- a/apps/bookmarks/css/bookmarks.css +++ b/apps/bookmarks/css/bookmarks.css @@ -18,7 +18,7 @@ } .bookmarks_list { - margin-top: 2.8em; + margin-top: 36px; } .bookmarks_addBml { @@ -63,10 +63,22 @@ .bookmark_title { font-weight: bold; display: inline-block; margin-right: 0.8em; } .bookmark_url { display: none; color: #999; } .bookmark_single:hover .bookmark_url { display: inline; } - +.bookmark_tags { + position: absolute; + top: 0.5em; + right: 6em; + text-align: right; +} .bookmark_tag { - color: #ff3333; + display: inline-block; + color: white; + margin: 0 0.2em; + padding: 0 0.4em; + background-color: #1D2D44; + border-radius: 0.4em; + opacity: 0.2; } +.bookmark_tag:hover { opacity: 0.5; } .loading_meta { display: none; diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js index 86bb71ac725..b43c3deb59c 100644 --- a/apps/bookmarks/js/bookmarks.js +++ b/apps/bookmarks/js/bookmarks.js @@ -87,8 +87,8 @@ function addOrEditBookmark(event) { '
    ' + '

     

    ' + '

    ' + title + '

    ' + - '

    ' + url + '

    ' + '

    ' + tagshtml + '

    ' + + '

    ' + url + '

    ' + '
    ' ); } @@ -146,7 +146,8 @@ function updateBookmarksList(bookmark) { var tags = encodeEntities(bookmark.tags).split(' '); var taglist = ''; for ( var i=0, len=tags.length; i' + tags[i] + ' '; + if(tags[i] != '') + taglist = taglist + '' + tags[i] + ' '; } if(!hasProtocol(bookmark.url)) { bookmark.url = 'http://' + bookmark.url; @@ -156,9 +157,11 @@ function updateBookmarksList(bookmark) { '

     

    ' + '

    ' + encodeEntities(bookmark.title) + '

    ' + '

    ' + encodeEntities(bookmark.url) + '

    ' + - '

    ' + taglist + '

    ' + '
    ' ); + if(taglist != '') { + $('div[data-id="'+ bookmark.id +'"]').append('

    ' + taglist + '

    '); + } } function updateOnBottom() { @@ -178,7 +181,6 @@ function recordClick(event) { function encodeEntities(s){ try { return $('
    ').text(s).html(); - } catch (ex) { return ""; } -- GitLab From f1982965769ac30f00bb36ab3c672815d1a0d09b Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Wed, 1 Feb 2012 22:15:01 +0100 Subject: [PATCH 386/546] gallery works in safari now --- apps/gallery/js/albums.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js index 59efb5b5659..d2b4d858b55 100644 --- a/apps/gallery/js/albums.js +++ b/apps/gallery/js/albums.js @@ -46,14 +46,14 @@ Albums={ var a = Albums.albums[i]; var local=$(displayTemplate); local.attr('data-album',a.name); - $(".gallery_album_decoration a.rename", local).click(function(name,event){ + $(".gallery_album_decoration a.rename", local).bind('click', {name: a.name},function(event){ event.preventDefault(); - galleryRename(name); - }.bind(null,a.name)); - $(".gallery_album_decoration a.remove", local).click(function(name,event){ + galleryRename(event.data.name); + }); + $(".gallery_album_decoration a.remove", local).bind('click', {name: a.name},function(event){ event.preventDefault(); - galleryRemove(name); - }.bind(null,a.name)); + galleryRemove(a.data.name); + }); $("a.view", local).attr('href','?view='+a.name); $('h1',local).text(a.name); $(".gallery_album_cover", local).attr('title',a.name); -- GitLab From 92b8f3238658782e6eb5a4285185a8fae6665f05 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 2 Feb 2012 15:01:05 +0100 Subject: [PATCH 387/546] Calendar: Bugfix: better input validation --- apps/calendar/ajax/createcalendar.php | 2 +- apps/calendar/ajax/events.php | 4 ++-- apps/calendar/ajax/updatecalendar.php | 2 +- apps/calendar/js/calendar.js | 1 + apps/calendar/templates/part.eventform.php | 6 +++--- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/calendar/ajax/createcalendar.php b/apps/calendar/ajax/createcalendar.php index b719b207c74..08bf7b4ee49 100644 --- a/apps/calendar/ajax/createcalendar.php +++ b/apps/calendar/ajax/createcalendar.php @@ -25,7 +25,7 @@ foreach($calendars as $cal){ } $userid = OC_User::getUser(); -$calendarid = OC_Calendar_Calendar::addCalendar($userid, $_POST['name'], 'VEVENT,VTODO,VJOURNAL', null, 0, $_POST['color']); +$calendarid = OC_Calendar_Calendar::addCalendar($userid, htmlspecialchars($_POST['name']), 'VEVENT,VTODO,VJOURNAL', null, 0, $_POST['color']); OC_Calendar_Calendar::setCalendarActive($calendarid, 1); $calendar = OC_Calendar_Calendar::find($calendarid); diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php index 998991c2fb4..75fac6838d7 100644 --- a/apps/calendar/ajax/events.php +++ b/apps/calendar/ajax/events.php @@ -11,8 +11,8 @@ require_once('../../../3rdparty/when/When.php'); function addoutput($event, $vevent, $return_event){ $return_event['id'] = (int)$event['id']; - $return_event['title'] = $event['summary']; - $return_event['description'] = isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:''; + $return_event['title'] = htmlspecialchars($event['summary']); + $return_event['description'] = isset($vevent->DESCRIPTION)?htmlspecialchars($vevent->DESCRIPTION->value):''; $last_modified = $vevent->__get('LAST-MODIFIED'); if ($last_modified){ $lastmodified = $last_modified->getDateTime()->format('U'); diff --git a/apps/calendar/ajax/updatecalendar.php b/apps/calendar/ajax/updatecalendar.php index 269b7b7ca06..90dafd35b68 100644 --- a/apps/calendar/ajax/updatecalendar.php +++ b/apps/calendar/ajax/updatecalendar.php @@ -26,7 +26,7 @@ foreach($calendars as $cal){ $calendarid = $_POST['id']; $calendar = OC_Calendar_App::getCalendar($calendarid);//access check -OC_Calendar_Calendar::editCalendar($calendarid, $_POST['name'], null, null, null, $_POST['color']); +OC_Calendar_Calendar::editCalendar($calendarid, htmlspecialchars($_POST['name']), null, null, null, $_POST['color']); OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); $calendar = OC_Calendar_App::getCalendar($calendarid); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index afd1b692dd4..64c029404cb 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -698,6 +698,7 @@ $(document).ready(function(){ eventDrop: Calendar.UI.moveEvent, eventResize: Calendar.UI.resizeEvent, eventRender: function(event, element) { + element.find('span.fc-event-title').html(element.find('span.fc-event-title').text()); element.tipsy({ className: 'tipsy-event', opacity: 0.9, diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php index 1f2073f4bc7..49214aca77c 100644 --- a/apps/calendar/templates/part.eventform.php +++ b/apps/calendar/templates/part.eventform.php @@ -2,7 +2,7 @@ t("Title");?>: - " value="" maxlength="100" name="title"/> + " value="" maxlength="100" name="title"/> @@ -207,7 +207,7 @@ t("Location");?>: - " value="" maxlength="100" name="location" /> + " value="" maxlength="100" name="location" /> @@ -215,7 +215,7 @@ t("Description");?>: - + -- GitLab From 66b96e4440961483d026473fc6242599b3d51550 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 2 Feb 2012 16:46:38 +0100 Subject: [PATCH 388/546] Sanitize in- and output. --- apps/contacts/ajax/addcard.php | 2 +- apps/contacts/ajax/addproperty.php | 2 ++ apps/contacts/ajax/setproperty.php | 6 +++- apps/contacts/templates/part.property.FN.php | 4 +-- apps/contacts/templates/part.property.php | 20 +++++------ .../templates/part.setpropertyform.php | 36 +++++++++---------- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/apps/contacts/ajax/addcard.php b/apps/contacts/ajax/addcard.php index 140d6a48095..f15a1685840 100644 --- a/apps/contacts/ajax/addcard.php +++ b/apps/contacts/ajax/addcard.php @@ -77,7 +77,7 @@ foreach( $add as $propname){ ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! $value = OC_VObject::escapeSemicolons($value); } - $vcard->addProperty($propname, $value); //, $prop_parameters); + $vcard->addProperty($propname, strip_tags($value)); //, $prop_parameters); $line = count($vcard->children) - 1; foreach ($prop_parameters as $key=>$element) { if(is_array($element) && strtoupper($key) == 'TYPE') { diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index c90af217c87..a00346c7dff 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -67,6 +67,8 @@ foreach($current as $item) { if(is_array($value)) { ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! +} else { + $value = strip_tags($value); } $property = $vcard->addProperty($name, $value); //, $parameters); diff --git a/apps/contacts/ajax/setproperty.php b/apps/contacts/ajax/setproperty.php index cf3fe582247..f9e2a8e8647 100644 --- a/apps/contacts/ajax/setproperty.php +++ b/apps/contacts/ajax/setproperty.php @@ -37,9 +37,13 @@ $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); $value = $_POST['value']; if(is_array($value)){ ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! + foreach(array_keys($value) as $key) { + OC_Log::write('contacts','ajax/setproperty.php: setting: '.$key.': '.$value[$key], OC_Log::DEBUG); + } + $value = OC_VObject::escapeSemicolons($value); } OC_Log::write('contacts','ajax/setproperty.php: setting: '.$vcard->children[$line]->name.': '.$value, OC_Log::DEBUG); -$vcard->children[$line]->setValue($value); +$vcard->children[$line]->setValue(strip_tags($value)); // Add parameters $postparameters = isset($_POST['parameters'])?$_POST['parameters']:array(); diff --git a/apps/contacts/templates/part.property.FN.php b/apps/contacts/templates/part.property.FN.php index 83cef94e303..c9e21c20e60 100644 --- a/apps/contacts/templates/part.property.FN.php +++ b/apps/contacts/templates/part.property.FN.php @@ -1,9 +1,9 @@

    - +

    diff --git a/apps/contacts/templates/part.property.php b/apps/contacts/templates/part.property.php index e4010397500..7b23fae45b5 100644 --- a/apps/contacts/templates/part.property.php +++ b/apps/contacts/templates/part.property.php @@ -8,21 +8,21 @@

    t('Organization'); ?>

    - +

    t('Email'); ?>

    - +

    t('Preferred').' ' : '' ?>t('Phone'); ?>

    - +

    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    - + diff --git a/apps/contacts/templates/part.setpropertyform.php b/apps/contacts/templates/part.setpropertyform.php index 49fa9662146..93ade8faaa7 100644 --- a/apps/contacts/templates/part.setpropertyform.php +++ b/apps/contacts/templates/part.setpropertyform.php @@ -5,18 +5,18 @@

    -
    +
    -
    +
    -
    - - +
    + +

    -

    +

    @@ -32,60 +32,60 @@
    - +
    - - + +
    - + - +
    - +
    - +

    -

    +

    -

    +

    -

    +

    -- GitLab From 6225b5ec869922a8e292610794bfda0f4dfdd77d Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 2 Feb 2012 17:53:46 +0100 Subject: [PATCH 389/546] More in-/output sanitation, --- apps/contacts/ajax/createaddressbook.php | 2 +- apps/contacts/templates/part.chooseaddressbook.rowfields.php | 2 +- apps/contacts/templates/part.editaddressbook.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php index edcf794f497..3d766b6a60a 100644 --- a/apps/contacts/ajax/createaddressbook.php +++ b/apps/contacts/ajax/createaddressbook.php @@ -15,7 +15,7 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); $userid = OC_User::getUser(); -$bookid = OC_Contacts_Addressbook::add($userid, $_POST['name'], null); +$bookid = OC_Contacts_Addressbook::add($userid, strip_tags($_POST['name']), null); if(!$bookid) { OC_JSON::error(array('data' => array('message' => $l->t('Error adding addressbook.')))); OC_Log::write('contacts','ajax/createaddressbook.php: Error adding addressbook: '.$_POST['name'], OC_Log::ERROR); diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php index 0cbfe2bf803..95a4b2362aa 100644 --- a/apps/contacts/templates/part.chooseaddressbook.rowfields.php +++ b/apps/contacts/templates/part.chooseaddressbook.rowfields.php @@ -1,5 +1,5 @@ "; - echo ""; + echo ""; echo "t("CardDav Link") . "\" class=\"action\">t("Download") . "\" class=\"action\">t("Edit") . "\" class=\"action\" onclick=\"Contacts.UI.Addressbooks.editAddressbook(this, " . $_['addressbook']["id"] . ");\">t("Delete") . "\" class=\"action\">"; diff --git a/apps/contacts/templates/part.editaddressbook.php b/apps/contacts/templates/part.editaddressbook.php index 48fe5c3b378..c1c585687c4 100644 --- a/apps/contacts/templates/part.editaddressbook.php +++ b/apps/contacts/templates/part.editaddressbook.php @@ -11,7 +11,7 @@ t('Displayname') ?> - + -- GitLab From bfa69c3e591e0c9f930af7948364e1aae4bdff8b Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Thu, 2 Feb 2012 18:36:37 +0100 Subject: [PATCH 390/546] add a label calendar to the settings page - bugfix for oc-157 --- apps/calendar/templates/settings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php index fc8e0e061d9..e174378d02d 100644 --- a/apps/calendar/templates/settings.php +++ b/apps/calendar/templates/settings.php @@ -9,6 +9,7 @@ ?>
    + t('Calendar'); ?>
    + + +
    +
    + + -- GitLab From 5a106d10361865dfd5cffe8809caee73ff410c4c Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 4 Feb 2012 10:30:32 +0100 Subject: [PATCH 395/546] gallery: fix FS hooks --- apps/gallery/lib/album.php | 1 + apps/gallery/lib/hooks_handlers.php | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index 502237481a9..167813a1a31 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -54,6 +54,7 @@ class OC_Gallery_Album { public static function removeByPath($path, $owner) { $album = self::find($owner, null, $path); $album = $album->fetchRow(); + error_log($path . '--' . $album['album_name']); self::remove($owner, $album['album_name']); OC_Gallery_Photo::removeByAlbumId($album['album_id']); // find and remove any gallery which might be stored lower in dir hierarchy diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 236a4b96a07..605cb0d0037 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -58,12 +58,18 @@ class OC_Gallery_Hooks_Handlers { return OC_Gallery_Album::find(OC_User::getUser(), null, $path); } + public static function pathInRoot($path) { + $root = OC_Appconfig::getValue('gallery', 'root', '/'); + return substr($path, 0, strlen($path)>strlen($root)?strlen($root):strlen($path)) == $root; + } + public static function addPhotoFromPath($params) { $fullpath = $params[OC_Filesystem::signal_param_path]; if (!self::isPhoto($fullpath)) return; $path = substr($fullpath, 0, strrpos($fullpath, '/')); + if (!self::pathInRoot($path)) return; OC_Gallery_Scanner::scanDir($path, $albums); } @@ -71,8 +77,8 @@ class OC_Gallery_Hooks_Handlers { public static function removePhoto($params) { $path = $params[OC_Filesystem::signal_param_path]; if (OC_Filesystem::is_dir($path) && self::directoryContainsPhotos($path)) { - OC_Gallery_Album::removeByPath($path, OC_User::getUser()); - OC_Gallery_Photo::removeByPath($path.'/%'); + if(!self::pathInRoot($path)) return; + OC_Gallery_Album::removeByPath($path.'/', OC_User::getUser()); } elseif (self::isPhoto($path)) { OC_Gallery_Photo::removeByPath($path); } -- GitLab From f1672d7d10477026cfa4f49a8ec7c71e03f3f6ba Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 4 Feb 2012 11:02:13 +0100 Subject: [PATCH 396/546] handling special chars in dirnames --- apps/gallery/ajax/galleryOp.php | 4 ++-- apps/gallery/js/albums.js | 4 ++-- apps/gallery/lib/album.php | 1 - apps/gallery/lib/scanner.php | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 187cd8af292..1233b49052f 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -104,7 +104,7 @@ if ($_GET['operation']) { OC_JSON::success(); break; case 'get_covers': - handleGetThumbnails($_GET['albumname']); + handleGetThumbnails(urldecode($_GET['albumname'])); break; case 'scan': handleGalleryScanning(); @@ -113,7 +113,7 @@ if ($_GET['operation']) { handleFilescan($_GET['cleanup']); break; case 'partial_create': - handlePartialCreate($_GET['path']); + handlePartialCreate(urldecode($_GET['path'])); break; case 'store_settings': handleStoreSettings($_GET['root'], $_GET['order']); diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js index 01e146a2f12..987412f28e0 100644 --- a/apps/gallery/js/albums.js +++ b/apps/gallery/js/albums.js @@ -54,12 +54,12 @@ Albums={ event.preventDefault(); galleryRemove(event.data.name); }); - $("a.view", local).attr('href','?view='+a.name); + $("a.view", local).attr('href','?view='+escape(a.name)); $('h1',local).text(a.name); $(".gallery_album_cover", local).attr('title',a.name); $(".gallery_album_cover", local).css('background-repeat', 'no-repeat'); $(".gallery_album_cover", local).css('background-position', '0'); - $(".gallery_album_cover", local).css('background-image','url("ajax/galleryOp.php?operation=get_covers&albumname='+a.name+'")'); + $(".gallery_album_cover", local).css('background-image','url("ajax/galleryOp.php?operation=get_covers&albumname='+escape(a.name)+'")'); $(".gallery_album_cover", local).mousemove(function(e) { var albumMetadata = Albums.find(this.title); diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index 167813a1a31..502237481a9 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -54,7 +54,6 @@ class OC_Gallery_Album { public static function removeByPath($path, $owner) { $album = self::find($owner, null, $path); $album = $album->fetchRow(); - error_log($path . '--' . $album['album_name']); self::remove($owner, $album['album_name']); OC_Gallery_Photo::removeByAlbumId($album['album_id']); // find and remove any gallery which might be stored lower in dir hierarchy diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php index dfb9edebfea..2af63d8bf0e 100644 --- a/apps/gallery/lib/scanner.php +++ b/apps/gallery/lib/scanner.php @@ -106,7 +106,7 @@ class OC_Gallery_Scanner { if (self::isPhoto($path.$file)) $addpath = TRUE; } - if ($addpath) $ret[] = $path; + if ($addpath) $ret[] = urlencode($path); return $ret; } -- GitLab From f6a27dfa2898ab23527d4efe8063ff32895b52e8 Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 4 Feb 2012 15:35:58 +0100 Subject: [PATCH 397/546] stripping root from gallery name --- apps/gallery/lib/scanner.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php index 2af63d8bf0e..13800f48e69 100644 --- a/apps/gallery/lib/scanner.php +++ b/apps/gallery/lib/scanner.php @@ -39,12 +39,19 @@ class OC_Gallery_Scanner { $stmt->execute(array()); } + public static function createName($name) { + $root = OC_Appconfig::getValue('gallery', 'root', '/'); + $name = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $name)); + if (substr($name, 0, strlen($root)) == str_replace('/','.',$root)) { + $name = substr($name, strlen($root)); + } + $name = ($name==='.') ? 'main' : trim($name,'.'); + return $name; + } + public static function scanDir($path, &$albums) { $current_album = array('name'=> $path, 'imagesCount' => 0, 'images' => array()); - $current_album['name'] = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $current_album['name'])); - $current_album['name'] = ($current_album['name']==='.') ? - 'main' : - trim($current_album['name'],'.'); + $current_album['name'] = self::createName($current_album['name']); if ($dh = OC_Filesystem::opendir($path)) { while (($filename = readdir($dh)) !== false) { -- GitLab From cfc710e7683a3e16e80fd0f2b6e8bef047e8502c Mon Sep 17 00:00:00 2001 From: Bartek Przybylski Date: Sat, 4 Feb 2012 20:15:55 +0100 Subject: [PATCH 398/546] preferences store fix --- apps/gallery/ajax/galleryOp.php | 8 ++++---- apps/gallery/lib/album.php | 2 +- apps/gallery/lib/hooks_handlers.php | 2 +- apps/gallery/lib/scanner.php | 2 +- apps/gallery/templates/index.php | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php index 1233b49052f..f819d87f666 100644 --- a/apps/gallery/ajax/galleryOp.php +++ b/apps/gallery/ajax/galleryOp.php @@ -57,7 +57,7 @@ function handleGalleryScanning() { function handleFilescan($cleanup) { OC_JSON::checkLoggedIn(); if ($cleanup) OC_Gallery_Album::cleanup(); - $root = OC_Appconfig::getValue('gallery', 'root', '').'/'; + $root = OC_Preferences::getValue(OC_User::getUser(), 'gallery', 'root', '').'/'; $pathlist = OC_Gallery_Scanner::find_paths($root); sort($pathlist); OC_JSON::success(array('paths' => $pathlist)); @@ -85,11 +85,11 @@ function handleStoreSettings($root, $order) { return; } - $current_root = OC_Appconfig::getValue('gallery', 'root', '/'); + $current_root = OC_Preferences::getValue(OC_User::getUser(),'gallery', 'root', '/'); $root = trim(rtrim($root, '/')); $rescan = $current_root==$root?'no':'yes'; - OC_Appconfig::setValue('gallery', 'root', $root); - OC_Appconfig::setValue('gallery', 'order', $order); + OC_Preferences::setValue(OC_User::getUser(), 'gallery', 'root', $root); + OC_Preferences::setValue(OC_User::getUser(), 'gallery', 'order', $order); OC_JSON::success(array('rescan' => $rescan)); } diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php index 502237481a9..d1405333ac7 100644 --- a/apps/gallery/lib/album.php +++ b/apps/gallery/lib/album.php @@ -77,7 +77,7 @@ class OC_Gallery_Album { $sql .= ' AND album_path = ?'; $args[] = $path; } - $order = OC_Appconfig::getValue('gallery', 'order', 'ASC'); + $order = OC_Preferences::getValue(OC_User::getUser(), 'gallery', 'order', 'ASC'); $sql .= ' ORDER BY album_name ' . $order; $stmt = OC_DB::prepare($sql); diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php index 605cb0d0037..046866e5c5d 100644 --- a/apps/gallery/lib/hooks_handlers.php +++ b/apps/gallery/lib/hooks_handlers.php @@ -59,7 +59,7 @@ class OC_Gallery_Hooks_Handlers { } public static function pathInRoot($path) { - $root = OC_Appconfig::getValue('gallery', 'root', '/'); + $root = OC_Preferences::getValue(OC_User::getUser(), 'gallery', 'root', '/'); return substr($path, 0, strlen($path)>strlen($root)?strlen($root):strlen($path)) == $root; } diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php index 13800f48e69..3aae94d1a4f 100644 --- a/apps/gallery/lib/scanner.php +++ b/apps/gallery/lib/scanner.php @@ -40,7 +40,7 @@ class OC_Gallery_Scanner { } public static function createName($name) { - $root = OC_Appconfig::getValue('gallery', 'root', '/'); + $root = OC_Preferences::getValue(OC_User::getUser(), 'gallery', 'root', '/'); $name = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $name)); if (substr($name, 0, strlen($root)) == str_replace('/','.',$root)) { $name = substr($name, strlen($root)); diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php index 4e74be4c64e..7cc7dad3ac6 100644 --- a/apps/gallery/templates/index.php +++ b/apps/gallery/templates/index.php @@ -33,7 +33,7 @@ $l = new OC_L10N('gallery');
    $eol"; - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - } - - if (isset($sequences[$table_name])) { - foreach ($sequences[$table_name] as $sequence) { - $result = $this->dumpSequence($database_definition['sequences'][$sequence], - $sequence, $eol, $dump); - if (PEAR::isError($result)) { - return $result; - } - - if ($output) { - call_user_func($output, $result); - } else { - fwrite($fp, $result); - } - } - } - } - } - - if (isset($sequences[''])) { - foreach ($sequences[''] as $sequence) { - $result = $this->dumpSequence($database_definition['sequences'][$sequence], - $sequence, $eol, $dump); - if (PEAR::isError($result)) { - return $result; - } - - if ($output) { - call_user_func($output, $result); - } else { - fwrite($fp, $result); - } - } - } - - $buffer = "$eol$eol"; - if ($output) { - call_user_func($output, $buffer); - } else { - fwrite($fp, $buffer); - fclose($fp); - } - - return MDB2_OK; - } - - // }}} - // {{{ writeExpression() - - /** - * Dumps the structure of an element. Elements can be value, column, - * function or expression. - * - * @param array $element multi dimensional array that represents the parsed element - * of a DML instruction. - * @param integer $offset base indentation width - * @param array $arguments associative array that takes pairs of tag - * names and values that define dump options. - * - * @return string - * - * @access public - * @see MDB2_Schema_Writer::dumpDatabase() - */ - function writeExpression($element, $offset = 0, $arguments = null) - { - $eol = isset($arguments['end_of_line']) ? $arguments['end_of_line'] : "\n"; - $str = ''; - - $indent = str_repeat(' ', $offset); - $noffset = $offset + 1; - - switch ($element['type']) { - case 'value': - $str .= "$indent".$this->_escapeSpecialChars($element['data'])."$eol"; - break; - case 'column': - $str .= "$indent".$this->_escapeSpecialChars($element['data'])."$eol"; - break; - case 'function': - $str .= "$indent$eol$indent ".$this->_escapeSpecialChars($element['data']['name'])."$eol"; - - if (!empty($element['data']['arguments']) - && is_array($element['data']['arguments']) - ) { - foreach ($element['data']['arguments'] as $v) { - $str .= $this->writeExpression($v, $noffset, $arguments); - } - } - - $str .= "$indent$eol"; - break; - case 'expression': - $str .= "$indent$eol"; - $str .= $this->writeExpression($element['data']['operants'][0], $noffset, $arguments); - $str .= "$indent ".$element['data']['operator']."$eol"; - $str .= $this->writeExpression($element['data']['operants'][1], $noffset, $arguments); - $str .= "$indent$eol"; - break; - } - return $str; - } - - // }}} -} -?> diff --git a/3rdparty/PEAR.php b/3rdparty/PEAR.php deleted file mode 100644 index f832c0d4916..00000000000 --- a/3rdparty/PEAR.php +++ /dev/null @@ -1,1055 +0,0 @@ - | -// | Stig Bakken | -// | Tomas V.V.Cox | -// +--------------------------------------------------------------------+ -// -// $Id: PEAR.php,v 1.82.2.6 2005/01/01 05:24:51 cellog Exp $ -// - -define('PEAR_ERROR_RETURN', 1); -define('PEAR_ERROR_PRINT', 2); -define('PEAR_ERROR_TRIGGER', 4); -define('PEAR_ERROR_DIE', 8); -define('PEAR_ERROR_CALLBACK', 16); -/** - * WARNING: obsolete - * @deprecated - */ -define('PEAR_ERROR_EXCEPTION', 32); -define('PEAR_ZE2', (function_exists('version_compare') && - version_compare(zend_version(), "2-dev", "ge"))); - -if (substr(PHP_OS, 0, 3) == 'WIN') { - define('OS_WINDOWS', true); - define('OS_UNIX', false); - define('PEAR_OS', 'Windows'); -} else { - define('OS_WINDOWS', false); - define('OS_UNIX', true); - define('PEAR_OS', 'Unix'); // blatant assumption -} - -// instant backwards compatibility -if (!defined('PATH_SEPARATOR')) { - if (OS_WINDOWS) { - define('PATH_SEPARATOR', ';'); - } else { - define('PATH_SEPARATOR', ':'); - } -} - -$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; -$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; -$GLOBALS['_PEAR_destructor_object_list'] = array(); -$GLOBALS['_PEAR_shutdown_funcs'] = array(); -$GLOBALS['_PEAR_error_handler_stack'] = array(); - -@ini_set('track_errors', true); - -/** - * Base class for other PEAR classes. Provides rudimentary - * emulation of destructors. - * - * If you want a destructor in your class, inherit PEAR and make a - * destructor method called _yourclassname (same name as the - * constructor, but with a "_" prefix). Also, in your constructor you - * have to call the PEAR constructor: $this->PEAR();. - * The destructor method will be called without parameters. Note that - * at in some SAPI implementations (such as Apache), any output during - * the request shutdown (in which destructors are called) seems to be - * discarded. If you need to get any debug information from your - * destructor, use error_log(), syslog() or something similar. - * - * IMPORTANT! To use the emulated destructors you need to create the - * objects by reference: $obj =& new PEAR_child; - * - * @since PHP 4.0.2 - * @author Stig Bakken - * @see http://pear.php.net/manual/ - */ -class PEAR -{ - // {{{ properties - - /** - * Whether to enable internal debug messages. - * - * @var bool - * @access private - */ - var $_debug = false; - - /** - * Default error mode for this object. - * - * @var int - * @access private - */ - var $_default_error_mode = null; - - /** - * Default error options used for this object when error mode - * is PEAR_ERROR_TRIGGER. - * - * @var int - * @access private - */ - var $_default_error_options = null; - - /** - * Default error handler (callback) for this object, if error mode is - * PEAR_ERROR_CALLBACK. - * - * @var string - * @access private - */ - var $_default_error_handler = ''; - - /** - * Which class to use for error objects. - * - * @var string - * @access private - */ - var $_error_class = 'PEAR_Error'; - - /** - * An array of expected errors. - * - * @var array - * @access private - */ - var $_expected_errors = array(); - - // }}} - - // {{{ constructor - - /** - * Constructor. Registers this object in - * $_PEAR_destructor_object_list for destructor emulation if a - * destructor object exists. - * - * @param string $error_class (optional) which class to use for - * error objects, defaults to PEAR_Error. - * @access public - * @return void - */ - function PEAR($error_class = null) - { - $classname = strtolower(get_class($this)); - if ($this->_debug) { - print "PEAR constructor called, class=$classname\n"; - } - if ($error_class !== null) { - $this->_error_class = $error_class; - } - while ($classname && strcasecmp($classname, "pear")) { - $destructor = "_$classname"; - if (method_exists($this, $destructor)) { - global $_PEAR_destructor_object_list; - $_PEAR_destructor_object_list[] = &$this; - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - break; - } else { - $classname = get_parent_class($classname); - } - } - } - - // }}} - // {{{ destructor - - /** - * Destructor (the emulated type of...). Does nothing right now, - * but is included for forward compatibility, so subclass - * destructors should always call it. - * - * See the note in the class desciption about output from - * destructors. - * - * @access public - * @return void - */ - function _PEAR() { - if ($this->_debug) { - printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); - } - } - - // }}} - // {{{ getStaticProperty() - - /** - * If you have a class that's mostly/entirely static, and you need static - * properties, you can use this method to simulate them. Eg. in your method(s) - * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); - * You MUST use a reference, or they will not persist! - * - * @access public - * @param string $class The calling classname, to prevent clashes - * @param string $var The variable to retrieve. - * @return mixed A reference to the variable. If not set it will be - * auto initialised to NULL. - */ - function &getStaticProperty($class, $var) - { - static $properties; - return $properties[$class][$var]; - } - - // }}} - // {{{ registerShutdownFunc() - - /** - * Use this function to register a shutdown method for static - * classes. - * - * @access public - * @param mixed $func The function name (or array of class/method) to call - * @param mixed $args The arguments to pass to the function - * @return void - */ - function registerShutdownFunc($func, $args = array()) - { - $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); - } - - // }}} - // {{{ isError() - - /** - * Tell whether a value is a PEAR error. - * - * @param mixed $data the value to test - * @param int $code if $data is an error object, return true - * only if $code is a string and - * $obj->getMessage() == $code or - * $code is an integer and $obj->getCode() == $code - * @access public - * @return bool true if parameter is an error - */ - static function isError($data, $code = null) - { - if ($data instanceof PEAR_Error) { - if (is_null($code)) { - return true; - } elseif (is_string($code)) { - return $data->getMessage() == $code; - } else { - return $data->getCode() == $code; - } - } - return false; - } - - // }}} - // {{{ setErrorHandling() - - /** - * Sets how errors generated by this object should be handled. - * Can be invoked both in objects and statically. If called - * statically, setErrorHandling sets the default behaviour for all - * PEAR objects. If called in an object, setErrorHandling sets - * the default behaviour for that object. - * - * @param int $mode - * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. - * - * @param mixed $options - * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one - * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * - * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is the object, and the element at index 1 is - * the name of the method to call in the object. - * - * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is - * a printf format string used when printing the error - * message. - * - * @access public - * @return void - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - * @see PEAR_ERROR_EXCEPTION - * - * @since PHP 4.0.5 - */ - - function setErrorHandling($mode = null, $options = null) - { - if (isset($this) && $this instanceof PEAR) { - $setmode = &$this->_default_error_mode; - $setoptions = &$this->_default_error_options; - } else { - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - } - - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - } - - // }}} - // {{{ expectError() - - /** - * This method is used to tell which errors you expect to get. - * Expected errors are always returned with error mode - * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, - * and this method pushes a new element onto it. The list of - * expected errors are in effect until they are popped off the - * stack with the popExpect() method. - * - * Note that this method can not be called statically - * - * @param mixed $code a single error code or an array of error codes to expect - * - * @return int the new depth of the "expected errors" stack - * @access public - */ - function expectError($code = '*') - { - if (is_array($code)) { - array_push($this->_expected_errors, $code); - } else { - array_push($this->_expected_errors, array($code)); - } - return sizeof($this->_expected_errors); - } - - // }}} - // {{{ popExpect() - - /** - * This method pops one element off the expected error codes - * stack. - * - * @return array the list of error codes that were popped - */ - function popExpect() - { - return array_pop($this->_expected_errors); - } - - // }}} - // {{{ _checkDelExpect() - - /** - * This method checks unsets an error code if available - * - * @param mixed error code - * @return bool true if the error code was unset, false otherwise - * @access private - * @since PHP 4.3.0 - */ - function _checkDelExpect($error_code) - { - $deleted = false; - - foreach ($this->_expected_errors AS $key => $error_array) { - if (in_array($error_code, $error_array)) { - unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); - $deleted = true; - } - - // clean up empty arrays - if (0 == count($this->_expected_errors[$key])) { - unset($this->_expected_errors[$key]); - } - } - return $deleted; - } - - // }}} - // {{{ delExpect() - - /** - * This method deletes all occurences of the specified element from - * the expected error codes stack. - * - * @param mixed $error_code error code that should be deleted - * @return mixed list of error codes that were deleted or error - * @access public - * @since PHP 4.3.0 - */ - function delExpect($error_code) - { - $deleted = false; - - if ((is_array($error_code) && (0 != count($error_code)))) { - // $error_code is a non-empty array here; - // we walk through it trying to unset all - // values - foreach($error_code as $key => $error) { - if ($this->_checkDelExpect($error)) { - $deleted = true; - } else { - $deleted = false; - } - } - return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } elseif (!empty($error_code)) { - // $error_code comes alone, trying to unset it - if ($this->_checkDelExpect($error_code)) { - return true; - } else { - return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } - } else { - // $error_code is empty - return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME - } - } - - // }}} - // {{{ raiseError() - - /** - * This method is a wrapper that returns an instance of the - * configured error class with this object's default error - * handling applied. If the $mode and $options parameters are not - * specified, the object's defaults are used. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. - * - * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter - * specifies the PHP-internal error level (one of - * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * If $mode is PEAR_ERROR_CALLBACK, this - * parameter specifies the callback function or - * method. In other error modes this parameter - * is ignored. - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @param string $error_class The returned error object will be - * instantiated from this class, if specified. - * - * @param bool $skipmsg If true, raiseError will only pass error codes, - * the error message parameter will be dropped. - * - * @access public - * @return object a PEAR error object - * @see PEAR::setErrorHandling - * @since PHP 4.0.5 - */ - function raiseError($message = null, - $code = null, - $mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - // The error is yet a PEAR error object - if (is_object($message)) { - $code = $message->getCode(); - $userinfo = $message->getUserInfo(); - $error_class = $message->getType(); - $message->error_message_prefix = ''; - $message = $message->getMessage(); - } - - if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { - if ($exp[0] == "*" || - (is_int(reset($exp)) && in_array($code, $exp)) || - (is_string(reset($exp)) && in_array($message, $exp))) { - $mode = PEAR_ERROR_RETURN; - } - } - // No mode given, try global ones - if ($mode === null) { - // Class error handler - if (isset($this) && isset($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - // Global error handler - } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { - $mode = $GLOBALS['_PEAR_default_error_mode']; - $options = $GLOBALS['_PEAR_default_error_options']; - } - } - - if ($error_class !== null) { - $ec = $error_class; - } elseif (isset($this) && isset($this->_error_class)) { - $ec = $this->_error_class; - } else { - $ec = 'PEAR_Error'; - } - if ($skipmsg) { - return new $ec($code, $mode, $options, $userinfo); - } else { - return new $ec($message, $code, $mode, $options, $userinfo); - } - } - - // }}} - // {{{ throwError() - - /** - * Simpler form of raiseError with fewer options. In most cases - * message, code and userinfo are enough. - * - * @param string $message - * - */ - function throwError($message = null, - $code = null, - $userinfo = null) - { - if (isset($this) && $this instanceof PEAR) { - return $this->raiseError($message, $code, null, null, $userinfo); - } else { - return PEAR::raiseError($message, $code, null, null, $userinfo); - } - } - - // }}} - function staticPushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - $stack[] = array($def_mode, $def_options); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $def_mode = $mode; - $def_options = $options; - break; - - case PEAR_ERROR_CALLBACK: - $def_mode = $mode; - // class/object method callback - if (is_callable($options)) { - $def_options = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - $stack[] = array($mode, $options); - return true; - } - - function staticPopErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - return true; - } - - // {{{ pushErrorHandling() - - /** - * Push a new error handler on top of the error handler options stack. With this - * you can easily override the actual error handler for some code and restore - * it later with popErrorHandling. - * - * @param mixed $mode (same as setErrorHandling) - * @param mixed $options (same as setErrorHandling) - * - * @return bool Always true - * - * @see PEAR::setErrorHandling - */ - function pushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - if (isset($this) && $this instanceof PEAR) { - $def_mode = &$this->_default_error_mode; - $def_options = &$this->_default_error_options; - } else { - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - } - $stack[] = array($def_mode, $def_options); - - if (isset($this) && $this instanceof PEAR) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - $stack[] = array($mode, $options); - return true; - } - - // }}} - // {{{ popErrorHandling() - - /** - * Pop the last error handler used - * - * @return bool Always true - * - * @see PEAR::pushErrorHandling - */ - function popErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - if (isset($this) && $this instanceof PEAR) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - return true; - } - - // }}} - // {{{ loadExtension() - - /** - * OS independant PHP extension load. Remember to take care - * on the correct extension name for case sensitive OSes. - * - * @param string $ext The extension name - * @return bool Success or not on the dl() call - */ - function loadExtension($ext) - { - if (!extension_loaded($ext)) { - // if either returns true dl() will produce a FATAL error, stop that - if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { - return false; - } - if (OS_WINDOWS) { - $suffix = '.dll'; - } elseif (PHP_OS == 'HP-UX') { - $suffix = '.sl'; - } elseif (PHP_OS == 'AIX') { - $suffix = '.a'; - } elseif (PHP_OS == 'OSX') { - $suffix = '.bundle'; - } else { - $suffix = '.so'; - } - return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); - } - return true; - } - - // }}} -} - -// {{{ _PEAR_call_destructors() - -function _PEAR_call_destructors() -{ - global $_PEAR_destructor_object_list; - if (is_array($_PEAR_destructor_object_list) && - sizeof($_PEAR_destructor_object_list)) - { - reset($_PEAR_destructor_object_list); - if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { - $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); - } - while (list($k, $objref) = each($_PEAR_destructor_object_list)) { - $classname = get_class($objref); - while ($classname) { - $destructor = "_$classname"; - if (method_exists($objref, $destructor)) { - $objref->$destructor(); - break; - } else { - $classname = get_parent_class($classname); - } - } - } - // Empty the object list to ensure that destructors are - // not called more than once. - $_PEAR_destructor_object_list = array(); - } - - // Now call the shutdown functions - if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { - foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { - call_user_func_array($value[0], $value[1]); - } - } -} - -// }}} - -class PEAR_Error -{ - // {{{ properties - - var $error_message_prefix = ''; - var $mode = PEAR_ERROR_RETURN; - var $level = E_USER_NOTICE; - var $code = -1; - var $message = ''; - var $userinfo = ''; - var $backtrace = null; - - // }}} - // {{{ constructor - - /** - * PEAR_Error constructor - * - * @param string $message message - * - * @param int $code (optional) error code - * - * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, - * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION - * - * @param mixed $options (optional) error level, _OR_ in the case of - * PEAR_ERROR_CALLBACK, the callback function or object/method - * tuple. - * - * @param string $userinfo (optional) additional user/debug info - * - * @access public - * - */ - function PEAR_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - if ($mode === null) { - $mode = PEAR_ERROR_RETURN; - } - $this->message = $message; - $this->code = $code; - $this->mode = $mode; - $this->userinfo = $userinfo; - if (function_exists("debug_backtrace")) { - if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { - $this->backtrace = debug_backtrace(); - } - } - if ($mode & PEAR_ERROR_CALLBACK) { - $this->level = E_USER_NOTICE; - $this->callback = $options; - } else { - if ($options === null) { - $options = E_USER_NOTICE; - } - $this->level = $options; - $this->callback = null; - } - if ($this->mode & PEAR_ERROR_PRINT) { - if (is_null($options) || is_int($options)) { - $format = "%s"; - } else { - $format = $options; - } - printf($format, $this->getMessage()); - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - trigger_error($this->getMessage(), $this->level); - } - if ($this->mode & PEAR_ERROR_DIE) { - $msg = $this->getMessage(); - if (is_null($options) || is_int($options)) { - $format = "%s"; - if (substr($msg, -1) != "\n") { - $msg .= "\n"; - } - } else { - $format = $options; - } - die(sprintf($format, $msg)); - } - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_callable($this->callback)) { - call_user_func($this->callback, $this); - } - } - if ($this->mode & PEAR_ERROR_EXCEPTION) { - trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions", E_USER_WARNING); - eval('$e = new Exception($this->message, $this->code);$e->PEAR_Error = $this;throw($e);'); - } - } - - // }}} - // {{{ getMode() - - /** - * Get the error mode from an error object. - * - * @return int error mode - * @access public - */ - function getMode() { - return $this->mode; - } - - // }}} - // {{{ getCallback() - - /** - * Get the callback function/method from an error object. - * - * @return mixed callback function or object/method array - * @access public - */ - function getCallback() { - return $this->callback; - } - - // }}} - // {{{ getMessage() - - - /** - * Get the error message from an error object. - * - * @return string full error message - * @access public - */ - function getMessage() - { - return ($this->error_message_prefix . $this->message); - } - - - // }}} - // {{{ getCode() - - /** - * Get error code from an error object - * - * @return int error code - * @access public - */ - function getCode() - { - return $this->code; - } - - // }}} - // {{{ getType() - - /** - * Get the name of this error/exception. - * - * @return string error/exception name (type) - * @access public - */ - function getType() - { - return get_class($this); - } - - // }}} - // {{{ getUserInfo() - - /** - * Get additional user-supplied information. - * - * @return string user-supplied information - * @access public - */ - function getUserInfo() - { - return $this->userinfo; - } - - // }}} - // {{{ getDebugInfo() - - /** - * Get additional debug information supplied by the application. - * - * @return string debug information - * @access public - */ - function getDebugInfo() - { - return $this->getUserInfo(); - } - - // }}} - // {{{ getBacktrace() - - /** - * Get the call backtrace from where the error was generated. - * Supported with PHP 4.3.0 or newer. - * - * @param int $frame (optional) what frame to fetch - * @return array Backtrace, or NULL if not available. - * @access public - */ - function getBacktrace($frame = null) - { - if ($frame === null) { - return $this->backtrace; - } - return $this->backtrace[$frame]; - } - - // }}} - // {{{ addUserInfo() - - function addUserInfo($info) - { - if (empty($this->userinfo)) { - $this->userinfo = $info; - } else { - $this->userinfo .= " ** $info"; - } - } - - // }}} - // {{{ toString() - - /** - * Make a string representation of this object. - * - * @return string a string with an object summary - * @access public - */ - function toString() { - $modes = array(); - $levels = array(E_USER_NOTICE => 'notice', - E_USER_WARNING => 'warning', - E_USER_ERROR => 'error'); - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_array($this->callback)) { - $callback = (is_object($this->callback[0]) ? - strtolower(get_class($this->callback[0])) : - $this->callback[0]) . '::' . - $this->callback[1]; - } else { - $callback = $this->callback; - } - return sprintf('[%s: message="%s" code=%d mode=callback '. - 'callback=%s prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - $callback, $this->error_message_prefix, - $this->userinfo); - } - if ($this->mode & PEAR_ERROR_PRINT) { - $modes[] = 'print'; - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - $modes[] = 'trigger'; - } - if ($this->mode & PEAR_ERROR_DIE) { - $modes[] = 'die'; - } - if ($this->mode & PEAR_ERROR_RETURN) { - $modes[] = 'return'; - } - return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. - 'prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - implode("|", $modes), $levels[$this->level], - $this->error_message_prefix, - $this->userinfo); - } - - // }}} -} - -/* - * Local Variables: - * mode: php - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ -?> diff --git a/3rdparty/PEAR/Autoloader.php b/3rdparty/PEAR/Autoloader.php deleted file mode 100644 index de0278d6191..00000000000 --- a/3rdparty/PEAR/Autoloader.php +++ /dev/null @@ -1,208 +0,0 @@ - | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Autoloader.php,v 1.11 2004/02/27 02:21:29 cellog Exp $ - -if (!extension_loaded("overload")) { - // die hard without ext/overload - die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader"); -} - -require_once "PEAR.php"; - -/** - * This class is for objects where you want to separate the code for - * some methods into separate classes. This is useful if you have a - * class with not-frequently-used methods that contain lots of code - * that you would like to avoid always parsing. - * - * The PEAR_Autoloader class provides autoloading and aggregation. - * The autoloading lets you set up in which classes the separated - * methods are found. Aggregation is the technique used to import new - * methods, an instance of each class providing separated methods is - * stored and called every time the aggregated method is called. - * - * @author Stig Sæther Bakken - */ -class PEAR_Autoloader extends PEAR -{ - // {{{ properties - - /** - * Map of methods and classes where they are defined - * - * @var array - * - * @access private - */ - var $_autoload_map = array(); - - /** - * Map of methods and aggregate objects - * - * @var array - * - * @access private - */ - var $_method_map = array(); - - // }}} - // {{{ addAutoload() - - /** - * Add one or more autoload entries. - * - * @param string $method which method to autoload - * - * @param string $classname (optional) which class to find the method in. - * If the $method parameter is an array, this - * parameter may be omitted (and will be ignored - * if not), and the $method parameter will be - * treated as an associative array with method - * names as keys and class names as values. - * - * @return void - * - * @access public - */ - function addAutoload($method, $classname = null) - { - if (is_array($method)) { - array_walk($method, create_function('$a,&$b', '$b = strtolower($b);')); - $this->_autoload_map = array_merge($this->_autoload_map, $method); - } else { - $this->_autoload_map[strtolower($method)] = $classname; - } - } - - // }}} - // {{{ removeAutoload() - - /** - * Remove an autoload entry. - * - * @param string $method which method to remove the autoload entry for - * - * @return bool TRUE if an entry was removed, FALSE if not - * - * @access public - */ - function removeAutoload($method) - { - $method = strtolower($method); - $ok = isset($this->_autoload_map[$method]); - unset($this->_autoload_map[$method]); - return $ok; - } - - // }}} - // {{{ addAggregateObject() - - /** - * Add an aggregate object to this object. If the specified class - * is not defined, loading it will be attempted following PEAR's - * file naming scheme. All the methods in the class will be - * aggregated, except private ones (name starting with an - * underscore) and constructors. - * - * @param string $classname what class to instantiate for the object. - * - * @return void - * - * @access public - */ - function addAggregateObject($classname) - { - $classname = strtolower($classname); - if (!class_exists($classname)) { - $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname); - include_once $include_file; - } - $obj =& new $classname; - $methods = get_class_methods($classname); - foreach ($methods as $method) { - // don't import priviate methods and constructors - if ($method{0} != '_' && $method != $classname) { - $this->_method_map[$method] = $obj; - } - } - } - - // }}} - // {{{ removeAggregateObject() - - /** - * Remove an aggregate object. - * - * @param string $classname the class of the object to remove - * - * @return bool TRUE if an object was removed, FALSE if not - * - * @access public - */ - function removeAggregateObject($classname) - { - $ok = false; - $classname = strtolower($classname); - reset($this->_method_map); - while (list($method, $obj) = each($this->_method_map)) { - if (is_a($obj, $classname)) { - unset($this->_method_map[$method]); - $ok = true; - } - } - return $ok; - } - - // }}} - // {{{ __call() - - /** - * Overloaded object call handler, called each time an - * undefined/aggregated method is invoked. This method repeats - * the call in the right aggregate object and passes on the return - * value. - * - * @param string $method which method that was called - * - * @param string $args An array of the parameters passed in the - * original call - * - * @return mixed The return value from the aggregated method, or a PEAR - * error if the called method was unknown. - */ - function __call($method, $args, &$retval) - { - $method = strtolower($method); - if (empty($this->_method_map[$method]) && isset($this->_autoload_map[$method])) { - $this->addAggregateObject($this->_autoload_map[$method]); - } - if (isset($this->_method_map[$method])) { - $retval = call_user_func_array(array($this->_method_map[$method], $method), $args); - return true; - } - return false; - } - - // }}} -} - -overload("PEAR_Autoloader"); - -?> diff --git a/3rdparty/PEAR/Builder.php b/3rdparty/PEAR/Builder.php deleted file mode 100644 index 4f6cc135d1e..00000000000 --- a/3rdparty/PEAR/Builder.php +++ /dev/null @@ -1,426 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Builder.php,v 1.16.2.3 2005/02/17 17:55:01 cellog Exp $ - -require_once 'PEAR/Common.php'; - -/** - * Class to handle building (compiling) extensions. - * - * @author Stig Sæther Bakken - */ -class PEAR_Builder extends PEAR_Common -{ - // {{{ properties - - var $php_api_version = 0; - var $zend_module_api_no = 0; - var $zend_extension_api_no = 0; - - var $extensions_built = array(); - - var $current_callback = null; - - // used for msdev builds - var $_lastline = null; - var $_firstline = null; - // }}} - // {{{ constructor - - /** - * PEAR_Builder constructor. - * - * @param object $ui user interface object (instance of PEAR_Frontend_*) - * - * @access public - */ - function PEAR_Builder(&$ui) - { - parent::PEAR_Common(); - $this->setFrontendObject($ui); - } - - // }}} - - // {{{ _build_win32() - - /** - * Build an extension from source on windows. - * requires msdev - */ - function _build_win32($descfile, $callback = null) - { - if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { - return $info; - } - $dir = dirname($descfile); - $old_cwd = getcwd(); - - if (!@chdir($dir)) { - return $this->raiseError("could not chdir to $dir"); - } - $this->log(2, "building in $dir"); - - $dsp = $info['package'].'.dsp'; - if (!@is_file("$dir/$dsp")) { - return $this->raiseError("The DSP $dsp does not exist."); - } - // XXX TODO: make release build type configurable - $command = 'msdev '.$dsp.' /MAKE "'.$info['package']. ' - Release"'; - - $this->current_callback = $callback; - $err = $this->_runCommand($command, array(&$this, 'msdevCallback')); - if (PEAR::isError($err)) { - return $err; - } - - // figure out the build platform and type - $platform = 'Win32'; - $buildtype = 'Release'; - if (preg_match('/.*?'.$info['package'].'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) { - $platform = $matches[1]; - $buildtype = $matches[2]; - } - - if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/',$this->_lastline,$matches)) { - if ($matches[2]) { - // there were errors in the build - return $this->raiseError("There were errors during compilation."); - } - $out = $matches[1]; - } else { - return $this->raiseError("Did not understand the completion status returned from msdev.exe."); - } - - // msdev doesn't tell us the output directory :/ - // open the dsp, find /out and use that directory - $dsptext = join(file($dsp),''); - - // this regex depends on the build platform and type having been - // correctly identified above. - $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'. - $info['package'].'\s-\s'. - $platform.'\s'. - $buildtype.'").*?'. - '\/out:"(.*?)"/is'; - - if ($dsptext && preg_match($regex,$dsptext,$matches)) { - // what we get back is a relative path to the output file itself. - $outfile = realpath($matches[2]); - } else { - return $this->raiseError("Could not retrieve output information from $dsp."); - } - if (@copy($outfile, "$dir/$out")) { - $outfile = "$dir/$out"; - } - - $built_files[] = array( - 'file' => "$outfile", - 'php_api' => $this->php_api_version, - 'zend_mod_api' => $this->zend_module_api_no, - 'zend_ext_api' => $this->zend_extension_api_no, - ); - - return $built_files; - } - // }}} - - // {{{ msdevCallback() - function msdevCallback($what, $data) - { - if (!$this->_firstline) - $this->_firstline = $data; - $this->_lastline = $data; - } - // }}} - - // {{{ _harventInstDir - /** - * @param string - * @param string - * @param array - * @access private - */ - function _harvestInstDir($dest_prefix, $dirname, &$built_files) - { - $d = opendir($dirname); - if (!$d) - return false; - - $ret = true; - while (($ent = readdir($d)) !== false) { - if ($ent{0} == '.') - continue; - - $full = $dirname . DIRECTORY_SEPARATOR . $ent; - if (is_dir($full)) { - if (!$this->_harvestInstDir( - $dest_prefix . DIRECTORY_SEPARATOR . $ent, - $full, $built_files)) { - $ret = false; - break; - } - } else { - $dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent; - $built_files[] = array( - 'file' => $full, - 'dest' => $dest, - 'php_api' => $this->php_api_version, - 'zend_mod_api' => $this->zend_module_api_no, - 'zend_ext_api' => $this->zend_extension_api_no, - ); - } - } - closedir($d); - return $ret; - } - - // }}} - - // {{{ build() - - /** - * Build an extension from source. Runs "phpize" in the source - * directory, but compiles in a temporary directory - * (/var/tmp/pear-build-USER/PACKAGE-VERSION). - * - * @param string $descfile path to XML package description file - * - * @param mixed $callback callback function used to report output, - * see PEAR_Builder::_runCommand for details - * - * @return array an array of associative arrays with built files, - * format: - * array( array( 'file' => '/path/to/ext.so', - * 'php_api' => YYYYMMDD, - * 'zend_mod_api' => YYYYMMDD, - * 'zend_ext_api' => YYYYMMDD ), - * ... ) - * - * @access public - * - * @see PEAR_Builder::_runCommand - * @see PEAR_Common::infoFromDescriptionFile - */ - function build($descfile, $callback = null) - { - if (PEAR_OS == "Windows") { - return $this->_build_win32($descfile,$callback); - } - if (PEAR_OS != 'Unix') { - return $this->raiseError("building extensions not supported on this platform"); - } - if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { - return $info; - } - $dir = dirname($descfile); - $old_cwd = getcwd(); - if (!@chdir($dir)) { - return $this->raiseError("could not chdir to $dir"); - } - $vdir = "$info[package]-$info[version]"; - if (is_dir($vdir)) { - chdir($vdir); - } - $dir = getcwd(); - $this->log(2, "building in $dir"); - $this->current_callback = $callback; - putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH')); - $err = $this->_runCommand("phpize", array(&$this, 'phpizeCallback')); - if (PEAR::isError($err)) { - return $err; - } - if (!$err) { - return $this->raiseError("`phpize' failed"); - } - - // {{{ start of interactive part - $configure_command = "$dir/configure"; - if (isset($info['configure_options'])) { - foreach ($info['configure_options'] as $o) { - list($r) = $this->ui->userDialog('build', - array($o['prompt']), - array('text'), - array(@$o['default'])); - if (substr($o['name'], 0, 5) == 'with-' && - ($r == 'yes' || $r == 'autodetect')) { - $configure_command .= " --$o[name]"; - } else { - $configure_command .= " --$o[name]=".trim($r); - } - } - } - // }}} end of interactive part - - // FIXME make configurable - if(!$user=getenv('USER')){ - $user='defaultuser'; - } - $build_basedir = "/var/tmp/pear-build-$user"; - $build_dir = "$build_basedir/$info[package]-$info[version]"; - $inst_dir = "$build_basedir/install-$info[package]-$info[version]"; - $this->log(1, "building in $build_dir"); - if (is_dir($build_dir)) { - System::rm('-rf', $build_dir); - } - if (!System::mkDir(array('-p', $build_dir))) { - return $this->raiseError("could not create build dir: $build_dir"); - } - $this->addTempFile($build_dir); - if (!System::mkDir(array('-p', $inst_dir))) { - return $this->raiseError("could not create temporary install dir: $inst_dir"); - } - $this->addTempFile($inst_dir); - - if (getenv('MAKE')) { - $make_command = getenv('MAKE'); - } else { - $make_command = 'make'; - } - $to_run = array( - $configure_command, - $make_command, - "$make_command INSTALL_ROOT=\"$inst_dir\" install", - "find \"$inst_dir\" -ls" - ); - if (!@chdir($build_dir)) { - return $this->raiseError("could not chdir to $build_dir"); - } - putenv('PHP_PEAR_VERSION=@PEAR-VER@'); - foreach ($to_run as $cmd) { - $err = $this->_runCommand($cmd, $callback); - if (PEAR::isError($err)) { - chdir($old_cwd); - return $err; - } - if (!$err) { - chdir($old_cwd); - return $this->raiseError("`$cmd' failed"); - } - } - if (!($dp = opendir("modules"))) { - chdir($old_cwd); - return $this->raiseError("no `modules' directory found"); - } - $built_files = array(); - $prefix = exec("php-config --prefix"); - $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files); - chdir($old_cwd); - return $built_files; - } - - // }}} - // {{{ phpizeCallback() - - /** - * Message callback function used when running the "phpize" - * program. Extracts the API numbers used. Ignores other message - * types than "cmdoutput". - * - * @param string $what the type of message - * @param mixed $data the message - * - * @return void - * - * @access public - */ - function phpizeCallback($what, $data) - { - if ($what != 'cmdoutput') { - return; - } - $this->log(1, rtrim($data)); - if (preg_match('/You should update your .aclocal.m4/', $data)) { - return; - } - $matches = array(); - if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) { - $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1])); - $apino = (int)$matches[2]; - if (isset($this->$member)) { - $this->$member = $apino; - //$msg = sprintf("%-22s : %d", $matches[1], $apino); - //$this->log(1, $msg); - } - } - } - - // }}} - // {{{ _runCommand() - - /** - * Run an external command, using a message callback to report - * output. The command will be run through popen and output is - * reported for every line with a "cmdoutput" message with the - * line string, including newlines, as payload. - * - * @param string $command the command to run - * - * @param mixed $callback (optional) function to use as message - * callback - * - * @return bool whether the command was successful (exit code 0 - * means success, any other means failure) - * - * @access private - */ - function _runCommand($command, $callback = null) - { - $this->log(1, "running: $command"); - $pp = @popen("$command 2>&1", "r"); - if (!$pp) { - return $this->raiseError("failed to run `$command'"); - } - if ($callback && $callback[0]->debug == 1) { - $olddbg = $callback[0]->debug; - $callback[0]->debug = 2; - } - - while ($line = fgets($pp, 1024)) { - if ($callback) { - call_user_func($callback, 'cmdoutput', $line); - } else { - $this->log(2, rtrim($line)); - } - } - if ($callback && isset($olddbg)) { - $callback[0]->debug = $olddbg; - } - $exitcode = @pclose($pp); - return ($exitcode == 0); - } - - // }}} - // {{{ log() - - function log($level, $msg) - { - if ($this->current_callback) { - if ($this->debug >= $level) { - call_user_func($this->current_callback, 'output', $msg); - } - return; - } - return PEAR_Common::log($level, $msg); - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Command.php b/3rdparty/PEAR/Command.php deleted file mode 100644 index 2ea68743d20..00000000000 --- a/3rdparty/PEAR/Command.php +++ /dev/null @@ -1,398 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Command.php,v 1.24 2004/05/16 15:43:30 pajoye Exp $ - - -require_once "PEAR.php"; - -/** - * List of commands and what classes they are implemented in. - * @var array command => implementing class - */ -$GLOBALS['_PEAR_Command_commandlist'] = array(); - -/** - * List of shortcuts to common commands. - * @var array shortcut => command - */ -$GLOBALS['_PEAR_Command_shortcuts'] = array(); - -/** - * Array of command objects - * @var array class => object - */ -$GLOBALS['_PEAR_Command_objects'] = array(); - -/** - * Which user interface class is being used. - * @var string class name - */ -$GLOBALS['_PEAR_Command_uiclass'] = 'PEAR_Frontend_CLI'; - -/** - * Instance of $_PEAR_Command_uiclass. - * @var object - */ -$GLOBALS['_PEAR_Command_uiobject'] = null; - -/** - * PEAR command class, a simple factory class for administrative - * commands. - * - * How to implement command classes: - * - * - The class must be called PEAR_Command_Nnn, installed in the - * "PEAR/Common" subdir, with a method called getCommands() that - * returns an array of the commands implemented by the class (see - * PEAR/Command/Install.php for an example). - * - * - The class must implement a run() function that is called with three - * params: - * - * (string) command name - * (array) assoc array with options, freely defined by each - * command, for example: - * array('force' => true) - * (array) list of the other parameters - * - * The run() function returns a PEAR_CommandResponse object. Use - * these methods to get information: - * - * int getStatus() Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL) - * *_PARTIAL means that you need to issue at least - * one more command to complete the operation - * (used for example for validation steps). - * - * string getMessage() Returns a message for the user. Remember, - * no HTML or other interface-specific markup. - * - * If something unexpected happens, run() returns a PEAR error. - * - * - DON'T OUTPUT ANYTHING! Return text for output instead. - * - * - DON'T USE HTML! The text you return will be used from both Gtk, - * web and command-line interfaces, so for now, keep everything to - * plain text. - * - * - DON'T USE EXIT OR DIE! Always use pear errors. From static - * classes do PEAR::raiseError(), from other classes do - * $this->raiseError(). - */ -class PEAR_Command -{ - // {{{ factory() - - /** - * Get the right object for executing a command. - * - * @param string $command The name of the command - * @param object $config Instance of PEAR_Config object - * - * @return object the command object or a PEAR error - * - * @access public - * @static - */ - function factory($command, &$config) - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { - $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; - } - if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { - return PEAR::raiseError("unknown command `$command'"); - } - $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; - if (!class_exists($class)) { - return PEAR::raiseError("unknown command `$command'"); - } - $ui =& PEAR_Command::getFrontendObject(); - $obj = &new $class($ui, $config); - return $obj; - } - - // }}} - // {{{ & getFrontendObject() - - /** - * Get instance of frontend object. - * - * @return object - * @static - */ - function &getFrontendObject() - { - if (empty($GLOBALS['_PEAR_Command_uiobject'])) { - $GLOBALS['_PEAR_Command_uiobject'] = &new $GLOBALS['_PEAR_Command_uiclass']; - } - return $GLOBALS['_PEAR_Command_uiobject']; - } - - // }}} - // {{{ & setFrontendClass() - - /** - * Load current frontend class. - * - * @param string $uiclass Name of class implementing the frontend - * - * @return object the frontend object, or a PEAR error - * @static - */ - function &setFrontendClass($uiclass) - { - if (is_object($GLOBALS['_PEAR_Command_uiobject']) && - is_a($GLOBALS['_PEAR_Command_uiobject'], $uiclass)) { - return $GLOBALS['_PEAR_Command_uiobject']; - } - if (!class_exists($uiclass)) { - $file = str_replace('_', '/', $uiclass) . '.php'; - if (PEAR_Command::isIncludeable($file)) { - include_once $file; - } - } - if (class_exists($uiclass)) { - $obj = &new $uiclass; - // quick test to see if this class implements a few of the most - // important frontend methods - if (method_exists($obj, 'userConfirm')) { - $GLOBALS['_PEAR_Command_uiobject'] = &$obj; - $GLOBALS['_PEAR_Command_uiclass'] = $uiclass; - return $obj; - } else { - $err = PEAR::raiseError("not a frontend class: $uiclass"); - return $err; - } - } - $err = PEAR::raiseError("no such class: $uiclass"); - return $err; - } - - // }}} - // {{{ setFrontendType() - - // }}} - // {{{ isIncludeable() - - /** - * @param string $path relative or absolute include path - * @return boolean - * @static - */ - function isIncludeable($path) - { - if (file_exists($path) && is_readable($path)) { - return true; - } - $ipath = explode(PATH_SEPARATOR, ini_get('include_path')); - foreach ($ipath as $include) { - $test = realpath($include . DIRECTORY_SEPARATOR . $path); - if (file_exists($test) && is_readable($test)) { - return true; - } - } - return false; - } - - /** - * Set current frontend. - * - * @param string $uitype Name of the frontend type (for example "CLI") - * - * @return object the frontend object, or a PEAR error - * @static - */ - function setFrontendType($uitype) - { - $uiclass = 'PEAR_Frontend_' . $uitype; - return PEAR_Command::setFrontendClass($uiclass); - } - - // }}} - // {{{ registerCommands() - - /** - * Scan through the Command directory looking for classes - * and see what commands they implement. - * - * @param bool (optional) if FALSE (default), the new list of - * commands should replace the current one. If TRUE, - * new entries will be merged with old. - * - * @param string (optional) where (what directory) to look for - * classes, defaults to the Command subdirectory of - * the directory from where this file (__FILE__) is - * included. - * - * @return bool TRUE on success, a PEAR error on failure - * - * @access public - * @static - */ - function registerCommands($merge = false, $dir = null) - { - if ($dir === null) { - $dir = dirname(__FILE__) . '/Command'; - } - $dp = @opendir($dir); - if (empty($dp)) { - return PEAR::raiseError("registerCommands: opendir($dir) failed"); - } - if (!$merge) { - $GLOBALS['_PEAR_Command_commandlist'] = array(); - } - while ($entry = readdir($dp)) { - if ($entry{0} == '.' || substr($entry, -4) != '.php' || $entry == 'Common.php') { - continue; - } - $class = "PEAR_Command_".substr($entry, 0, -4); - $file = "$dir/$entry"; - include_once $file; - // List of commands - if (empty($GLOBALS['_PEAR_Command_objects'][$class])) { - $GLOBALS['_PEAR_Command_objects'][$class] = &new $class($ui, $config); - } - $implements = $GLOBALS['_PEAR_Command_objects'][$class]->getCommands(); - foreach ($implements as $command => $desc) { - $GLOBALS['_PEAR_Command_commandlist'][$command] = $class; - $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc; - } - $shortcuts = $GLOBALS['_PEAR_Command_objects'][$class]->getShortcuts(); - foreach ($shortcuts as $shortcut => $command) { - $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command; - } - } - @closedir($dp); - return true; - } - - // }}} - // {{{ getCommands() - - /** - * Get the list of currently supported commands, and what - * classes implement them. - * - * @return array command => implementing class - * - * @access public - * @static - */ - function getCommands() - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - return $GLOBALS['_PEAR_Command_commandlist']; - } - - // }}} - // {{{ getShortcuts() - - /** - * Get the list of command shortcuts. - * - * @return array shortcut => command - * - * @access public - * @static - */ - function getShortcuts() - { - if (empty($GLOBALS['_PEAR_Command_shortcuts'])) { - PEAR_Command::registerCommands(); - } - return $GLOBALS['_PEAR_Command_shortcuts']; - } - - // }}} - // {{{ getGetoptArgs() - - /** - * Compiles arguments for getopt. - * - * @param string $command command to get optstring for - * @param string $short_args (reference) short getopt format - * @param array $long_args (reference) long getopt format - * - * @return void - * - * @access public - * @static - */ - function getGetoptArgs($command, &$short_args, &$long_args) - { - if (empty($GLOBALS['_PEAR_Command_commandlist'])) { - PEAR_Command::registerCommands(); - } - if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { - return null; - } - $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; - $obj = &$GLOBALS['_PEAR_Command_objects'][$class]; - return $obj->getGetoptArgs($command, $short_args, $long_args); - } - - // }}} - // {{{ getDescription() - - /** - * Get description for a command. - * - * @param string $command Name of the command - * - * @return string command description - * - * @access public - * @static - */ - function getDescription($command) - { - if (!isset($GLOBALS['_PEAR_Command_commanddesc'][$command])) { - return null; - } - return $GLOBALS['_PEAR_Command_commanddesc'][$command]; - } - - // }}} - // {{{ getHelp() - - /** - * Get help for command. - * - * @param string $command Name of the command to return help for - * - * @access public - * @static - */ - function getHelp($command) - { - $cmds = PEAR_Command::getCommands(); - if (isset($cmds[$command])) { - $class = $cmds[$command]; - return $GLOBALS['_PEAR_Command_objects'][$class]->getHelp($command); - } - return false; - } - // }}} -} - -?> diff --git a/3rdparty/PEAR/Command/Auth.php b/3rdparty/PEAR/Command/Auth.php deleted file mode 100644 index 0b9d3d3965d..00000000000 --- a/3rdparty/PEAR/Command/Auth.php +++ /dev/null @@ -1,155 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Auth.php,v 1.15 2004/01/08 17:33:13 sniper Exp $ - -require_once "PEAR/Command/Common.php"; -require_once "PEAR/Remote.php"; -require_once "PEAR/Config.php"; - -/** - * PEAR commands for managing configuration data. - * - */ -class PEAR_Command_Auth extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'login' => array( - 'summary' => 'Connects and authenticates to remote server', - 'shortcut' => 'li', - 'function' => 'doLogin', - 'options' => array(), - 'doc' => ' -Log in to the remote server. To use remote functions in the installer -that require any kind of privileges, you need to log in first. The -username and password you enter here will be stored in your per-user -PEAR configuration (~/.pearrc on Unix-like systems). After logging -in, your username and password will be sent along in subsequent -operations on the remote server.', - ), - 'logout' => array( - 'summary' => 'Logs out from the remote server', - 'shortcut' => 'lo', - 'function' => 'doLogout', - 'options' => array(), - 'doc' => ' -Logs out from the remote server. This command does not actually -connect to the remote server, it only deletes the stored username and -password from your user configuration.', - ) - - ); - - // }}} - - // {{{ constructor - - /** - * PEAR_Command_Auth constructor. - * - * @access public - */ - function PEAR_Command_Auth(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doLogin() - - /** - * Execute the 'login' command. - * - * @param string $command command name - * - * @param array $options option_name => value - * - * @param array $params list of additional parameters - * - * @return bool TRUE on success, FALSE for unknown commands, or - * a PEAR error on failure - * - * @access public - */ - function doLogin($command, $options, $params) - { - $server = $this->config->get('master_server'); - $remote = new PEAR_Remote($this->config); - $username = $this->config->get('username'); - if (empty($username)) { - $username = @$_ENV['USER']; - } - $this->ui->outputData("Logging in to $server.", $command); - - list($username, $password) = $this->ui->userDialog( - $command, - array('Username', 'Password'), - array('text', 'password'), - array($username, '') - ); - $username = trim($username); - $password = trim($password); - - $this->config->set('username', $username); - $this->config->set('password', $password); - - $remote->expectError(401); - $ok = $remote->call('logintest'); - $remote->popExpect(); - if ($ok === true) { - $this->ui->outputData("Logged in.", $command); - $this->config->store(); - } else { - return $this->raiseError("Login failed!"); - } - - } - - // }}} - // {{{ doLogout() - - /** - * Execute the 'logout' command. - * - * @param string $command command name - * - * @param array $options option_name => value - * - * @param array $params list of additional parameters - * - * @return bool TRUE on success, FALSE for unknown commands, or - * a PEAR error on failure - * - * @access public - */ - function doLogout($command, $options, $params) - { - $server = $this->config->get('master_server'); - $this->ui->outputData("Logging out from $server.", $command); - $this->config->remove('username'); - $this->config->remove('password'); - $this->config->store(); - } - - // }}} -} - -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Build.php b/3rdparty/PEAR/Command/Build.php deleted file mode 100644 index 2ecbbc92f5f..00000000000 --- a/3rdparty/PEAR/Command/Build.php +++ /dev/null @@ -1,89 +0,0 @@ - | -// | Tomas V.V.Cox | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Build.php,v 1.9 2004/01/08 17:33:13 sniper Exp $ - -require_once "PEAR/Command/Common.php"; -require_once "PEAR/Builder.php"; - -/** - * PEAR commands for building extensions. - * - */ -class PEAR_Command_Build extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'build' => array( - 'summary' => 'Build an Extension From C Source', - 'function' => 'doBuild', - 'shortcut' => 'b', - 'options' => array(), - 'doc' => '[package.xml] -Builds one or more extensions contained in a package.' - ), - ); - - // }}} - - // {{{ constructor - - /** - * PEAR_Command_Build constructor. - * - * @access public - */ - function PEAR_Command_Build(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doBuild() - - function doBuild($command, $options, $params) - { - if (sizeof($params) < 1) { - $params[0] = 'package.xml'; - } - $builder = &new PEAR_Builder($this->ui); - $this->debug = $this->config->get('verbose'); - $err = $builder->build($params[0], array(&$this, 'buildCallback')); - if (PEAR::isError($err)) { - return $err; - } - return true; - } - - // }}} - // {{{ buildCallback() - - function buildCallback($what, $data) - { - if (($what == 'cmdoutput' && $this->debug > 1) || - ($what == 'output' && $this->debug > 0)) { - $this->ui->outputData(rtrim($data), 'build'); - } - } - - // }}} -} diff --git a/3rdparty/PEAR/Command/Common.php b/3rdparty/PEAR/Command/Common.php deleted file mode 100644 index c6ace694caf..00000000000 --- a/3rdparty/PEAR/Command/Common.php +++ /dev/null @@ -1,249 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Common.php,v 1.24 2004/01/08 17:33:13 sniper Exp $ - -require_once "PEAR.php"; - -class PEAR_Command_Common extends PEAR -{ - // {{{ properties - - /** - * PEAR_Config object used to pass user system and configuration - * on when executing commands - * - * @var object - */ - var $config; - - /** - * User Interface object, for all interaction with the user. - * @var object - */ - var $ui; - - var $_deps_rel_trans = array( - 'lt' => '<', - 'le' => '<=', - 'eq' => '=', - 'ne' => '!=', - 'gt' => '>', - 'ge' => '>=', - 'has' => '==' - ); - - var $_deps_type_trans = array( - 'pkg' => 'package', - 'extension' => 'extension', - 'php' => 'PHP', - 'prog' => 'external program', - 'ldlib' => 'external library for linking', - 'rtlib' => 'external runtime library', - 'os' => 'operating system', - 'websrv' => 'web server', - 'sapi' => 'SAPI backend' - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Common constructor. - * - * @access public - */ - function PEAR_Command_Common(&$ui, &$config) - { - parent::PEAR(); - $this->config = &$config; - $this->ui = &$ui; - } - - // }}} - - // {{{ getCommands() - - /** - * Return a list of all the commands defined by this class. - * @return array list of commands - * @access public - */ - function getCommands() - { - $ret = array(); - foreach (array_keys($this->commands) as $command) { - $ret[$command] = $this->commands[$command]['summary']; - } - return $ret; - } - - // }}} - // {{{ getShortcuts() - - /** - * Return a list of all the command shortcuts defined by this class. - * @return array shortcut => command - * @access public - */ - function getShortcuts() - { - $ret = array(); - foreach (array_keys($this->commands) as $command) { - if (isset($this->commands[$command]['shortcut'])) { - $ret[$this->commands[$command]['shortcut']] = $command; - } - } - return $ret; - } - - // }}} - // {{{ getOptions() - - function getOptions($command) - { - return @$this->commands[$command]['options']; - } - - // }}} - // {{{ getGetoptArgs() - - function getGetoptArgs($command, &$short_args, &$long_args) - { - $short_args = ""; - $long_args = array(); - if (empty($this->commands[$command])) { - return; - } - reset($this->commands[$command]); - while (list($option, $info) = each($this->commands[$command]['options'])) { - $larg = $sarg = ''; - if (isset($info['arg'])) { - if ($info['arg']{0} == '(') { - $larg = '=='; - $sarg = '::'; - $arg = substr($info['arg'], 1, -1); - } else { - $larg = '='; - $sarg = ':'; - $arg = $info['arg']; - } - } - if (isset($info['shortopt'])) { - $short_args .= $info['shortopt'] . $sarg; - } - $long_args[] = $option . $larg; - } - } - - // }}} - // {{{ getHelp() - /** - * Returns the help message for the given command - * - * @param string $command The command - * @return mixed A fail string if the command does not have help or - * a two elements array containing [0]=>help string, - * [1]=> help string for the accepted cmd args - */ - function getHelp($command) - { - $config = &PEAR_Config::singleton(); - $help = @$this->commands[$command]['doc']; - if (empty($help)) { - // XXX (cox) Fallback to summary if there is no doc (show both?) - if (!$help = @$this->commands[$command]['summary']) { - return "No help for command \"$command\""; - } - } - if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { - foreach($matches[0] as $k => $v) { - $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); - } - } - return array($help, $this->getHelpArgs($command)); - } - - // }}} - // {{{ getHelpArgs() - /** - * Returns the help for the accepted arguments of a command - * - * @param string $command - * @return string The help string - */ - function getHelpArgs($command) - { - if (isset($this->commands[$command]['options']) && - count($this->commands[$command]['options'])) - { - $help = "Options:\n"; - foreach ($this->commands[$command]['options'] as $k => $v) { - if (isset($v['arg'])) { - if ($v['arg']{0} == '(') { - $arg = substr($v['arg'], 1, -1); - $sapp = " [$arg]"; - $lapp = "[=$arg]"; - } else { - $sapp = " $v[arg]"; - $lapp = "=$v[arg]"; - } - } else { - $sapp = $lapp = ""; - } - if (isset($v['shortopt'])) { - $s = $v['shortopt']; - @$help .= " -$s$sapp, --$k$lapp\n"; - } else { - @$help .= " --$k$lapp\n"; - } - $p = " "; - $doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); - $help .= " $doc\n"; - } - return $help; - } - return null; - } - - // }}} - // {{{ run() - - function run($command, $options, $params) - { - $func = @$this->commands[$command]['function']; - if (empty($func)) { - // look for shortcuts - foreach (array_keys($this->commands) as $cmd) { - if (@$this->commands[$cmd]['shortcut'] == $command) { - $command = $cmd; - $func = @$this->commands[$command]['function']; - if (empty($func)) { - return $this->raiseError("unknown command `$command'"); - } - break; - } - } - } - return $this->$func($command, $options, $params); - } - - // }}} -} - -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Command/Config.php b/3rdparty/PEAR/Command/Config.php deleted file mode 100644 index 474a2345170..00000000000 --- a/3rdparty/PEAR/Command/Config.php +++ /dev/null @@ -1,225 +0,0 @@ - | -// | Tomas V.V.Cox | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Config.php,v 1.27 2004/06/15 16:48:49 pajoye Exp $ - -require_once "PEAR/Command/Common.php"; -require_once "PEAR/Config.php"; - -/** - * PEAR commands for managing configuration data. - * - */ -class PEAR_Command_Config extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'config-show' => array( - 'summary' => 'Show All Settings', - 'function' => 'doConfigShow', - 'shortcut' => 'csh', - 'options' => array(), - 'doc' => ' -Displays all configuration values. An optional argument -may be used to tell which configuration layer to display. Valid -configuration layers are "user", "system" and "default". -', - ), - 'config-get' => array( - 'summary' => 'Show One Setting', - 'function' => 'doConfigGet', - 'shortcut' => 'cg', - 'options' => array(), - 'doc' => ' [layer] -Displays the value of one configuration parameter. The -first argument is the name of the parameter, an optional second argument -may be used to tell which configuration layer to look in. Valid configuration -layers are "user", "system" and "default". If no layer is specified, a value -will be picked from the first layer that defines the parameter, in the order -just specified. -', - ), - 'config-set' => array( - 'summary' => 'Change Setting', - 'function' => 'doConfigSet', - 'shortcut' => 'cs', - 'options' => array(), - 'doc' => ' [layer] -Sets the value of one configuration parameter. The first argument is -the name of the parameter, the second argument is the new value. Some -parameters are subject to validation, and the command will fail with -an error message if the new value does not make sense. An optional -third argument may be used to specify in which layer to set the -configuration parameter. The default layer is "user". -', - ), - 'config-help' => array( - 'summary' => 'Show Information About Setting', - 'function' => 'doConfigHelp', - 'shortcut' => 'ch', - 'options' => array(), - 'doc' => '[parameter] -Displays help for a configuration parameter. Without arguments it -displays help for all configuration parameters. -', - ), - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Config constructor. - * - * @access public - */ - function PEAR_Command_Config(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doConfigShow() - - function doConfigShow($command, $options, $params) - { - // $params[0] -> the layer - if ($error = $this->_checkLayer(@$params[0])) { - return $this->raiseError($error); - } - $keys = $this->config->getKeys(); - sort($keys); - $data = array('caption' => 'Configuration:'); - foreach ($keys as $key) { - $type = $this->config->getType($key); - $value = $this->config->get($key, @$params[0]); - if ($type == 'password' && $value) { - $value = '********'; - } - if ($value === false) { - $value = 'false'; - } elseif ($value === true) { - $value = 'true'; - } - $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); - } - $this->ui->outputData($data, $command); - return true; - } - - // }}} - // {{{ doConfigGet() - - function doConfigGet($command, $options, $params) - { - // $params[0] -> the parameter - // $params[1] -> the layer - if ($error = $this->_checkLayer(@$params[1])) { - return $this->raiseError($error); - } - if (sizeof($params) < 1 || sizeof($params) > 2) { - return $this->raiseError("config-get expects 1 or 2 parameters"); - } elseif (sizeof($params) == 1) { - $this->ui->outputData($this->config->get($params[0]), $command); - } else { - $data = $this->config->get($params[0], $params[1]); - $this->ui->outputData($data, $command); - } - return true; - } - - // }}} - // {{{ doConfigSet() - - function doConfigSet($command, $options, $params) - { - // $param[0] -> a parameter to set - // $param[1] -> the value for the parameter - // $param[2] -> the layer - $failmsg = ''; - if (sizeof($params) < 2 || sizeof($params) > 3) { - $failmsg .= "config-set expects 2 or 3 parameters"; - return PEAR::raiseError($failmsg); - } - if ($error = $this->_checkLayer(@$params[2])) { - $failmsg .= $error; - return PEAR::raiseError($failmsg); - } - if (!call_user_func_array(array(&$this->config, 'set'), $params)) - { - $failmsg = "config-set (" . implode(", ", $params) . ") failed"; - } else { - $this->config->store(); - } - if ($failmsg) { - return $this->raiseError($failmsg); - } - return true; - } - - // }}} - // {{{ doConfigHelp() - - function doConfigHelp($command, $options, $params) - { - if (empty($params)) { - $params = $this->config->getKeys(); - } - $data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); - $data['headline'] = array('Name', 'Type', 'Description'); - $data['border'] = true; - foreach ($params as $name) { - $type = $this->config->getType($name); - $docs = $this->config->getDocs($name); - if ($type == 'set') { - $docs = rtrim($docs) . "\nValid set: " . - implode(' ', $this->config->getSetValues($name)); - } - $data['data'][] = array($name, $type, $docs); - } - $this->ui->outputData($data, $command); - } - - // }}} - // {{{ _checkLayer() - - /** - * Checks if a layer is defined or not - * - * @param string $layer The layer to search for - * @return mixed False on no error or the error message - */ - function _checkLayer($layer = null) - { - if (!empty($layer) && $layer != 'default') { - $layers = $this->config->getLayers(); - if (!in_array($layer, $layers)) { - return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; - } - } - return false; - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Command/Install.php b/3rdparty/PEAR/Command/Install.php deleted file mode 100644 index dce52f017e2..00000000000 --- a/3rdparty/PEAR/Command/Install.php +++ /dev/null @@ -1,470 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Install.php,v 1.53.2.1 2004/10/19 04:08:42 cellog Exp $ - -require_once "PEAR/Command/Common.php"; -require_once "PEAR/Installer.php"; - -/** - * PEAR commands for installation or deinstallation/upgrading of - * packages. - * - */ -class PEAR_Command_Install extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'install' => array( - 'summary' => 'Install Package', - 'function' => 'doInstall', - 'shortcut' => 'i', - 'options' => array( - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'will overwrite newer installed packages', - ), - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, install anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as installed', - ), - 'soft' => array( - 'shortopt' => 's', - 'doc' => 'soft install, fail silently, or upgrade if already installed', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'alldeps' => array( - 'shortopt' => 'a', - 'doc' => 'install all required and optional dependencies', - ), - 'onlyreqdeps' => array( - 'shortopt' => 'o', - 'doc' => 'install all required dependencies', - ), - ), - 'doc' => ' ... -Installs one or more PEAR packages. You can specify a package to -install in four ways: - -"Package-1.0.tgz" : installs from a local file - -"http://example.com/Package-1.0.tgz" : installs from -anywhere on the net. - -"package.xml" : installs the package described in -package.xml. Useful for testing, or for wrapping a PEAR package in -another package manager such as RPM. - -"Package" : queries your configured server -({config master_server}) and downloads the newest package with -the preferred quality/state ({config preferred_state}). - -More than one package may be specified at once. It is ok to mix these -four ways of specifying packages. -'), - 'upgrade' => array( - 'summary' => 'Upgrade Package', - 'function' => 'doInstall', - 'shortcut' => 'up', - 'options' => array( - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'overwrite newer installed packages', - ), - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, upgrade anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as upgraded', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - 'alldeps' => array( - 'shortopt' => 'a', - 'doc' => 'install all required and optional dependencies', - ), - 'onlyreqdeps' => array( - 'shortopt' => 'o', - 'doc' => 'install all required dependencies', - ), - ), - 'doc' => ' ... -Upgrades one or more PEAR packages. See documentation for the -"install" command for ways to specify a package. - -When upgrading, your package will be updated if the provided new -package has a higher version number (use the -f option if you need to -upgrade anyway). - -More than one package may be specified at once. -'), - 'upgrade-all' => array( - 'summary' => 'Upgrade All Packages', - 'function' => 'doInstall', - 'shortcut' => 'ua', - 'options' => array( - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, upgrade anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not install files, only register the package as upgraded', - ), - 'nobuild' => array( - 'shortopt' => 'B', - 'doc' => 'don\'t build C extensions', - ), - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'request uncompressed files when downloading', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - ), - 'doc' => ' -Upgrades all packages that have a newer release available. Upgrades are -done only if there is a release available of the state specified in -"preferred_state" (currently {config preferred_state}), or a state considered -more stable. -'), - 'uninstall' => array( - 'summary' => 'Un-install Package', - 'function' => 'doUninstall', - 'shortcut' => 'un', - 'options' => array( - 'nodeps' => array( - 'shortopt' => 'n', - 'doc' => 'ignore dependencies, uninstall anyway', - ), - 'register-only' => array( - 'shortopt' => 'r', - 'doc' => 'do not remove files, only register the packages as not installed', - ), - 'installroot' => array( - 'shortopt' => 'R', - 'arg' => 'DIR', - 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', - ), - 'ignore-errors' => array( - 'doc' => 'force install even if there were errors', - ), - ), - 'doc' => ' ... -Uninstalls one or more PEAR packages. More than one package may be -specified at once. -'), - 'bundle' => array( - 'summary' => 'Unpacks a Pecl Package', - 'function' => 'doBundle', - 'shortcut' => 'bun', - 'options' => array( - 'destination' => array( - 'shortopt' => 'd', - 'arg' => 'DIR', - 'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)', - ), - 'force' => array( - 'shortopt' => 'f', - 'doc' => 'Force the unpacking even if there were errors in the package', - ), - ), - 'doc' => ' -Unpacks a Pecl Package into the selected location. It will download the -package if needed. -'), - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Install constructor. - * - * @access public - */ - function PEAR_Command_Install(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doInstall() - - function doInstall($command, $options, $params) - { - require_once 'PEAR/Downloader.php'; - if (empty($this->installer)) { - $this->installer = &new PEAR_Installer($this->ui); - } - if ($command == 'upgrade') { - $options['upgrade'] = true; - } - if ($command == 'upgrade-all') { - include_once "PEAR/Remote.php"; - $options['upgrade'] = true; - $remote = &new PEAR_Remote($this->config); - $state = $this->config->get('preferred_state'); - if (empty($state) || $state == 'any') { - $latest = $remote->call("package.listLatestReleases"); - } else { - $latest = $remote->call("package.listLatestReleases", $state); - } - if (PEAR::isError($latest)) { - return $latest; - } - $reg = new PEAR_Registry($this->config->get('php_dir')); - $installed = array_flip($reg->listPackages()); - $params = array(); - foreach ($latest as $package => $info) { - $package = strtolower($package); - if (!isset($installed[$package])) { - // skip packages we don't have installed - continue; - } - $inst_version = $reg->packageInfo($package, 'version'); - if (version_compare("$info[version]", "$inst_version", "le")) { - // installed version is up-to-date - continue; - } - $params[] = $package; - $this->ui->outputData(array('data' => "Will upgrade $package"), $command); - } - } - $this->downloader = &new PEAR_Downloader($this->ui, $options, $this->config); - $errors = array(); - $downloaded = array(); - $this->downloader->download($params); - $errors = $this->downloader->getErrorMsgs(); - if (count($errors)) { - $err['data'] = array($errors); - $err['headline'] = 'Install Errors'; - $this->ui->outputData($err); - return $this->raiseError("$command failed"); - } - $downloaded = $this->downloader->getDownloadedPackages(); - $this->installer->sortPkgDeps($downloaded); - foreach ($downloaded as $pkg) { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $info = $this->installer->install($pkg['file'], $options, $this->config); - PEAR::popErrorHandling(); - if (PEAR::isError($info)) { - $this->ui->outputData('ERROR: ' .$info->getMessage()); - continue; - } - if (is_array($info)) { - if ($this->config->get('verbose') > 0) { - $label = "$info[package] $info[version]"; - $out = array('data' => "$command ok: $label"); - if (isset($info['release_warnings'])) { - $out['release_warnings'] = $info['release_warnings']; - } - $this->ui->outputData($out, $command); - } - } else { - return $this->raiseError("$command failed"); - } - } - return true; - } - - // }}} - // {{{ doUninstall() - - function doUninstall($command, $options, $params) - { - if (empty($this->installer)) { - $this->installer = &new PEAR_Installer($this->ui); - } - if (sizeof($params) < 1) { - return $this->raiseError("Please supply the package(s) you want to uninstall"); - } - include_once 'PEAR/Registry.php'; - $reg = new PEAR_Registry($this->config->get('php_dir')); - $newparams = array(); - $badparams = array(); - foreach ($params as $pkg) { - $info = $reg->packageInfo($pkg); - if ($info === null) { - $badparams[] = $pkg; - } else { - $newparams[] = $info; - } - } - $this->installer->sortPkgDeps($newparams, true); - $params = array(); - foreach($newparams as $info) { - $params[] = $info['info']['package']; - } - $params = array_merge($params, $badparams); - foreach ($params as $pkg) { - if ($this->installer->uninstall($pkg, $options)) { - if ($this->config->get('verbose') > 0) { - $this->ui->outputData("uninstall ok: $pkg", $command); - } - } else { - return $this->raiseError("uninstall failed: $pkg"); - } - } - return true; - } - - // }}} - - - // }}} - // {{{ doBundle() - /* - (cox) It just downloads and untars the package, does not do - any check that the PEAR_Installer::_installFile() does. - */ - - function doBundle($command, $options, $params) - { - if (empty($this->installer)) { - $this->installer = &new PEAR_Downloader($this->ui); - } - $installer = &$this->installer; - if (sizeof($params) < 1) { - return $this->raiseError("Please supply the package you want to bundle"); - } - $pkgfile = $params[0]; - $need_download = false; - if (preg_match('#^(http|ftp)://#', $pkgfile)) { - $need_download = true; - } elseif (!@is_file($pkgfile)) { - if ($installer->validPackageName($pkgfile)) { - $pkgfile = $installer->getPackageDownloadUrl($pkgfile); - $need_download = true; - } else { - if (strlen($pkgfile)) { - return $this->raiseError("Could not open the package file: $pkgfile"); - } else { - return $this->raiseError("No package file given"); - } - } - } - - // Download package ----------------------------------------------- - if ($need_download) { - $downloaddir = $installer->config->get('download_dir'); - if (empty($downloaddir)) { - if (PEAR::isError($downloaddir = System::mktemp('-d'))) { - return $downloaddir; - } - $installer->log(2, '+ tmp dir created at ' . $downloaddir); - } - $callback = $this->ui ? array(&$installer, '_downloadCallback') : null; - $file = $installer->downloadHttp($pkgfile, $this->ui, $downloaddir, $callback); - if (PEAR::isError($file)) { - return $this->raiseError($file); - } - $pkgfile = $file; - } - - // Parse xml file ----------------------------------------------- - $pkginfo = $installer->infoFromTgzFile($pkgfile); - if (PEAR::isError($pkginfo)) { - return $this->raiseError($pkginfo); - } - $installer->validatePackageInfo($pkginfo, $errors, $warnings); - // XXX We allow warnings, do we have to do it? - if (count($errors)) { - if (empty($options['force'])) { - return $this->raiseError("The following errors where found:\n". - implode("\n", $errors)); - } else { - $this->log(0, "warning : the following errors were found:\n". - implode("\n", $errors)); - } - } - $pkgname = $pkginfo['package']; - - // Unpacking ------------------------------------------------- - - if (isset($options['destination'])) { - if (!is_dir($options['destination'])) { - System::mkdir('-p ' . $options['destination']); - } - $dest = realpath($options['destination']); - } else { - $pwd = getcwd(); - if (is_dir($pwd . DIRECTORY_SEPARATOR . 'ext')) { - $dest = $pwd . DIRECTORY_SEPARATOR . 'ext'; - } else { - $dest = $pwd; - } - } - $dest .= DIRECTORY_SEPARATOR . $pkgname; - $orig = $pkgname . '-' . $pkginfo['version']; - - $tar = new Archive_Tar($pkgfile); - if (!@$tar->extractModify($dest, $orig)) { - return $this->raiseError("unable to unpack $pkgfile"); - } - $this->ui->outputData("Package ready at '$dest'"); - // }}} - } - - // }}} - -} -?> diff --git a/3rdparty/PEAR/Command/Mirror.php b/3rdparty/PEAR/Command/Mirror.php deleted file mode 100644 index bf56c3db640..00000000000 --- a/3rdparty/PEAR/Command/Mirror.php +++ /dev/null @@ -1,101 +0,0 @@ - | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Mirror.php,v 1.5 2004/03/18 12:23:57 mj Exp $ - -require_once "PEAR/Command/Common.php"; -require_once "PEAR/Command.php"; -require_once "PEAR/Remote.php"; -require_once "PEAR.php"; - -/** - * PEAR commands for providing file mirrors - * - */ -class PEAR_Command_Mirror extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'download-all' => array( - 'summary' => 'Downloads each available package from master_server', - 'function' => 'doDownloadAll', - 'shortcut' => 'da', - 'options' => array(), - 'doc' => ' - Requests a list of available packages from the package server - (master_server) and downloads them to current working directory' - ), - ); - - // }}} - - // {{{ constructor - - /** - * PEAR_Command_Mirror constructor. - * - * @access public - * @param object PEAR_Frontend a reference to an frontend - * @param object PEAR_Config a reference to the configuration data - */ - function PEAR_Command_Mirror(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doDownloadAll() - /** - * retrieves a list of avaible Packages from master server - * and downloads them - * - * @access public - * @param string $command the command - * @param array $options the command options before the command - * @param array $params the stuff after the command name - * @return bool true if succesful - * @throw PEAR_Error - */ - function doDownloadAll($command, $options, $params) - { - $this->config->set("php_dir", "."); - $remote = &new PEAR_Remote($this->config); - $remoteInfo = $remote->call("package.listAll"); - if (PEAR::isError($remoteInfo)) { - return $remoteInfo; - } - $cmd = &PEAR_Command::factory("download", $this->config); - if (PEAR::isError($cmd)) { - return $cmd; - } - foreach ($remoteInfo as $pkgn => $pkg) { - /** - * Error handling not neccesary, because already done by - * the download command - */ - $cmd->run("download", array(), array($pkgn)); - } - - return true; - } - - // }}} -} diff --git a/3rdparty/PEAR/Command/Package.php b/3rdparty/PEAR/Command/Package.php deleted file mode 100644 index aca87111118..00000000000 --- a/3rdparty/PEAR/Command/Package.php +++ /dev/null @@ -1,819 +0,0 @@ - | -// | Martin Jansen | -// | Greg Beaver | -// +----------------------------------------------------------------------+ -// -// $Id: Package.php,v 1.61.2.7 2005/02/17 17:47:55 cellog Exp $ - -require_once 'PEAR/Common.php'; -require_once 'PEAR/Command/Common.php'; - -class PEAR_Command_Package extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'package' => array( - 'summary' => 'Build Package', - 'function' => 'doPackage', - 'shortcut' => 'p', - 'options' => array( - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'Do not gzip the package file' - ), - 'showname' => array( - 'shortopt' => 'n', - 'doc' => 'Print the name of the packaged file.', - ), - ), - 'doc' => '[descfile] -Creates a PEAR package from its description file (usually called -package.xml). -' - ), - 'package-validate' => array( - 'summary' => 'Validate Package Consistency', - 'function' => 'doPackageValidate', - 'shortcut' => 'pv', - 'options' => array(), - 'doc' => ' -', - ), - 'cvsdiff' => array( - 'summary' => 'Run a "cvs diff" for all files in a package', - 'function' => 'doCvsDiff', - 'shortcut' => 'cd', - 'options' => array( - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Be quiet', - ), - 'reallyquiet' => array( - 'shortopt' => 'Q', - 'doc' => 'Be really quiet', - ), - 'date' => array( - 'shortopt' => 'D', - 'doc' => 'Diff against revision of DATE', - 'arg' => 'DATE', - ), - 'release' => array( - 'shortopt' => 'R', - 'doc' => 'Diff against tag for package release REL', - 'arg' => 'REL', - ), - 'revision' => array( - 'shortopt' => 'r', - 'doc' => 'Diff against revision REV', - 'arg' => 'REV', - ), - 'context' => array( - 'shortopt' => 'c', - 'doc' => 'Generate context diff', - ), - 'unified' => array( - 'shortopt' => 'u', - 'doc' => 'Generate unified diff', - ), - 'ignore-case' => array( - 'shortopt' => 'i', - 'doc' => 'Ignore case, consider upper- and lower-case letters equivalent', - ), - 'ignore-whitespace' => array( - 'shortopt' => 'b', - 'doc' => 'Ignore changes in amount of white space', - ), - 'ignore-blank-lines' => array( - 'shortopt' => 'B', - 'doc' => 'Ignore changes that insert or delete blank lines', - ), - 'brief' => array( - 'doc' => 'Report only whether the files differ, no details', - ), - 'dry-run' => array( - 'shortopt' => 'n', - 'doc' => 'Don\'t do anything, just pretend', - ), - ), - 'doc' => ' -Compares all the files in a package. Without any options, this -command will compare the current code with the last checked-in code. -Using the -r or -R option you may compare the current code with that -of a specific release. -', - ), - 'cvstag' => array( - 'summary' => 'Set CVS Release Tag', - 'function' => 'doCvsTag', - 'shortcut' => 'ct', - 'options' => array( - 'quiet' => array( - 'shortopt' => 'q', - 'doc' => 'Be quiet', - ), - 'reallyquiet' => array( - 'shortopt' => 'Q', - 'doc' => 'Be really quiet', - ), - 'slide' => array( - 'shortopt' => 'F', - 'doc' => 'Move (slide) tag if it exists', - ), - 'delete' => array( - 'shortopt' => 'd', - 'doc' => 'Remove tag', - ), - 'dry-run' => array( - 'shortopt' => 'n', - 'doc' => 'Don\'t do anything, just pretend', - ), - ), - 'doc' => ' -Sets a CVS tag on all files in a package. Use this command after you have -packaged a distribution tarball with the "package" command to tag what -revisions of what files were in that release. If need to fix something -after running cvstag once, but before the tarball is released to the public, -use the "slide" option to move the release tag. -', - ), - 'run-tests' => array( - 'summary' => 'Run Regression Tests', - 'function' => 'doRunTests', - 'shortcut' => 'rt', - 'options' => array( - 'recur' => array( - 'shortopt' => 'r', - 'doc' => 'Run tests in child directories, recursively. 4 dirs deep maximum', - ), - 'ini' => array( - 'shortopt' => 'i', - 'doc' => 'actual string of settings to pass to php in format " -d setting=blah"', - 'arg' => 'SETTINGS' - ), - 'realtimelog' => array( - 'shortopt' => 'l', - 'doc' => 'Log test runs/results as they are run', - ), - ), - 'doc' => '[testfile|dir ...] -Run regression tests with PHP\'s regression testing script (run-tests.php).', - ), - 'package-dependencies' => array( - 'summary' => 'Show package dependencies', - 'function' => 'doPackageDependencies', - 'shortcut' => 'pd', - 'options' => array(), - 'doc' => ' -List all depencies the package has.' - ), - 'sign' => array( - 'summary' => 'Sign a package distribution file', - 'function' => 'doSign', - 'shortcut' => 'si', - 'options' => array(), - 'doc' => ' -Signs a package distribution (.tar or .tgz) file with GnuPG.', - ), - 'makerpm' => array( - 'summary' => 'Builds an RPM spec file from a PEAR package', - 'function' => 'doMakeRPM', - 'shortcut' => 'rpm', - 'options' => array( - 'spec-template' => array( - 'shortopt' => 't', - 'arg' => 'FILE', - 'doc' => 'Use FILE as RPM spec file template' - ), - 'rpm-pkgname' => array( - 'shortopt' => 'p', - 'arg' => 'FORMAT', - 'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced -by the PEAR package name, defaults to "PEAR::%s".', - ), - ), - 'doc' => ' - -Creates an RPM .spec file for wrapping a PEAR package inside an RPM -package. Intended to be used from the SPECS directory, with the PEAR -package tarball in the SOURCES directory: - -$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz -Wrote RPM spec file PEAR::Net_Geo-1.0.spec -$ rpm -bb PEAR::Net_Socket-1.0.spec -... -Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm -', - ), - ); - - var $output; - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Package constructor. - * - * @access public - */ - function PEAR_Command_Package(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ _displayValidationResults() - - function _displayValidationResults($err, $warn, $strict = false) - { - foreach ($err as $e) { - $this->output .= "Error: $e\n"; - } - foreach ($warn as $w) { - $this->output .= "Warning: $w\n"; - } - $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n", - sizeof($err), sizeof($warn)); - if ($strict && sizeof($err) > 0) { - $this->output .= "Fix these errors and try again."; - return false; - } - return true; - } - - // }}} - // {{{ doPackage() - - function doPackage($command, $options, $params) - { - $this->output = ''; - include_once 'PEAR/Packager.php'; - if (sizeof($params) < 1) { - $params[0] = "package.xml"; - } - $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml'; - $packager =& new PEAR_Packager(); - $err = $warn = array(); - $dir = dirname($pkginfofile); - $compress = empty($options['nocompress']) ? true : false; - $result = $packager->package($pkginfofile, $compress); - if (PEAR::isError($result)) { - $this->ui->outputData($this->output, $command); - return $this->raiseError($result); - } - // Don't want output, only the package file name just created - if (isset($options['showname'])) { - $this->output = $result; - } - if (PEAR::isError($result)) { - $this->output .= "Package failed: ".$result->getMessage(); - } - $this->ui->outputData($this->output, $command); - return true; - } - - // }}} - // {{{ doPackageValidate() - - function doPackageValidate($command, $options, $params) - { - $this->output = ''; - if (sizeof($params) < 1) { - $params[0] = "package.xml"; - } - $obj = new PEAR_Common; - $info = null; - if ($fp = @fopen($params[0], "r")) { - $test = fread($fp, 5); - fclose($fp); - if ($test == "infoFromDescriptionFile($params[0]); - } - } - if (empty($info)) { - $info = $obj->infoFromTgzFile($params[0]); - } - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - $obj->validatePackageInfo($info, $err, $warn); - $this->_displayValidationResults($err, $warn); - $this->ui->outputData($this->output, $command); - return true; - } - - // }}} - // {{{ doCvsTag() - - function doCvsTag($command, $options, $params) - { - $this->output = ''; - $_cmd = $command; - if (sizeof($params) < 1) { - $help = $this->getHelp($command); - return $this->raiseError("$command: missing parameter: $help[0]"); - } - $obj = new PEAR_Common; - $info = $obj->infoFromDescriptionFile($params[0]); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - $err = $warn = array(); - $obj->validatePackageInfo($info, $err, $warn); - if (!$this->_displayValidationResults($err, $warn, true)) { - $this->ui->outputData($this->output, $command); - break; - } - $version = $info['version']; - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version); - $cvstag = "RELEASE_$cvsversion"; - $files = array_keys($info['filelist']); - $command = "cvs"; - if (isset($options['quiet'])) { - $command .= ' -q'; - } - if (isset($options['reallyquiet'])) { - $command .= ' -Q'; - } - $command .= ' tag'; - if (isset($options['slide'])) { - $command .= ' -F'; - } - if (isset($options['delete'])) { - $command .= ' -d'; - } - $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]); - foreach ($files as $file) { - $command .= ' ' . escapeshellarg($file); - } - if ($this->config->get('verbose') > 1) { - $this->output .= "+ $command\n"; - } - $this->output .= "+ $command\n"; - if (empty($options['dry-run'])) { - $fp = popen($command, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - $this->ui->outputData($this->output, $_cmd); - return true; - } - - // }}} - // {{{ doCvsDiff() - - function doCvsDiff($command, $options, $params) - { - $this->output = ''; - if (sizeof($params) < 1) { - $help = $this->getHelp($command); - return $this->raiseError("$command: missing parameter: $help[0]"); - } - $obj = new PEAR_Common; - $info = $obj->infoFromDescriptionFile($params[0]); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - $files = array_keys($info['filelist']); - $cmd = "cvs"; - if (isset($options['quiet'])) { - $cmd .= ' -q'; - unset($options['quiet']); - } - if (isset($options['reallyquiet'])) { - $cmd .= ' -Q'; - unset($options['reallyquiet']); - } - if (isset($options['release'])) { - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']); - $cvstag = "RELEASE_$cvsversion"; - $options['revision'] = $cvstag; - unset($options['release']); - } - $execute = true; - if (isset($options['dry-run'])) { - $execute = false; - unset($options['dry-run']); - } - $cmd .= ' diff'; - // the rest of the options are passed right on to "cvs diff" - foreach ($options as $option => $optarg) { - $arg = @$this->commands[$command]['options'][$option]['arg']; - $short = @$this->commands[$command]['options'][$option]['shortopt']; - $cmd .= $short ? " -$short" : " --$option"; - if ($arg && $optarg) { - $cmd .= ($short ? '' : '=') . escapeshellarg($optarg); - } - } - foreach ($files as $file) { - $cmd .= ' ' . escapeshellarg($file); - } - if ($this->config->get('verbose') > 1) { - $this->output .= "+ $cmd\n"; - } - if ($execute) { - $fp = popen($cmd, "r"); - while ($line = fgets($fp, 1024)) { - $this->output .= rtrim($line)."\n"; - } - pclose($fp); - } - $this->ui->outputData($this->output, $command); - return true; - } - - // }}} - // {{{ doRunTests() - - function doRunTests($command, $options, $params) - { - include_once 'PEAR/RunTest.php'; - $log = new PEAR_Common; - $log->ui = &$this->ui; // slightly hacky, but it will work - $run = new PEAR_RunTest($log); - $tests = array(); - if (isset($options['recur'])) { - $depth = 4; - } else { - $depth = 1; - } - if (!count($params)) { - $params[] = '.'; - } - foreach ($params as $p) { - if (is_dir($p)) { - $dir = System::find(array($p, '-type', 'f', - '-maxdepth', $depth, - '-name', '*.phpt')); - $tests = array_merge($tests, $dir); - } else { - if (!@file_exists($p)) { - if (!preg_match('/\.phpt$/', $p)) { - $p .= '.phpt'; - } - $dir = System::find(array(dirname($p), '-type', 'f', - '-maxdepth', $depth, - '-name', $p)); - $tests = array_merge($tests, $dir); - } else { - $tests[] = $p; - } - } - } - $ini_settings = ''; - if (isset($options['ini'])) { - $ini_settings .= $options['ini']; - } - if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) { - $ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}"; - } - if ($ini_settings) { - $this->ui->outputData('Using INI settings: "' . $ini_settings . '"'); - } - $skipped = $passed = $failed = array(); - $this->ui->outputData('Running ' . count($tests) . ' tests', $command); - $start = time(); - if (isset($options['realtimelog'])) { - @unlink('run-tests.log'); - } - foreach ($tests as $t) { - if (isset($options['realtimelog'])) { - $fp = @fopen('run-tests.log', 'a'); - if ($fp) { - fwrite($fp, "Running test $t..."); - fclose($fp); - } - } - $result = $run->run($t, $ini_settings); - if (OS_WINDOWS) { - for($i=0;$i<2000;$i++) { - $i = $i; // delay - race conditions on windows - } - } - if (isset($options['realtimelog'])) { - $fp = @fopen('run-tests.log', 'a'); - if ($fp) { - fwrite($fp, "$result\n"); - fclose($fp); - } - } - if ($result == 'FAILED') { - $failed[] = $t; - } - if ($result == 'PASSED') { - $passed[] = $t; - } - if ($result == 'SKIPPED') { - $skipped[] = $t; - } - } - $total = date('i:s', time() - $start); - if (count($failed)) { - $output = "TOTAL TIME: $total\n"; - $output .= count($passed) . " PASSED TESTS\n"; - $output .= count($skipped) . " SKIPPED TESTS\n"; - $output .= count($failed) . " FAILED TESTS:\n"; - foreach ($failed as $failure) { - $output .= $failure . "\n"; - } - if (isset($options['realtimelog'])) { - $fp = @fopen('run-tests.log', 'a'); - } else { - $fp = @fopen('run-tests.log', 'w'); - } - if ($fp) { - fwrite($fp, $output, strlen($output)); - fclose($fp); - $this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command); - } - } elseif (@file_exists('run-tests.log') && !@is_dir('run-tests.log')) { - @unlink('run-tests.log'); - } - $this->ui->outputData('TOTAL TIME: ' . $total); - $this->ui->outputData(count($passed) . ' PASSED TESTS', $command); - $this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command); - if (count($failed)) { - $this->ui->outputData(count($failed) . ' FAILED TESTS:', $command); - foreach ($failed as $failure) { - $this->ui->outputData($failure, $command); - } - } - - return true; - } - - // }}} - // {{{ doPackageDependencies() - - function doPackageDependencies($command, $options, $params) - { - // $params[0] -> the PEAR package to list its information - if (sizeof($params) != 1) { - return $this->raiseError("bad parameter(s), try \"help $command\""); - } - - $obj = new PEAR_Common(); - if (PEAR::isError($info = $obj->infoFromAny($params[0]))) { - return $this->raiseError($info); - } - - if (is_array($info['release_deps'])) { - $data = array( - 'caption' => 'Dependencies for ' . $info['package'], - 'border' => true, - 'headline' => array("Type", "Name", "Relation", "Version"), - ); - - foreach ($info['release_deps'] as $d) { - - if (isset($this->_deps_rel_trans[$d['rel']])) { - $rel = $this->_deps_rel_trans[$d['rel']]; - } else { - $rel = $d['rel']; - } - - if (isset($this->_deps_type_trans[$d['type']])) { - $type = ucfirst($this->_deps_type_trans[$d['type']]); - } else { - $type = $d['type']; - } - - if (isset($d['name'])) { - $name = $d['name']; - } else { - $name = ''; - } - - if (isset($d['version'])) { - $version = $d['version']; - } else { - $version = ''; - } - - $data['data'][] = array($type, $name, $rel, $version); - } - - $this->ui->outputData($data, $command); - return true; - } - - // Fallback - $this->ui->outputData("This package does not have any dependencies.", $command); - } - - // }}} - // {{{ doSign() - - function doSign($command, $options, $params) - { - // should move most of this code into PEAR_Packager - // so it'll be easy to implement "pear package --sign" - if (sizeof($params) != 1) { - return $this->raiseError("bad parameter(s), try \"help $command\""); - } - if (!file_exists($params[0])) { - return $this->raiseError("file does not exist: $params[0]"); - } - $obj = new PEAR_Common; - $info = $obj->infoFromTgzFile($params[0]); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - include_once "Archive/Tar.php"; - include_once "System.php"; - $tar = new Archive_Tar($params[0]); - $tmpdir = System::mktemp('-d pearsign'); - if (!$tar->extractList('package.xml package.sig', $tmpdir)) { - return $this->raiseError("failed to extract tar file"); - } - if (file_exists("$tmpdir/package.sig")) { - return $this->raiseError("package already signed"); - } - @unlink("$tmpdir/package.sig"); - $input = $this->ui->userDialog($command, - array('GnuPG Passphrase'), - array('password')); - $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/package.xml 2>/dev/null", "w"); - if (!$gpg) { - return $this->raiseError("gpg command failed"); - } - fwrite($gpg, "$input[0]\r"); - if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) { - return $this->raiseError("gpg sign failed"); - } - $tar->addModify("$tmpdir/package.sig", '', $tmpdir); - return true; - } - - // }}} - // {{{ doMakeRPM() - - /* - - (cox) - - TODO: - - - Fill the rpm dependencies in the template file. - - IDEAS: - - - Instead of mapping the role to rpm vars, perhaps it's better - - to use directly the pear cmd to install the files by itself - - in %postrun so: - - pear -d php_dir=%{_libdir}/php/pear -d test_dir=.. - - */ - - function doMakeRPM($command, $options, $params) - { - if (sizeof($params) != 1) { - return $this->raiseError("bad parameter(s), try \"help $command\""); - } - if (!file_exists($params[0])) { - return $this->raiseError("file does not exist: $params[0]"); - } - include_once "Archive/Tar.php"; - include_once "PEAR/Installer.php"; - include_once "System.php"; - $tar = new Archive_Tar($params[0]); - $tmpdir = System::mktemp('-d pear2rpm'); - $instroot = System::mktemp('-d pear2rpm'); - $tmp = $this->config->get('verbose'); - $this->config->set('verbose', 0); - $installer = new PEAR_Installer($this->ui); - $info = $installer->install($params[0], - array('installroot' => $instroot, - 'nodeps' => true)); - $pkgdir = "$info[package]-$info[version]"; - $info['rpm_xml_dir'] = '/var/lib/pear'; - $this->config->set('verbose', $tmp); - if (!$tar->extractList("package.xml", $tmpdir, $pkgdir)) { - return $this->raiseError("failed to extract $params[0]"); - } - if (!file_exists("$tmpdir/package.xml")) { - return $this->raiseError("no package.xml found in $params[0]"); - } - if (isset($options['spec-template'])) { - $spec_template = $options['spec-template']; - } else { - $spec_template = $this->config->get('data_dir') . - '/PEAR/template.spec'; - } - if (isset($options['rpm-pkgname'])) { - $rpm_pkgname_format = $options['rpm-pkgname']; - } else { - $rpm_pkgname_format = "PEAR::%s"; - } - - $info['extra_headers'] = ''; - $info['doc_files'] = ''; - $info['files'] = ''; - $info['rpm_package'] = sprintf($rpm_pkgname_format, $info['package']); - $srcfiles = 0; - foreach ($info['filelist'] as $name => $attr) { - - if (!isset($attr['role'])) { - continue; - } - $name = preg_replace('![/:\\\\]!', '/', $name); - if ($attr['role'] == 'doc') { - $info['doc_files'] .= " $name"; - - // Map role to the rpm vars - } else { - - $c_prefix = '%{_libdir}/php/pear'; - - switch ($attr['role']) { - - case 'php': - - $prefix = $c_prefix; break; - - case 'ext': - - $prefix = '%{_libdir}/php'; break; // XXX good place? - - case 'src': - - $srcfiles++; - - $prefix = '%{_includedir}/php'; break; // XXX good place? - - case 'test': - - $prefix = "$c_prefix/tests/" . $info['package']; break; - - case 'data': - - $prefix = "$c_prefix/data/" . $info['package']; break; - - case 'script': - - $prefix = '%{_bindir}'; break; - - } - - $name = str_replace('\\', '/', $name); - $info['files'] .= "$prefix/$name\n"; - - } - } - if ($srcfiles > 0) { - include_once "OS/Guess.php"; - $os = new OS_Guess; - $arch = $os->getCpu(); - } else { - $arch = 'noarch'; - } - $cfg = array('master_server', 'php_dir', 'ext_dir', 'doc_dir', - 'bin_dir', 'data_dir', 'test_dir'); - foreach ($cfg as $k) { - $info[$k] = $this->config->get($k); - } - $info['arch'] = $arch; - $fp = @fopen($spec_template, "r"); - if (!$fp) { - return $this->raiseError("could not open RPM spec file template $spec_template: $php_errormsg"); - } - $spec_contents = preg_replace('/@([a-z0-9_-]+)@/e', '$info["\1"]', fread($fp, filesize($spec_template))); - fclose($fp); - $spec_file = "$info[rpm_package]-$info[version].spec"; - $wp = fopen($spec_file, "wb"); - if (!$wp) { - return $this->raiseError("could not write RPM spec file $spec_file: $php_errormsg"); - } - fwrite($wp, $spec_contents); - fclose($wp); - $this->ui->outputData("Wrote RPM spec file $spec_file", $command); - - return true; - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Command/Registry.php b/3rdparty/PEAR/Command/Registry.php deleted file mode 100644 index 62cb4b00e28..00000000000 --- a/3rdparty/PEAR/Command/Registry.php +++ /dev/null @@ -1,351 +0,0 @@ - | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Registry.php,v 1.36 2004/01/08 17:33:13 sniper Exp $ - -require_once 'PEAR/Command/Common.php'; -require_once 'PEAR/Registry.php'; -require_once 'PEAR/Config.php'; - -class PEAR_Command_Registry extends PEAR_Command_Common -{ - // {{{ properties - - var $commands = array( - 'list' => array( - 'summary' => 'List Installed Packages', - 'function' => 'doList', - 'shortcut' => 'l', - 'options' => array(), - 'doc' => '[package] -If invoked without parameters, this command lists the PEAR packages -installed in your php_dir ({config php_dir)). With a parameter, it -lists the files in that package. -', - ), - 'shell-test' => array( - 'summary' => 'Shell Script Test', - 'function' => 'doShellTest', - 'shortcut' => 'st', - 'options' => array(), - 'doc' => ' [[relation] version] -Tests if a package is installed in the system. Will exit(1) if it is not. - The version comparison operator. One of: - <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne - The version to compare with -'), - 'info' => array( - 'summary' => 'Display information about a package', - 'function' => 'doInfo', - 'shortcut' => 'in', - 'options' => array(), - 'doc' => ' -Displays information about a package. The package argument may be a -local package file, an URL to a package file, or the name of an -installed package.' - ) - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Registry constructor. - * - * @access public - */ - function PEAR_Command_Registry(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doList() - - function _sortinfo($a, $b) - { - return strcmp($a['package'], $b['package']); - } - - function doList($command, $options, $params) - { - $reg = new PEAR_Registry($this->config->get('php_dir')); - if (sizeof($params) == 0) { - $installed = $reg->packageInfo(); - usort($installed, array(&$this, '_sortinfo')); - $i = $j = 0; - $data = array( - 'caption' => 'Installed packages:', - 'border' => true, - 'headline' => array('Package', 'Version', 'State') - ); - foreach ($installed as $package) { - $data['data'][] = array($package['package'], - $package['version'], - @$package['release_state']); - } - if (count($installed)==0) { - $data = '(no packages installed)'; - } - $this->ui->outputData($data, $command); - } else { - if (file_exists($params[0]) && !is_dir($params[0])) { - include_once "PEAR/Common.php"; - $obj = &new PEAR_Common; - $info = $obj->infoFromAny($params[0]); - $headings = array('Package File', 'Install Path'); - $installed = false; - } else { - $info = $reg->packageInfo($params[0]); - $headings = array('Type', 'Install Path'); - $installed = true; - } - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - if ($info === null) { - return $this->raiseError("`$params[0]' not installed"); - } - $list = $info['filelist']; - if ($installed) { - $caption = 'Installed Files For ' . $params[0]; - } else { - $caption = 'Contents of ' . basename($params[0]); - } - $data = array( - 'caption' => $caption, - 'border' => true, - 'headline' => $headings); - foreach ($list as $file => $att) { - if ($installed) { - if (empty($att['installed_as'])) { - continue; - } - $data['data'][] = array($att['role'], $att['installed_as']); - } else { - if (isset($att['baseinstalldir'])) { - $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR . - $file; - } else { - $dest = $file; - } - switch ($att['role']) { - case 'test': - case 'data': - if ($installed) { - break 2; - } - $dest = '-- will not be installed --'; - break; - case 'doc': - $dest = $this->config->get('doc_dir') . DIRECTORY_SEPARATOR . - $dest; - break; - case 'php': - default: - $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR . - $dest; - } - $dest = preg_replace('!/+!', '/', $dest); - $file = preg_replace('!/+!', '/', $file); - $data['data'][] = array($file, $dest); - } - } - $this->ui->outputData($data, $command); - - - } - return true; - } - - // }}} - // {{{ doShellTest() - - function doShellTest($command, $options, $params) - { - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $reg = &new PEAR_Registry($this->config->get('php_dir')); - // "pear shell-test Foo" - if (sizeof($params) == 1) { - if (!$reg->packageExists($params[0])) { - exit(1); - } - // "pear shell-test Foo 1.0" - } elseif (sizeof($params) == 2) { - $v = $reg->packageInfo($params[0], 'version'); - if (!$v || !version_compare("$v", "{$params[1]}", "ge")) { - exit(1); - } - // "pear shell-test Foo ge 1.0" - } elseif (sizeof($params) == 3) { - $v = $reg->packageInfo($params[0], 'version'); - if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) { - exit(1); - } - } else { - $this->popErrorHandling(); - $this->raiseError("$command: expects 1 to 3 parameters"); - exit(1); - } - } - - // }}} - // {{{ doInfo - - function doInfo($command, $options, $params) - { - // $params[0] The package for showing info - if (sizeof($params) != 1) { - return $this->raiseError("This command only accepts one param: ". - "the package you want information"); - } - if (@is_file($params[0])) { - $obj = &new PEAR_Common(); - $info = $obj->infoFromAny($params[0]); - } else { - $reg = &new PEAR_Registry($this->config->get('php_dir')); - $info = $reg->packageInfo($params[0]); - } - if (PEAR::isError($info)) { - return $info; - } - if (empty($info)) { - $this->raiseError("Nothing found for `$params[0]'"); - return; - } - unset($info['filelist']); - unset($info['changelog']); - $keys = array_keys($info); - $longtext = array('description', 'summary'); - foreach ($keys as $key) { - if (is_array($info[$key])) { - switch ($key) { - case 'maintainers': { - $i = 0; - $mstr = ''; - foreach ($info[$key] as $m) { - if ($i++ > 0) { - $mstr .= "\n"; - } - $mstr .= $m['name'] . " <"; - if (isset($m['email'])) { - $mstr .= $m['email']; - } else { - $mstr .= $m['handle'] . '@php.net'; - } - $mstr .= "> ($m[role])"; - } - $info[$key] = $mstr; - break; - } - case 'release_deps': { - $i = 0; - $dstr = ''; - foreach ($info[$key] as $d) { - if (isset($this->_deps_rel_trans[$d['rel']])) { - $rel = $this->_deps_rel_trans[$d['rel']]; - } else { - $rel = $d['rel']; - } - if (isset($this->_deps_type_trans[$d['type']])) { - $type = ucfirst($this->_deps_type_trans[$d['type']]); - } else { - $type = $d['type']; - } - if (isset($d['name'])) { - $name = $d['name'] . ' '; - } else { - $name = ''; - } - if (isset($d['version'])) { - $version = $d['version'] . ' '; - } else { - $version = ''; - } - $dstr .= "$type $name$rel $version\n"; - } - $info[$key] = $dstr; - break; - } - case 'provides' : { - $debug = $this->config->get('verbose'); - if ($debug < 2) { - $pstr = 'Classes: '; - } else { - $pstr = ''; - } - $i = 0; - foreach ($info[$key] as $p) { - if ($debug < 2 && $p['type'] != "class") { - continue; - } - // Only print classes when verbosity mode is < 2 - if ($debug < 2) { - if ($i++ > 0) { - $pstr .= ", "; - } - $pstr .= $p['name']; - } else { - if ($i++ > 0) { - $pstr .= "\n"; - } - $pstr .= ucfirst($p['type']) . " " . $p['name']; - if (isset($p['explicit']) && $p['explicit'] == 1) { - $pstr .= " (explicit)"; - } - } - } - $info[$key] = $pstr; - break; - } - default: { - $info[$key] = implode(", ", $info[$key]); - break; - } - } - } - if ($key == '_lastmodified') { - $hdate = date('Y-m-d', $info[$key]); - unset($info[$key]); - $info['Last Modified'] = $hdate; - } else { - $info[$key] = trim($info[$key]); - if (in_array($key, $longtext)) { - $info[$key] = preg_replace('/ +/', ' ', $info[$key]); - } - } - } - $caption = 'About ' . $info['package'] . '-' . $info['version']; - $data = array( - 'caption' => $caption, - 'border' => true); - foreach ($info as $key => $value) { - $key = ucwords(trim(str_replace('_', ' ', $key))); - $data['data'][] = array($key, $value); - } - $data['raw'] = $info; - - $this->ui->outputData($data, 'package-info'); - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Command/Remote.php b/3rdparty/PEAR/Command/Remote.php deleted file mode 100644 index bbd16093f5d..00000000000 --- a/3rdparty/PEAR/Command/Remote.php +++ /dev/null @@ -1,435 +0,0 @@ - | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Remote.php,v 1.39 2004/04/03 15:56:00 cellog Exp $ - -require_once 'PEAR/Command/Common.php'; -require_once 'PEAR/Common.php'; -require_once 'PEAR/Remote.php'; -require_once 'PEAR/Registry.php'; - -class PEAR_Command_Remote extends PEAR_Command_Common -{ - // {{{ command definitions - - var $commands = array( - 'remote-info' => array( - 'summary' => 'Information About Remote Packages', - 'function' => 'doRemoteInfo', - 'shortcut' => 'ri', - 'options' => array(), - 'doc' => ' -Get details on a package from the server.', - ), - 'list-upgrades' => array( - 'summary' => 'List Available Upgrades', - 'function' => 'doListUpgrades', - 'shortcut' => 'lu', - 'options' => array(), - 'doc' => ' -List releases on the server of packages you have installed where -a newer version is available with the same release state (stable etc.).' - ), - 'remote-list' => array( - 'summary' => 'List Remote Packages', - 'function' => 'doRemoteList', - 'shortcut' => 'rl', - 'options' => array(), - 'doc' => ' -Lists the packages available on the configured server along with the -latest stable release of each package.', - ), - 'search' => array( - 'summary' => 'Search remote package database', - 'function' => 'doSearch', - 'shortcut' => 'sp', - 'options' => array(), - 'doc' => ' -Lists all packages which match the search parameters (first param -is package name, second package info)', - ), - 'list-all' => array( - 'summary' => 'List All Packages', - 'function' => 'doListAll', - 'shortcut' => 'la', - 'options' => array(), - 'doc' => ' -Lists the packages available on the configured server along with the -latest stable release of each package.', - ), - 'download' => array( - 'summary' => 'Download Package', - 'function' => 'doDownload', - 'shortcut' => 'd', - 'options' => array( - 'nocompress' => array( - 'shortopt' => 'Z', - 'doc' => 'download an uncompressed (.tar) file', - ), - ), - 'doc' => '{package|package-version} -Download a package tarball. The file will be named as suggested by the -server, for example if you download the DB package and the latest stable -version of DB is 1.2, the downloaded file will be DB-1.2.tgz.', - ), - 'clear-cache' => array( - 'summary' => 'Clear XML-RPC Cache', - 'function' => 'doClearCache', - 'shortcut' => 'cc', - 'options' => array(), - 'doc' => ' -Clear the XML-RPC cache. See also the cache_ttl configuration -parameter. -', - ), - ); - - // }}} - // {{{ constructor - - /** - * PEAR_Command_Remote constructor. - * - * @access public - */ - function PEAR_Command_Remote(&$ui, &$config) - { - parent::PEAR_Command_Common($ui, $config); - } - - // }}} - - // {{{ doRemoteInfo() - - function doRemoteInfo($command, $options, $params) - { - if (sizeof($params) != 1) { - return $this->raiseError("$command expects one param: the remote package name"); - } - $r = new PEAR_Remote($this->config); - $info = $r->call('package.info', $params[0]); - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - - $reg = new PEAR_Registry($this->config->get('php_dir')); - $installed = $reg->packageInfo($info['name']); - $info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; - - $this->ui->outputData($info, $command); - - return true; - } - - // }}} - // {{{ doRemoteList() - - function doRemoteList($command, $options, $params) - { - $r = new PEAR_Remote($this->config); - $list_options = false; - if ($this->config->get('preferred_state') == 'stable') - $list_options = true; - $available = $r->call('package.listAll', $list_options); - if (PEAR::isError($available)) { - return $this->raiseError($available); - } - $i = $j = 0; - $data = array( - 'caption' => 'Available packages:', - 'border' => true, - 'headline' => array('Package', 'Version'), - ); - foreach ($available as $name => $info) { - $data['data'][] = array($name, isset($info['stable']) ? $info['stable'] : '-n/a-'); - } - if (count($available)==0) { - $data = '(no packages installed yet)'; - } - $this->ui->outputData($data, $command); - return true; - } - - // }}} - // {{{ doListAll() - - function doListAll($command, $options, $params) - { - $r = new PEAR_Remote($this->config); - $reg = new PEAR_Registry($this->config->get('php_dir')); - $list_options = false; - if ($this->config->get('preferred_state') == 'stable') - $list_options = true; - $available = $r->call('package.listAll', $list_options); - if (PEAR::isError($available)) { - return $this->raiseError($available); - } - if (!is_array($available)) { - return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "'.$available.'")'); - } - $data = array( - 'caption' => 'All packages:', - 'border' => true, - 'headline' => array('Package', 'Latest', 'Local'), - ); - $local_pkgs = $reg->listPackages(); - - foreach ($available as $name => $info) { - $installed = $reg->packageInfo($name); - $desc = $info['summary']; - if (isset($params[$name])) - $desc .= "\n\n".$info['description']; - - if (isset($options['mode'])) - { - if ($options['mode'] == 'installed' && !isset($installed['version'])) - continue; - if ($options['mode'] == 'notinstalled' && isset($installed['version'])) - continue; - if ($options['mode'] == 'upgrades' - && (!isset($installed['version']) || $installed['version'] == $info['stable'])) - { - continue; - } - } - $pos = array_search(strtolower($name), $local_pkgs); - if ($pos !== false) { - unset($local_pkgs[$pos]); - } - - $data['data'][$info['category']][] = array( - $name, - @$info['stable'], - @$installed['version'], - @$desc, - @$info['deps'], - ); - } - - foreach ($local_pkgs as $name) { - $info = $reg->packageInfo($name); - $data['data']['Local'][] = array( - $info['package'], - '', - $info['version'], - $info['summary'], - @$info['release_deps'] - ); - } - - $this->ui->outputData($data, $command); - return true; - } - - // }}} - // {{{ doSearch() - - function doSearch($command, $options, $params) - { - if ((!isset($params[0]) || empty($params[0])) - && (!isset($params[1]) || empty($params[1]))) - { - return $this->raiseError('no valid search string supplied'); - }; - - $r = new PEAR_Remote($this->config); - $reg = new PEAR_Registry($this->config->get('php_dir')); - $available = $r->call('package.listAll', true, false); - if (PEAR::isError($available)) { - return $this->raiseError($available); - } - $data = array( - 'caption' => 'Matched packages:', - 'border' => true, - 'headline' => array('Package', 'Stable/(Latest)', 'Local'), - ); - - foreach ($available as $name => $info) { - $found = (!empty($params[0]) && stristr($name, $params[0]) !== false); - if (!$found && !(isset($params[1]) && !empty($params[1]) - && (stristr($info['summary'], $params[1]) !== false - || stristr($info['description'], $params[1]) !== false))) - { - continue; - }; - - $installed = $reg->packageInfo($name); - $desc = $info['summary']; - if (isset($params[$name])) - $desc .= "\n\n".$info['description']; - - $unstable = ''; - if ($info['unstable']) { - $unstable = '/(' . $info['unstable'] . $info['state'] . ')'; - } - if (!isset($info['stable']) || !$info['stable']) { - $info['stable'] = 'none'; - } - $data['data'][$info['category']][] = array( - $name, - $info['stable'] . $unstable, - $installed['version'], - $desc, - ); - } - if (!isset($data['data'])) { - return $this->raiseError('no packages found'); - } - $this->ui->outputData($data, $command); - return true; - } - - // }}} - // {{{ doDownload() - - function doDownload($command, $options, $params) - { - //$params[0] -> The package to download - if (count($params) != 1) { - return PEAR::raiseError("download expects one argument: the package to download"); - } - $server = $this->config->get('master_server'); - if (!ereg('^http://', $params[0])) { - $getoption = isset($options['nocompress'])&&$options['nocompress']==1?'?uncompress=on':''; - $pkgfile = "http://$server/get/$params[0]".$getoption; - } else { - $pkgfile = $params[0]; - } - $this->bytes_downloaded = 0; - $saved = PEAR_Common::downloadHttp($pkgfile, $this->ui, '.', - array(&$this, 'downloadCallback')); - if (PEAR::isError($saved)) { - return $this->raiseError($saved); - } - $fname = basename($saved); - $this->ui->outputData("File $fname downloaded ($this->bytes_downloaded bytes)", $command); - return true; - } - - function downloadCallback($msg, $params = null) - { - if ($msg == 'done') { - $this->bytes_downloaded = $params; - } - } - - // }}} - // {{{ doListUpgrades() - - function doListUpgrades($command, $options, $params) - { - include_once "PEAR/Registry.php"; - $remote = new PEAR_Remote($this->config); - if (empty($params[0])) { - $state = $this->config->get('preferred_state'); - } else { - $state = $params[0]; - } - $caption = 'Available Upgrades'; - if (empty($state) || $state == 'any') { - $latest = $remote->call("package.listLatestReleases"); - } else { - $latest = $remote->call("package.listLatestReleases", $state); - $caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')'; - } - $caption .= ':'; - if (PEAR::isError($latest)) { - return $latest; - } - $reg = new PEAR_Registry($this->config->get('php_dir')); - $inst = array_flip($reg->listPackages()); - $data = array( - 'caption' => $caption, - 'border' => 1, - 'headline' => array('Package', 'Local', 'Remote', 'Size'), - ); - foreach ((array)$latest as $pkg => $info) { - $package = strtolower($pkg); - if (!isset($inst[$package])) { - // skip packages we don't have installed - continue; - } - extract($info); - $pkginfo = $reg->packageInfo($package); - $inst_version = $pkginfo['version']; - $inst_state = $pkginfo['release_state']; - if (version_compare("$version", "$inst_version", "le")) { - // installed version is up-to-date - continue; - } - if ($filesize >= 20480) { - $filesize += 1024 - ($filesize % 1024); - $fs = sprintf("%dkB", $filesize / 1024); - } elseif ($filesize > 0) { - $filesize += 103 - ($filesize % 103); - $fs = sprintf("%.1fkB", $filesize / 1024.0); - } else { - $fs = " -"; // XXX center instead - } - $data['data'][] = array($pkg, "$inst_version ($inst_state)", "$version ($state)", $fs); - } - if (empty($data['data'])) { - $this->ui->outputData('No upgrades available'); - } else { - $this->ui->outputData($data, $command); - } - return true; - } - - // }}} - // {{{ doClearCache() - - function doClearCache($command, $options, $params) - { - $cache_dir = $this->config->get('cache_dir'); - $verbose = $this->config->get('verbose'); - $output = ''; - if (!($dp = @opendir($cache_dir))) { - return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); - } - if ($verbose >= 1) { - $output .= "reading directory $cache_dir\n"; - } - $num = 0; - while ($ent = readdir($dp)) { - if (preg_match('/^xmlrpc_cache_[a-z0-9]{32}$/', $ent)) { - $path = $cache_dir . DIRECTORY_SEPARATOR . $ent; - $ok = @unlink($path); - if ($ok) { - if ($verbose >= 2) { - $output .= "deleted $path\n"; - } - $num++; - } elseif ($verbose >= 1) { - $output .= "failed to delete $path\n"; - } - } - } - closedir($dp); - if ($verbose >= 1) { - $output .= "$num cache entries cleared\n"; - } - $this->ui->outputData(rtrim($output), $command); - return $num; - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Common.php b/3rdparty/PEAR/Common.php deleted file mode 100644 index fba53a37799..00000000000 --- a/3rdparty/PEAR/Common.php +++ /dev/null @@ -1,2094 +0,0 @@ - | -// | Tomas V.V.Cox | -// +----------------------------------------------------------------------+ -// -// $Id: Common.php,v 1.126.2.2 2004/12/27 07:04:19 cellog Exp $ - -require_once 'PEAR.php'; -require_once 'Archive/Tar.php'; -require_once 'System.php'; -require_once 'PEAR/Config.php'; - -// {{{ constants and globals - -/** - * PEAR_Common error when an invalid PHP file is passed to PEAR_Common::analyzeSourceCode() - */ -define('PEAR_COMMON_ERROR_INVALIDPHP', 1); -define('_PEAR_COMMON_PACKAGE_NAME_PREG', '[A-Za-z][a-zA-Z0-9_]+'); -define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '$/'); - -// this should allow: 1, 1.0, 1.0RC1, 1.0dev, 1.0dev123234234234, 1.0a1, 1.0b1, 1.0pl1 -define('_PEAR_COMMON_PACKAGE_VERSION_PREG', '\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?'); -define('PEAR_COMMON_PACKAGE_VERSION_PREG', '/^' . _PEAR_COMMON_PACKAGE_VERSION_PREG . '$/i'); - -// XXX far from perfect :-) -define('PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '/^(' . _PEAR_COMMON_PACKAGE_NAME_PREG . ')(-([.0-9a-zA-Z]+))?$/'); - -/** - * List of temporary files and directories registered by - * PEAR_Common::addTempFile(). - * @var array - */ -$GLOBALS['_PEAR_Common_tempfiles'] = array(); - -/** - * Valid maintainer roles - * @var array - */ -$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper'); - -/** - * Valid release states - * @var array - */ -$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel'); - -/** - * Valid dependency types - * @var array - */ -$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi'); - -/** - * Valid dependency relations - * @var array - */ -$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge','not', 'ne'); - -/** - * Valid file roles - * @var array - */ -$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script'); - -/** - * Valid replacement types - * @var array - */ -$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info'); - -/** - * Valid "provide" types - * @var array - */ -$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api'); - -/** - * Valid "provide" types - * @var array - */ -$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup'); - -// }}} - -/** - * Class providing common functionality for PEAR administration classes. - * @deprecated This class will disappear, and its components will be spread - * into smaller classes, like the AT&T breakup - */ -class PEAR_Common extends PEAR -{ - // {{{ properties - - /** stack of elements, gives some sort of XML context */ - var $element_stack = array(); - - /** name of currently parsed XML element */ - var $current_element; - - /** array of attributes of the currently parsed XML element */ - var $current_attributes = array(); - - /** assoc with information about a package */ - var $pkginfo = array(); - - /** - * User Interface object (PEAR_Frontend_* class). If null, - * the log() method uses print. - * @var object - */ - var $ui = null; - - /** - * Configuration object (PEAR_Config). - * @var object - */ - var $config = null; - - var $current_path = null; - - /** - * PEAR_SourceAnalyzer instance - * @var object - */ - var $source_analyzer = null; - /** - * Flag variable used to mark a valid package file - * @var boolean - * @access private - */ - var $_validPackageFile; - - // }}} - - // {{{ constructor - - /** - * PEAR_Common constructor - * - * @access public - */ - function PEAR_Common() - { - parent::PEAR(); - $this->config = &PEAR_Config::singleton(); - $this->debug = $this->config->get('verbose'); - } - - // }}} - // {{{ destructor - - /** - * PEAR_Common destructor - * - * @access private - */ - function _PEAR_Common() - { - // doesn't work due to bug #14744 - //$tempfiles = $this->_tempfiles; - $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles']; - while ($file = array_shift($tempfiles)) { - if (@is_dir($file)) { - System::rm(array('-rf', $file)); - } elseif (file_exists($file)) { - unlink($file); - } - } - } - - // }}} - // {{{ addTempFile() - - /** - * Register a temporary file or directory. When the destructor is - * executed, all registered temporary files and directories are - * removed. - * - * @param string $file name of file or directory - * - * @return void - * - * @access public - */ - function addTempFile($file) - { - $GLOBALS['_PEAR_Common_tempfiles'][] = $file; - } - - // }}} - // {{{ mkDirHier() - - /** - * Wrapper to System::mkDir(), creates a directory as well as - * any necessary parent directories. - * - * @param string $dir directory name - * - * @return bool TRUE on success, or a PEAR error - * - * @access public - */ - function mkDirHier($dir) - { - $this->log(2, "+ create dir $dir"); - return System::mkDir(array('-p', $dir)); - } - - // }}} - // {{{ log() - - /** - * Logging method. - * - * @param int $level log level (0 is quiet, higher is noisier) - * @param string $msg message to write to the log - * - * @return void - * - * @access public - */ - function log($level, $msg, $append_crlf = true) - { - if ($this->debug >= $level) { - if (is_object($this->ui)) { - $this->ui->log($msg, $append_crlf); - } else { - print "$msg\n"; - } - } - } - - // }}} - // {{{ mkTempDir() - - /** - * Create and register a temporary directory. - * - * @param string $tmpdir (optional) Directory to use as tmpdir. - * Will use system defaults (for example - * /tmp or c:\windows\temp) if not specified - * - * @return string name of created directory - * - * @access public - */ - function mkTempDir($tmpdir = '') - { - if ($tmpdir) { - $topt = array('-t', $tmpdir); - } else { - $topt = array(); - } - $topt = array_merge($topt, array('-d', 'pear')); - if (!$tmpdir = System::mktemp($topt)) { - return false; - } - $this->addTempFile($tmpdir); - return $tmpdir; - } - - // }}} - // {{{ setFrontendObject() - - /** - * Set object that represents the frontend to be used. - * - * @param object Reference of the frontend object - * @return void - * @access public - */ - function setFrontendObject(&$ui) - { - $this->ui = &$ui; - } - - // }}} - - // {{{ _unIndent() - - /** - * Unindent given string (?) - * - * @param string $str The string that has to be unindented. - * @return string - * @access private - */ - function _unIndent($str) - { - // remove leading newlines - $str = preg_replace('/^[\r\n]+/', '', $str); - // find whitespace at the beginning of the first line - $indent_len = strspn($str, " \t"); - $indent = substr($str, 0, $indent_len); - $data = ''; - // remove the same amount of whitespace from following lines - foreach (explode("\n", $str) as $line) { - if (substr($line, 0, $indent_len) == $indent) { - $data .= substr($line, $indent_len) . "\n"; - } - } - return $data; - } - - // }}} - // {{{ _element_start() - - /** - * XML parser callback for starting elements. Used while package - * format version is not yet known. - * - * @param resource $xp XML parser resource - * @param string $name name of starting element - * @param array $attribs element attributes, name => value - * - * @return void - * - * @access private - */ - function _element_start($xp, $name, $attribs) - { - array_push($this->element_stack, $name); - $this->current_element = $name; - $spos = sizeof($this->element_stack) - 2; - $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; - $this->current_attributes = $attribs; - switch ($name) { - case 'package': { - $this->_validPackageFile = true; - if (isset($attribs['version'])) { - $vs = preg_replace('/[^0-9a-z]/', '_', $attribs['version']); - } else { - $vs = '1_0'; - } - $elem_start = '_element_start_'. $vs; - $elem_end = '_element_end_'. $vs; - $cdata = '_pkginfo_cdata_'. $vs; - if (!method_exists($this, $elem_start) || - !method_exists($this, $elem_end) || - !method_exists($this, $cdata)) { - $this->raiseError("No handlers for package.xml version $attribs[version]"); - return; - } - xml_set_element_handler($xp, $elem_start, $elem_end); - xml_set_character_data_handler($xp, $cdata); - break; - } - } - } - - // }}} - // {{{ _element_end() - - /** - * XML parser callback for ending elements. Used while package - * format version is not yet known. - * - * @param resource $xp XML parser resource - * @param string $name name of ending element - * - * @return void - * - * @access private - */ - function _element_end($xp, $name) - { - } - - // }}} - - // Support for package DTD v1.0: - // {{{ _element_start_1_0() - - /** - * XML parser callback for ending elements. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name name of ending element - * - * @return void - * - * @access private - */ - function _element_start_1_0($xp, $name, $attribs) - { - array_push($this->element_stack, $name); - $this->current_element = $name; - $spos = sizeof($this->element_stack) - 2; - $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; - $this->current_attributes = $attribs; - $this->cdata = ''; - switch ($name) { - case 'dir': - if ($this->in_changelog) { - break; - } - if ($attribs['name'] != '/') { - $this->dir_names[] = $attribs['name']; - } - if (isset($attribs['baseinstalldir'])) { - $this->dir_install = $attribs['baseinstalldir']; - } - if (isset($attribs['role'])) { - $this->dir_role = $attribs['role']; - } - break; - case 'file': - if ($this->in_changelog) { - break; - } - if (isset($attribs['name'])) { - $path = ''; - if (count($this->dir_names)) { - foreach ($this->dir_names as $dir) { - $path .= $dir . DIRECTORY_SEPARATOR; - } - } - $path .= $attribs['name']; - unset($attribs['name']); - $this->current_path = $path; - $this->filelist[$path] = $attribs; - // Set the baseinstalldir only if the file don't have this attrib - if (!isset($this->filelist[$path]['baseinstalldir']) && - isset($this->dir_install)) - { - $this->filelist[$path]['baseinstalldir'] = $this->dir_install; - } - // Set the Role - if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { - $this->filelist[$path]['role'] = $this->dir_role; - } - } - break; - case 'replace': - if (!$this->in_changelog) { - $this->filelist[$this->current_path]['replacements'][] = $attribs; - } - break; - case 'maintainers': - $this->pkginfo['maintainers'] = array(); - $this->m_i = 0; // maintainers array index - break; - case 'maintainer': - // compatibility check - if (!isset($this->pkginfo['maintainers'])) { - $this->pkginfo['maintainers'] = array(); - $this->m_i = 0; - } - $this->pkginfo['maintainers'][$this->m_i] = array(); - $this->current_maintainer =& $this->pkginfo['maintainers'][$this->m_i]; - break; - case 'changelog': - $this->pkginfo['changelog'] = array(); - $this->c_i = 0; // changelog array index - $this->in_changelog = true; - break; - case 'release': - if ($this->in_changelog) { - $this->pkginfo['changelog'][$this->c_i] = array(); - $this->current_release = &$this->pkginfo['changelog'][$this->c_i]; - } else { - $this->current_release = &$this->pkginfo; - } - break; - case 'deps': - if (!$this->in_changelog) { - $this->pkginfo['release_deps'] = array(); - } - break; - case 'dep': - // dependencies array index - if (!$this->in_changelog) { - $this->d_i++; - $this->pkginfo['release_deps'][$this->d_i] = $attribs; - } - break; - case 'configureoptions': - if (!$this->in_changelog) { - $this->pkginfo['configure_options'] = array(); - } - break; - case 'configureoption': - if (!$this->in_changelog) { - $this->pkginfo['configure_options'][] = $attribs; - } - break; - case 'provides': - if (empty($attribs['type']) || empty($attribs['name'])) { - break; - } - $attribs['explicit'] = true; - $this->pkginfo['provides']["$attribs[type];$attribs[name]"] = $attribs; - break; - } - } - - // }}} - // {{{ _element_end_1_0() - - /** - * XML parser callback for ending elements. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name name of ending element - * - * @return void - * - * @access private - */ - function _element_end_1_0($xp, $name) - { - $data = trim($this->cdata); - switch ($name) { - case 'name': - switch ($this->prev_element) { - case 'package': - // XXX should we check the package name here? - $this->pkginfo['package'] = ereg_replace('[^a-zA-Z0-9._]', '_', $data); - break; - case 'maintainer': - $this->current_maintainer['name'] = $data; - break; - } - break; - case 'summary': - $this->pkginfo['summary'] = $data; - break; - case 'description': - $data = $this->_unIndent($this->cdata); - $this->pkginfo['description'] = $data; - break; - case 'user': - $this->current_maintainer['handle'] = $data; - break; - case 'email': - $this->current_maintainer['email'] = $data; - break; - case 'role': - $this->current_maintainer['role'] = $data; - break; - case 'version': - $data = ereg_replace ('[^a-zA-Z0-9._\-]', '_', $data); - if ($this->in_changelog) { - $this->current_release['version'] = $data; - } else { - $this->pkginfo['version'] = $data; - } - break; - case 'date': - if ($this->in_changelog) { - $this->current_release['release_date'] = $data; - } else { - $this->pkginfo['release_date'] = $data; - } - break; - case 'notes': - // try to "de-indent" release notes in case someone - // has been over-indenting their xml ;-) - $data = $this->_unIndent($this->cdata); - if ($this->in_changelog) { - $this->current_release['release_notes'] = $data; - } else { - $this->pkginfo['release_notes'] = $data; - } - break; - case 'warnings': - if ($this->in_changelog) { - $this->current_release['release_warnings'] = $data; - } else { - $this->pkginfo['release_warnings'] = $data; - } - break; - case 'state': - if ($this->in_changelog) { - $this->current_release['release_state'] = $data; - } else { - $this->pkginfo['release_state'] = $data; - } - break; - case 'license': - if ($this->in_changelog) { - $this->current_release['release_license'] = $data; - } else { - $this->pkginfo['release_license'] = $data; - } - break; - case 'dep': - if ($data && !$this->in_changelog) { - $this->pkginfo['release_deps'][$this->d_i]['name'] = $data; - } - break; - case 'dir': - if ($this->in_changelog) { - break; - } - array_pop($this->dir_names); - break; - case 'file': - if ($this->in_changelog) { - break; - } - if ($data) { - $path = ''; - if (count($this->dir_names)) { - foreach ($this->dir_names as $dir) { - $path .= $dir . DIRECTORY_SEPARATOR; - } - } - $path .= $data; - $this->filelist[$path] = $this->current_attributes; - // Set the baseinstalldir only if the file don't have this attrib - if (!isset($this->filelist[$path]['baseinstalldir']) && - isset($this->dir_install)) - { - $this->filelist[$path]['baseinstalldir'] = $this->dir_install; - } - // Set the Role - if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { - $this->filelist[$path]['role'] = $this->dir_role; - } - } - break; - case 'maintainer': - if (empty($this->pkginfo['maintainers'][$this->m_i]['role'])) { - $this->pkginfo['maintainers'][$this->m_i]['role'] = 'lead'; - } - $this->m_i++; - break; - case 'release': - if ($this->in_changelog) { - $this->c_i++; - } - break; - case 'changelog': - $this->in_changelog = false; - break; - } - array_pop($this->element_stack); - $spos = sizeof($this->element_stack) - 1; - $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : ''; - $this->cdata = ''; - } - - // }}} - // {{{ _pkginfo_cdata_1_0() - - /** - * XML parser callback for character data. Used for version 1.0 - * packages. - * - * @param resource $xp XML parser resource - * @param string $name character data - * - * @return void - * - * @access private - */ - function _pkginfo_cdata_1_0($xp, $data) - { - if (isset($this->cdata)) { - $this->cdata .= $data; - } - } - - // }}} - - // {{{ infoFromTgzFile() - - /** - * Returns information about a package file. Expects the name of - * a gzipped tar file as input. - * - * @param string $file name of .tgz file - * - * @return array array with package information - * - * @access public - * - */ - function infoFromTgzFile($file) - { - if (!@is_file($file)) { - return $this->raiseError("could not open file \"$file\""); - } - $tar = new Archive_Tar($file); - if ($this->debug <= 1) { - $tar->pushErrorHandling(PEAR_ERROR_RETURN); - } - $content = $tar->listContent(); - if ($this->debug <= 1) { - $tar->popErrorHandling(); - } - if (!is_array($content)) { - $file = realpath($file); - return $this->raiseError("Could not get contents of package \"$file\"". - '. Invalid tgz file.'); - } - $xml = null; - foreach ($content as $file) { - $name = $file['filename']; - if ($name == 'package.xml') { - $xml = $name; - break; - } elseif (ereg('package.xml$', $name, $match)) { - $xml = $match[0]; - break; - } - } - $tmpdir = System::mkTemp(array('-d', 'pear')); - $this->addTempFile($tmpdir); - if (!$xml || !$tar->extractList(array($xml), $tmpdir)) { - return $this->raiseError('could not extract the package.xml file'); - } - return $this->infoFromDescriptionFile("$tmpdir/$xml"); - } - - // }}} - // {{{ infoFromDescriptionFile() - - /** - * Returns information about a package file. Expects the name of - * a package xml file as input. - * - * @param string $descfile name of package xml file - * - * @return array array with package information - * - * @access public - * - */ - function infoFromDescriptionFile($descfile) - { - if (!@is_file($descfile) || !is_readable($descfile) || - (!$fp = @fopen($descfile, 'r'))) { - return $this->raiseError("Unable to open $descfile"); - } - - // read the whole thing so we only get one cdata callback - // for each block of cdata - $data = fread($fp, filesize($descfile)); - return $this->infoFromString($data); - } - - // }}} - // {{{ infoFromString() - - /** - * Returns information about a package file. Expects the contents - * of a package xml file as input. - * - * @param string $data name of package xml file - * - * @return array array with package information - * - * @access public - * - */ - function infoFromString($data) - { - require_once('PEAR/Dependency.php'); - if (PEAR_Dependency::checkExtension($error, 'xml')) { - return $this->raiseError($error); - } - $xp = @xml_parser_create(); - if (!$xp) { - return $this->raiseError('Unable to create XML parser'); - } - xml_set_object($xp, $this); - xml_set_element_handler($xp, '_element_start', '_element_end'); - xml_set_character_data_handler($xp, '_pkginfo_cdata'); - xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); - - $this->element_stack = array(); - $this->pkginfo = array('provides' => array()); - $this->current_element = false; - unset($this->dir_install); - $this->pkginfo['filelist'] = array(); - $this->filelist =& $this->pkginfo['filelist']; - $this->dir_names = array(); - $this->in_changelog = false; - $this->d_i = 0; - $this->cdata = ''; - $this->_validPackageFile = false; - - if (!xml_parse($xp, $data, 1)) { - $code = xml_get_error_code($xp); - $msg = sprintf("XML error: %s at line %d", - xml_error_string($code), - xml_get_current_line_number($xp)); - xml_parser_free($xp); - return $this->raiseError($msg, $code); - } - - xml_parser_free($xp); - - if (!$this->_validPackageFile) { - return $this->raiseError('Invalid Package File, no tag'); - } - foreach ($this->pkginfo as $k => $v) { - if (!is_array($v)) { - $this->pkginfo[$k] = trim($v); - } - } - return $this->pkginfo; - } - // }}} - // {{{ infoFromAny() - - /** - * Returns package information from different sources - * - * This method is able to extract information about a package - * from a .tgz archive or from a XML package definition file. - * - * @access public - * @param string Filename of the source ('package.xml', '.tgz') - * @return string - */ - function infoFromAny($info) - { - if (is_string($info) && file_exists($info)) { - $tmp = substr($info, -4); - if ($tmp == '.xml') { - $info = $this->infoFromDescriptionFile($info); - } elseif ($tmp == '.tar' || $tmp == '.tgz') { - $info = $this->infoFromTgzFile($info); - } else { - $fp = fopen($info, "r"); - $test = fread($fp, 5); - fclose($fp); - if ($test == "infoFromDescriptionFile($info); - } else { - $info = $this->infoFromTgzFile($info); - } - } - if (PEAR::isError($info)) { - return $this->raiseError($info); - } - } - return $info; - } - - // }}} - // {{{ xmlFromInfo() - - /** - * Return an XML document based on the package info (as returned - * by the PEAR_Common::infoFrom* methods). - * - * @param array $pkginfo package info - * - * @return string XML data - * - * @access public - */ - function xmlFromInfo($pkginfo) - { - static $maint_map = array( - "handle" => "user", - "name" => "name", - "email" => "email", - "role" => "role", - ); - $ret = "\n"; - $ret .= "\n"; - $ret .= " - $pkginfo[package] - ".htmlspecialchars($pkginfo['summary'])." - ".htmlspecialchars($pkginfo['description'])." - -"; - foreach ($pkginfo['maintainers'] as $maint) { - $ret .= " \n"; - foreach ($maint_map as $idx => $elm) { - $ret .= " <$elm>"; - $ret .= htmlspecialchars($maint[$idx]); - $ret .= "\n"; - } - $ret .= " \n"; - } - $ret .= " \n"; - $ret .= $this->_makeReleaseXml($pkginfo); - if (@sizeof($pkginfo['changelog']) > 0) { - $ret .= " \n"; - foreach ($pkginfo['changelog'] as $oldrelease) { - $ret .= $this->_makeReleaseXml($oldrelease, true); - } - $ret .= " \n"; - } - $ret .= "\n"; - return $ret; - } - - // }}} - // {{{ _makeReleaseXml() - - /** - * Generate part of an XML description with release information. - * - * @param array $pkginfo array with release information - * @param bool $changelog whether the result will be in a changelog element - * - * @return string XML data - * - * @access private - */ - function _makeReleaseXml($pkginfo, $changelog = false) - { - // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!! - $indent = $changelog ? " " : ""; - $ret = "$indent \n"; - if (!empty($pkginfo['version'])) { - $ret .= "$indent $pkginfo[version]\n"; - } - if (!empty($pkginfo['release_date'])) { - $ret .= "$indent $pkginfo[release_date]\n"; - } - if (!empty($pkginfo['release_license'])) { - $ret .= "$indent $pkginfo[release_license]\n"; - } - if (!empty($pkginfo['release_state'])) { - $ret .= "$indent $pkginfo[release_state]\n"; - } - if (!empty($pkginfo['release_notes'])) { - $ret .= "$indent ".htmlspecialchars($pkginfo['release_notes'])."\n"; - } - if (!empty($pkginfo['release_warnings'])) { - $ret .= "$indent ".htmlspecialchars($pkginfo['release_warnings'])."\n"; - } - if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) { - $ret .= "$indent \n"; - foreach ($pkginfo['release_deps'] as $dep) { - $ret .= "$indent $what) { - $ret .= "$indent $fa) { - @$ret .= "$indent $v) { - $ret .= " $k=\"" . htmlspecialchars($v) .'"'; - } - $ret .= "/>\n"; - } - @$ret .= "$indent \n"; - } - } - $ret .= "$indent \n"; - } - $ret .= "$indent \n"; - return $ret; - } - - // }}} - // {{{ validatePackageInfo() - - /** - * Validate XML package definition file. - * - * @param string $info Filename of the package archive or of the - * package definition file - * @param array $errors Array that will contain the errors - * @param array $warnings Array that will contain the warnings - * @param string $dir_prefix (optional) directory where source files - * may be found, or empty if they are not available - * @access public - * @return boolean - */ - function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '') - { - if (PEAR::isError($info = $this->infoFromAny($info))) { - return $this->raiseError($info); - } - if (!is_array($info)) { - return false; - } - - $errors = array(); - $warnings = array(); - if (!isset($info['package'])) { - $errors[] = 'missing package name'; - } elseif (!$this->validPackageName($info['package'])) { - $errors[] = 'invalid package name'; - } - $this->_packageName = $pn = $info['package']; - - if (empty($info['summary'])) { - $errors[] = 'missing summary'; - } elseif (strpos(trim($info['summary']), "\n") !== false) { - $warnings[] = 'summary should be on a single line'; - } - if (empty($info['description'])) { - $errors[] = 'missing description'; - } - if (empty($info['release_license'])) { - $errors[] = 'missing license'; - } - if (!isset($info['version'])) { - $errors[] = 'missing version'; - } elseif (!$this->validPackageVersion($info['version'])) { - $errors[] = 'invalid package release version'; - } - if (empty($info['release_state'])) { - $errors[] = 'missing release state'; - } elseif (!in_array($info['release_state'], PEAR_Common::getReleaseStates())) { - $errors[] = "invalid release state `$info[release_state]', should be one of: " - . implode(' ', PEAR_Common::getReleaseStates()); - } - if (empty($info['release_date'])) { - $errors[] = 'missing release date'; - } elseif (!preg_match('/^\d{4}-\d\d-\d\d$/', $info['release_date'])) { - $errors[] = "invalid release date `$info[release_date]', format is YYYY-MM-DD"; - } - if (empty($info['release_notes'])) { - $errors[] = "missing release notes"; - } - if (empty($info['maintainers'])) { - $errors[] = 'no maintainer(s)'; - } else { - $i = 1; - foreach ($info['maintainers'] as $m) { - if (empty($m['handle'])) { - $errors[] = "maintainer $i: missing handle"; - } - if (empty($m['role'])) { - $errors[] = "maintainer $i: missing role"; - } elseif (!in_array($m['role'], PEAR_Common::getUserRoles())) { - $errors[] = "maintainer $i: invalid role `$m[role]', should be one of: " - . implode(' ', PEAR_Common::getUserRoles()); - } - if (empty($m['name'])) { - $errors[] = "maintainer $i: missing name"; - } - if (empty($m['email'])) { - $errors[] = "maintainer $i: missing email"; - } - $i++; - } - } - if (!empty($info['release_deps'])) { - $i = 1; - foreach ($info['release_deps'] as $d) { - if (empty($d['type'])) { - $errors[] = "dependency $i: missing type"; - } elseif (!in_array($d['type'], PEAR_Common::getDependencyTypes())) { - $errors[] = "dependency $i: invalid type '$d[type]', should be one of: " . - implode(' ', PEAR_Common::getDependencyTypes()); - } - if (empty($d['rel'])) { - $errors[] = "dependency $i: missing relation"; - } elseif (!in_array($d['rel'], PEAR_Common::getDependencyRelations())) { - $errors[] = "dependency $i: invalid relation '$d[rel]', should be one of: " - . implode(' ', PEAR_Common::getDependencyRelations()); - } - if (!empty($d['optional'])) { - if (!in_array($d['optional'], array('yes', 'no'))) { - $errors[] = "dependency $i: invalid relation optional attribute '$d[optional]', should be one of: yes no"; - } else { - if (($d['rel'] == 'not' || $d['rel'] == 'ne') && $d['optional'] == 'yes') { - $errors[] = "dependency $i: 'not' and 'ne' dependencies cannot be " . - "optional"; - } - } - } - if ($d['rel'] != 'not' && $d['rel'] != 'has' && empty($d['version'])) { - $warnings[] = "dependency $i: missing version"; - } elseif (($d['rel'] == 'not' || $d['rel'] == 'has') && !empty($d['version'])) { - $warnings[] = "dependency $i: version ignored for `$d[rel]' dependencies"; - } - if ($d['rel'] == 'not' && !empty($d['version'])) { - $warnings[] = "dependency $i: 'not' defines a total conflict, to exclude " . - "specific versions, use 'ne'"; - } - if ($d['type'] == 'php' && !empty($d['name'])) { - $warnings[] = "dependency $i: name ignored for php type dependencies"; - } elseif ($d['type'] != 'php' && empty($d['name'])) { - $errors[] = "dependency $i: missing name"; - } - if ($d['type'] == 'php' && $d['rel'] == 'not') { - $errors[] = "dependency $i: PHP dependencies cannot use 'not' " . - "rel, use 'ne' to exclude versions"; - } - $i++; - } - } - if (!empty($info['configure_options'])) { - $i = 1; - foreach ($info['configure_options'] as $c) { - if (empty($c['name'])) { - $errors[] = "configure option $i: missing name"; - } - if (empty($c['prompt'])) { - $errors[] = "configure option $i: missing prompt"; - } - $i++; - } - } - if (empty($info['filelist'])) { - $errors[] = 'no files'; - } else { - foreach ($info['filelist'] as $file => $fa) { - if (empty($fa['role'])) { - $errors[] = "file $file: missing role"; - continue; - } elseif (!in_array($fa['role'], PEAR_Common::getFileRoles())) { - $errors[] = "file $file: invalid role, should be one of: " - . implode(' ', PEAR_Common::getFileRoles()); - } - if ($fa['role'] == 'php' && $dir_prefix) { - $this->log(1, "Analyzing $file"); - $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file); - if ($srcinfo) { - $this->buildProvidesArray($srcinfo); - } - } - - // (ssb) Any checks we can do for baseinstalldir? - // (cox) Perhaps checks that either the target dir and - // baseInstall doesn't cointain "../../" - } - } - $this->_packageName = $pn = $info['package']; - $pnl = strlen($pn); - foreach ((array)$this->pkginfo['provides'] as $key => $what) { - if (isset($what['explicit'])) { - // skip conformance checks if the provides entry is - // specified in the package.xml file - continue; - } - extract($what); - if ($type == 'class') { - if (!strncasecmp($name, $pn, $pnl)) { - continue; - } - $warnings[] = "in $file: class \"$name\" not prefixed with package name \"$pn\""; - } elseif ($type == 'function') { - if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) { - continue; - } - $warnings[] = "in $file: function \"$name\" not prefixed with package name \"$pn\""; - } - } - - - return true; - } - - // }}} - // {{{ buildProvidesArray() - - /** - * Build a "provides" array from data returned by - * analyzeSourceCode(). The format of the built array is like - * this: - * - * array( - * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), - * ... - * ) - * - * - * @param array $srcinfo array with information about a source file - * as returned by the analyzeSourceCode() method. - * - * @return void - * - * @access public - * - */ - function buildProvidesArray($srcinfo) - { - $file = basename($srcinfo['source_file']); - $pn = ''; - if (isset($this->_packageName)) { - $pn = $this->_packageName; - } - $pnl = strlen($pn); - foreach ($srcinfo['declared_classes'] as $class) { - $key = "class;$class"; - if (isset($this->pkginfo['provides'][$key])) { - continue; - } - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'class', 'name' => $class); - if (isset($srcinfo['inheritance'][$class])) { - $this->pkginfo['provides'][$key]['extends'] = - $srcinfo['inheritance'][$class]; - } - } - foreach ($srcinfo['declared_methods'] as $class => $methods) { - foreach ($methods as $method) { - $function = "$class::$method"; - $key = "function;$function"; - if ($method{0} == '_' || !strcasecmp($method, $class) || - isset($this->pkginfo['provides'][$key])) { - continue; - } - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - foreach ($srcinfo['declared_functions'] as $function) { - $key = "function;$function"; - if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) { - continue; - } - if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) { - $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\""; - } - $this->pkginfo['provides'][$key] = - array('file'=> $file, 'type' => 'function', 'name' => $function); - } - } - - // }}} - // {{{ analyzeSourceCode() - - /** - * Analyze the source code of the given PHP file - * - * @param string Filename of the PHP file - * @return mixed - * @access public - */ - function analyzeSourceCode($file) - { - if (!function_exists("token_get_all")) { - return false; - } - if (!defined('T_DOC_COMMENT')) { - define('T_DOC_COMMENT', T_COMMENT); - } - if (!defined('T_INTERFACE')) { - define('T_INTERFACE', -1); - } - if (!defined('T_IMPLEMENTS')) { - define('T_IMPLEMENTS', -1); - } - if (!$fp = @fopen($file, "r")) { - return false; - } - $contents = fread($fp, filesize($file)); - $tokens = token_get_all($contents); -/* - for ($i = 0; $i < sizeof($tokens); $i++) { - @list($token, $data) = $tokens[$i]; - if (is_string($token)) { - var_dump($token); - } else { - print token_name($token) . ' '; - var_dump(rtrim($data)); - } - } -*/ - $look_for = 0; - $paren_level = 0; - $bracket_level = 0; - $brace_level = 0; - $lastphpdoc = ''; - $current_class = ''; - $current_interface = ''; - $current_class_level = -1; - $current_function = ''; - $current_function_level = -1; - $declared_classes = array(); - $declared_interfaces = array(); - $declared_functions = array(); - $declared_methods = array(); - $used_classes = array(); - $used_functions = array(); - $extends = array(); - $implements = array(); - $nodeps = array(); - $inquote = false; - $interface = false; - for ($i = 0; $i < sizeof($tokens); $i++) { - if (is_array($tokens[$i])) { - list($token, $data) = $tokens[$i]; - } else { - $token = $tokens[$i]; - $data = ''; - } - if ($inquote) { - if ($token != '"') { - continue; - } else { - $inquote = false; - } - } - switch ($token) { - case T_WHITESPACE: - continue; - case ';': - if ($interface) { - $current_function = ''; - $current_function_level = -1; - } - break; - case '"': - $inquote = true; - break; - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - case '{': $brace_level++; continue 2; - case '}': - $brace_level--; - if ($current_class_level == $brace_level) { - $current_class = ''; - $current_class_level = -1; - } - if ($current_function_level == $brace_level) { - $current_function = ''; - $current_function_level = -1; - } - continue 2; - case '[': $bracket_level++; continue 2; - case ']': $bracket_level--; continue 2; - case '(': $paren_level++; continue 2; - case ')': $paren_level--; continue 2; - case T_INTERFACE: - $interface = true; - case T_CLASS: - if (($current_class_level != -1) || ($current_function_level != -1)) { - PEAR::raiseError("Parser error: Invalid PHP file $file", - PEAR_COMMON_ERROR_INVALIDPHP); - return false; - } - case T_FUNCTION: - case T_NEW: - case T_EXTENDS: - case T_IMPLEMENTS: - $look_for = $token; - continue 2; - case T_STRING: - if (version_compare(zend_version(), '2.0', '<')) { - if (in_array(strtolower($data), - array('public', 'private', 'protected', 'abstract', - 'interface', 'implements', 'clone', 'throw') - )) { - PEAR::raiseError('Error: PHP5 packages must be packaged by php 5 PEAR'); - return false; - } - } - if ($look_for == T_CLASS) { - $current_class = $data; - $current_class_level = $brace_level; - $declared_classes[] = $current_class; - } elseif ($look_for == T_INTERFACE) { - $current_interface = $data; - $current_class_level = $brace_level; - $declared_interfaces[] = $current_interface; - } elseif ($look_for == T_IMPLEMENTS) { - $implements[$current_class] = $data; - } elseif ($look_for == T_EXTENDS) { - $extends[$current_class] = $data; - } elseif ($look_for == T_FUNCTION) { - if ($current_class) { - $current_function = "$current_class::$data"; - $declared_methods[$current_class][] = $data; - } elseif ($current_interface) { - $current_function = "$current_interface::$data"; - $declared_methods[$current_interface][] = $data; - } else { - $current_function = $data; - $declared_functions[] = $current_function; - } - $current_function_level = $brace_level; - $m = array(); - } elseif ($look_for == T_NEW) { - $used_classes[$data] = true; - } - $look_for = 0; - continue 2; - case T_VARIABLE: - $look_for = 0; - continue 2; - case T_DOC_COMMENT: - case T_COMMENT: - if (preg_match('!^/\*\*\s!', $data)) { - $lastphpdoc = $data; - if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) { - $nodeps = array_merge($nodeps, $m[1]); - } - } - continue 2; - case T_DOUBLE_COLON: - if (!($tokens[$i - 1][0] == T_WHITESPACE || $tokens[$i - 1][0] == T_STRING)) { - PEAR::raiseError("Parser error: Invalid PHP file $file", - PEAR_COMMON_ERROR_INVALIDPHP); - return false; - } - $class = $tokens[$i - 1][1]; - if (strtolower($class) != 'parent') { - $used_classes[$class] = true; - } - continue 2; - } - } - return array( - "source_file" => $file, - "declared_classes" => $declared_classes, - "declared_interfaces" => $declared_interfaces, - "declared_methods" => $declared_methods, - "declared_functions" => $declared_functions, - "used_classes" => array_diff(array_keys($used_classes), $nodeps), - "inheritance" => $extends, - "implements" => $implements, - ); - } - - // }}} - // {{{ betterStates() - - /** - * Return an array containing all of the states that are more stable than - * or equal to the passed in state - * - * @param string Release state - * @param boolean Determines whether to include $state in the list - * @return false|array False if $state is not a valid release state - */ - function betterStates($state, $include = false) - { - static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); - $i = array_search($state, $states); - if ($i === false) { - return false; - } - if ($include) { - $i--; - } - return array_slice($states, $i + 1); - } - - // }}} - // {{{ detectDependencies() - - function detectDependencies($any, $status_callback = null) - { - if (!function_exists("token_get_all")) { - return false; - } - if (PEAR::isError($info = $this->infoFromAny($any))) { - return $this->raiseError($info); - } - if (!is_array($info)) { - return false; - } - $deps = array(); - $used_c = $decl_c = $decl_f = $decl_m = array(); - foreach ($info['filelist'] as $file => $fa) { - $tmp = $this->analyzeSourceCode($file); - $used_c = @array_merge($used_c, $tmp['used_classes']); - $decl_c = @array_merge($decl_c, $tmp['declared_classes']); - $decl_f = @array_merge($decl_f, $tmp['declared_functions']); - $decl_m = @array_merge($decl_m, $tmp['declared_methods']); - $inheri = @array_merge($inheri, $tmp['inheritance']); - } - $used_c = array_unique($used_c); - $decl_c = array_unique($decl_c); - $undecl_c = array_diff($used_c, $decl_c); - return array('used_classes' => $used_c, - 'declared_classes' => $decl_c, - 'declared_methods' => $decl_m, - 'declared_functions' => $decl_f, - 'undeclared_classes' => $undecl_c, - 'inheritance' => $inheri, - ); - } - - // }}} - // {{{ getUserRoles() - - /** - * Get the valid roles for a PEAR package maintainer - * - * @return array - * @static - */ - function getUserRoles() - { - return $GLOBALS['_PEAR_Common_maintainer_roles']; - } - - // }}} - // {{{ getReleaseStates() - - /** - * Get the valid package release states of packages - * - * @return array - * @static - */ - function getReleaseStates() - { - return $GLOBALS['_PEAR_Common_release_states']; - } - - // }}} - // {{{ getDependencyTypes() - - /** - * Get the implemented dependency types (php, ext, pkg etc.) - * - * @return array - * @static - */ - function getDependencyTypes() - { - return $GLOBALS['_PEAR_Common_dependency_types']; - } - - // }}} - // {{{ getDependencyRelations() - - /** - * Get the implemented dependency relations (has, lt, ge etc.) - * - * @return array - * @static - */ - function getDependencyRelations() - { - return $GLOBALS['_PEAR_Common_dependency_relations']; - } - - // }}} - // {{{ getFileRoles() - - /** - * Get the implemented file roles - * - * @return array - * @static - */ - function getFileRoles() - { - return $GLOBALS['_PEAR_Common_file_roles']; - } - - // }}} - // {{{ getReplacementTypes() - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getReplacementTypes() - { - return $GLOBALS['_PEAR_Common_replacement_types']; - } - - // }}} - // {{{ getProvideTypes() - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getProvideTypes() - { - return $GLOBALS['_PEAR_Common_provide_types']; - } - - // }}} - // {{{ getScriptPhases() - - /** - * Get the implemented file replacement types in - * - * @return array - * @static - */ - function getScriptPhases() - { - return $GLOBALS['_PEAR_Common_script_phases']; - } - - // }}} - // {{{ validPackageName() - - /** - * Test whether a string contains a valid package name. - * - * @param string $name the package name to test - * - * @return bool - * - * @access public - */ - function validPackageName($name) - { - return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name); - } - - - // }}} - // {{{ validPackageVersion() - - /** - * Test whether a string contains a valid package version. - * - * @param string $ver the package version to test - * - * @return bool - * - * @access public - */ - function validPackageVersion($ver) - { - return (bool)preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver); - } - - - // }}} - - // {{{ downloadHttp() - - /** - * Download a file through HTTP. Considers suggested file name in - * Content-disposition: header and can run a callback function for - * different events. The callback will be called with two - * parameters: the callback type, and parameters. The implemented - * callback types are: - * - * 'setup' called at the very beginning, parameter is a UI object - * that should be used for all output - * 'message' the parameter is a string with an informational message - * 'saveas' may be used to save with a different file name, the - * parameter is the filename that is about to be used. - * If a 'saveas' callback returns a non-empty string, - * that file name will be used as the filename instead. - * Note that $save_dir will not be affected by this, only - * the basename of the file. - * 'start' download is starting, parameter is number of bytes - * that are expected, or -1 if unknown - * 'bytesread' parameter is the number of bytes read so far - * 'done' download is complete, parameter is the total number - * of bytes read - * 'connfailed' if the TCP connection fails, this callback is called - * with array(host,port,errno,errmsg) - * 'writefailed' if writing to disk fails, this callback is called - * with array(destfile,errmsg) - * - * If an HTTP proxy has been configured (http_proxy PEAR_Config - * setting), the proxy will be used. - * - * @param string $url the URL to download - * @param object $ui PEAR_Frontend_* instance - * @param object $config PEAR_Config instance - * @param string $save_dir (optional) directory to save file in - * @param mixed $callback (optional) function/method to call for status - * updates - * - * @return string Returns the full path of the downloaded file or a PEAR - * error on failure. If the error is caused by - * socket-related errors, the error object will - * have the fsockopen error code available through - * getCode(). - * - * @access public - */ - function downloadHttp($url, &$ui, $save_dir = '.', $callback = null) - { - if ($callback) { - call_user_func($callback, 'setup', array(&$ui)); - } - if (preg_match('!^http://([^/:?#]*)(:(\d+))?(/.*)!', $url, $matches)) { - list(,$host,,$port,$path) = $matches; - } - if (isset($this)) { - $config = &$this->config; - } else { - $config = &PEAR_Config::singleton(); - } - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - if ($proxy = parse_url($config->get('http_proxy'))) { - $proxy_host = @$proxy['host']; - $proxy_port = @$proxy['port']; - $proxy_user = @$proxy['user']; - $proxy_pass = @$proxy['pass']; - - if ($proxy_port == '') { - $proxy_port = 8080; - } - if ($callback) { - call_user_func($callback, 'message', "Using HTTP proxy $host:$port"); - } - } - if (empty($port)) { - $port = 80; - } - if ($proxy_host != '') { - $fp = @fsockopen($proxy_host, $proxy_port, $errno, $errstr); - if (!$fp) { - if ($callback) { - call_user_func($callback, 'connfailed', array($proxy_host, $proxy_port, - $errno, $errstr)); - } - return PEAR::raiseError("Connection to `$proxy_host:$proxy_port' failed: $errstr", $errno); - } - $request = "GET $url HTTP/1.0\r\n"; - } else { - $fp = @fsockopen($host, $port, $errno, $errstr); - if (!$fp) { - if ($callback) { - call_user_func($callback, 'connfailed', array($host, $port, - $errno, $errstr)); - } - return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno); - } - $request = "GET $path HTTP/1.0\r\n"; - } - $request .= "Host: $host:$port\r\n". - "User-Agent: PHP/".PHP_VERSION."\r\n"; - if ($proxy_host != '' && $proxy_user != '') { - $request .= 'Proxy-Authorization: Basic ' . - base64_encode($proxy_user . ':' . $proxy_pass) . "\r\n"; - } - $request .= "\r\n"; - fwrite($fp, $request); - $headers = array(); - while (trim($line = fgets($fp, 1024))) { - if (preg_match('/^([^:]+):\s+(.*)\s*$/', $line, $matches)) { - $headers[strtolower($matches[1])] = trim($matches[2]); - } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) { - if ($matches[1] != 200) { - return PEAR::raiseError("File http://$host:$port$path not valid (received: $line)"); - } - } - } - if (isset($headers['content-disposition']) && - preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|$)/', $headers['content-disposition'], $matches)) { - $save_as = basename($matches[1]); - } else { - $save_as = basename($url); - } - if ($callback) { - $tmp = call_user_func($callback, 'saveas', $save_as); - if ($tmp) { - $save_as = $tmp; - } - } - $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as; - if (!$wp = @fopen($dest_file, 'wb')) { - fclose($fp); - if ($callback) { - call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); - } - return PEAR::raiseError("could not open $dest_file for writing"); - } - if (isset($headers['content-length'])) { - $length = $headers['content-length']; - } else { - $length = -1; - } - $bytes = 0; - if ($callback) { - call_user_func($callback, 'start', array(basename($dest_file), $length)); - } - while ($data = @fread($fp, 1024)) { - $bytes += strlen($data); - if ($callback) { - call_user_func($callback, 'bytesread', $bytes); - } - if (!@fwrite($wp, $data)) { - fclose($fp); - if ($callback) { - call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); - } - return PEAR::raiseError("$dest_file: write failed ($php_errormsg)"); - } - } - fclose($fp); - fclose($wp); - if ($callback) { - call_user_func($callback, 'done', $bytes); - } - return $dest_file; - } - - // }}} - // {{{ sortPkgDeps() - - /** - * Sort a list of arrays of array(downloaded packagefilename) by dependency. - * - * It also removes duplicate dependencies - * @param array - * @param boolean Sort packages in reverse order if true - * @return array array of array(packagefilename, package.xml contents) - */ - function sortPkgDeps(&$packages, $uninstall = false) - { - $ret = array(); - if ($uninstall) { - foreach($packages as $packageinfo) { - $ret[] = array('info' => $packageinfo); - } - } else { - foreach($packages as $packagefile) { - if (!is_array($packagefile)) { - $ret[] = array('file' => $packagefile, - 'info' => $a = $this->infoFromAny($packagefile), - 'pkg' => $a['package']); - } else { - $ret[] = $packagefile; - } - } - } - $checkdupes = array(); - $newret = array(); - foreach($ret as $i => $p) { - if (!isset($checkdupes[$p['info']['package']])) { - $checkdupes[$p['info']['package']][] = $i; - $newret[] = $p; - } - } - $this->_packageSortTree = $this->_getPkgDepTree($newret); - - $func = $uninstall ? '_sortPkgDepsRev' : '_sortPkgDeps'; - usort($newret, array(&$this, $func)); - $this->_packageSortTree = null; - $packages = $newret; - } - - // }}} - // {{{ _sortPkgDeps() - - /** - * Compare two package's package.xml, and sort - * so that dependencies are installed first - * - * This is a crude compare, real dependency checking is done on install. - * The only purpose this serves is to make the command-line - * order-independent (you can list a dependent package first, and - * installation occurs in the order required) - * @access private - */ - function _sortPkgDeps($p1, $p2) - { - $p1name = $p1['info']['package']; - $p2name = $p2['info']['package']; - $p1deps = $this->_getPkgDeps($p1); - $p2deps = $this->_getPkgDeps($p2); - if (!count($p1deps) && !count($p2deps)) { - return 0; // order makes no difference - } - if (!count($p1deps)) { - return -1; // package 2 has dependencies, package 1 doesn't - } - if (!count($p2deps)) { - return 1; // package 1 has dependencies, package 2 doesn't - } - // both have dependencies - if (in_array($p1name, $p2deps)) { - return -1; // put package 1 first: package 2 depends on package 1 - } - if (in_array($p2name, $p1deps)) { - return 1; // put package 2 first: package 1 depends on package 2 - } - if ($this->_removedDependency($p1name, $p2name)) { - return -1; // put package 1 first: package 2 depends on packages that depend on package 1 - } - if ($this->_removedDependency($p2name, $p1name)) { - return 1; // put package 2 first: package 1 depends on packages that depend on package 2 - } - // doesn't really matter if neither depends on the other - return 0; - } - - // }}} - // {{{ _sortPkgDepsRev() - - /** - * Compare two package's package.xml, and sort - * so that dependencies are uninstalled last - * - * This is a crude compare, real dependency checking is done on uninstall. - * The only purpose this serves is to make the command-line - * order-independent (you can list a dependency first, and - * uninstallation occurs in the order required) - * @access private - */ - function _sortPkgDepsRev($p1, $p2) - { - $p1name = $p1['info']['package']; - $p2name = $p2['info']['package']; - $p1deps = $this->_getRevPkgDeps($p1); - $p2deps = $this->_getRevPkgDeps($p2); - if (!count($p1deps) && !count($p2deps)) { - return 0; // order makes no difference - } - if (!count($p1deps)) { - return 1; // package 2 has dependencies, package 1 doesn't - } - if (!count($p2deps)) { - return -1; // package 2 has dependencies, package 1 doesn't - } - // both have dependencies - if (in_array($p1name, $p2deps)) { - return 1; // put package 1 last - } - if (in_array($p2name, $p1deps)) { - return -1; // put package 2 last - } - if ($this->_removedDependency($p1name, $p2name)) { - return 1; // put package 1 last: package 2 depends on packages that depend on package 1 - } - if ($this->_removedDependency($p2name, $p1name)) { - return -1; // put package 2 last: package 1 depends on packages that depend on package 2 - } - // doesn't really matter if neither depends on the other - return 0; - } - - // }}} - // {{{ _getPkgDeps() - - /** - * get an array of package dependency names - * @param array - * @return array - * @access private - */ - function _getPkgDeps($p) - { - if (!isset($p['info']['releases'])) { - return $this->_getRevPkgDeps($p); - } - $rel = array_shift($p['info']['releases']); - if (!isset($rel['deps'])) { - return array(); - } - $ret = array(); - foreach($rel['deps'] as $dep) { - if ($dep['type'] == 'pkg') { - $ret[] = $dep['name']; - } - } - return $ret; - } - - // }}} - // {{{ _getPkgDeps() - - /** - * get an array representation of the package dependency tree - * @return array - * @access private - */ - function _getPkgDepTree($packages) - { - $tree = array(); - foreach ($packages as $p) { - $package = $p['info']['package']; - $deps = $this->_getPkgDeps($p); - $tree[$package] = $deps; - } - return $tree; - } - - // }}} - // {{{ _removedDependency($p1, $p2) - - /** - * get an array of package dependency names for uninstall - * @param string package 1 name - * @param string package 2 name - * @return bool - * @access private - */ - function _removedDependency($p1, $p2) - { - if (empty($this->_packageSortTree[$p2])) { - return false; - } - if (!in_array($p1, $this->_packageSortTree[$p2])) { - foreach ($this->_packageSortTree[$p2] as $potential) { - if ($this->_removedDependency($p1, $potential)) { - return true; - } - } - return false; - } - return true; - } - - // }}} - // {{{ _getRevPkgDeps() - - /** - * get an array of package dependency names for uninstall - * @param array - * @return array - * @access private - */ - function _getRevPkgDeps($p) - { - if (!isset($p['info']['release_deps'])) { - return array(); - } - $ret = array(); - foreach($p['info']['release_deps'] as $dep) { - if ($dep['type'] == 'pkg') { - $ret[] = $dep['name']; - } - } - return $ret; - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Config.php b/3rdparty/PEAR/Config.php deleted file mode 100644 index ba641735250..00000000000 --- a/3rdparty/PEAR/Config.php +++ /dev/null @@ -1,1169 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Config.php,v 1.52 2004/01/08 17:33:12 sniper Exp $ - -require_once 'PEAR.php'; -require_once 'System.php'; - -/** - * Last created PEAR_Config instance. - * @var object - */ -$GLOBALS['_PEAR_Config_instance'] = null; -if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) { - $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear'; -} else { - $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR; -} - -// Below we define constants with default values for all configuration -// parameters except username/password. All of them can have their -// defaults set through environment variables. The reason we use the -// PHP_ prefix is for some security, PHP protects environment -// variables starting with PHP_*. - -if (getenv('PHP_PEAR_SYSCONF_DIR')) { - define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); -} elseif (getenv('SystemRoot')) { - define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); -} else { - define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); -} - -// Default for master_server -if (getenv('PHP_PEAR_MASTER_SERVER')) { - define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER')); -} else { - define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net'); -} - -// Default for http_proxy -if (getenv('PHP_PEAR_HTTP_PROXY')) { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY')); -} elseif (getenv('http_proxy')) { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy')); -} else { - define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', ''); -} - -// Default for php_dir -if (getenv('PHP_PEAR_INSTALL_DIR')) { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR')); -} else { - if (@is_dir($PEAR_INSTALL_DIR)) { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', - $PEAR_INSTALL_DIR); - } else { - define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR); - } -} - -// Default for ext_dir -if (getenv('PHP_PEAR_EXTENSION_DIR')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR')); -} else { - if (ini_get('extension_dir')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir')); - } elseif (defined('PEAR_EXTENSION_DIR') && @is_dir(PEAR_EXTENSION_DIR)) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', PEAR_EXTENSION_DIR); - } elseif (defined('PHP_EXTENSION_DIR')) { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', PHP_EXTENSION_DIR); - } else { - define('PEAR_CONFIG_DEFAULT_EXT_DIR', '.'); - } -} - -// Default for doc_dir -if (getenv('PHP_PEAR_DOC_DIR')) { - define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_DOC_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs'); -} - -// Default for bin_dir -if (getenv('PHP_PEAR_BIN_DIR')) { - define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR); -} - -// Default for data_dir -if (getenv('PHP_PEAR_DATA_DIR')) { - define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_DATA_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data'); -} - -// Default for test_dir -if (getenv('PHP_PEAR_TEST_DIR')) { - define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_TEST_DIR', - $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests'); -} - -// Default for cache_dir -if (getenv('PHP_PEAR_CACHE_DIR')) { - define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR')); -} else { - define('PEAR_CONFIG_DEFAULT_CACHE_DIR', - System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . - DIRECTORY_SEPARATOR . 'cache'); -} - -// Default for php_bin -if (getenv('PHP_PEAR_PHP_BIN')) { - define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN')); -} else { - define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR. - DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : '')); -} - -// Default for verbose -if (getenv('PHP_PEAR_VERBOSE')) { - define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE')); -} else { - define('PEAR_CONFIG_DEFAULT_VERBOSE', 1); -} - -// Default for preferred_state -if (getenv('PHP_PEAR_PREFERRED_STATE')) { - define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE')); -} else { - define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable'); -} - -// Default for umask -if (getenv('PHP_PEAR_UMASK')) { - define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK')); -} else { - define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask())); -} - -// Default for cache_ttl -if (getenv('PHP_PEAR_CACHE_TTL')) { - define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL')); -} else { - define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600); -} - -// Default for sig_type -if (getenv('PHP_PEAR_SIG_TYPE')) { - define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg'); -} - -// Default for sig_bin -if (getenv('PHP_PEAR_SIG_BIN')) { - define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_BIN', - System::which( - 'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg')); -} - -// Default for sig_keydir -if (getenv('PHP_PEAR_SIG_KEYDIR')) { - define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR')); -} else { - define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', - PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys'); -} - -/** - * This is a class for storing configuration data, keeping track of - * which are system-defined, user-defined or defaulted. - */ -class PEAR_Config extends PEAR -{ - // {{{ properties - - /** - * Array of config files used. - * - * @var array layer => config file - */ - var $files = array( - 'system' => '', - 'user' => '', - ); - - var $layers = array(); - - /** - * Configuration data, two-dimensional array where the first - * dimension is the config layer ('user', 'system' and 'default'), - * and the second dimension is keyname => value. - * - * The order in the first dimension is important! Earlier - * layers will shadow later ones when a config value is - * requested (if a 'user' value exists, it will be returned first, - * then 'system' and finally 'default'). - * - * @var array layer => array(keyname => value, ...) - */ - var $configuration = array( - 'user' => array(), - 'system' => array(), - 'default' => array(), - ); - - /** - * Information about the configuration data. Stores the type, - * default value and a documentation string for each configuration - * value. - * - * @var array layer => array(infotype => value, ...) - */ - var $configuration_info = array( - // Internet Access - 'master_server' => array( - 'type' => 'string', - 'default' => 'pear.php.net', - 'doc' => 'name of the main PEAR server', - 'prompt' => 'PEAR server', - 'group' => 'Internet Access', - ), - 'http_proxy' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY, - 'doc' => 'HTTP proxy (host:port) to use when downloading packages', - 'prompt' => 'HTTP Proxy Server Address', - 'group' => 'Internet Access', - ), - // File Locations - 'php_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_PHP_DIR, - 'doc' => 'directory where .php files are installed', - 'prompt' => 'PEAR directory', - 'group' => 'File Locations', - ), - 'ext_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, - 'doc' => 'directory where loadable extensions are installed', - 'prompt' => 'PHP extension directory', - 'group' => 'File Locations', - ), - 'doc_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_DOC_DIR, - 'doc' => 'directory where documentation is installed', - 'prompt' => 'PEAR documentation directory', - 'group' => 'File Locations', - ), - 'bin_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_BIN_DIR, - 'doc' => 'directory where executables are installed', - 'prompt' => 'PEAR executables directory', - 'group' => 'File Locations', - ), - 'data_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_DATA_DIR, - 'doc' => 'directory where data files are installed', - 'prompt' => 'PEAR data directory', - 'group' => 'File Locations (Advanced)', - ), - 'test_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_TEST_DIR, - 'doc' => 'directory where regression tests are installed', - 'prompt' => 'PEAR test directory', - 'group' => 'File Locations (Advanced)', - ), - 'cache_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR, - 'doc' => 'directory which is used for XMLRPC cache', - 'prompt' => 'PEAR Installer cache directory', - 'group' => 'File Locations (Advanced)', - ), - 'php_bin' => array( - 'type' => 'file', - 'default' => PEAR_CONFIG_DEFAULT_PHP_BIN, - 'doc' => 'PHP CLI/CGI binary for executing scripts', - 'prompt' => 'PHP CLI/CGI binary', - 'group' => 'File Locations (Advanced)', - ), - // Maintainers - 'username' => array( - 'type' => 'string', - 'default' => '', - 'doc' => '(maintainers) your PEAR account name', - 'prompt' => 'PEAR username (for maintainers)', - 'group' => 'Maintainers', - ), - 'password' => array( - 'type' => 'password', - 'default' => '', - 'doc' => '(maintainers) your PEAR account password', - 'prompt' => 'PEAR password (for maintainers)', - 'group' => 'Maintainers', - ), - // Advanced - 'verbose' => array( - 'type' => 'integer', - 'default' => PEAR_CONFIG_DEFAULT_VERBOSE, - 'doc' => 'verbosity level -0: really quiet -1: somewhat quiet -2: verbose -3: debug', - 'prompt' => 'Debug Log Level', - 'group' => 'Advanced', - ), - 'preferred_state' => array( - 'type' => 'set', - 'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE, - 'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified', - 'valid_set' => array( - 'stable', 'beta', 'alpha', 'devel', 'snapshot'), - 'prompt' => 'Preferred Package State', - 'group' => 'Advanced', - ), - 'umask' => array( - 'type' => 'mask', - 'default' => PEAR_CONFIG_DEFAULT_UMASK, - 'doc' => 'umask used when creating files (Unix-like systems only)', - 'prompt' => 'Unix file mask', - 'group' => 'Advanced', - ), - 'cache_ttl' => array( - 'type' => 'integer', - 'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL, - 'doc' => 'amount of secs where the local cache is used and not updated', - 'prompt' => 'Cache TimeToLive', - 'group' => 'Advanced', - ), - 'sig_type' => array( - 'type' => 'set', - 'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE, - 'doc' => 'which package signature mechanism to use', - 'valid_set' => array('gpg'), - 'prompt' => 'Package Signature Type', - 'group' => 'Maintainers', - ), - 'sig_bin' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_SIG_BIN, - 'doc' => 'which package signature mechanism to use', - 'prompt' => 'Signature Handling Program', - 'group' => 'Maintainers', - ), - 'sig_keyid' => array( - 'type' => 'string', - 'default' => '', - 'doc' => 'which key to use for signing with', - 'prompt' => 'Signature Key Id', - 'group' => 'Maintainers', - ), - 'sig_keydir' => array( - 'type' => 'string', - 'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR, - 'doc' => 'which package signature mechanism to use', - 'prompt' => 'Signature Key Directory', - 'group' => 'Maintainers', - ), - ); - - // }}} - - // {{{ PEAR_Config([file], [defaults_file]) - - /** - * Constructor. - * - * @param string (optional) file to read user-defined options from - * @param string (optional) file to read system-wide defaults from - * - * @access public - * - * @see PEAR_Config::singleton - */ - function PEAR_Config($user_file = '', $system_file = '') - { - $this->PEAR(); - $sl = DIRECTORY_SEPARATOR; - if (empty($user_file)) { - if (OS_WINDOWS) { - $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; - } else { - $user_file = getenv('HOME') . $sl . '.pearrc'; - } - } - if (empty($system_file)) { - if (OS_WINDOWS) { - $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; - } else { - $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'; - } - } - $this->layers = array_keys($this->configuration); - $this->files['user'] = $user_file; - $this->files['system'] = $system_file; - if ($user_file && file_exists($user_file)) { - $this->readConfigFile($user_file); - } - if ($system_file && file_exists($system_file)) { - $this->mergeConfigFile($system_file, false, 'system'); - } - foreach ($this->configuration_info as $key => $info) { - $this->configuration['default'][$key] = $info['default']; - } - //$GLOBALS['_PEAR_Config_instance'] = &$this; - } - - // }}} - // {{{ singleton([file], [defaults_file]) - - /** - * Static singleton method. If you want to keep only one instance - * of this class in use, this method will give you a reference to - * the last created PEAR_Config object if one exists, or create a - * new object. - * - * @param string (optional) file to read user-defined options from - * @param string (optional) file to read system-wide defaults from - * - * @return object an existing or new PEAR_Config instance - * - * @access public - * - * @see PEAR_Config::PEAR_Config - */ - function &singleton($user_file = '', $system_file = '') - { - if (is_object($GLOBALS['_PEAR_Config_instance'])) { - return $GLOBALS['_PEAR_Config_instance']; - } - $GLOBALS['_PEAR_Config_instance'] = - &new PEAR_Config($user_file, $system_file); - return $GLOBALS['_PEAR_Config_instance']; - } - - // }}} - // {{{ readConfigFile([file], [layer]) - - /** - * Reads configuration data from a file. All existing values in - * the config layer are discarded and replaced with data from the - * file. - * - * @param string (optional) file to read from, if NULL or not - * specified, the last-used file for the same layer (second param) - * is used - * - * @param string (optional) config layer to insert data into - * ('user' or 'system') - * - * @return bool TRUE on success or a PEAR error on failure - * - * @access public - */ - function readConfigFile($file = null, $layer = 'user') - { - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config file type `$layer'"); - } - if ($file === null) { - $file = $this->files[$layer]; - } - $data = $this->_readConfigDataFrom($file); - if (PEAR::isError($data)) { - return $data; - } - $this->_decodeInput($data); - $this->configuration[$layer] = $data; - return true; - } - - // }}} - // {{{ mergeConfigFile(file, [override], [layer]) - - /** - * Merges data into a config layer from a file. Does the same - * thing as readConfigFile, except it does not replace all - * existing values in the config layer. - * - * @param string file to read from - * - * @param bool (optional) whether to overwrite existing data - * (default TRUE) - * - * @param string config layer to insert data into ('user' or - * 'system') - * - * @return bool TRUE on success or a PEAR error on failure - * - * @access public. - */ - function mergeConfigFile($file, $override = true, $layer = 'user') - { - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config file type `$layer'"); - } - if ($file === null) { - $file = $this->files[$layer]; - } - $data = $this->_readConfigDataFrom($file); - if (PEAR::isError($data)) { - return $data; - } - $this->_decodeInput($data); - if ($override) { - $this->configuration[$layer] = array_merge($this->configuration[$layer], $data); - } else { - $this->configuration[$layer] = array_merge($data, $this->configuration[$layer]); - } - return true; - } - - // }}} - // {{{ writeConfigFile([file], [layer]) - - /** - * Writes data into a config layer from a file. - * - * @param string file to read from - * - * @param bool (optional) whether to overwrite existing data - * (default TRUE) - * - * @param string config layer to insert data into ('user' or - * 'system') - * - * @return bool TRUE on success or a PEAR error on failure - * - * @access public. - */ - function writeConfigFile($file = null, $layer = 'user', $data = null) - { - if ($layer == 'both' || $layer == 'all') { - foreach ($this->files as $type => $file) { - $err = $this->writeConfigFile($file, $type, $data); - if (PEAR::isError($err)) { - return $err; - } - } - return true; - } - if (empty($this->files[$layer])) { - return $this->raiseError("unknown config file type `$layer'"); - } - if ($file === null) { - $file = $this->files[$layer]; - } - $data = ($data === null) ? $this->configuration[$layer] : $data; - $this->_encodeOutput($data); - $opt = array('-p', dirname($file)); - if (!@System::mkDir($opt)) { - return $this->raiseError("could not create directory: " . dirname($file)); - } - if (@is_file($file) && !@is_writeable($file)) { - return $this->raiseError("no write access to $file!"); - } - $fp = @fopen($file, "w"); - if (!$fp) { - return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed"); - } - $contents = "#PEAR_Config 0.9\n" . serialize($data); - if (!@fwrite($fp, $contents)) { - return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed"); - } - return true; - } - - // }}} - // {{{ _readConfigDataFrom(file) - - /** - * Reads configuration data from a file and returns the parsed data - * in an array. - * - * @param string file to read from - * - * @return array configuration data or a PEAR error on failure - * - * @access private - */ - function _readConfigDataFrom($file) - { - $fp = @fopen($file, "r"); - if (!$fp) { - return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed"); - } - $size = filesize($file); - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - $contents = fread($fp, $size); - set_magic_quotes_runtime($rt); - fclose($fp); - $version = '0.1'; - if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) { - $version = $matches[1]; - $contents = substr($contents, strlen($matches[0])); - } - if (version_compare("$version", '1', '<')) { - $data = unserialize($contents); - if (!is_array($data)) { - if (strlen(trim($contents)) > 0) { - $error = "PEAR_Config: bad data in $file"; -// if (isset($this)) { - return $this->raiseError($error); -// } else { -// return PEAR::raiseError($error); - } else { - $data = array(); - } - } - // add parsing of newer formats here... - } else { - return $this->raiseError("$file: unknown version `$version'"); - } - return $data; - } - - // }}} - // {{{ getConfFile(layer) - /** - * Gets the file used for storing the config for a layer - * - * @param string $layer 'user' or 'system' - */ - - function getConfFile($layer) - { - return $this->files[$layer]; - } - - // }}} - // {{{ _encodeOutput(&data) - - /** - * Encodes/scrambles configuration data before writing to files. - * Currently, 'password' values will be base64-encoded as to avoid - * that people spot cleartext passwords by accident. - * - * @param array (reference) array to encode values in - * - * @return bool TRUE on success - * - * @access private - */ - function _encodeOutput(&$data) - { - foreach ($data as $key => $value) { - if (!isset($this->configuration_info[$key])) { - continue; - } - $type = $this->configuration_info[$key]['type']; - switch ($type) { - // we base64-encode passwords so they are at least - // not shown in plain by accident - case 'password': { - $data[$key] = base64_encode($data[$key]); - break; - } - case 'mask': { - $data[$key] = octdec($data[$key]); - break; - } - } - } - return true; - } - - // }}} - // {{{ _decodeInput(&data) - - /** - * Decodes/unscrambles configuration data after reading from files. - * - * @param array (reference) array to encode values in - * - * @return bool TRUE on success - * - * @access private - * - * @see PEAR_Config::_encodeOutput - */ - function _decodeInput(&$data) - { - if (!is_array($data)) { - return true; - } - foreach ($data as $key => $value) { - if (!isset($this->configuration_info[$key])) { - continue; - } - $type = $this->configuration_info[$key]['type']; - switch ($type) { - case 'password': { - $data[$key] = base64_decode($data[$key]); - break; - } - case 'mask': { - $data[$key] = decoct($data[$key]); - break; - } - } - } - return true; - } - - // }}} - // {{{ get(key, [layer]) - - /** - * Returns a configuration value, prioritizing layers as per the - * layers property. - * - * @param string config key - * - * @return mixed the config value, or NULL if not found - * - * @access public - */ - function get($key, $layer = null) - { - if ($layer === null) { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer][$key])) { - return $this->configuration[$layer][$key]; - } - } - } elseif (isset($this->configuration[$layer][$key])) { - return $this->configuration[$layer][$key]; - } - return null; - } - - // }}} - // {{{ set(key, value, [layer]) - - /** - * Set a config value in a specific layer (defaults to 'user'). - * Enforces the types defined in the configuration_info array. An - * integer config variable will be cast to int, and a set config - * variable will be validated against its legal values. - * - * @param string config key - * - * @param string config value - * - * @param string (optional) config layer - * - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function set($key, $value, $layer = 'user') - { - if (empty($this->configuration_info[$key])) { - return false; - } - extract($this->configuration_info[$key]); - switch ($type) { - case 'integer': - $value = (int)$value; - break; - case 'set': { - // If a valid_set is specified, require the value to - // be in the set. If there is no valid_set, accept - // any value. - if ($valid_set) { - reset($valid_set); - if ((key($valid_set) === 0 && !in_array($value, $valid_set)) || - (key($valid_set) !== 0 && empty($valid_set[$value]))) - { - return false; - } - } - break; - } - } - $this->configuration[$layer][$key] = $value; - return true; - } - - // }}} - // {{{ getType(key) - - /** - * Get the type of a config value. - * - * @param string config key - * - * @return string type, one of "string", "integer", "file", - * "directory", "set" or "password". - * - * @access public - * - */ - function getType($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['type']; - } - return false; - } - - // }}} - // {{{ getDocs(key) - - /** - * Get the documentation for a config value. - * - * @param string config key - * - * @return string documentation string - * - * @access public - * - */ - function getDocs($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['doc']; - } - return false; - } - // }}} - // {{{ getPrompt(key) - - /** - * Get the short documentation for a config value. - * - * @param string config key - * - * @return string short documentation string - * - * @access public - * - */ - function getPrompt($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['prompt']; - } - return false; - } - // }}} - // {{{ getGroup(key) - - /** - * Get the parameter group for a config key. - * - * @param string config key - * - * @return string parameter group - * - * @access public - * - */ - function getGroup($key) - { - if (isset($this->configuration_info[$key])) { - return $this->configuration_info[$key]['group']; - } - return false; - } - - // }}} - // {{{ getGroups() - - /** - * Get the list of parameter groups. - * - * @return array list of parameter groups - * - * @access public - * - */ - function getGroups() - { - $tmp = array(); - foreach ($this->configuration_info as $key => $info) { - $tmp[$info['group']] = 1; - } - return array_keys($tmp); - } - - // }}} - // {{{ getGroupKeys() - - /** - * Get the list of the parameters in a group. - * - * @param string $group parameter group - * - * @return array list of parameters in $group - * - * @access public - * - */ - function getGroupKeys($group) - { - $keys = array(); - foreach ($this->configuration_info as $key => $info) { - if ($info['group'] == $group) { - $keys[] = $key; - } - } - return $keys; - } - - // }}} - // {{{ getSetValues(key) - - /** - * Get the list of allowed set values for a config value. Returns - * NULL for config values that are not sets. - * - * @param string config key - * - * @return array enumerated array of set values, or NULL if the - * config key is unknown or not a set - * - * @access public - * - */ - function getSetValues($key) - { - if (isset($this->configuration_info[$key]) && - isset($this->configuration_info[$key]['type']) && - $this->configuration_info[$key]['type'] == 'set') - { - $valid_set = $this->configuration_info[$key]['valid_set']; - reset($valid_set); - if (key($valid_set) === 0) { - return $valid_set; - } - return array_keys($valid_set); - } - return false; - } - - // }}} - // {{{ getKeys() - - /** - * Get all the current config keys. - * - * @return array simple array of config keys - * - * @access public - */ - function getKeys() - { - $keys = array(); - foreach ($this->layers as $layer) { - $keys = array_merge($keys, $this->configuration[$layer]); - } - return array_keys($keys); - } - - // }}} - // {{{ remove(key, [layer]) - - /** - * Remove the a config key from a specific config layer. - * - * @param string config key - * - * @param string (optional) config layer - * - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function remove($key, $layer = 'user') - { - if (isset($this->configuration[$layer][$key])) { - unset($this->configuration[$layer][$key]); - return true; - } - return false; - } - - // }}} - // {{{ removeLayer(layer) - - /** - * Temporarily remove an entire config layer. USE WITH CARE! - * - * @param string config key - * - * @param string (optional) config layer - * - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function removeLayer($layer) - { - if (isset($this->configuration[$layer])) { - $this->configuration[$layer] = array(); - return true; - } - return false; - } - - // }}} - // {{{ store([layer]) - - /** - * Stores configuration data in a layer. - * - * @param string config layer to store - * - * @return bool TRUE on success, or PEAR error on failure - * - * @access public - */ - function store($layer = 'user', $data = null) - { - return $this->writeConfigFile(null, $layer, $data); - } - - // }}} - // {{{ toDefault(key) - - /** - * Unset the user-defined value of a config key, reverting the - * value to the system-defined one. - * - * @param string config key - * - * @return bool TRUE on success, FALSE on failure - * - * @access public - */ - function toDefault($key) - { - trigger_error("PEAR_Config::toDefault() deprecated, use PEAR_Config::remove() instead", E_USER_NOTICE); - return $this->remove($key, 'user'); - } - - // }}} - // {{{ definedBy(key) - - /** - * Tells what config layer that gets to define a key. - * - * @param string config key - * - * @return string the config layer, or an empty string if not found - * - * @access public - */ - function definedBy($key) - { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer][$key])) { - return $layer; - } - } - return ''; - } - - // }}} - // {{{ isDefaulted(key) - - /** - * Tells whether a config value has a system-defined value. - * - * @param string config key - * - * @return bool - * - * @access public - * - * @deprecated - */ - function isDefaulted($key) - { - trigger_error("PEAR_Config::isDefaulted() deprecated, use PEAR_Config::definedBy() instead", E_USER_NOTICE); - return $this->definedBy($key) == 'system'; - } - - // }}} - // {{{ isDefined(key) - - /** - * Tells whether a given key exists as a config value. - * - * @param string config key - * - * @return bool whether exists in this object - * - * @access public - */ - function isDefined($key) - { - foreach ($this->layers as $layer) { - if (isset($this->configuration[$layer][$key])) { - return true; - } - } - return false; - } - - // }}} - // {{{ isDefinedLayer(key) - - /** - * Tells whether a given config layer exists. - * - * @param string config layer - * - * @return bool whether exists in this object - * - * @access public - */ - function isDefinedLayer($layer) - { - return isset($this->configuration[$layer]); - } - - // }}} - // {{{ getLayers() - - /** - * Returns the layers defined (except the 'default' one) - * - * @return array of the defined layers - */ - function getLayers() - { - $cf = $this->configuration; - unset($cf['default']); - return array_keys($cf); - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Dependency.php b/3rdparty/PEAR/Dependency.php deleted file mode 100644 index 705167aa70f..00000000000 --- a/3rdparty/PEAR/Dependency.php +++ /dev/null @@ -1,487 +0,0 @@ - | -// | Stig Bakken | -// +----------------------------------------------------------------------+ -// -// $Id: Dependency.php,v 1.36.4.1 2004/12/27 07:04:19 cellog Exp $ - -require_once "PEAR.php"; - -define('PEAR_DEPENDENCY_MISSING', -1); -define('PEAR_DEPENDENCY_CONFLICT', -2); -define('PEAR_DEPENDENCY_UPGRADE_MINOR', -3); -define('PEAR_DEPENDENCY_UPGRADE_MAJOR', -4); -define('PEAR_DEPENDENCY_BAD_DEPENDENCY', -5); -define('PEAR_DEPENDENCY_MISSING_OPTIONAL', -6); -define('PEAR_DEPENDENCY_CONFLICT_OPTIONAL', -7); -define('PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL', -8); -define('PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL', -9); - -/** - * Dependency check for PEAR packages - * - * The class is based on the dependency RFC that can be found at - * http://cvs.php.net/cvs.php/pearweb/rfc. It requires PHP >= 4.1 - * - * @author Tomas V.V.Vox - * @author Stig Bakken - */ -class PEAR_Dependency -{ - // {{{ constructor - /** - * Constructor - * - * @access public - * @param object Registry object - * @return void - */ - function PEAR_Dependency(&$registry) - { - $this->registry = &$registry; - } - - // }}} - // {{{ callCheckMethod() - - /** - * This method maps the XML dependency definition to the - * corresponding one from PEAR_Dependency - * - *
    -    * $opts => Array
    -    *    (
    -    *        [type] => pkg
    -    *        [rel] => ge
    -    *        [version] => 3.4
    -    *        [name] => HTML_Common
    -    *        [optional] => false
    -    *    )
    -    * 
    - * - * @param string Error message - * @param array Options - * @return boolean - */ - function callCheckMethod(&$errmsg, $opts) - { - $rel = isset($opts['rel']) ? $opts['rel'] : 'has'; - $req = isset($opts['version']) ? $opts['version'] : null; - $name = isset($opts['name']) ? $opts['name'] : null; - $opt = (isset($opts['optional']) && $opts['optional'] == 'yes') ? - $opts['optional'] : null; - $errmsg = ''; - switch ($opts['type']) { - case 'pkg': - return $this->checkPackage($errmsg, $name, $req, $rel, $opt); - break; - case 'ext': - return $this->checkExtension($errmsg, $name, $req, $rel, $opt); - break; - case 'php': - return $this->checkPHP($errmsg, $req, $rel); - break; - case 'prog': - return $this->checkProgram($errmsg, $name); - break; - case 'os': - return $this->checkOS($errmsg, $name); - break; - case 'sapi': - return $this->checkSAPI($errmsg, $name); - break; - case 'zend': - return $this->checkZend($errmsg, $name); - break; - default: - return "'{$opts['type']}' dependency type not supported"; - } - } - - // }}} - // {{{ checkPackage() - - /** - * Package dependencies check method - * - * @param string $errmsg Empty string, it will be populated with an error message, if any - * @param string $name Name of the package to test - * @param string $req The package version required - * @param string $relation How to compare versions with each other - * @param bool $opt Whether the relationship is optional - * - * @return mixed bool false if no error or the error string - */ - function checkPackage(&$errmsg, $name, $req = null, $relation = 'has', - $opt = false) - { - if (is_string($req) && substr($req, 0, 2) == 'v.') { - $req = substr($req, 2); - } - switch ($relation) { - case 'has': - if (!$this->registry->packageExists($name)) { - if ($opt) { - $errmsg = "package `$name' is recommended to utilize some features."; - return PEAR_DEPENDENCY_MISSING_OPTIONAL; - } - $errmsg = "requires package `$name'"; - return PEAR_DEPENDENCY_MISSING; - } - return false; - case 'not': - if ($this->registry->packageExists($name)) { - $errmsg = "conflicts with package `$name'"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - case 'lt': - case 'le': - case 'eq': - case 'ne': - case 'ge': - case 'gt': - $version = $this->registry->packageInfo($name, 'version'); - if (!$this->registry->packageExists($name) - || !version_compare("$version", "$req", $relation)) - { - $code = $this->codeFromRelation($relation, $version, $req, $opt); - if ($opt) { - $errmsg = "package `$name' version " . $this->signOperator($relation) . - " $req is recommended to utilize some features."; - if ($version) { - $errmsg .= " Installed version is $version"; - } - return $code; - } - $errmsg = "requires package `$name' " . - $this->signOperator($relation) . " $req"; - return $code; - } - return false; - } - $errmsg = "relation '$relation' with requirement '$req' is not supported (name=$name)"; - return PEAR_DEPENDENCY_BAD_DEPENDENCY; - } - - // }}} - // {{{ checkPackageUninstall() - - /** - * Check package dependencies on uninstall - * - * @param string $error The resultant error string - * @param string $warning The resultant warning string - * @param string $name Name of the package to test - * - * @return bool true if there were errors - */ - function checkPackageUninstall(&$error, &$warning, $package) - { - $error = null; - $packages = $this->registry->listPackages(); - foreach ($packages as $pkg) { - if ($pkg == $package) { - continue; - } - $deps = $this->registry->packageInfo($pkg, 'release_deps'); - if (empty($deps)) { - continue; - } - foreach ($deps as $dep) { - if ($dep['type'] == 'pkg' && strcasecmp($dep['name'], $package) == 0) { - if ($dep['rel'] == 'ne' || $dep['rel'] == 'not') { - continue; - } - if (isset($dep['optional']) && $dep['optional'] == 'yes') { - $warning .= "\nWarning: Package '$pkg' optionally depends on '$package'"; - } else { - $error .= "Package '$pkg' depends on '$package'\n"; - } - } - } - } - return ($error) ? true : false; - } - - // }}} - // {{{ checkExtension() - - /** - * Extension dependencies check method - * - * @param string $name Name of the extension to test - * @param string $req_ext_ver Required extension version to compare with - * @param string $relation How to compare versions with eachother - * @param bool $opt Whether the relationship is optional - * - * @return mixed bool false if no error or the error string - */ - function checkExtension(&$errmsg, $name, $req = null, $relation = 'has', - $opt = false) - { - if ($relation == 'not') { - if (extension_loaded($name)) { - $errmsg = "conflicts with PHP extension '$name'"; - return PEAR_DEPENDENCY_CONFLICT; - } else { - return false; - } - } - - if (!extension_loaded($name)) { - if ($relation == 'not') { - return false; - } - if ($opt) { - $errmsg = "'$name' PHP extension is recommended to utilize some features"; - return PEAR_DEPENDENCY_MISSING_OPTIONAL; - } - $errmsg = "'$name' PHP extension is not installed"; - return PEAR_DEPENDENCY_MISSING; - } - if ($relation == 'has') { - return false; - } - $code = false; - if (is_string($req) && substr($req, 0, 2) == 'v.') { - $req = substr($req, 2); - } - $ext_ver = phpversion($name); - $operator = $relation; - // Force params to be strings, otherwise the comparation will fail (ex. 0.9==0.90) - if (!version_compare("$ext_ver", "$req", $operator)) { - $errmsg = "'$name' PHP extension version " . - $this->signOperator($operator) . " $req is required"; - $code = $this->codeFromRelation($relation, $ext_ver, $req, $opt); - if ($opt) { - $errmsg = "'$name' PHP extension version " . $this->signOperator($operator) . - " $req is recommended to utilize some features"; - return $code; - } - } - return $code; - } - - // }}} - // {{{ checkOS() - - /** - * Operating system dependencies check method - * - * @param string $os Name of the operating system - * - * @return mixed bool false if no error or the error string - */ - function checkOS(&$errmsg, $os) - { - // XXX Fixme: Implement a more flexible way, like - // comma separated values or something similar to PEAR_OS - static $myos; - if (empty($myos)) { - include_once "OS/Guess.php"; - $myos = new OS_Guess(); - } - // only 'has' relation is currently supported - if ($myos->matchSignature($os)) { - return false; - } - $errmsg = "'$os' operating system not supported"; - return PEAR_DEPENDENCY_CONFLICT; - } - - // }}} - // {{{ checkPHP() - - /** - * PHP version check method - * - * @param string $req which version to compare - * @param string $relation how to compare the version - * - * @return mixed bool false if no error or the error string - */ - function checkPHP(&$errmsg, $req, $relation = 'ge') - { - // this would be a bit stupid, but oh well :) - if ($relation == 'has') { - return false; - } - if ($relation == 'not') { - $errmsg = 'Invalid dependency - "not" is not allowed for php dependencies, ' . - 'php cannot conflict with itself'; - return PEAR_DEPENDENCY_BAD_DEPENDENCY; - } - if (substr($req, 0, 2) == 'v.') { - $req = substr($req,2, strlen($req) - 2); - } - $php_ver = phpversion(); - $operator = $relation; - if (!version_compare("$php_ver", "$req", $operator)) { - $errmsg = "PHP version " . $this->signOperator($operator) . - " $req is required"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - } - - // }}} - // {{{ checkProgram() - - /** - * External program check method. Looks for executable files in - * directories listed in the PATH environment variable. - * - * @param string $program which program to look for - * - * @return mixed bool false if no error or the error string - */ - function checkProgram(&$errmsg, $program) - { - // XXX FIXME honor safe mode - $exe_suffix = OS_WINDOWS ? '.exe' : ''; - $path_elements = explode(PATH_SEPARATOR, getenv('PATH')); - foreach ($path_elements as $dir) { - $file = $dir . DIRECTORY_SEPARATOR . $program . $exe_suffix; - if (@file_exists($file) && @is_executable($file)) { - return false; - } - } - $errmsg = "'$program' program is not present in the PATH"; - return PEAR_DEPENDENCY_MISSING; - } - - // }}} - // {{{ checkSAPI() - - /** - * SAPI backend check method. Version comparison is not yet - * available here. - * - * @param string $name name of SAPI backend - * @param string $req which version to compare - * @param string $relation how to compare versions (currently - * hardcoded to 'has') - * @return mixed bool false if no error or the error string - */ - function checkSAPI(&$errmsg, $name, $req = null, $relation = 'has') - { - // XXX Fixme: There is no way to know if the user has or - // not other SAPI backends installed than the installer one - - $sapi_backend = php_sapi_name(); - // Version comparisons not supported, sapi backends don't have - // version information yet. - if ($sapi_backend == $name) { - return false; - } - $errmsg = "'$sapi_backend' SAPI backend not supported"; - return PEAR_DEPENDENCY_CONFLICT; - } - - // }}} - // {{{ checkZend() - - /** - * Zend version check method - * - * @param string $req which version to compare - * @param string $relation how to compare the version - * - * @return mixed bool false if no error or the error string - */ - function checkZend(&$errmsg, $req, $relation = 'ge') - { - if (substr($req, 0, 2) == 'v.') { - $req = substr($req,2, strlen($req) - 2); - } - $zend_ver = zend_version(); - $operator = substr($relation,0,2); - if (!version_compare("$zend_ver", "$req", $operator)) { - $errmsg = "Zend version " . $this->signOperator($operator) . - " $req is required"; - return PEAR_DEPENDENCY_CONFLICT; - } - return false; - } - - // }}} - // {{{ signOperator() - - /** - * Converts text comparing operators to them sign equivalents - * - * Example: 'ge' to '>=' - * - * @access public - * @param string Operator - * @return string Sign equivalent - */ - function signOperator($operator) - { - switch($operator) { - case 'lt': return '<'; - case 'le': return '<='; - case 'gt': return '>'; - case 'ge': return '>='; - case 'eq': return '=='; - case 'ne': return '!='; - default: - return $operator; - } - } - - // }}} - // {{{ codeFromRelation() - - /** - * Convert relation into corresponding code - * - * @access public - * @param string Relation - * @param string Version - * @param string Requirement - * @param bool Optional dependency indicator - * @return integer - */ - function codeFromRelation($relation, $version, $req, $opt = false) - { - $code = PEAR_DEPENDENCY_BAD_DEPENDENCY; - switch ($relation) { - case 'gt': case 'ge': case 'eq': - // upgrade - $have_major = preg_replace('/\D.*/', '', $version); - $need_major = preg_replace('/\D.*/', '', $req); - if ($need_major > $have_major) { - $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL : - PEAR_DEPENDENCY_UPGRADE_MAJOR; - } else { - $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL : - PEAR_DEPENDENCY_UPGRADE_MINOR; - } - break; - case 'lt': case 'le': case 'ne': - $code = $opt ? PEAR_DEPENDENCY_CONFLICT_OPTIONAL : - PEAR_DEPENDENCY_CONFLICT; - break; - } - return $code; - } - - // }}} -} -?> diff --git a/3rdparty/PEAR/Downloader.php b/3rdparty/PEAR/Downloader.php deleted file mode 100644 index 5e16dc5ffb1..00000000000 --- a/3rdparty/PEAR/Downloader.php +++ /dev/null @@ -1,680 +0,0 @@ - | -// | Tomas V.V.Cox | -// | Martin Jansen | -// +----------------------------------------------------------------------+ -// -// $Id: Downloader.php,v 1.17.2.1 2004/10/22 22:54:03 cellog Exp $ - -require_once 'PEAR/Common.php'; -require_once 'PEAR/Registry.php'; -require_once 'PEAR/Dependency.php'; -require_once 'PEAR/Remote.php'; -require_once 'System.php'; - - -define('PEAR_INSTALLER_OK', 1); -define('PEAR_INSTALLER_FAILED', 0); -define('PEAR_INSTALLER_SKIPPED', -1); -define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2); - -/** - * Administration class used to download PEAR packages and maintain the - * installed package database. - * - * @since PEAR 1.4 - * @author Greg Beaver - */ -class PEAR_Downloader extends PEAR_Common -{ - /** - * @var PEAR_Config - * @access private - */ - var $_config; - - /** - * @var PEAR_Registry - * @access private - */ - var $_registry; - - /** - * @var PEAR_Remote - * @access private - */ - var $_remote; - - /** - * Preferred Installation State (snapshot, devel, alpha, beta, stable) - * @var string|null - * @access private - */ - var $_preferredState; - - /** - * Options from command-line passed to Install. - * - * Recognized options:
    - * - onlyreqdeps : install all required dependencies as well - * - alldeps : install all dependencies, including optional - * - installroot : base relative path to install files in - * - force : force a download even if warnings would prevent it - * @see PEAR_Command_Install - * @access private - * @var array - */ - var $_options; - - /** - * Downloaded Packages after a call to download(). - * - * Format of each entry: - * - * - * array('pkg' => 'package_name', 'file' => '/path/to/local/file', - * 'info' => array() // parsed package.xml - * ); - * - * @access private - * @var array - */ - var $_downloadedPackages = array(); - - /** - * Packages slated for download. - * - * This is used to prevent downloading a package more than once should it be a dependency - * for two packages to be installed. - * Format of each entry: - * - *
    -     * array('package_name1' => parsed package.xml, 'package_name2' => parsed package.xml,
    -     * );
    -     * 
    - * @access private - * @var array - */ - var $_toDownload = array(); - - /** - * Array of every package installed, with names lower-cased. - * - * Format: - * - * array('package1' => 0, 'package2' => 1, ); - * - * @var array - */ - var $_installed = array(); - - /** - * @var array - * @access private - */ - var $_errorStack = array(); - - // {{{ PEAR_Downloader() - - function PEAR_Downloader(&$ui, $options, &$config) - { - $this->_options = $options; - $this->_config = &$config; - $this->_preferredState = $this->_config->get('preferred_state'); - $this->ui = &$ui; - if (!$this->_preferredState) { - // don't inadvertantly use a non-set preferred_state - $this->_preferredState = null; - } - - $php_dir = $this->_config->get('php_dir'); - if (isset($this->_options['installroot'])) { - if (substr($this->_options['installroot'], -1) == DIRECTORY_SEPARATOR) { - $this->_options['installroot'] = substr($this->_options['installroot'], 0, -1); - } - $php_dir = $this->_prependPath($php_dir, $this->_options['installroot']); - } - $this->_registry = &new PEAR_Registry($php_dir); - $this->_remote = &new PEAR_Remote($config); - - if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { - $this->_installed = $this->_registry->listPackages(); - array_walk($this->_installed, create_function('&$v,$k','$v = strtolower($v);')); - $this->_installed = array_flip($this->_installed); - } - parent::PEAR_Common(); - } - - // }}} - // {{{ configSet() - function configSet($key, $value, $layer = 'user') - { - $this->_config->set($key, $value, $layer); - $this->_preferredState = $this->_config->get('preferred_state'); - if (!$this->_preferredState) { - // don't inadvertantly use a non-set preferred_state - $this->_preferredState = null; - } - } - - // }}} - // {{{ setOptions() - function setOptions($options) - { - $this->_options = $options; - } - - // }}} - // {{{ _downloadFile() - /** - * @param string filename to download - * @param string version/state - * @param string original value passed to command-line - * @param string|null preferred state (snapshot/devel/alpha/beta/stable) - * Defaults to configuration preferred state - * @return null|PEAR_Error|string - * @access private - */ - function _downloadFile($pkgfile, $version, $origpkgfile, $state = null) - { - if (is_null($state)) { - $state = $this->_preferredState; - } - // {{{ check the package filename, and whether it's already installed - $need_download = false; - if (preg_match('#^(http|ftp)://#', $pkgfile)) { - $need_download = true; - } elseif (!@is_file($pkgfile)) { - if ($this->validPackageName($pkgfile)) { - if ($this->_registry->packageExists($pkgfile)) { - if (empty($this->_options['upgrade']) && empty($this->_options['force'])) { - $errors[] = "$pkgfile already installed"; - return; - } - } - $pkgfile = $this->getPackageDownloadUrl($pkgfile, $version); - $need_download = true; - } else { - if (strlen($pkgfile)) { - $errors[] = "Could not open the package file: $pkgfile"; - } else { - $errors[] = "No package file given"; - } - return; - } - } - // }}} - - // {{{ Download package ----------------------------------------------- - if ($need_download) { - $downloaddir = $this->_config->get('download_dir'); - if (empty($downloaddir)) { - if (PEAR::isError($downloaddir = System::mktemp('-d'))) { - return $downloaddir; - } - $this->log(3, '+ tmp dir created at ' . $downloaddir); - } - $callback = $this->ui ? array(&$this, '_downloadCallback') : null; - $this->pushErrorHandling(PEAR_ERROR_RETURN); - $file = $this->downloadHttp($pkgfile, $this->ui, $downloaddir, $callback); - $this->popErrorHandling(); - if (PEAR::isError($file)) { - if ($this->validPackageName($origpkgfile)) { - if (!PEAR::isError($info = $this->_remote->call('package.info', - $origpkgfile))) { - if (!count($info['releases'])) { - return $this->raiseError('Package ' . $origpkgfile . - ' has no releases'); - } else { - return $this->raiseError('No releases of preferred state "' - . $state . '" exist for package ' . $origpkgfile . - '. Use ' . $origpkgfile . '-state to install another' . - ' state (like ' . $origpkgfile .'-beta)', - PEAR_INSTALLER_ERROR_NO_PREF_STATE); - } - } else { - return $pkgfile; - } - } else { - return $this->raiseError($file); - } - } - $pkgfile = $file; - } - // }}} - return $pkgfile; - } - // }}} - // {{{ getPackageDownloadUrl() - - function getPackageDownloadUrl($package, $version = null) - { - if ($version) { - $package .= "-$version"; - } - if ($this === null || $this->_config === null) { - $package = "http://pear.php.net/get/$package"; - } else { - $package = "http://" . $this->_config->get('master_server') . - "/get/$package"; - } - if (!extension_loaded("zlib")) { - $package .= '?uncompress=yes'; - } - return $package; - } - - // }}} - // {{{ extractDownloadFileName($pkgfile, &$version) - - function extractDownloadFileName($pkgfile, &$version) - { - if (@is_file($pkgfile)) { - return $pkgfile; - } - // regex defined in Common.php - if (preg_match(PEAR_COMMON_PACKAGE_DOWNLOAD_PREG, $pkgfile, $m)) { - $version = (isset($m[3])) ? $m[3] : null; - return $m[1]; - } - $version = null; - return $pkgfile; - } - - // }}} - - // }}} - // {{{ getDownloadedPackages() - - /** - * Retrieve a list of downloaded packages after a call to {@link download()}. - * - * Also resets the list of downloaded packages. - * @return array - */ - function getDownloadedPackages() - { - $ret = $this->_downloadedPackages; - $this->_downloadedPackages = array(); - $this->_toDownload = array(); - return $ret; - } - - // }}} - // {{{ download() - - /** - * Download any files and their dependencies, if necessary - * - * BC-compatible method name - * @param array a mixed list of package names, local files, or package.xml - */ - function download($packages) - { - return $this->doDownload($packages); - } - - // }}} - // {{{ doDownload() - - /** - * Download any files and their dependencies, if necessary - * - * @param array a mixed list of package names, local files, or package.xml - */ - function doDownload($packages) - { - $mywillinstall = array(); - $state = $this->_preferredState; - - // {{{ download files in this list if necessary - foreach($packages as $pkgfile) { - $need_download = false; - if (!is_file($pkgfile)) { - if (preg_match('#^(http|ftp)://#', $pkgfile)) { - $need_download = true; - } - $pkgfile = $this->_downloadNonFile($pkgfile); - if (PEAR::isError($pkgfile)) { - return $pkgfile; - } - if ($pkgfile === false) { - continue; - } - } // end is_file() - - $tempinfo = $this->infoFromAny($pkgfile); - if ($need_download) { - $this->_toDownload[] = $tempinfo['package']; - } - if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { - // ignore dependencies if there are any errors - if (!PEAR::isError($tempinfo)) { - $mywillinstall[strtolower($tempinfo['package'])] = @$tempinfo['release_deps']; - } - } - $this->_downloadedPackages[] = array('pkg' => $tempinfo['package'], - 'file' => $pkgfile, 'info' => $tempinfo); - } // end foreach($packages) - // }}} - - // {{{ extract dependencies from downloaded files and then download - // them if necessary - if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { - $deppackages = array(); - foreach ($mywillinstall as $package => $alldeps) { - if (!is_array($alldeps)) { - // there are no dependencies - continue; - } - $fail = false; - foreach ($alldeps as $info) { - if ($info['type'] != 'pkg') { - continue; - } - $ret = $this->_processDependency($package, $info, $mywillinstall); - if ($ret === false) { - continue; - } - if ($ret === 0) { - $fail = true; - continue; - } - if (PEAR::isError($ret)) { - return $ret; - } - $deppackages[] = $ret; - } // foreach($alldeps - if ($fail) { - $deppackages = array(); - } - } - - if (count($deppackages)) { - $this->doDownload($deppackages); - } - } // }}} if --alldeps or --onlyreqdeps - } - - // }}} - // {{{ _downloadNonFile($pkgfile) - - /** - * @return false|PEAR_Error|string false if loop should be broken out of, - * string if the file was downloaded, - * PEAR_Error on exception - * @access private - */ - function _downloadNonFile($pkgfile) - { - $origpkgfile = $pkgfile; - $state = null; - $pkgfile = $this->extractDownloadFileName($pkgfile, $version); - if (preg_match('#^(http|ftp)://#', $pkgfile)) { - return $this->_downloadFile($pkgfile, $version, $origpkgfile); - } - if (!$this->validPackageName($pkgfile)) { - return $this->raiseError("Package name '$pkgfile' not valid"); - } - // ignore packages that are installed unless we are upgrading - $curinfo = $this->_registry->packageInfo($pkgfile); - if ($this->_registry->packageExists($pkgfile) - && empty($this->_options['upgrade']) && empty($this->_options['force'])) { - $this->log(0, "Package '{$curinfo['package']}' already installed, skipping"); - return false; - } - if (in_array($pkgfile, $this->_toDownload)) { - return false; - } - $releases = $this->_remote->call('package.info', $pkgfile, 'releases', true); - if (!count($releases)) { - return $this->raiseError("No releases found for package '$pkgfile'"); - } - // Want a specific version/state - if ($version !== null) { - // Passed Foo-1.2 - if ($this->validPackageVersion($version)) { - if (!isset($releases[$version])) { - return $this->raiseError("No release with version '$version' found for '$pkgfile'"); - } - // Passed Foo-alpha - } elseif (in_array($version, $this->getReleaseStates())) { - $state = $version; - $version = 0; - foreach ($releases as $ver => $inf) { - if ($inf['state'] == $state && version_compare("$version", "$ver") < 0) { - $version = $ver; - break; - } - } - if ($version == 0) { - return $this->raiseError("No release with state '$state' found for '$pkgfile'"); - } - // invalid suffix passed - } else { - return $this->raiseError("Invalid suffix '-$version', be sure to pass a valid PEAR ". - "version number or release state"); - } - // Guess what to download - } else { - $states = $this->betterStates($this->_preferredState, true); - $possible = false; - $version = 0; - $higher_version = 0; - $prev_hi_ver = 0; - foreach ($releases as $ver => $inf) { - if (in_array($inf['state'], $states) && version_compare("$version", "$ver") < 0) { - $version = $ver; - break; - } else { - $ver = (string)$ver; - if (version_compare($prev_hi_ver, $ver) < 0) { - $prev_hi_ver = $higher_version = $ver; - } - } - } - if ($version === 0 && !isset($this->_options['force'])) { - return $this->raiseError('No release with state equal to: \'' . implode(', ', $states) . - "' found for '$pkgfile'"); - } elseif ($version === 0) { - $this->log(0, "Warning: $pkgfile is state '" . $releases[$higher_version]['state'] . "' which is less stable " . - "than state '$this->_preferredState'"); - } - } - // Check if we haven't already the version - if (empty($this->_options['force']) && !is_null($curinfo)) { - if ($curinfo['version'] == $version) { - $this->log(0, "Package '{$curinfo['package']}-{$curinfo['version']}' already installed, skipping"); - return false; - } elseif (version_compare("$version", "{$curinfo['version']}") < 0) { - $this->log(0, "Package '{$curinfo['package']}' version '{$curinfo['version']}' " . - " is installed and {$curinfo['version']} is > requested '$version', skipping"); - return false; - } - } - $this->_toDownload[] = $pkgfile; - return $this->_downloadFile($pkgfile, $version, $origpkgfile, $state); - } - - // }}} - // {{{ _processDependency($package, $info, $mywillinstall) - - /** - * Process a dependency, download if necessary - * @param array dependency information from PEAR_Remote call - * @param array packages that will be installed in this iteration - * @return false|string|PEAR_Error - * @access private - * @todo Add test for relation 'lt'/'le' -> make sure that the dependency requested is - * in fact lower than the required value. This will be very important for BC dependencies - */ - function _processDependency($package, $info, $mywillinstall) - { - $state = $this->_preferredState; - if (!isset($this->_options['alldeps']) && isset($info['optional']) && - $info['optional'] == 'yes') { - // skip optional deps - $this->log(0, "skipping Package '$package' optional dependency '$info[name]'"); - return false; - } - // {{{ get releases - $releases = $this->_remote->call('package.info', $info['name'], 'releases', true); - if (PEAR::isError($releases)) { - return $releases; - } - if (!count($releases)) { - if (!isset($this->_installed[strtolower($info['name'])])) { - $this->pushError("Package '$package' dependency '$info[name]' ". - "has no releases"); - } - return false; - } - $found = false; - $save = $releases; - while(count($releases) && !$found) { - if (!empty($state) && $state != 'any') { - list($release_version, $release) = each($releases); - if ($state != $release['state'] && - !in_array($release['state'], $this->betterStates($state))) - { - // drop this release - it ain't stable enough - array_shift($releases); - } else { - $found = true; - } - } else { - $found = true; - } - } - if (!count($releases) && !$found) { - $get = array(); - foreach($save as $release) { - $get = array_merge($get, - $this->betterStates($release['state'], true)); - } - $savestate = array_shift($get); - $this->pushError( "Release for '$package' dependency '$info[name]' " . - "has state '$savestate', requires '$state'"); - return 0; - } - if (in_array(strtolower($info['name']), $this->_toDownload) || - isset($mywillinstall[strtolower($info['name'])])) { - // skip upgrade check for packages we will install - return false; - } - if (!isset($this->_installed[strtolower($info['name'])])) { - // check to see if we can install the specific version required - if ($info['rel'] == 'eq') { - return $info['name'] . '-' . $info['version']; - } - // skip upgrade check for packages we don't have installed - return $info['name']; - } - // }}} - - // {{{ see if a dependency must be upgraded - $inst_version = $this->_registry->packageInfo($info['name'], 'version'); - if (!isset($info['version'])) { - // this is a rel='has' dependency, check against latest - if (version_compare($release_version, $inst_version, 'le')) { - return false; - } else { - return $info['name']; - } - } - if (version_compare($info['version'], $inst_version, 'le')) { - // installed version is up-to-date - return false; - } - return $info['name']; - } - - // }}} - // {{{ _downloadCallback() - - function _downloadCallback($msg, $params = null) - { - switch ($msg) { - case 'saveas': - $this->log(1, "downloading $params ..."); - break; - case 'done': - $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes'); - break; - case 'bytesread': - static $bytes; - if (empty($bytes)) { - $bytes = 0; - } - if (!($bytes % 10240)) { - $this->log(1, '.', false); - } - $bytes += $params; - break; - case 'start': - $this->log(1, "Starting to download {$params[0]} (".number_format($params[1], 0, '', ',')." bytes)"); - break; - } - if (method_exists($this->ui, '_downloadCallback')) - $this->ui->_downloadCallback($msg, $params); - } - - // }}} - // {{{ _prependPath($path, $prepend) - - function _prependPath($path, $prepend) - { - if (strlen($prepend) > 0) { - if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) { - $path = $prepend . substr($path, 2); - } else { - $path = $prepend . $path; - } - } - return $path; - } - // }}} - // {{{ pushError($errmsg, $code) - - /** - * @param string - * @param integer - */ - function pushError($errmsg, $code = -1) - { - array_push($this->_errorStack, array($errmsg, $code)); - } - - // }}} - // {{{ getErrorMsgs() - - function getErrorMsgs() - { - $msgs = array(); - $errs = $this->_errorStack; - foreach ($errs as $err) { - $msgs[] = $err[0]; - } - $this->_errorStack = array(); - return $msgs; - } - - // }}} -} -// }}} - -?> diff --git a/3rdparty/PEAR/ErrorStack.php b/3rdparty/PEAR/ErrorStack.php deleted file mode 100644 index da52f08d345..00000000000 --- a/3rdparty/PEAR/ErrorStack.php +++ /dev/null @@ -1,981 +0,0 @@ - | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: ErrorStack.php,v 1.7.2.5 2005/01/01 21:26:51 cellog Exp $ - -/** - * Error Stack Implementation - * - * This is an incredibly simple implementation of a very complex error handling - * facility. It contains the ability - * to track multiple errors from multiple packages simultaneously. In addition, - * it can track errors of many levels, save data along with the error, context - * information such as the exact file, line number, class and function that - * generated the error, and if necessary, it can raise a traditional PEAR_Error. - * It has built-in support for PEAR::Log, to log errors as they occur - * - * Since version 0.2alpha, it is also possible to selectively ignore errors, - * through the use of an error callback, see {@link pushCallback()} - * - * Since version 0.3alpha, it is possible to specify the exception class - * returned from {@link push()} - * - * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class. This can - * still be done quite handily in an error callback or by manipulating the returned array - * @author Greg Beaver - * @version PEAR1.3.2 (beta) - * @package PEAR_ErrorStack - * @category Debugging - * @license http://www.php.net/license/3_0.txt PHP License v3.0 - */ - -/** - * Singleton storage - * - * Format: - *
    - * array(
    - *  'package1' => PEAR_ErrorStack object,
    - *  'package2' => PEAR_ErrorStack object,
    - *  ...
    - * )
    - * 
    - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] - */ -$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array(); - -/** - * Global error callback (default) - * - * This is only used if set to non-false. * is the default callback for - * all packages, whereas specific packages may set a default callback - * for all instances, regardless of whether they are a singleton or not. - * - * To exclude non-singletons, only set the local callback for the singleton - * @see PEAR_ErrorStack::setDefaultCallback() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] - */ -$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array( - '*' => false, -); - -/** - * Global Log object (default) - * - * This is only used if set to non-false. Use to set a default log object for - * all stacks, regardless of instantiation order or location - * @see PEAR_ErrorStack::setDefaultLogger() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] - */ -$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false; - -/** - * Global Overriding Callback - * - * This callback will override any error callbacks that specific loggers have set. - * Use with EXTREME caution - * @see PEAR_ErrorStack::staticPushCallback() - * @access private - * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] - */ -$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); - -/**#@+ - * One of four possible return values from the error Callback - * @see PEAR_ErrorStack::_errorCallback() - */ -/** - * If this is returned, then the error will be both pushed onto the stack - * and logged. - */ -define('PEAR_ERRORSTACK_PUSHANDLOG', 1); -/** - * If this is returned, then the error will only be pushed onto the stack, - * and not logged. - */ -define('PEAR_ERRORSTACK_PUSH', 2); -/** - * If this is returned, then the error will only be logged, but not pushed - * onto the error stack. - */ -define('PEAR_ERRORSTACK_LOG', 3); -/** - * If this is returned, then the error is completely ignored. - */ -define('PEAR_ERRORSTACK_IGNORE', 4); -/** - * If this is returned, then the error is logged and die() is called. - */ -define('PEAR_ERRORSTACK_DIE', 5); -/**#@-*/ - -/** - * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in - * the singleton method. - */ -define('PEAR_ERRORSTACK_ERR_NONCLASS', 1); - -/** - * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()} - * that has no __toString() method - */ -define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2); -/** - * Error Stack Implementation - * - * Usage: - * - * // global error stack - * $global_stack = &PEAR_ErrorStack::singleton('MyPackage'); - * // local error stack - * $local_stack = new PEAR_ErrorStack('MyPackage'); - * - * @copyright 2004 Gregory Beaver - * @package PEAR_ErrorStack - * @license http://www.php.net/license/3_0.txt PHP License - */ -class PEAR_ErrorStack { - /** - * Errors are stored in the order that they are pushed on the stack. - * @since 0.4alpha Errors are no longer organized by error level. - * This renders pop() nearly unusable, and levels could be more easily - * handled in a callback anyway - * @var array - * @access private - */ - var $_errors = array(); - - /** - * Storage of errors by level. - * - * Allows easy retrieval and deletion of only errors from a particular level - * @since PEAR 1.4.0dev - * @var array - * @access private - */ - var $_errorsByLevel = array(); - - /** - * Package name this error stack represents - * @var string - * @access protected - */ - var $_package; - - /** - * Determines whether a PEAR_Error is thrown upon every error addition - * @var boolean - * @access private - */ - var $_compat = false; - - /** - * If set to a valid callback, this will be used to generate the error - * message from the error code, otherwise the message passed in will be - * used - * @var false|string|array - * @access private - */ - var $_msgCallback = false; - - /** - * If set to a valid callback, this will be used to generate the error - * context for an error. For PHP-related errors, this will be a file - * and line number as retrieved from debug_backtrace(), but can be - * customized for other purposes. The error might actually be in a separate - * configuration file, or in a database query. - * @var false|string|array - * @access protected - */ - var $_contextCallback = false; - - /** - * If set to a valid callback, this will be called every time an error - * is pushed onto the stack. The return value will be used to determine - * whether to allow an error to be pushed or logged. - * - * The return value must be one an PEAR_ERRORSTACK_* constant - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @var false|string|array - * @access protected - */ - var $_errorCallback = array(); - - /** - * PEAR::Log object for logging errors - * @var false|Log - * @access protected - */ - var $_logger = false; - - /** - * Error messages - designed to be overridden - * @var array - * @abstract - */ - var $_errorMsgs = array(); - - /** - * Set up a new error stack - * - * @param string $package name of the package this error stack represents - * @param callback $msgCallback callback used for error message generation - * @param callback $contextCallback callback used for context generation, - * defaults to {@link getFileLine()} - * @param boolean $throwPEAR_Error - */ - function PEAR_ErrorStack($package, $msgCallback = false, $contextCallback = false, - $throwPEAR_Error = false) - { - $this->_package = $package; - $this->setMessageCallback($msgCallback); - $this->setContextCallback($contextCallback); - $this->_compat = $throwPEAR_Error; - } - - /** - * Return a single error stack for this package. - * - * Note that all parameters are ignored if the stack for package $package - * has already been instantiated - * @param string $package name of the package this error stack represents - * @param callback $msgCallback callback used for error message generation - * @param callback $contextCallback callback used for context generation, - * defaults to {@link getFileLine()} - * @param boolean $throwPEAR_Error - * @param string $stackClass class to instantiate - * @static - * @return PEAR_ErrorStack - */ - function &singleton($package, $msgCallback = false, $contextCallback = false, - $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack') - { - if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; - } - if (!class_exists($stackClass)) { - if (function_exists('debug_backtrace')) { - $trace = debug_backtrace(); - } - PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS, - 'exception', array('stackclass' => $stackClass), - 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)', - false, $trace); - } - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] = - &new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error); - } - - /** - * Internal error handler for PEAR_ErrorStack class - * - * Dies if the error is an exception (and would have died anyway) - * @access private - */ - function _handleError($err) - { - if ($err['level'] == 'exception') { - $message = $err['message']; - if (isset($_SERVER['REQUEST_URI'])) { - echo '
    '; - } else { - echo "\n"; - } - var_dump($err['context']); - die($message); - } - } - - /** - * Set up a PEAR::Log object for all error stacks that don't have one - * @param Log $log - * @static - */ - function setDefaultLogger(&$log) - { - if (is_object($log) && method_exists($log, 'log') ) { - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; - } elseif (is_callable($log)) { - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; - } - } - - /** - * Set up a PEAR::Log object for this error stack - * @param Log $log - */ - function setLogger(&$log) - { - if (is_object($log) && method_exists($log, 'log') ) { - $this->_logger = &$log; - } elseif (is_callable($log)) { - $this->_logger = &$log; - } - } - - /** - * Set an error code => error message mapping callback - * - * This method sets the callback that can be used to generate error - * messages for any instance - * @param array|string Callback function/method - */ - function setMessageCallback($msgCallback) - { - if (!$msgCallback) { - $this->_msgCallback = array(&$this, 'getErrorMessage'); - } else { - if (is_callable($msgCallback)) { - $this->_msgCallback = $msgCallback; - } - } - } - - /** - * Get an error code => error message mapping callback - * - * This method returns the current callback that can be used to generate error - * messages - * @return array|string|false Callback function/method or false if none - */ - function getMessageCallback() - { - return $this->_msgCallback; - } - - /** - * Sets a default callback to be used by all error stacks - * - * This method sets the callback that can be used to generate error - * messages for a singleton - * @param array|string Callback function/method - * @param string Package name, or false for all packages - * @static - */ - function setDefaultCallback($callback = false, $package = false) - { - if (!is_callable($callback)) { - $callback = false; - } - $package = $package ? $package : '*'; - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback; - } - - /** - * Set a callback that generates context information (location of error) for an error stack - * - * This method sets the callback that can be used to generate context - * information for an error. Passing in NULL will disable context generation - * and remove the expensive call to debug_backtrace() - * @param array|string|null Callback function/method - */ - function setContextCallback($contextCallback) - { - if ($contextCallback === null) { - return $this->_contextCallback = false; - } - if (!$contextCallback) { - $this->_contextCallback = array(&$this, 'getFileLine'); - } else { - if (is_callable($contextCallback)) { - $this->_contextCallback = $contextCallback; - } - } - } - - /** - * Set an error Callback - * If set to a valid callback, this will be called every time an error - * is pushed onto the stack. The return value will be used to determine - * whether to allow an error to be pushed or logged. - * - * The return value must be one of the ERRORSTACK_* constants. - * - * This functionality can be used to emulate PEAR's pushErrorHandling, and - * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of - * the error stack or logging - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @see popCallback() - * @param string|array $cb - */ - function pushCallback($cb) - { - array_push($this->_errorCallback, $cb); - } - - /** - * Remove a callback from the error callback stack - * @see pushCallback() - * @return array|string|false - */ - function popCallback() - { - if (!count($this->_errorCallback)) { - return false; - } - return array_pop($this->_errorCallback); - } - - /** - * Set a temporary overriding error callback for every package error stack - * - * Use this to temporarily disable all existing callbacks (can be used - * to emulate the @ operator, for instance) - * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG - * @see staticPopCallback(), pushCallback() - * @param string|array $cb - * @static - */ - function staticPushCallback($cb) - { - array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb); - } - - /** - * Remove a temporary overriding error callback - * @see staticPushCallback() - * @return array|string|false - * @static - */ - function staticPopCallback() - { - $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']); - if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) { - $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); - } - return $ret; - } - - /** - * Add an error to the stack - * - * If the message generator exists, it is called with 2 parameters. - * - the current Error Stack object - * - an array that is in the same format as an error. Available indices - * are 'code', 'package', 'time', 'params', 'level', and 'context' - * - * Next, if the error should contain context information, this is - * handled by the context grabbing method. - * Finally, the error is pushed onto the proper error stack - * @param int $code Package-specific error code - * @param string $level Error level. This is NOT spell-checked - * @param array $params associative array of error parameters - * @param string $msg Error message, or a portion of it if the message - * is to be generated - * @param array $repackage If this error re-packages an error pushed by - * another package, place the array returned from - * {@link pop()} in this parameter - * @param array $backtrace Protected parameter: use this to pass in the - * {@link debug_backtrace()} that should be used - * to find error context - * @return PEAR_Error|array|Exception - * if compatibility mode is on, a PEAR_Error is also - * thrown. If the class Exception exists, then one - * is returned to allow code like: - * - * throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob'))); - * - * - * The errorData property of the exception class will be set to the array - * that would normally be returned. If a PEAR_Error is returned, the userinfo - * property is set to the array - * - * Otherwise, an array is returned in this format: - * - * array( - * 'code' => $code, - * 'params' => $params, - * 'package' => $this->_package, - * 'level' => $level, - * 'time' => time(), - * 'context' => $context, - * 'message' => $msg, - * //['repackage' => $err] repackaged error array/Exception class - * ); - * - */ - function push($code, $level = 'error', $params = array(), $msg = false, - $repackage = false, $backtrace = false) - { - $context = false; - // grab error context - if ($this->_contextCallback) { - if (!$backtrace) { - $backtrace = debug_backtrace(); - } - $context = call_user_func($this->_contextCallback, $code, $params, $backtrace); - } - - // save error - $time = explode(' ', microtime()); - $time = $time[1] + $time[0]; - $err = array( - 'code' => $code, - 'params' => $params, - 'package' => $this->_package, - 'level' => $level, - 'time' => $time, - 'context' => $context, - 'message' => $msg, - ); - - // set up the error message, if necessary - if ($this->_msgCallback) { - $msg = call_user_func_array($this->_msgCallback, - array(&$this, $err)); - $err['message'] = $msg; - } - - if ($repackage) { - $err['repackage'] = $repackage; - } - $push = $log = true; - $die = false; - // try the overriding callback first - $callback = $this->staticPopCallback(); - if ($callback) { - $this->staticPushCallback($callback); - } - if (!is_callable($callback)) { - // try the local callback next - $callback = $this->popCallback(); - if (is_callable($callback)) { - $this->pushCallback($callback); - } else { - // try the default callback - $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ? - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] : - $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*']; - } - } - if (is_callable($callback)) { - switch(call_user_func($callback, $err)){ - case PEAR_ERRORSTACK_IGNORE: - return $err; - break; - case PEAR_ERRORSTACK_PUSH: - $log = false; - break; - case PEAR_ERRORSTACK_LOG: - $push = false; - break; - case PEAR_ERRORSTACK_DIE: - $die = true; - break; - // anything else returned has the same effect as pushandlog - } - } - if ($push) { - array_unshift($this->_errors, $err); - $this->_errorsByLevel[$err['level']][] = &$this->_errors[0]; - } - if ($log) { - if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) { - $this->_log($err); - } - } - if ($die) { - die(); - } - if ($this->_compat && $push) { - return $this->raiseError($msg, $code, null, null, $err); - } - return $err; - } - - /** - * Static version of {@link push()} - * - * @param string $package Package name this error belongs to - * @param int $code Package-specific error code - * @param string $level Error level. This is NOT spell-checked - * @param array $params associative array of error parameters - * @param string $msg Error message, or a portion of it if the message - * is to be generated - * @param array $repackage If this error re-packages an error pushed by - * another package, place the array returned from - * {@link pop()} in this parameter - * @param array $backtrace Protected parameter: use this to pass in the - * {@link debug_backtrace()} that should be used - * to find error context - * @return PEAR_Error|null|Exception - * if compatibility mode is on, a PEAR_Error is also - * thrown. If the class Exception exists, then one - * is returned to allow code like: - * - * throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob'))); - * - * @static - */ - function staticPush($package, $code, $level = 'error', $params = array(), - $msg = false, $repackage = false, $backtrace = false) - { - $s = &PEAR_ErrorStack::singleton($package); - if ($s->_contextCallback) { - if (!$backtrace) { - if (function_exists('debug_backtrace')) { - $backtrace = debug_backtrace(); - } - } - } - return $s->push($code, $level, $params, $msg, $repackage, $backtrace); - } - - /** - * Log an error using PEAR::Log - * @param array $err Error array - * @param array $levels Error level => Log constant map - * @access protected - */ - function _log($err) - { - if ($this->_logger) { - $logger = &$this->_logger; - } else { - $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']; - } - if (is_a($logger, 'Log')) { - $levels = array( - 'exception' => PEAR_LOG_CRIT, - 'alert' => PEAR_LOG_ALERT, - 'critical' => PEAR_LOG_CRIT, - 'error' => PEAR_LOG_ERR, - 'warning' => PEAR_LOG_WARNING, - 'notice' => PEAR_LOG_NOTICE, - 'info' => PEAR_LOG_INFO, - 'debug' => PEAR_LOG_DEBUG); - if (isset($levels[$err['level']])) { - $level = $levels[$err['level']]; - } else { - $level = PEAR_LOG_INFO; - } - $logger->log($err['message'], $level, $err); - } else { // support non-standard logs - call_user_func($logger, $err); - } - } - - - /** - * Pop an error off of the error stack - * - * @return false|array - * @since 0.4alpha it is no longer possible to specify a specific error - * level to return - the last error pushed will be returned, instead - */ - function pop() - { - return @array_shift($this->_errors); - } - - /** - * Determine whether there are any errors on the stack - * @param string|array Level name. Use to determine if any errors - * of level (string), or levels (array) have been pushed - * @return boolean - */ - function hasErrors($level = false) - { - if ($level) { - return isset($this->_errorsByLevel[$level]); - } - return count($this->_errors); - } - - /** - * Retrieve all errors since last purge - * - * @param boolean set in order to empty the error stack - * @param string level name, to return only errors of a particular severity - * @return array - */ - function getErrors($purge = false, $level = false) - { - if (!$purge) { - if ($level) { - if (!isset($this->_errorsByLevel[$level])) { - return array(); - } else { - return $this->_errorsByLevel[$level]; - } - } else { - return $this->_errors; - } - } - if ($level) { - $ret = $this->_errorsByLevel[$level]; - foreach ($this->_errorsByLevel[$level] as $i => $unused) { - // entries are references to the $_errors array - $this->_errorsByLevel[$level][$i] = false; - } - // array_filter removes all entries === false - $this->_errors = array_filter($this->_errors); - unset($this->_errorsByLevel[$level]); - return $ret; - } - $ret = $this->_errors; - $this->_errors = array(); - $this->_errorsByLevel = array(); - return $ret; - } - - /** - * Determine whether there are any errors on a single error stack, or on any error stack - * - * The optional parameter can be used to test the existence of any errors without the need of - * singleton instantiation - * @param string|false Package name to check for errors - * @param string Level name to check for a particular severity - * @return boolean - * @static - */ - function staticHasErrors($package = false, $level = false) - { - if ($package) { - if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { - return false; - } - return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level); - } - foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { - if ($obj->hasErrors($level)) { - return true; - } - } - return false; - } - - /** - * Get a list of all errors since last purge, organized by package - * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be - * @param boolean $purge Set to purge the error stack of existing errors - * @param string $level Set to a level name in order to retrieve only errors of a particular level - * @param boolean $merge Set to return a flat array, not organized by package - * @param array $sortfunc Function used to sort a merged array - default - * sorts by time, and should be good for most cases - * @static - * @return array - */ - function staticGetErrors($purge = false, $level = false, $merge = false, - $sortfunc = array('PEAR_ErrorStack', '_sortErrors')) - { - $ret = array(); - if (!is_callable($sortfunc)) { - $sortfunc = array('PEAR_ErrorStack', '_sortErrors'); - } - foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { - $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level); - if ($test) { - if ($merge) { - $ret = array_merge($ret, $test); - } else { - $ret[$package] = $test; - } - } - } - if ($merge) { - usort($ret, $sortfunc); - } - return $ret; - } - - /** - * Error sorting function, sorts by time - * @access private - */ - function _sortErrors($a, $b) - { - if ($a['time'] == $b['time']) { - return 0; - } - if ($a['time'] < $b['time']) { - return 1; - } - return -1; - } - - /** - * Standard file/line number/function/class context callback - * - * This function uses a backtrace generated from {@link debug_backtrace()} - * and so will not work at all in PHP < 4.3.0. The frame should - * reference the frame that contains the source of the error. - * @return array|false either array('file' => file, 'line' => line, - * 'function' => function name, 'class' => class name) or - * if this doesn't work, then false - * @param unused - * @param integer backtrace frame. - * @param array Results of debug_backtrace() - * @static - */ - function getFileLine($code, $params, $backtrace = null) - { - if ($backtrace === null) { - return false; - } - $frame = 0; - $functionframe = 1; - if (!isset($backtrace[1])) { - $functionframe = 0; - } else { - while (isset($backtrace[$functionframe]['function']) && - $backtrace[$functionframe]['function'] == 'eval' && - isset($backtrace[$functionframe + 1])) { - $functionframe++; - } - } - if (isset($backtrace[$frame])) { - if (!isset($backtrace[$frame]['file'])) { - $frame++; - } - $funcbacktrace = $backtrace[$functionframe]; - $filebacktrace = $backtrace[$frame]; - $ret = array('file' => $filebacktrace['file'], - 'line' => $filebacktrace['line']); - // rearrange for eval'd code or create function errors - if (strpos($filebacktrace['file'], '(') && - preg_match(';^(.*?)\((\d+)\) : (.*?)$;', $filebacktrace['file'], - $matches)) { - $ret['file'] = $matches[1]; - $ret['line'] = $matches[2] + 0; - } - if (isset($funcbacktrace['function']) && isset($backtrace[1])) { - if ($funcbacktrace['function'] != 'eval') { - if ($funcbacktrace['function'] == '__lambda_func') { - $ret['function'] = 'create_function() code'; - } else { - $ret['function'] = $funcbacktrace['function']; - } - } - } - if (isset($funcbacktrace['class']) && isset($backtrace[1])) { - $ret['class'] = $funcbacktrace['class']; - } - return $ret; - } - return false; - } - - /** - * Standard error message generation callback - * - * This method may also be called by a custom error message generator - * to fill in template values from the params array, simply - * set the third parameter to the error message template string to use - * - * The special variable %__msg% is reserved: use it only to specify - * where a message passed in by the user should be placed in the template, - * like so: - * - * Error message: %msg% - internal error - * - * If the message passed like so: - * - * - * $stack->push(ERROR_CODE, 'error', array(), 'server error 500'); - * - * - * The returned error message will be "Error message: server error 500 - - * internal error" - * @param PEAR_ErrorStack - * @param array - * @param string|false Pre-generated error message template - * @static - * @return string - */ - function getErrorMessage(&$stack, $err, $template = false) - { - if ($template) { - $mainmsg = $template; - } else { - $mainmsg = $stack->getErrorMessageTemplate($err['code']); - } - $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg); - if (count($err['params'])) { - foreach ($err['params'] as $name => $val) { - if (is_array($val)) { - // @ is needed in case $val is a multi-dimensional array - $val = @implode(', ', $val); - } - if (is_object($val)) { - if (method_exists($val, '__toString')) { - $val = $val->__toString(); - } else { - PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING, - 'warning', array('obj' => get_class($val)), - 'object %obj% passed into getErrorMessage, but has no __toString() method'); - $val = 'Object'; - } - } - $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg); - } - } - return $mainmsg; - } - - /** - * Standard Error Message Template generator from code - * @return string - */ - function getErrorMessageTemplate($code) - { - if (!isset($this->_errorMsgs[$code])) { - return '%__msg%'; - } - return $this->_errorMsgs[$code]; - } - - /** - * Set the Error Message Template array - * - * The array format must be: - *
    -     * array(error code => 'message template',...)
    -     * 
    - * - * Error message parameters passed into {@link push()} will be used as input - * for the error message. If the template is 'message %foo% was %bar%', and the - * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will - * be 'message one was six' - * @return string - */ - function setErrorMessageTemplate($template) - { - $this->_errorMsgs = $template; - } - - - /** - * emulate PEAR::raiseError() - * - * @return PEAR_Error - */ - function raiseError() - { - require_once 'PEAR.php'; - $args = func_get_args(); - return call_user_func_array(array('PEAR', 'raiseError'), $args); - } -} -$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack'); -$stack->pushCallback(array('PEAR_ErrorStack', '_handleError')); -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Exception.php b/3rdparty/PEAR/Exception.php deleted file mode 100644 index c735c16b398..00000000000 --- a/3rdparty/PEAR/Exception.php +++ /dev/null @@ -1,359 +0,0 @@ - | -// | Hans Lellelid | -// | Bertrand Mansion | -// | Greg Beaver | -// +----------------------------------------------------------------------+ -// -// $Id: Exception.php,v 1.4.2.2 2004/12/31 19:01:52 cellog Exp $ - - -/** - * Base PEAR_Exception Class - * - * WARNING: This code should be considered stable, but the API is - * subject to immediate and drastic change, so API stability is - * at best alpha - * - * 1) Features: - * - * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) - * - Definable triggers, shot when exceptions occur - * - Pretty and informative error messages - * - Added more context info available (like class, method or cause) - * - cause can be a PEAR_Exception or an array of mixed - * PEAR_Exceptions/PEAR_ErrorStack warnings - * - callbacks for specific exception classes and their children - * - * 2) Ideas: - * - * - Maybe a way to define a 'template' for the output - * - * 3) Inherited properties from PHP Exception Class: - * - * protected $message - * protected $code - * protected $line - * protected $file - * private $trace - * - * 4) Inherited methods from PHP Exception Class: - * - * __clone - * __construct - * getMessage - * getCode - * getFile - * getLine - * getTraceSafe - * getTraceSafeAsString - * __toString - * - * 5) Usage example - * - * - * require_once 'PEAR/Exception.php'; - * - * class Test { - * function foo() { - * throw new PEAR_Exception('Error Message', ERROR_CODE); - * } - * } - * - * function myLogger($pear_exception) { - * echo $pear_exception->getMessage(); - * } - * // each time a exception is thrown the 'myLogger' will be called - * // (its use is completely optional) - * PEAR_Exception::addObserver('myLogger'); - * $test = new Test; - * try { - * $test->foo(); - * } catch (PEAR_Exception $e) { - * print $e; - * } - * - * - * @since PHP 5 - * @package PEAR - * @version $Revision: 1.4.2.2 $ - * @author Tomas V.V.Cox - * @author Hans Lellelid - * @author Bertrand Mansion - * - */ -class PEAR_Exception extends Exception -{ - const OBSERVER_PRINT = -2; - const OBSERVER_TRIGGER = -4; - const OBSERVER_DIE = -8; - protected $cause; - private static $_observers = array(); - private static $_uniqueid = 0; - private $_trace; - - /** - * Supported signatures: - * PEAR_Exception(string $message); - * PEAR_Exception(string $message, int $code); - * PEAR_Exception(string $message, Exception $cause); - * PEAR_Exception(string $message, Exception $cause, int $code); - * PEAR_Exception(string $message, array $causes); - * PEAR_Exception(string $message, array $causes, int $code); - */ - public function __construct($message, $p2 = null, $p3 = null) - { - if (is_int($p2)) { - $code = $p2; - $this->cause = null; - } elseif ($p2 instanceof Exception || is_array($p2)) { - $code = $p3; - if (is_array($p2) && isset($p2['message'])) { - // fix potential problem of passing in a single warning - $p2 = array($p2); - } - $this->cause = $p2; - } else { - $code = null; - $this->cause = null; - } - parent::__construct($message, $code); - $this->signal(); - } - - /** - * @param mixed $callback - A valid php callback, see php func is_callable() - * - A PEAR_Exception::OBSERVER_* constant - * - An array(const PEAR_Exception::OBSERVER_*, - * mixed $options) - * @param string $label The name of the observer. Use this if you want - * to remove it later with removeObserver() - */ - public static function addObserver($callback, $label = 'default') - { - self::$_observers[$label] = $callback; - } - - public static function removeObserver($label = 'default') - { - unset(self::$_observers[$label]); - } - - /** - * @return int unique identifier for an observer - */ - public static function getUniqueId() - { - return self::$_uniqueid++; - } - - private function signal() - { - foreach (self::$_observers as $func) { - if (is_callable($func)) { - call_user_func($func, $this); - continue; - } - settype($func, 'array'); - switch ($func[0]) { - case self::OBSERVER_PRINT : - $f = (isset($func[1])) ? $func[1] : '%s'; - printf($f, $this->getMessage()); - break; - case self::OBSERVER_TRIGGER : - $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; - trigger_error($this->getMessage(), $f); - break; - case self::OBSERVER_DIE : - $f = (isset($func[1])) ? $func[1] : '%s'; - die(printf($f, $this->getMessage())); - break; - default: - trigger_error('invalid observer type', E_USER_WARNING); - } - } - } - - /** - * Return specific error information that can be used for more detailed - * error messages or translation. - * - * This method may be overridden in child exception classes in order - * to add functionality not present in PEAR_Exception and is a placeholder - * to define API - * - * The returned array must be an associative array of parameter => value like so: - *
    -     * array('name' => $name, 'context' => array(...))
    -     * 
    - * @return array - */ - public function getErrorData() - { - return array(); - } - - /** - * Returns the exception that caused this exception to be thrown - * @access public - * @return Exception|array The context of the exception - */ - public function getCause() - { - return $this->cause; - } - - /** - * Function must be public to call on caused exceptions - * @param array - */ - public function getCauseMessage(&$causes) - { - $trace = $this->getTraceSafe(); - $cause = array('class' => get_class($this), - 'message' => $this->message, - 'file' => 'unknown', - 'line' => 'unknown'); - if (isset($trace[0])) { - if (isset($trace[0]['file'])) { - $cause['file'] = $trace[0]['file']; - $cause['line'] = $trace[0]['line']; - } - } - if ($this->cause instanceof PEAR_Exception) { - $this->cause->getCauseMessage($causes); - } - if (is_array($this->cause)) { - foreach ($this->cause as $cause) { - if ($cause instanceof PEAR_Exception) { - $cause->getCauseMessage($causes); - } elseif (is_array($cause) && isset($cause['message'])) { - // PEAR_ErrorStack warning - $causes[] = array( - 'class' => $cause['package'], - 'message' => $cause['message'], - 'file' => isset($cause['context']['file']) ? - $cause['context']['file'] : - 'unknown', - 'line' => isset($cause['context']['line']) ? - $cause['context']['line'] : - 'unknown', - ); - } - } - } - } - - public function getTraceSafe() - { - if (!isset($this->_trace)) { - $this->_trace = $this->getTrace(); - if (empty($this->_trace)) { - $backtrace = debug_backtrace(); - $this->_trace = array($backtrace[count($backtrace)-1]); - } - } - return $this->_trace; - } - - public function getErrorClass() - { - $trace = $this->getTraceSafe(); - return $trace[0]['class']; - } - - public function getErrorMethod() - { - $trace = $this->getTraceSafe(); - return $trace[0]['function']; - } - - public function __toString() - { - if (isset($_SERVER['REQUEST_URI'])) { - return $this->toHtml(); - } - return $this->toText(); - } - - public function toHtml() - { - $trace = $this->getTraceSafe(); - $causes = array(); - $this->getCauseMessage($causes); - $html = '' . "\n"; - foreach ($causes as $i => $cause) { - $html .= '\n"; - } - $html .= '' . "\n" - . '' - . '' - . '' . "\n"; - - foreach ($trace as $k => $v) { - $html .= '' - . '' - . '' . "\n"; - } - $html .= '' - . '' - . '' . "\n" - . '
    ' - . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' - . htmlspecialchars($cause['message']) . ' in ' . $cause['file'] . ' ' - . 'on line ' . $cause['line'] . '' - . "
    Exception trace
    #FunctionLocation
    ' . $k . ''; - if (!empty($v['class'])) { - $html .= $v['class'] . $v['type']; - } - $html .= $v['function']; - $args = array(); - if (!empty($v['args'])) { - foreach ($v['args'] as $arg) { - if (is_null($arg)) $args[] = 'null'; - elseif (is_array($arg)) $args[] = 'Array'; - elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')'; - elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false'; - elseif (is_int($arg) || is_double($arg)) $args[] = $arg; - else { - $arg = (string)$arg; - $str = htmlspecialchars(substr($arg, 0, 16)); - if (strlen($arg) > 16) $str .= '…'; - $args[] = "'" . $str . "'"; - } - } - } - $html .= '(' . implode(', ',$args) . ')' - . '' . $v['file'] . ':' . $v['line'] . '
    ' . ($k+1) . '{main} 
    '; - return $html; - } - - public function toText() - { - $causes = array(); - $this->getCauseMessage($causes); - $causeMsg = ''; - foreach ($causes as $i => $cause) { - $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' - . $cause['message'] . ' in ' . $cause['file'] - . ' on line ' . $cause['line'] . "\n"; - } - return $causeMsg . $this->getTraceAsString(); - } -} - -?> \ No newline at end of file diff --git a/3rdparty/PEAR/Frontend/CLI.php b/3rdparty/PEAR/Frontend/CLI.php deleted file mode 100644 index 832ddf09b3f..00000000000 --- a/3rdparty/PEAR/Frontend/CLI.php +++ /dev/null @@ -1,509 +0,0 @@ - | - +----------------------------------------------------------------------+ - - $Id: CLI.php,v 1.41 2004/02/17 05:49:16 ssb Exp $ -*/ - -require_once "PEAR.php"; - -class PEAR_Frontend_CLI extends PEAR -{ - // {{{ properties - - /** - * What type of user interface this frontend is for. - * @var string - * @access public - */ - var $type = 'CLI'; - var $lp = ''; // line prefix - - var $params = array(); - var $term = array( - 'bold' => '', - 'normal' => '', - ); - - // }}} - - // {{{ constructor - - function PEAR_Frontend_CLI() - { - parent::PEAR(); - $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1 - if (function_exists('posix_isatty') && !posix_isatty(1)) { - // output is being redirected to a file or through a pipe - } elseif ($term) { - // XXX can use ncurses extension here, if available - if (preg_match('/^(xterm|vt220|linux)/', $term)) { - $this->term['bold'] = sprintf("%c%c%c%c", 27, 91, 49, 109); - $this->term['normal']=sprintf("%c%c%c", 27, 91, 109); - } elseif (preg_match('/^vt100/', $term)) { - $this->term['bold'] = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); - $this->term['normal']=sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0); - } - } elseif (OS_WINDOWS) { - // XXX add ANSI codes here - } - } - - // }}} - - // {{{ displayLine(text) - - function displayLine($text) - { - trigger_error("PEAR_Frontend_CLI::displayLine deprecated", E_USER_ERROR); - } - - function _displayLine($text) - { - print "$this->lp$text\n"; - } - - // }}} - // {{{ display(text) - - function display($text) - { - trigger_error("PEAR_Frontend_CLI::display deprecated", E_USER_ERROR); - } - - function _display($text) - { - print $text; - } - - // }}} - // {{{ displayError(eobj) - - /** - * @param object PEAR_Error object - */ - function displayError($eobj) - { - return $this->_displayLine($eobj->getMessage()); - } - - // }}} - // {{{ displayFatalError(eobj) - - /** - * @param object PEAR_Error object - */ - function displayFatalError($eobj) - { - $this->displayError($eobj); - exit(1); - } - - // }}} - // {{{ displayHeading(title) - - function displayHeading($title) - { - trigger_error("PEAR_Frontend_CLI::displayHeading deprecated", E_USER_ERROR); - } - - function _displayHeading($title) - { - print $this->lp.$this->bold($title)."\n"; - print $this->lp.str_repeat("=", strlen($title))."\n"; - } - - // }}} - // {{{ userDialog(prompt, [type], [default]) - - function userDialog($command, $prompts, $types = array(), $defaults = array()) - { - $result = array(); - if (is_array($prompts)) { - $fp = fopen("php://stdin", "r"); - foreach ($prompts as $key => $prompt) { - $type = $types[$key]; - $default = @$defaults[$key]; - if ($type == 'password') { - system('stty -echo'); - } - print "$this->lp$prompt "; - if ($default) { - print "[$default] "; - } - print ": "; - $line = fgets($fp, 2048); - if ($type == 'password') { - system('stty echo'); - print "\n"; - } - if ($default && trim($line) == "") { - $result[$key] = $default; - } else { - $result[$key] = $line; - } - } - fclose($fp); - } - return $result; - } - - // }}} - // {{{ userConfirm(prompt, [default]) - - function userConfirm($prompt, $default = 'yes') - { - trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); - static $positives = array('y', 'yes', 'on', '1'); - static $negatives = array('n', 'no', 'off', '0'); - print "$this->lp$prompt [$default] : "; - $fp = fopen("php://stdin", "r"); - $line = fgets($fp, 2048); - fclose($fp); - $answer = strtolower(trim($line)); - if (empty($answer)) { - $answer = $default; - } - if (in_array($answer, $positives)) { - return true; - } - if (in_array($answer, $negatives)) { - return false; - } - if (in_array($default, $positives)) { - return true; - } - return false; - } - - // }}} - // {{{ startTable([params]) - - function startTable($params = array()) - { - trigger_error("PEAR_Frontend_CLI::startTable deprecated", E_USER_ERROR); - } - - function _startTable($params = array()) - { - $params['table_data'] = array(); - $params['widest'] = array(); // indexed by column - $params['highest'] = array(); // indexed by row - $params['ncols'] = 0; - $this->params = $params; - } - - // }}} - // {{{ tableRow(columns, [rowparams], [colparams]) - - function tableRow($columns, $rowparams = array(), $colparams = array()) - { - trigger_error("PEAR_Frontend_CLI::tableRow deprecated", E_USER_ERROR); - } - - function _tableRow($columns, $rowparams = array(), $colparams = array()) - { - $highest = 1; - for ($i = 0; $i < sizeof($columns); $i++) { - $col = &$columns[$i]; - if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) { - $col = wordwrap($col, $colparams[$i]['wrap'], "\n", 0); - } - if (strpos($col, "\n") !== false) { - $multiline = explode("\n", $col); - $w = 0; - foreach ($multiline as $n => $line) { - if (strlen($line) > $w) { - $w = strlen($line); - } - } - $lines = sizeof($multiline); - } else { - $w = strlen($col); - } - if ($w > @$this->params['widest'][$i]) { - $this->params['widest'][$i] = $w; - } - $tmp = count_chars($columns[$i], 1); - // handle unix, mac and windows formats - $lines = (isset($tmp[10]) ? $tmp[10] : @$tmp[13]) + 1; - if ($lines > $highest) { - $highest = $lines; - } - } - if (sizeof($columns) > $this->params['ncols']) { - $this->params['ncols'] = sizeof($columns); - } - $new_row = array( - 'data' => $columns, - 'height' => $highest, - 'rowparams' => $rowparams, - 'colparams' => $colparams, - ); - $this->params['table_data'][] = $new_row; - } - - // }}} - // {{{ endTable() - - function endTable() - { - trigger_error("PEAR_Frontend_CLI::endTable deprecated", E_USER_ERROR); - } - - function _endTable() - { - extract($this->params); - if (!empty($caption)) { - $this->_displayHeading($caption); - } - if (count($table_data) == 0) { - return; - } - if (!isset($width)) { - $width = $widest; - } else { - for ($i = 0; $i < $ncols; $i++) { - if (!isset($width[$i])) { - $width[$i] = $widest[$i]; - } - } - } - $border = false; - if (empty($border)) { - $cellstart = ''; - $cellend = ' '; - $rowend = ''; - $padrowend = false; - $borderline = ''; - } else { - $cellstart = '| '; - $cellend = ' '; - $rowend = '|'; - $padrowend = true; - $borderline = '+'; - foreach ($width as $w) { - $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1); - $borderline .= '+'; - } - } - if ($borderline) { - $this->_displayLine($borderline); - } - for ($i = 0; $i < sizeof($table_data); $i++) { - extract($table_data[$i]); - if (!is_array($rowparams)) { - $rowparams = array(); - } - if (!is_array($colparams)) { - $colparams = array(); - } - $rowlines = array(); - if ($height > 1) { - for ($c = 0; $c < sizeof($data); $c++) { - $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]); - if (sizeof($rowlines[$c]) < $height) { - $rowlines[$c] = array_pad($rowlines[$c], $height, ''); - } - } - } else { - for ($c = 0; $c < sizeof($data); $c++) { - $rowlines[$c] = array($data[$c]); - } - } - for ($r = 0; $r < $height; $r++) { - $rowtext = ''; - for ($c = 0; $c < sizeof($data); $c++) { - if (isset($colparams[$c])) { - $attribs = array_merge($rowparams, $colparams); - } else { - $attribs = $rowparams; - } - $w = isset($width[$c]) ? $width[$c] : 0; - //$cell = $data[$c]; - $cell = $rowlines[$c][$r]; - $l = strlen($cell); - if ($l > $w) { - $cell = substr($cell, 0, $w); - } - if (isset($attribs['bold'])) { - $cell = $this->bold($cell); - } - if ($l < $w) { - // not using str_pad here because we may - // add bold escape characters to $cell - $cell .= str_repeat(' ', $w - $l); - } - - $rowtext .= $cellstart . $cell . $cellend; - } - if (!$border) { - $rowtext = rtrim($rowtext); - } - $rowtext .= $rowend; - $this->_displayLine($rowtext); - } - } - if ($borderline) { - $this->_displayLine($borderline); - } - } - - // }}} - // {{{ outputData() - - function outputData($data, $command = '_default') - { - switch ($command) { - case 'install': - case 'upgrade': - case 'upgrade-all': - if (isset($data['release_warnings'])) { - $this->_displayLine(''); - $this->_startTable(array( - 'border' => false, - 'caption' => 'Release Warnings' - )); - $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55))); - $this->_endTable(); - $this->_displayLine(''); - } - $this->_displayLine($data['data']); - break; - case 'search': - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); - } - - foreach($data['data'] as $category) { - foreach($category as $pkg) { - $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); - } - }; - $this->_endTable(); - break; - case 'list-all': - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); - } - - foreach($data['data'] as $category) { - foreach($category as $pkg) { - unset($pkg[3]); - unset($pkg[4]); - $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); - } - }; - $this->_endTable(); - break; - case 'config-show': - $data['border'] = false; - $opts = array(0 => array('wrap' => 30), - 1 => array('wrap' => 20), - 2 => array('wrap' => 35)); - $this->_startTable($data); - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], - array('bold' => true), - $opts); - } - foreach($data['data'] as $group) { - foreach($group as $value) { - if ($value[2] == '') { - $value[2] = ""; - } - $this->_tableRow($value, null, $opts); - } - } - $this->_endTable(); - break; - case 'remote-info': - $data = array( - 'caption' => 'Package details:', - 'border' => false, - 'data' => array( - array("Latest", $data['stable']), - array("Installed", $data['installed']), - array("Package", $data['name']), - array("License", $data['license']), - array("Category", $data['category']), - array("Summary", $data['summary']), - array("Description", $data['description']), - ), - ); - default: { - if (is_array($data)) { - $this->_startTable($data); - $count = count($data['data'][0]); - if ($count == 2) { - $opts = array(0 => array('wrap' => 25), - 1 => array('wrap' => 48) - ); - } elseif ($count == 3) { - $opts = array(0 => array('wrap' => 30), - 1 => array('wrap' => 20), - 2 => array('wrap' => 35) - ); - } else { - $opts = null; - } - if (isset($data['headline']) && is_array($data['headline'])) { - $this->_tableRow($data['headline'], - array('bold' => true), - $opts); - } - foreach($data['data'] as $row) { - $this->_tableRow($row, null, $opts); - } - $this->_endTable(); - } else { - $this->_displayLine($data); - } - } - } - } - - // }}} - // {{{ log(text) - - - function log($text, $append_crlf = true) - { - if ($append_crlf) { - return $this->_displayLine($text); - } - return $this->_display($text); - } - - - // }}} - // {{{ bold($text) - - function bold($text) - { - if (empty($this->term['bold'])) { - return strtoupper($text); - } - return $this->term['bold'] . $text . $this->term['normal']; - } - - // }}} -} - -?> diff --git a/3rdparty/PEAR/Installer.php b/3rdparty/PEAR/Installer.php deleted file mode 100644 index 31e2cff81ee..00000000000 --- a/3rdparty/PEAR/Installer.php +++ /dev/null @@ -1,1068 +0,0 @@ - | -// | Tomas V.V.Cox | -// | Martin Jansen | -// +----------------------------------------------------------------------+ -// -// $Id: Installer.php,v 1.150.2.2 2005/02/17 17:47:55 cellog Exp $ - -require_once 'PEAR/Downloader.php'; - -/** - * Administration class used to install PEAR packages and maintain the - * installed package database. - * - * TODO: - * - Check dependencies break on package uninstall (when no force given) - * - add a guessInstallDest() method with the code from _installFile() and - * use that method in Registry::_rebuildFileMap() & Command_Registry::doList(), - * others.. - * - * @since PHP 4.0.2 - * @author Stig Bakken - * @author Martin Jansen - * @author Greg Beaver - */ -class PEAR_Installer extends PEAR_Downloader -{ - // {{{ properties - - /** name of the package directory, for example Foo-1.0 - * @var string - */ - var $pkgdir; - - /** directory where PHP code files go - * @var string - */ - var $phpdir; - - /** directory where PHP extension files go - * @var string - */ - var $extdir; - - /** directory where documentation goes - * @var string - */ - var $docdir; - - /** installation root directory (ala PHP's INSTALL_ROOT or - * automake's DESTDIR - * @var string - */ - var $installroot = ''; - - /** debug level - * @var int - */ - var $debug = 1; - - /** temporary directory - * @var string - */ - var $tmpdir; - - /** PEAR_Registry object used by the installer - * @var object - */ - var $registry; - - /** List of file transactions queued for an install/upgrade/uninstall. - * - * Format: - * array( - * 0 => array("rename => array("from-file", "to-file")), - * 1 => array("delete" => array("file-to-delete")), - * ... - * ) - * - * @var array - */ - var $file_operations = array(); - - // }}} - - // {{{ constructor - - /** - * PEAR_Installer constructor. - * - * @param object $ui user interface object (instance of PEAR_Frontend_*) - * - * @access public - */ - function PEAR_Installer(&$ui) - { - parent::PEAR_Common(); - $this->setFrontendObject($ui); - $this->debug = $this->config->get('verbose'); - //$this->registry = &new PEAR_Registry($this->config->get('php_dir')); - } - - // }}} - - // {{{ _deletePackageFiles() - - /** - * Delete a package's installed files, does not remove empty directories. - * - * @param string $package package name - * - * @return bool TRUE on success, or a PEAR error on failure - * - * @access private - */ - function _deletePackageFiles($package) - { - if (!strlen($package)) { - return $this->raiseError("No package to uninstall given"); - } - $filelist = $this->registry->packageInfo($package, 'filelist'); - if ($filelist == null) { - return $this->raiseError("$package not installed"); - } - foreach ($filelist as $file => $props) { - if (empty($props['installed_as'])) { - continue; - } - $path = $this->_prependPath($props['installed_as'], $this->installroot); - $this->addFileOperation('delete', array($path)); - } - return true; - } - - // }}} - // {{{ _installFile() - - /** - * @param string filename - * @param array attributes from tag in package.xml - * @param string path to install the file in - * @param array options from command-line - * @access private - */ - function _installFile($file, $atts, $tmp_path, $options) - { - // {{{ return if this file is meant for another platform - static $os; - if (isset($atts['platform'])) { - if (empty($os)) { - include_once "OS/Guess.php"; - $os = new OS_Guess(); - } - if (strlen($atts['platform']) && $atts['platform']{0} == '!') { - $negate = true; - $platform = substr($atts['platform'], 1); - } else { - $negate = false; - $platform = $atts['platform']; - } - if ((bool) $os->matchSignature($platform) === $negate) { - $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")"); - return PEAR_INSTALLER_SKIPPED; - } - } - // }}} - - // {{{ assemble the destination paths - switch ($atts['role']) { - case 'doc': - case 'data': - case 'test': - $dest_dir = $this->config->get($atts['role'] . '_dir') . - DIRECTORY_SEPARATOR . $this->pkginfo['package']; - unset($atts['baseinstalldir']); - break; - case 'ext': - case 'php': - $dest_dir = $this->config->get($atts['role'] . '_dir'); - break; - case 'script': - $dest_dir = $this->config->get('bin_dir'); - break; - case 'src': - case 'extsrc': - $this->source_files++; - return; - default: - return $this->raiseError("Invalid role `$atts[role]' for file $file"); - } - $save_destdir = $dest_dir; - if (!empty($atts['baseinstalldir'])) { - $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; - } - if (dirname($file) != '.' && empty($atts['install-as'])) { - $dest_dir .= DIRECTORY_SEPARATOR . dirname($file); - } - if (empty($atts['install-as'])) { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file); - } else { - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as']; - } - $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file; - - // Clean up the DIRECTORY_SEPARATOR mess - $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; - list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), - DIRECTORY_SEPARATOR, - array($dest_file, $orig_file)); - $installed_as = $dest_file; - $final_dest_file = $this->_prependPath($dest_file, $this->installroot); - $dest_dir = dirname($final_dest_file); - $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); - // }}} - - if (!@is_dir($dest_dir)) { - if (!$this->mkDirHier($dest_dir)) { - return $this->raiseError("failed to mkdir $dest_dir", - PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ mkdir $dest_dir"); - } - if (empty($atts['replacements'])) { - if (!file_exists($orig_file)) { - return $this->raiseError("file does not exist", - PEAR_INSTALLER_FAILED); - } - if (!@copy($orig_file, $dest_file)) { - return $this->raiseError("failed to write $dest_file", - PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ cp $orig_file $dest_file"); - if (isset($atts['md5sum'])) { - $md5sum = md5_file($dest_file); - } - } else { - // {{{ file with replacements - if (!file_exists($orig_file)) { - return $this->raiseError("file does not exist", - PEAR_INSTALLER_FAILED); - } - $fp = fopen($orig_file, "r"); - $contents = fread($fp, filesize($orig_file)); - fclose($fp); - if (isset($atts['md5sum'])) { - $md5sum = md5($contents); - } - $subst_from = $subst_to = array(); - foreach ($atts['replacements'] as $a) { - $to = ''; - if ($a['type'] == 'php-const') { - if (preg_match('/^[a-z0-9_]+$/i', $a['to'])) { - eval("\$to = $a[to];"); - } else { - $this->log(0, "invalid php-const replacement: $a[to]"); - continue; - } - } elseif ($a['type'] == 'pear-config') { - $to = $this->config->get($a['to']); - if (is_null($to)) { - $this->log(0, "invalid pear-config replacement: $a[to]"); - continue; - } - } elseif ($a['type'] == 'package-info') { - if (isset($this->pkginfo[$a['to']]) && is_string($this->pkginfo[$a['to']])) { - $to = $this->pkginfo[$a['to']]; - } else { - $this->log(0, "invalid package-info replacement: $a[to]"); - continue; - } - } - if (!is_null($to)) { - $subst_from[] = $a['from']; - $subst_to[] = $to; - } - } - $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file"); - if (sizeof($subst_from)) { - $contents = str_replace($subst_from, $subst_to, $contents); - } - $wp = @fopen($dest_file, "wb"); - if (!is_resource($wp)) { - return $this->raiseError("failed to create $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - if (!fwrite($wp, $contents)) { - return $this->raiseError("failed writing to $dest_file: $php_errormsg", - PEAR_INSTALLER_FAILED); - } - fclose($wp); - // }}} - } - // {{{ check the md5 - if (isset($md5sum)) { - if (strtolower($md5sum) == strtolower($atts['md5sum'])) { - $this->log(2, "md5sum ok: $final_dest_file"); - } else { - if (empty($options['force'])) { - // delete the file - @unlink($dest_file); - return $this->raiseError("bad md5sum for file $final_dest_file", - PEAR_INSTALLER_FAILED); - } else { - $this->log(0, "warning : bad md5sum for file $final_dest_file"); - } - } - } - // }}} - // {{{ set file permissions - if (!OS_WINDOWS) { - if ($atts['role'] == 'script') { - $mode = 0777 & ~(int)octdec($this->config->get('umask')); - $this->log(3, "+ chmod +x $dest_file"); - } else { - $mode = 0666 & ~(int)octdec($this->config->get('umask')); - } - $this->addFileOperation("chmod", array($mode, $dest_file)); - if (!@chmod($dest_file, $mode)) { - $this->log(0, "failed to change mode of $dest_file"); - } - } - // }}} - $this->addFileOperation("rename", array($dest_file, $final_dest_file)); - // Store the full path where the file was installed for easy unistall - $this->addFileOperation("installed_as", array($file, $installed_as, - $save_destdir, dirname(substr($dest_file, strlen($save_destdir))))); - - //$this->log(2, "installed: $dest_file"); - return PEAR_INSTALLER_OK; - } - - // }}} - // {{{ addFileOperation() - - /** - * Add a file operation to the current file transaction. - * - * @see startFileTransaction() - * @var string $type This can be one of: - * - rename: rename a file ($data has 2 values) - * - chmod: change permissions on a file ($data has 2 values) - * - delete: delete a file ($data has 1 value) - * - rmdir: delete a directory if empty ($data has 1 value) - * - installed_as: mark a file as installed ($data has 4 values). - * @var array $data For all file operations, this array must contain the - * full path to the file or directory that is being operated on. For - * the rename command, the first parameter must be the file to rename, - * the second its new name. - * - * The installed_as operation contains 4 elements in this order: - * 1. Filename as listed in the filelist element from package.xml - * 2. Full path to the installed file - * 3. Full path from the php_dir configuration variable used in this - * installation - * 4. Relative path from the php_dir that this file is installed in - */ - function addFileOperation($type, $data) - { - if (!is_array($data)) { - return $this->raiseError('Internal Error: $data in addFileOperation' - . ' must be an array, was ' . gettype($data)); - } - if ($type == 'chmod') { - $octmode = decoct($data[0]); - $this->log(3, "adding to transaction: $type $octmode $data[1]"); - } else { - $this->log(3, "adding to transaction: $type " . implode(" ", $data)); - } - $this->file_operations[] = array($type, $data); - } - - // }}} - // {{{ startFileTransaction() - - function startFileTransaction($rollback_in_case = false) - { - if (count($this->file_operations) && $rollback_in_case) { - $this->rollbackFileTransaction(); - } - $this->file_operations = array(); - } - - // }}} - // {{{ commitFileTransaction() - - function commitFileTransaction() - { - $n = count($this->file_operations); - $this->log(2, "about to commit $n file operations"); - // {{{ first, check permissions and such manually - $errors = array(); - foreach ($this->file_operations as $tr) { - list($type, $data) = $tr; - switch ($type) { - case 'rename': - if (!file_exists($data[0])) { - $errors[] = "cannot rename file $data[0], doesn't exist"; - } - // check that dest dir. is writable - if (!is_writable(dirname($data[1]))) { - $errors[] = "permission denied ($type): $data[1]"; - } - break; - case 'chmod': - // check that file is writable - if (!is_writable($data[1])) { - $errors[] = "permission denied ($type): $data[1] " . decoct($data[0]); - } - break; - case 'delete': - if (!file_exists($data[0])) { - $this->log(2, "warning: file $data[0] doesn't exist, can't be deleted"); - } - // check that directory is writable - if (file_exists($data[0]) && !is_writable(dirname($data[0]))) { - $errors[] = "permission denied ($type): $data[0]"; - } - break; - } - - } - // }}} - $m = sizeof($errors); - if ($m > 0) { - foreach ($errors as $error) { - $this->log(1, $error); - } - return false; - } - // {{{ really commit the transaction - foreach ($this->file_operations as $tr) { - list($type, $data) = $tr; - switch ($type) { - case 'rename': - @unlink($data[1]); - @rename($data[0], $data[1]); - $this->log(3, "+ mv $data[0] $data[1]"); - break; - case 'chmod': - @chmod($data[1], $data[0]); - $octmode = decoct($data[0]); - $this->log(3, "+ chmod $octmode $data[1]"); - break; - case 'delete': - @unlink($data[0]); - $this->log(3, "+ rm $data[0]"); - break; - case 'rmdir': - @rmdir($data[0]); - $this->log(3, "+ rmdir $data[0]"); - break; - case 'installed_as': - $this->pkginfo['filelist'][$data[0]]['installed_as'] = $data[1]; - if (!isset($this->pkginfo['filelist']['dirtree'][dirname($data[1])])) { - $this->pkginfo['filelist']['dirtree'][dirname($data[1])] = true; - while(!empty($data[3]) && $data[3] != '/' && $data[3] != '\\' - && $data[3] != '.') { - $this->pkginfo['filelist']['dirtree'] - [$this->_prependPath($data[3], $data[2])] = true; - $data[3] = dirname($data[3]); - } - } - break; - } - } - // }}} - $this->log(2, "successfully committed $n file operations"); - $this->file_operations = array(); - return true; - } - - // }}} - // {{{ rollbackFileTransaction() - - function rollbackFileTransaction() - { - $n = count($this->file_operations); - $this->log(2, "rolling back $n file operations"); - foreach ($this->file_operations as $tr) { - list($type, $data) = $tr; - switch ($type) { - case 'rename': - @unlink($data[0]); - $this->log(3, "+ rm $data[0]"); - break; - case 'mkdir': - @rmdir($data[0]); - $this->log(3, "+ rmdir $data[0]"); - break; - case 'chmod': - break; - case 'delete': - break; - case 'installed_as': - if (isset($this->pkginfo['filelist'])) { - unset($this->pkginfo['filelist'][$data[0]]['installed_as']); - } - if (isset($this->pkginfo['filelist']['dirtree'][dirname($data[1])])) { - unset($this->pkginfo['filelist']['dirtree'][dirname($data[1])]); - while(!empty($data[3]) && $data[3] != '/' && $data[3] != '\\' - && $data[3] != '.') { - unset($this->pkginfo['filelist']['dirtree'] - [$this->_prependPath($data[3], $data[2])]); - $data[3] = dirname($data[3]); - } - } - if (isset($this->pkginfo['filelist']['dirtree']) - && !count($this->pkginfo['filelist']['dirtree'])) { - unset($this->pkginfo['filelist']['dirtree']); - } - break; - } - } - $this->file_operations = array(); - } - - // }}} - // {{{ mkDirHier($dir) - - function mkDirHier($dir) - { - $this->addFileOperation('mkdir', array($dir)); - return parent::mkDirHier($dir); - } - - // }}} - // {{{ download() - - /** - * Download any files and their dependencies, if necessary - * - * @param array a mixed list of package names, local files, or package.xml - * @param PEAR_Config - * @param array options from the command line - * @param array this is the array that will be populated with packages to - * install. Format of each entry: - * - * - * array('pkg' => 'package_name', 'file' => '/path/to/local/file', - * 'info' => array() // parsed package.xml - * ); - * - * @param array this will be populated with any error messages - * @param false private recursion variable - * @param false private recursion variable - * @param false private recursion variable - * @deprecated in favor of PEAR_Downloader - */ - function download($packages, $options, &$config, &$installpackages, - &$errors, $installed = false, $willinstall = false, $state = false) - { - // trickiness: initialize here - parent::PEAR_Downloader($this->ui, $options, $config); - $ret = parent::download($packages); - $errors = $this->getErrorMsgs(); - $installpackages = $this->getDownloadedPackages(); - trigger_error("PEAR Warning: PEAR_Installer::download() is deprecated " . - "in favor of PEAR_Downloader class", E_USER_WARNING); - return $ret; - } - - // }}} - // {{{ install() - - /** - * Installs the files within the package file specified. - * - * @param string $pkgfile path to the package file - * @param array $options - * recognized options: - * - installroot : optional prefix directory for installation - * - force : force installation - * - register-only : update registry but don't install files - * - upgrade : upgrade existing install - * - soft : fail silently - * - nodeps : ignore dependency conflicts/missing dependencies - * - alldeps : install all dependencies - * - onlyreqdeps : install only required dependencies - * - * @return array|PEAR_Error package info if successful - */ - - function install($pkgfile, $options = array()) - { - $php_dir = $this->config->get('php_dir'); - if (isset($options['installroot'])) { - if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { - $options['installroot'] = substr($options['installroot'], 0, -1); - } - $php_dir = $this->_prependPath($php_dir, $options['installroot']); - $this->installroot = $options['installroot']; - } else { - $this->installroot = ''; - } - $this->registry = &new PEAR_Registry($php_dir); - // ==> XXX should be removed later on - $flag_old_format = false; - - if (substr($pkgfile, -4) == '.xml') { - $descfile = $pkgfile; - } else { - // {{{ Decompress pack in tmp dir ------------------------------------- - - // To allow relative package file names - $pkgfile = realpath($pkgfile); - - if (PEAR::isError($tmpdir = System::mktemp('-d'))) { - return $tmpdir; - } - $this->log(3, '+ tmp dir created at ' . $tmpdir); - - $tar = new Archive_Tar($pkgfile); - if (!@$tar->extract($tmpdir)) { - return $this->raiseError("unable to unpack $pkgfile"); - } - - // {{{ Look for existing package file - $descfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; - - if (!is_file($descfile)) { - // ----- Look for old package archive format - // In this format the package.xml file was inside the - // Package-n.n directory - $dp = opendir($tmpdir); - do { - $pkgdir = readdir($dp); - } while ($pkgdir{0} == '.'); - - $descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml'; - $flag_old_format = true; - $this->log(0, "warning : you are using an archive with an old format"); - } - // }}} - // <== XXX This part should be removed later on - // }}} - } - - if (!is_file($descfile)) { - return $this->raiseError("no package.xml file after extracting the archive"); - } - - // Parse xml file ----------------------------------------------- - $pkginfo = $this->infoFromDescriptionFile($descfile); - if (PEAR::isError($pkginfo)) { - return $pkginfo; - } - $this->validatePackageInfo($pkginfo, $errors, $warnings); - // XXX We allow warnings, do we have to do it? - if (count($errors)) { - if (empty($options['force'])) { - return $this->raiseError("The following errors where found (use force option to install anyway):\n". - implode("\n", $errors)); - } else { - $this->log(0, "warning : the following errors were found:\n". - implode("\n", $errors)); - } - } - - $pkgname = $pkginfo['package']; - - // {{{ Check dependencies ------------------------------------------- - if (isset($pkginfo['release_deps']) && empty($options['nodeps'])) { - $dep_errors = ''; - $error = $this->checkDeps($pkginfo, $dep_errors); - if ($error == true) { - if (empty($options['soft'])) { - $this->log(0, substr($dep_errors, 1)); - } - return $this->raiseError("$pkgname: Dependencies failed"); - } else if (!empty($dep_errors)) { - // Print optional dependencies - if (empty($options['soft'])) { - $this->log(0, $dep_errors); - } - } - } - // }}} - - // {{{ checks to do when not in "force" mode - if (empty($options['force'])) { - $test = $this->registry->checkFileMap($pkginfo); - if (sizeof($test)) { - $tmp = $test; - foreach ($tmp as $file => $pkg) { - if ($pkg == $pkgname) { - unset($test[$file]); - } - } - if (sizeof($test)) { - $msg = "$pkgname: conflicting files found:\n"; - $longest = max(array_map("strlen", array_keys($test))); - $fmt = "%${longest}s (%s)\n"; - foreach ($test as $file => $pkg) { - $msg .= sprintf($fmt, $file, $pkg); - } - return $this->raiseError($msg); - } - } - } - // }}} - - $this->startFileTransaction(); - - if (empty($options['upgrade'])) { - // checks to do only when installing new packages - if (empty($options['force']) && $this->registry->packageExists($pkgname)) { - return $this->raiseError("$pkgname already installed"); - } - } else { - if ($this->registry->packageExists($pkgname)) { - $v1 = $this->registry->packageInfo($pkgname, 'version'); - $v2 = $pkginfo['version']; - $cmp = version_compare("$v1", "$v2", 'gt'); - if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) { - return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)"); - } - if (empty($options['register-only'])) { - // when upgrading, remove old release's files first: - if (PEAR::isError($err = $this->_deletePackageFiles($pkgname))) { - return $this->raiseError($err); - } - } - } - } - - // {{{ Copy files to dest dir --------------------------------------- - - // info from the package it self we want to access from _installFile - $this->pkginfo = &$pkginfo; - // used to determine whether we should build any C code - $this->source_files = 0; - - if (empty($options['register-only'])) { - if (!is_dir($php_dir)) { - return $this->raiseError("no script destination directory\n", - null, PEAR_ERROR_DIE); - } - - $tmp_path = dirname($descfile); - if (substr($pkgfile, -4) != '.xml') { - $tmp_path .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkginfo['version']; - } - - // ==> XXX This part should be removed later on - if ($flag_old_format) { - $tmp_path = dirname($descfile); - } - // <== XXX This part should be removed later on - - // {{{ install files - foreach ($pkginfo['filelist'] as $file => $atts) { - $this->expectError(PEAR_INSTALLER_FAILED); - $res = $this->_installFile($file, $atts, $tmp_path, $options); - $this->popExpect(); - if (PEAR::isError($res)) { - if (empty($options['ignore-errors'])) { - $this->rollbackFileTransaction(); - if ($res->getMessage() == "file does not exist") { - $this->raiseError("file $file in package.xml does not exist"); - } - return $this->raiseError($res); - } else { - $this->log(0, "Warning: " . $res->getMessage()); - } - } - if ($res != PEAR_INSTALLER_OK) { - // Do not register files that were not installed - unset($pkginfo['filelist'][$file]); - } - } - // }}} - - // {{{ compile and install source files - if ($this->source_files > 0 && empty($options['nobuild'])) { - $this->log(1, "$this->source_files source files, building"); - $bob = &new PEAR_Builder($this->ui); - $bob->debug = $this->debug; - $built = $bob->build($descfile, array(&$this, '_buildCallback')); - if (PEAR::isError($built)) { - $this->rollbackFileTransaction(); - return $built; - } - $this->log(1, "\nBuild process completed successfully"); - foreach ($built as $ext) { - $bn = basename($ext['file']); - list($_ext_name, $_ext_suff) = explode('.', $bn); - if ($_ext_suff == '.so' || $_ext_suff == '.dll') { - if (extension_loaded($_ext_name)) { - $this->raiseError("Extension '$_ext_name' already loaded. " . - 'Please unload it in your php.ini file ' . - 'prior to install or upgrade'); - } - $role = 'ext'; - } else { - $role = 'src'; - } - $dest = $ext['dest']; - $this->log(1, "Installing '$ext[file]'"); - $copyto = $this->_prependPath($dest, $this->installroot); - $copydir = dirname($copyto); - if (!@is_dir($copydir)) { - if (!$this->mkDirHier($copydir)) { - return $this->raiseError("failed to mkdir $copydir", - PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ mkdir $copydir"); - } - if (!@copy($ext['file'], $copyto)) { - return $this->raiseError("failed to write $copyto", PEAR_INSTALLER_FAILED); - } - $this->log(3, "+ cp $ext[file] $copyto"); - if (!OS_WINDOWS) { - $mode = 0666 & ~(int)octdec($this->config->get('umask')); - $this->addFileOperation('chmod', array($mode, $copyto)); - if (!@chmod($copyto, $mode)) { - $this->log(0, "failed to change mode of $copyto"); - } - } - $this->addFileOperation('rename', array($ext['file'], $copyto)); - - $pkginfo['filelist'][$bn] = array( - 'role' => $role, - 'installed_as' => $dest, - 'php_api' => $ext['php_api'], - 'zend_mod_api' => $ext['zend_mod_api'], - 'zend_ext_api' => $ext['zend_ext_api'], - ); - } - } - // }}} - } - - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED); - } - // }}} - - $ret = false; - // {{{ Register that the package is installed ----------------------- - if (empty($options['upgrade'])) { - // if 'force' is used, replace the info in registry - if (!empty($options['force']) && $this->registry->packageExists($pkgname)) { - $this->registry->deletePackage($pkgname); - } - $ret = $this->registry->addPackage($pkgname, $pkginfo); - } else { - // new: upgrade installs a package if it isn't installed - if (!$this->registry->packageExists($pkgname)) { - $ret = $this->registry->addPackage($pkgname, $pkginfo); - } else { - $ret = $this->registry->updatePackage($pkgname, $pkginfo, false); - } - } - if (!$ret) { - return $this->raiseError("Adding package $pkgname to registry failed"); - } - // }}} - return $pkginfo; - } - - // }}} - // {{{ uninstall() - - /** - * Uninstall a package - * - * This method removes all files installed by the application, and then - * removes any empty directories. - * @param string package name - * @param array Command-line options. Possibilities include: - * - * - installroot: base installation dir, if not the default - * - nodeps: do not process dependencies of other packages to ensure - * uninstallation does not break things - */ - function uninstall($package, $options = array()) - { - $php_dir = $this->config->get('php_dir'); - if (isset($options['installroot'])) { - if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { - $options['installroot'] = substr($options['installroot'], 0, -1); - } - $this->installroot = $options['installroot']; - $php_dir = $this->_prependPath($php_dir, $this->installroot); - } else { - $this->installroot = ''; - } - $this->registry = &new PEAR_Registry($php_dir); - $filelist = $this->registry->packageInfo($package, 'filelist'); - if ($filelist == null) { - return $this->raiseError("$package not installed"); - } - if (empty($options['nodeps'])) { - $depchecker = &new PEAR_Dependency($this->registry); - $error = $depchecker->checkPackageUninstall($errors, $warning, $package); - if ($error) { - return $this->raiseError($errors . 'uninstall failed'); - } - if ($warning) { - $this->log(0, $warning); - } - } - // {{{ Delete the files - $this->startFileTransaction(); - if (PEAR::isError($err = $this->_deletePackageFiles($package))) { - $this->rollbackFileTransaction(); - return $this->raiseError($err); - } - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - return $this->raiseError("uninstall failed"); - } else { - $this->startFileTransaction(); - if (!isset($filelist['dirtree']) || !count($filelist['dirtree'])) { - return $this->registry->deletePackage($package); - } - // attempt to delete empty directories - uksort($filelist['dirtree'], array($this, '_sortDirs')); - foreach($filelist['dirtree'] as $dir => $notused) { - $this->addFileOperation('rmdir', array($dir)); - } - if (!$this->commitFileTransaction()) { - $this->rollbackFileTransaction(); - } - } - // }}} - - // Register that the package is no longer installed - return $this->registry->deletePackage($package); - } - - // }}} - // {{{ _sortDirs() - function _sortDirs($a, $b) - { - if (strnatcmp($a, $b) == -1) return 1; - if (strnatcmp($a, $b) == 1) return -1; - return 0; - } - - // }}} - // {{{ checkDeps() - - /** - * Check if the package meets all dependencies - * - * @param array Package information (passed by reference) - * @param string Error message (passed by reference) - * @return boolean False when no error occured, otherwise true - */ - function checkDeps(&$pkginfo, &$errors) - { - if (empty($this->registry)) { - $this->registry = &new PEAR_Registry($this->config->get('php_dir')); - } - $depchecker = &new PEAR_Dependency($this->registry); - $error = $errors = ''; - $failed_deps = $optional_deps = array(); - if (is_array($pkginfo['release_deps'])) { - foreach($pkginfo['release_deps'] as $dep) { - $code = $depchecker->callCheckMethod($error, $dep); - if ($code) { - if (isset($dep['optional']) && $dep['optional'] == 'yes') { - $optional_deps[] = array($dep, $code, $error); - } else { - $failed_deps[] = array($dep, $code, $error); - } - } - } - // {{{ failed dependencies - $n = count($failed_deps); - if ($n > 0) { - for ($i = 0; $i < $n; $i++) { - if (isset($failed_deps[$i]['type'])) { - $type = $failed_deps[$i]['type']; - } else { - $type = 'pkg'; - } - switch ($failed_deps[$i][1]) { - case PEAR_DEPENDENCY_MISSING: - if ($type == 'pkg') { - // install - } - $errors .= "\n" . $failed_deps[$i][2]; - break; - case PEAR_DEPENDENCY_UPGRADE_MINOR: - if ($type == 'pkg') { - // upgrade - } - $errors .= "\n" . $failed_deps[$i][2]; - break; - default: - $errors .= "\n" . $failed_deps[$i][2]; - break; - } - } - return true; - } - // }}} - - // {{{ optional dependencies - $count_optional = count($optional_deps); - if ($count_optional > 0) { - $errors = "Optional dependencies:"; - - for ($i = 0; $i < $count_optional; $i++) { - if (isset($optional_deps[$i]['type'])) { - $type = $optional_deps[$i]['type']; - } else { - $type = 'pkg'; - } - switch ($optional_deps[$i][1]) { - case PEAR_DEPENDENCY_MISSING: - case PEAR_DEPENDENCY_UPGRADE_MINOR: - default: - $errors .= "\n" . $optional_deps[$i][2]; - break; - } - } - return false; - } - // }}} - } - return false; - } - - // }}} - // {{{ _buildCallback() - - function _buildCallback($what, $data) - { - if (($what == 'cmdoutput' && $this->debug > 1) || - ($what == 'output' && $this->debug > 0)) { - $this->ui->outputData(rtrim($data), 'build'); - } - } - - // }}} -} - -// {{{ md5_file() utility function -if (!function_exists("md5_file")) { - function md5_file($filename) { - $fp = fopen($filename, "r"); - if (!$fp) return null; - $contents = fread($fp, filesize($filename)); - fclose($fp); - return md5($contents); - } -} -// }}} - -?> diff --git a/3rdparty/PEAR/Packager.php b/3rdparty/PEAR/Packager.php deleted file mode 100644 index 3ed209be8b2..00000000000 --- a/3rdparty/PEAR/Packager.php +++ /dev/null @@ -1,165 +0,0 @@ - | -// | Tomas V.V.Cox | -// +----------------------------------------------------------------------+ -// -// $Id: Packager.php,v 1.53 2004/06/13 14:06:01 pajoye Exp $ - -require_once 'PEAR/Common.php'; -require_once 'System.php'; - -/** - * Administration class used to make a PEAR release tarball. - * - * TODO: - * - add an extra param the dir where to place the created package - * - * @since PHP 4.0.2 - * @author Stig Bakken - */ -class PEAR_Packager extends PEAR_Common -{ - // {{{ constructor - - function PEAR_Packager() - { - parent::PEAR_Common(); - } - - // }}} - // {{{ destructor - - function _PEAR_Packager() - { - parent::_PEAR_Common(); - } - - // }}} - - // {{{ package() - - function package($pkgfile = null, $compress = true) - { - // {{{ validate supplied package.xml file - if (empty($pkgfile)) { - $pkgfile = 'package.xml'; - } - // $this->pkginfo gets populated inside - $pkginfo = $this->infoFromDescriptionFile($pkgfile); - if (PEAR::isError($pkginfo)) { - return $this->raiseError($pkginfo); - } - - $pkgdir = dirname(realpath($pkgfile)); - $pkgfile = basename($pkgfile); - - $errors = $warnings = array(); - $this->validatePackageInfo($pkginfo, $errors, $warnings, $pkgdir); - foreach ($warnings as $w) { - $this->log(1, "Warning: $w"); - } - foreach ($errors as $e) { - $this->log(0, "Error: $e"); - } - if (sizeof($errors) > 0) { - return $this->raiseError('Errors in package'); - } - // }}} - - $pkgver = $pkginfo['package'] . '-' . $pkginfo['version']; - - // {{{ Create the package file list - $filelist = array(); - $i = 0; - - foreach ($pkginfo['filelist'] as $fname => $atts) { - $file = $pkgdir . DIRECTORY_SEPARATOR . $fname; - if (!file_exists($file)) { - return $this->raiseError("File does not exist: $fname"); - } else { - $filelist[$i++] = $file; - if (empty($pkginfo['filelist'][$fname]['md5sum'])) { - $md5sum = md5_file($file); - $pkginfo['filelist'][$fname]['md5sum'] = $md5sum; - } - $this->log(2, "Adding file $fname"); - } - } - // }}} - - // {{{ regenerate package.xml - $new_xml = $this->xmlFromInfo($pkginfo); - if (PEAR::isError($new_xml)) { - return $this->raiseError($new_xml); - } - if (!($tmpdir = System::mktemp(array('-d')))) { - return $this->raiseError("PEAR_Packager: mktemp failed"); - } - $newpkgfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; - $np = @fopen($newpkgfile, 'wb'); - if (!$np) { - return $this->raiseError("PEAR_Packager: unable to rewrite $pkgfile as $newpkgfile"); - } - fwrite($np, $new_xml); - fclose($np); - // }}} - - // {{{ TAR the Package ------------------------------------------- - $ext = $compress ? '.tgz' : '.tar'; - $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext; - $tar =& new Archive_Tar($dest_package, $compress); - $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors - // ----- Creates with the package.xml file - $ok = $tar->createModify(array($newpkgfile), '', $tmpdir); - if (PEAR::isError($ok)) { - return $this->raiseError($ok); - } elseif (!$ok) { - return $this->raiseError('PEAR_Packager: tarball creation failed'); - } - // ----- Add the content of the package - if (!$tar->addModify($filelist, $pkgver, $pkgdir)) { - return $this->raiseError('PEAR_Packager: tarball creation failed'); - } - $this->log(1, "Package $dest_package done"); - if (file_exists("$pkgdir/CVS/Root")) { - $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pkginfo['version']); - $cvstag = "RELEASE_$cvsversion"; - $this->log(1, "Tag the released code with `pear cvstag $pkgfile'"); - $this->log(1, "(or set the CVS tag $cvstag by hand)"); - } - // }}} - - return $dest_package; - } - - // }}} -} - -// {{{ md5_file() utility function -if (!function_exists('md5_file')) { - function md5_file($file) { - if (!$fd = @fopen($file, 'r')) { - return false; - } - $md5 = md5(fread($fd, filesize($file))); - fclose($fd); - return $md5; - } -} -// }}} - -?> diff --git a/3rdparty/PEAR/Registry.php b/3rdparty/PEAR/Registry.php deleted file mode 100644 index f2510a38f15..00000000000 --- a/3rdparty/PEAR/Registry.php +++ /dev/null @@ -1,538 +0,0 @@ - | -// | Tomas V.V.Cox | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: Registry.php,v 1.50.4.3 2004/10/26 19:19:56 cellog Exp $ - -/* -TODO: - - Transform into singleton() - - Add application level lock (avoid change the registry from the cmdline - while using the GTK interface, for ex.) -*/ -require_once "System.php"; -require_once "PEAR.php"; - -define('PEAR_REGISTRY_ERROR_LOCK', -2); -define('PEAR_REGISTRY_ERROR_FORMAT', -3); -define('PEAR_REGISTRY_ERROR_FILE', -4); - -/** - * Administration class used to maintain the installed package database. - */ -class PEAR_Registry extends PEAR -{ - // {{{ properties - - /** Directory where registry files are stored. - * @var string - */ - var $statedir = ''; - - /** File where the file map is stored - * @var string - */ - var $filemap = ''; - - /** Name of file used for locking the registry - * @var string - */ - var $lockfile = ''; - - /** File descriptor used during locking - * @var resource - */ - var $lock_fp = null; - - /** Mode used during locking - * @var int - */ - var $lock_mode = 0; // XXX UNUSED - - /** Cache of package information. Structure: - * array( - * 'package' => array('id' => ... ), - * ... ) - * @var array - */ - var $pkginfo_cache = array(); - - /** Cache of file map. Structure: - * array( '/path/to/file' => 'package', ... ) - * @var array - */ - var $filemap_cache = array(); - - // }}} - - // {{{ constructor - - /** - * PEAR_Registry constructor. - * - * @param string (optional) PEAR install directory (for .php files) - * - * @access public - */ - function PEAR_Registry($pear_install_dir = PEAR_INSTALL_DIR) - { - parent::PEAR(); - $ds = DIRECTORY_SEPARATOR; - $this->install_dir = $pear_install_dir; - $this->statedir = $pear_install_dir.$ds.'.registry'; - $this->filemap = $pear_install_dir.$ds.'.filemap'; - $this->lockfile = $pear_install_dir.$ds.'.lock'; - - // XXX Compatibility code should be removed in the future - // rename all registry files if any to lowercase - if (!OS_WINDOWS && $handle = @opendir($this->statedir)) { - $dest = $this->statedir . DIRECTORY_SEPARATOR; - while (false !== ($file = readdir($handle))) { - if (preg_match('/^.*[A-Z].*\.reg$/', $file)) { - rename($dest . $file, $dest . strtolower($file)); - } - } - closedir($handle); - } - if (!file_exists($this->filemap)) { - $this->rebuildFileMap(); - } - } - - // }}} - // {{{ destructor - - /** - * PEAR_Registry destructor. Makes sure no locks are forgotten. - * - * @access private - */ - function _PEAR_Registry() - { - parent::_PEAR(); - if (is_resource($this->lock_fp)) { - $this->_unlock(); - } - } - - // }}} - - // {{{ _assertStateDir() - - /** - * Make sure the directory where we keep registry files exists. - * - * @return bool TRUE if directory exists, FALSE if it could not be - * created - * - * @access private - */ - function _assertStateDir() - { - if (!@is_dir($this->statedir)) { - if (!System::mkdir(array('-p', $this->statedir))) { - return $this->raiseError("could not create directory '{$this->statedir}'"); - } - } - return true; - } - - // }}} - // {{{ _packageFileName() - - /** - * Get the name of the file where data for a given package is stored. - * - * @param string package name - * - * @return string registry file name - * - * @access public - */ - function _packageFileName($package) - { - return $this->statedir . DIRECTORY_SEPARATOR . strtolower($package) . '.reg'; - } - - // }}} - // {{{ _openPackageFile() - - function _openPackageFile($package, $mode) - { - $this->_assertStateDir(); - $file = $this->_packageFileName($package); - $fp = @fopen($file, $mode); - if (!$fp) { - return null; - } - return $fp; - } - - // }}} - // {{{ _closePackageFile() - - function _closePackageFile($fp) - { - fclose($fp); - } - - // }}} - // {{{ rebuildFileMap() - - function rebuildFileMap() - { - $packages = $this->listPackages(); - $files = array(); - foreach ($packages as $package) { - $version = $this->packageInfo($package, 'version'); - $filelist = $this->packageInfo($package, 'filelist'); - if (!is_array($filelist)) { - continue; - } - foreach ($filelist as $name => $attrs) { - if (isset($attrs['role']) && $attrs['role'] != 'php') { - continue; - } - if (isset($attrs['baseinstalldir'])) { - $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; - } else { - $file = $name; - } - $file = preg_replace(',^/+,', '', $file); - $files[$file] = $package; - } - } - $this->_assertStateDir(); - $fp = @fopen($this->filemap, 'wb'); - if (!$fp) { - return false; - } - $this->filemap_cache = $files; - fwrite($fp, serialize($files)); - fclose($fp); - return true; - } - - // }}} - // {{{ readFileMap() - - function readFileMap() - { - $fp = @fopen($this->filemap, 'r'); - if (!$fp) { - return $this->raiseError('PEAR_Registry: could not open filemap', PEAR_REGISTRY_ERROR_FILE, null, null, $php_errormsg); - } - $fsize = filesize($this->filemap); - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - $data = fread($fp, $fsize); - set_magic_quotes_runtime($rt); - fclose($fp); - $tmp = unserialize($data); - if (!$tmp && $fsize > 7) { - return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data); - } - $this->filemap_cache = $tmp; - return true; - } - - // }}} - // {{{ _lock() - - /** - * Lock the registry. - * - * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN. - * See flock manual for more information. - * - * @return bool TRUE on success, FALSE if locking failed, or a - * PEAR error if some other error occurs (such as the - * lock file not being writable). - * - * @access private - */ - function _lock($mode = LOCK_EX) - { - if (!eregi('Windows 9', php_uname())) { - if ($mode != LOCK_UN && is_resource($this->lock_fp)) { - // XXX does not check type of lock (LOCK_SH/LOCK_EX) - return true; - } - if (PEAR::isError($err = $this->_assertStateDir())) { - return $err; - } - $open_mode = 'w'; - // XXX People reported problems with LOCK_SH and 'w' - if ($mode === LOCK_SH || $mode === LOCK_UN) { - if (@!is_file($this->lockfile)) { - touch($this->lockfile); - } - $open_mode = 'r'; - } - - if (!is_resource($this->lock_fp)) { - $this->lock_fp = @fopen($this->lockfile, $open_mode); - } - - if (!is_resource($this->lock_fp)) { - return $this->raiseError("could not create lock file" . - (isset($php_errormsg) ? ": " . $php_errormsg : "")); - } - if (!(int)flock($this->lock_fp, $mode)) { - switch ($mode) { - case LOCK_SH: $str = 'shared'; break; - case LOCK_EX: $str = 'exclusive'; break; - case LOCK_UN: $str = 'unlock'; break; - default: $str = 'unknown'; break; - } - return $this->raiseError("could not acquire $str lock ($this->lockfile)", - PEAR_REGISTRY_ERROR_LOCK); - } - } - return true; - } - - // }}} - // {{{ _unlock() - - function _unlock() - { - $ret = $this->_lock(LOCK_UN); - if (is_resource($this->lock_fp)) { - fclose($this->lock_fp); - } - $this->lock_fp = null; - return $ret; - } - - // }}} - // {{{ _packageExists() - - function _packageExists($package) - { - return file_exists($this->_packageFileName($package)); - } - - // }}} - // {{{ _packageInfo() - - function _packageInfo($package = null, $key = null) - { - if ($package === null) { - return array_map(array($this, '_packageInfo'), - $this->_listPackages()); - } - $fp = $this->_openPackageFile($package, 'r'); - if ($fp === null) { - return null; - } - $rt = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - $data = fread($fp, filesize($this->_packageFileName($package))); - set_magic_quotes_runtime($rt); - $this->_closePackageFile($fp); - $data = unserialize($data); - if ($key === null) { - return $data; - } - if (isset($data[$key])) { - return $data[$key]; - } - return null; - } - - // }}} - // {{{ _listPackages() - - function _listPackages() - { - $pkglist = array(); - $dp = @opendir($this->statedir); - if (!$dp) { - return $pkglist; - } - while ($ent = readdir($dp)) { - if ($ent{0} == '.' || substr($ent, -4) != '.reg') { - continue; - } - $pkglist[] = substr($ent, 0, -4); - } - return $pkglist; - } - - // }}} - - // {{{ packageExists() - - function packageExists($package) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_packageExists($package); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ packageInfo() - - function packageInfo($package = null, $key = null) - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_packageInfo($package, $key); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ listPackages() - - function listPackages() - { - if (PEAR::isError($e = $this->_lock(LOCK_SH))) { - return $e; - } - $ret = $this->_listPackages(); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ addPackage() - - function addPackage($package, $info) - { - if ($this->packageExists($package)) { - return false; - } - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $fp = $this->_openPackageFile($package, 'wb'); - if ($fp === null) { - $this->_unlock(); - return false; - } - $info['_lastmodified'] = time(); - fwrite($fp, serialize($info)); - $this->_closePackageFile($fp); - $this->_unlock(); - return true; - } - - // }}} - // {{{ deletePackage() - - function deletePackage($package) - { - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $file = $this->_packageFileName($package); - $ret = @unlink($file); - $this->rebuildFileMap(); - $this->_unlock(); - return $ret; - } - - // }}} - // {{{ updatePackage() - - function updatePackage($package, $info, $merge = true) - { - $oldinfo = $this->packageInfo($package); - if (empty($oldinfo)) { - return false; - } - if (PEAR::isError($e = $this->_lock(LOCK_EX))) { - return $e; - } - $fp = $this->_openPackageFile($package, 'w'); - if ($fp === null) { - $this->_unlock(); - return false; - } - $info['_lastmodified'] = time(); - if ($merge) { - fwrite($fp, serialize(array_merge($oldinfo, $info))); - } else { - fwrite($fp, serialize($info)); - } - $this->_closePackageFile($fp); - if (isset($info['filelist'])) { - $this->rebuildFileMap(); - } - $this->_unlock(); - return true; - } - - // }}} - // {{{ checkFileMap() - - /** - * Test whether a file belongs to a package. - * - * @param string $path file path, absolute or relative to the pear - * install dir - * - * @return string which package the file belongs to, or an empty - * string if the file does not belong to an installed package - * - * @access public - */ - function checkFileMap($path) - { - if (is_array($path)) { - static $notempty; - if (empty($notempty)) { - $notempty = create_function('$a','return !empty($a);'); - } - $pkgs = array(); - foreach ($path as $name => $attrs) { - if (is_array($attrs) && isset($attrs['baseinstalldir'])) { - $name = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; - } - $pkgs[$name] = $this->checkFileMap($name); - } - return array_filter($pkgs, $notempty); - } - if (empty($this->filemap_cache) && PEAR::isError($this->readFileMap())) { - return $err; - } - if (isset($this->filemap_cache[$path])) { - return $this->filemap_cache[$path]; - } - $l = strlen($this->install_dir); - if (substr($path, 0, $l) == $this->install_dir) { - $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l)); - } - if (isset($this->filemap_cache[$path])) { - return $this->filemap_cache[$path]; - } - return ''; - } - - // }}} - -} - -?> diff --git a/3rdparty/PEAR/Remote.php b/3rdparty/PEAR/Remote.php deleted file mode 100644 index 7b1e314f903..00000000000 --- a/3rdparty/PEAR/Remote.php +++ /dev/null @@ -1,394 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: Remote.php,v 1.50 2004/06/08 18:03:46 cellog Exp $ - -require_once 'PEAR.php'; -require_once 'PEAR/Config.php'; - -/** - * This is a class for doing remote operations against the central - * PEAR database. - * - * @nodep XML_RPC_Value - * @nodep XML_RPC_Message - * @nodep XML_RPC_Client - */ -class PEAR_Remote extends PEAR -{ - // {{{ properties - - var $config = null; - var $cache = null; - - // }}} - - // {{{ PEAR_Remote(config_object) - - function PEAR_Remote(&$config) - { - $this->PEAR(); - $this->config = &$config; - } - - // }}} - - // {{{ getCache() - - - function getCache($args) - { - $id = md5(serialize($args)); - $cachedir = $this->config->get('cache_dir'); - $filename = $cachedir . DIRECTORY_SEPARATOR . 'xmlrpc_cache_' . $id; - if (!file_exists($filename)) { - return null; - }; - - $fp = fopen($filename, 'rb'); - if (!$fp) { - return null; - } - $content = fread($fp, filesize($filename)); - fclose($fp); - $result = array( - 'age' => time() - filemtime($filename), - 'lastChange' => filemtime($filename), - 'content' => unserialize($content), - ); - return $result; - } - - // }}} - - // {{{ saveCache() - - function saveCache($args, $data) - { - $id = md5(serialize($args)); - $cachedir = $this->config->get('cache_dir'); - if (!file_exists($cachedir)) { - System::mkdir(array('-p', $cachedir)); - } - $filename = $cachedir.'/xmlrpc_cache_'.$id; - - $fp = @fopen($filename, "wb"); - if ($fp) { - fwrite($fp, serialize($data)); - fclose($fp); - }; - } - - // }}} - - // {{{ call(method, [args...]) - - function call($method) - { - $_args = $args = func_get_args(); - - $this->cache = $this->getCache($args); - $cachettl = $this->config->get('cache_ttl'); - // If cache is newer than $cachettl seconds, we use the cache! - if ($this->cache !== null && $this->cache['age'] < $cachettl) { - return $this->cache['content']; - }; - - if (extension_loaded("xmlrpc")) { - $result = call_user_func_array(array(&$this, 'call_epi'), $args); - if (!PEAR::isError($result)) { - $this->saveCache($_args, $result); - }; - return $result; - } - if (!@include_once("XML/RPC.php")) { - return $this->raiseError("For this remote PEAR operation you need to install the XML_RPC package"); - } - array_shift($args); - $server_host = $this->config->get('master_server'); - $username = $this->config->get('username'); - $password = $this->config->get('password'); - $eargs = array(); - foreach($args as $arg) $eargs[] = $this->_encode($arg); - $f = new XML_RPC_Message($method, $eargs); - if ($this->cache !== null) { - $maxAge = '?maxAge='.$this->cache['lastChange']; - } else { - $maxAge = ''; - }; - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - if ($proxy = parse_url($this->config->get('http_proxy'))) { - $proxy_host = @$proxy['host']; - $proxy_port = @$proxy['port']; - $proxy_user = @urldecode(@$proxy['user']); - $proxy_pass = @urldecode(@$proxy['pass']); - } - $c = new XML_RPC_Client('/xmlrpc.php'.$maxAge, $server_host, 80, $proxy_host, $proxy_port, $proxy_user, $proxy_pass); - if ($username && $password) { - $c->setCredentials($username, $password); - } - if ($this->config->get('verbose') >= 3) { - $c->setDebug(1); - } - $r = $c->send($f); - if (!$r) { - return $this->raiseError("XML_RPC send failed"); - } - $v = $r->value(); - if ($e = $r->faultCode()) { - if ($e == $GLOBALS['XML_RPC_err']['http_error'] && strstr($r->faultString(), '304 Not Modified') !== false) { - return $this->cache['content']; - } - return $this->raiseError($r->faultString(), $e); - } - - $result = XML_RPC_decode($v); - $this->saveCache($_args, $result); - return $result; - } - - // }}} - - // {{{ call_epi(method, [args...]) - - function call_epi($method) - { - do { - if (extension_loaded("xmlrpc")) { - break; - } - if (OS_WINDOWS) { - $ext = 'dll'; - } elseif (PHP_OS == 'HP-UX') { - $ext = 'sl'; - } elseif (PHP_OS == 'AIX') { - $ext = 'a'; - } else { - $ext = 'so'; - } - $ext = OS_WINDOWS ? 'dll' : 'so'; - @dl("xmlrpc-epi.$ext"); - if (extension_loaded("xmlrpc")) { - break; - } - @dl("xmlrpc.$ext"); - if (extension_loaded("xmlrpc")) { - break; - } - return $this->raiseError("unable to load xmlrpc extension"); - } while (false); - $params = func_get_args(); - array_shift($params); - $method = str_replace("_", ".", $method); - $request = xmlrpc_encode_request($method, $params); - $server_host = $this->config->get("master_server"); - if (empty($server_host)) { - return $this->raiseError("PEAR_Remote::call: no master_server configured"); - } - $server_port = 80; - if ($http_proxy = $this->config->get('http_proxy')) { - $proxy = parse_url($http_proxy); - $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; - $proxy_host = @$proxy['host']; - $proxy_port = @$proxy['port']; - $proxy_user = @urldecode(@$proxy['user']); - $proxy_pass = @urldecode(@$proxy['pass']); - $fp = @fsockopen($proxy_host, $proxy_port); - $use_proxy = true; - } else { - $use_proxy = false; - $fp = @fsockopen($server_host, $server_port); - } - if (!$fp && $http_proxy) { - return $this->raiseError("PEAR_Remote::call: fsockopen(`$proxy_host', $proxy_port) failed"); - } elseif (!$fp) { - return $this->raiseError("PEAR_Remote::call: fsockopen(`$server_host', $server_port) failed"); - } - $len = strlen($request); - $req_headers = "Host: $server_host:$server_port\r\n" . - "Content-type: text/xml\r\n" . - "Content-length: $len\r\n"; - $username = $this->config->get('username'); - $password = $this->config->get('password'); - if ($username && $password) { - $req_headers .= "Cookie: PEAR_USER=$username; PEAR_PW=$password\r\n"; - $tmp = base64_encode("$username:$password"); - $req_headers .= "Authorization: Basic $tmp\r\n"; - } - if ($this->cache !== null) { - $maxAge = '?maxAge='.$this->cache['lastChange']; - } else { - $maxAge = ''; - }; - - if ($use_proxy && $proxy_host != '' && $proxy_user != '') { - $req_headers .= 'Proxy-Authorization: Basic ' - .base64_encode($proxy_user.':'.$proxy_pass) - ."\r\n"; - } - - if ($this->config->get('verbose') > 3) { - print "XMLRPC REQUEST HEADERS:\n"; - var_dump($req_headers); - print "XMLRPC REQUEST BODY:\n"; - var_dump($request); - } - - if ($use_proxy && $proxy_host != '') { - $post_string = "POST http://".$server_host; - if ($proxy_port > '') { - $post_string .= ':'.$server_port; - } - } else { - $post_string = "POST "; - } - - fwrite($fp, ($post_string."/xmlrpc.php$maxAge HTTP/1.0\r\n$req_headers\r\n$request")); - $response = ''; - $line1 = fgets($fp, 2048); - if (!preg_match('!^HTTP/[0-9\.]+ (\d+) (.*)!', $line1, $matches)) { - return $this->raiseError("PEAR_Remote: invalid HTTP response from XML-RPC server"); - } - switch ($matches[1]) { - case "200": // OK - break; - case "304": // Not Modified - return $this->cache['content']; - case "401": // Unauthorized - if ($username && $password) { - return $this->raiseError("PEAR_Remote: authorization failed", 401); - } else { - return $this->raiseError("PEAR_Remote: authorization required, please log in first", 401); - } - default: - return $this->raiseError("PEAR_Remote: unexpected HTTP response", (int)$matches[1], null, null, "$matches[1] $matches[2]"); - } - while (trim(fgets($fp, 2048)) != ''); // skip rest of headers - while ($chunk = fread($fp, 10240)) { - $response .= $chunk; - } - fclose($fp); - if ($this->config->get('verbose') > 3) { - print "XMLRPC RESPONSE:\n"; - var_dump($response); - } - $ret = xmlrpc_decode($response); - if (is_array($ret) && isset($ret['__PEAR_TYPE__'])) { - if ($ret['__PEAR_TYPE__'] == 'error') { - if (isset($ret['__PEAR_CLASS__'])) { - $class = $ret['__PEAR_CLASS__']; - } else { - $class = "PEAR_Error"; - } - if ($ret['code'] === '') $ret['code'] = null; - if ($ret['message'] === '') $ret['message'] = null; - if ($ret['userinfo'] === '') $ret['userinfo'] = null; - if (strtolower($class) == 'db_error') { - $ret = $this->raiseError(PEAR::errorMessage($ret['code']), - $ret['code'], null, null, - $ret['userinfo']); - } else { - $ret = $this->raiseError($ret['message'], $ret['code'], - null, null, $ret['userinfo']); - } - } - } elseif (is_array($ret) && sizeof($ret) == 1 && isset($ret[0]) - && is_array($ret[0]) && - !empty($ret[0]['faultString']) && - !empty($ret[0]['faultCode'])) { - extract($ret[0]); - $faultString = "XML-RPC Server Fault: " . - str_replace("\n", " ", $faultString); - return $this->raiseError($faultString, $faultCode); - } - return $ret; - } - - // }}} - - // {{{ _encode - - // a slightly extended version of XML_RPC_encode - function _encode($php_val) - { - global $XML_RPC_Boolean, $XML_RPC_Int, $XML_RPC_Double; - global $XML_RPC_String, $XML_RPC_Array, $XML_RPC_Struct; - - $type = gettype($php_val); - $xmlrpcval = new XML_RPC_Value; - - switch($type) { - case "array": - reset($php_val); - $firstkey = key($php_val); - end($php_val); - $lastkey = key($php_val); - if ($firstkey === 0 && is_int($lastkey) && - ($lastkey + 1) == count($php_val)) { - $is_continuous = true; - reset($php_val); - $size = count($php_val); - for ($expect = 0; $expect < $size; $expect++, next($php_val)) { - if (key($php_val) !== $expect) { - $is_continuous = false; - break; - } - } - if ($is_continuous) { - reset($php_val); - $arr = array(); - while (list($k, $v) = each($php_val)) { - $arr[$k] = $this->_encode($v); - } - $xmlrpcval->addArray($arr); - break; - } - } - // fall though if not numerical and continuous - case "object": - $arr = array(); - while (list($k, $v) = each($php_val)) { - $arr[$k] = $this->_encode($v); - } - $xmlrpcval->addStruct($arr); - break; - case "integer": - $xmlrpcval->addScalar($php_val, $XML_RPC_Int); - break; - case "double": - $xmlrpcval->addScalar($php_val, $XML_RPC_Double); - break; - case "string": - case "NULL": - $xmlrpcval->addScalar($php_val, $XML_RPC_String); - break; - case "boolean": - $xmlrpcval->addScalar($php_val, $XML_RPC_Boolean); - break; - case "unknown type": - default: - return null; - } - return $xmlrpcval; - } - - // }}} - -} - -?> diff --git a/3rdparty/PEAR/RunTest.php b/3rdparty/PEAR/RunTest.php deleted file mode 100644 index 1aa02aab9df..00000000000 --- a/3rdparty/PEAR/RunTest.php +++ /dev/null @@ -1,363 +0,0 @@ - | -// | Greg Beaver | -// | | -// +----------------------------------------------------------------------+ -// -// $Id: RunTest.php,v 1.3.2.4 2005/02/17 17:47:55 cellog Exp $ -// - -/** - * Simplified version of PHP's test suite - * -- EXPERIMENTAL -- - - Try it with: - - $ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; $o=$t->run("./pear_system.phpt");print_r($o);' - - -TODO: - -Actually finish the development and testing - - */ - -require_once 'PEAR.php'; -require_once 'PEAR/Config.php'; - -define('DETAILED', 1); -putenv("PHP_PEAR_RUNTESTS=1"); - -class PEAR_RunTest -{ - var $_logger; - - /** - * An object that supports the PEAR_Common->log() signature, or null - * @param PEAR_Common|null - */ - function PEAR_RunTest($logger = null) - { - $this->_logger = $logger; - } - - // - // Run an individual test case. - // - - function run($file, $ini_settings = '') - { - $cwd = getcwd(); - $conf = &PEAR_Config::singleton(); - $php = $conf->get('php_bin'); - //var_dump($php);exit; - global $log_format, $info_params, $ini_overwrites; - - $info_params = ''; - $log_format = 'LEOD'; - - // Load the sections of the test file. - $section_text = array( - 'TEST' => '(unnamed test)', - 'SKIPIF' => '', - 'GET' => '', - 'ARGS' => '', - ); - - if (!is_file($file) || !$fp = fopen($file, "r")) { - return PEAR::raiseError("Cannot open test file: $file"); - } - - $section = ''; - while (!feof($fp)) { - $line = fgets($fp); - - // Match the beginning of a section. - if (ereg('^--([A-Z]+)--',$line,$r)) { - $section = $r[1]; - $section_text[$section] = ''; - continue; - } - - // Add to the section text. - $section_text[$section] .= $line; - } - fclose($fp); - - $shortname = str_replace($cwd.'/', '', $file); - $tested = trim($section_text['TEST'])." [$shortname]"; - - $tmp = realpath(dirname($file)); - $tmp_skipif = $tmp . uniqid('/phpt.'); - $tmp_file = ereg_replace('\.phpt$','.php',$file); - $tmp_post = $tmp . uniqid('/phpt.'); - - @unlink($tmp_skipif); - @unlink($tmp_file); - @unlink($tmp_post); - - // unlink old test results - @unlink(ereg_replace('\.phpt$','.diff',$file)); - @unlink(ereg_replace('\.phpt$','.log',$file)); - @unlink(ereg_replace('\.phpt$','.exp',$file)); - @unlink(ereg_replace('\.phpt$','.out',$file)); - - // Check if test should be skipped. - $info = ''; - $warn = false; - if (array_key_exists('SKIPIF', $section_text)) { - if (trim($section_text['SKIPIF'])) { - $this->save_text($tmp_skipif, $section_text['SKIPIF']); - //$extra = substr(PHP_OS, 0, 3) !== "WIN" ? - // "unset REQUEST_METHOD;": ""; - - //$output = `$extra $php $info_params -f $tmp_skipif`; - $output = `$php $info_params -f $tmp_skipif`; - unlink($tmp_skipif); - if (eregi("^skip", trim($output))) { - $skipreason = "SKIP $tested"; - $reason = (eregi("^skip[[:space:]]*(.+)\$", trim($output))) ? eregi_replace("^skip[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; - if ($reason) { - $skipreason .= " (reason: $reason)"; - } - $this->_logger->log(0, $skipreason); - if (isset($old_php)) { - $php = $old_php; - } - return 'SKIPPED'; - } - if (eregi("^info", trim($output))) { - $reason = (ereg("^info[[:space:]]*(.+)\$", trim($output))) ? ereg_replace("^info[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; - if ($reason) { - $info = " (info: $reason)"; - } - } - if (eregi("^warn", trim($output))) { - $reason = (ereg("^warn[[:space:]]*(.+)\$", trim($output))) ? ereg_replace("^warn[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; - if ($reason) { - $warn = true; /* only if there is a reason */ - $info = " (warn: $reason)"; - } - } - } - } - - // We've satisfied the preconditions - run the test! - $this->save_text($tmp_file,$section_text['FILE']); - - $args = $section_text['ARGS'] ? ' -- '.$section_text['ARGS'] : ''; - - $cmd = "$php$ini_settings -f $tmp_file$args 2>&1"; - if (isset($this->_logger)) { - $this->_logger->log(2, 'Running command "' . $cmd . '"'); - } - - $savedir = getcwd(); // in case the test moves us around - if (isset($section_text['RETURNS'])) { - ob_start(); - system($cmd, $return_value); - $out = ob_get_contents(); - ob_end_clean(); - @unlink($tmp_post); - $section_text['RETURNS'] = (int) trim($section_text['RETURNS']); - $returnfail = ($return_value != $section_text['RETURNS']); - } else { - $out = `$cmd`; - $returnfail = false; - } - chdir($savedir); - // Does the output match what is expected? - $output = trim($out); - $output = preg_replace('/\r\n/', "\n", $output); - - if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) { - if (isset($section_text['EXPECTF'])) { - $wanted = trim($section_text['EXPECTF']); - } else { - $wanted = trim($section_text['EXPECTREGEX']); - } - $wanted_re = preg_replace('/\r\n/',"\n",$wanted); - if (isset($section_text['EXPECTF'])) { - $wanted_re = preg_quote($wanted_re, '/'); - // Stick to basics - $wanted_re = str_replace("%s", ".+?", $wanted_re); //not greedy - $wanted_re = str_replace("%i", "[+\-]?[0-9]+", $wanted_re); - $wanted_re = str_replace("%d", "[0-9]+", $wanted_re); - $wanted_re = str_replace("%x", "[0-9a-fA-F]+", $wanted_re); - $wanted_re = str_replace("%f", "[+\-]?\.?[0-9]+\.?[0-9]*(E-?[0-9]+)?", $wanted_re); - $wanted_re = str_replace("%c", ".", $wanted_re); - // %f allows two points "-.0.0" but that is the best *simple* expression - } - /* DEBUG YOUR REGEX HERE - var_dump($wanted_re); - print(str_repeat('=', 80) . "\n"); - var_dump($output); - */ - if (!$returnfail && preg_match("/^$wanted_re\$/s", $output)) { - @unlink($tmp_file); - $this->_logger->log(0, "PASS $tested$info"); - if (isset($old_php)) { - $php = $old_php; - } - return 'PASSED'; - } - - } else { - $wanted = trim($section_text['EXPECT']); - $wanted = preg_replace('/\r\n/',"\n",$wanted); - // compare and leave on success - $ok = (0 == strcmp($output,$wanted)); - if (!$returnfail && $ok) { - @unlink($tmp_file); - $this->_logger->log(0, "PASS $tested$info"); - if (isset($old_php)) { - $php = $old_php; - } - return 'PASSED'; - } - } - - // Test failed so we need to report details. - if ($warn) { - $this->_logger->log(0, "WARN $tested$info"); - } else { - $this->_logger->log(0, "FAIL $tested$info"); - } - - if (isset($section_text['RETURNS'])) { - $GLOBALS['__PHP_FAILED_TESTS__'][] = array( - 'name' => $file, - 'test_name' => $tested, - 'output' => ereg_replace('\.phpt$','.log', $file), - 'diff' => ereg_replace('\.phpt$','.diff', $file), - 'info' => $info, - 'return' => $return_value - ); - } else { - $GLOBALS['__PHP_FAILED_TESTS__'][] = array( - 'name' => $file, - 'test_name' => $tested, - 'output' => ereg_replace('\.phpt$','.log', $file), - 'diff' => ereg_replace('\.phpt$','.diff', $file), - 'info' => $info, - ); - } - - // write .exp - if (strpos($log_format,'E') !== FALSE) { - $logname = ereg_replace('\.phpt$','.exp',$file); - if (!$log = fopen($logname,'w')) { - return PEAR::raiseError("Cannot create test log - $logname"); - } - fwrite($log,$wanted); - fclose($log); - } - - // write .out - if (strpos($log_format,'O') !== FALSE) { - $logname = ereg_replace('\.phpt$','.out',$file); - if (!$log = fopen($logname,'w')) { - return PEAR::raiseError("Cannot create test log - $logname"); - } - fwrite($log,$output); - fclose($log); - } - - // write .diff - if (strpos($log_format,'D') !== FALSE) { - $logname = ereg_replace('\.phpt$','.diff',$file); - if (!$log = fopen($logname,'w')) { - return PEAR::raiseError("Cannot create test log - $logname"); - } - fwrite($log, $this->generate_diff($wanted, $output, - isset($section_text['RETURNS']) ? array(trim($section_text['RETURNS']), - $return_value) : null)); - fclose($log); - } - - // write .log - if (strpos($log_format,'L') !== FALSE) { - $logname = ereg_replace('\.phpt$','.log',$file); - if (!$log = fopen($logname,'w')) { - return PEAR::raiseError("Cannot create test log - $logname"); - } - fwrite($log," ----- EXPECTED OUTPUT -$wanted ----- ACTUAL OUTPUT -$output ----- FAILED -"); - if ($returnfail) { - fwrite($log," ----- EXPECTED RETURN -$section_text[RETURNS] ----- ACTUAL RETURN -$return_value -"); - } - fclose($log); - //error_report($file,$logname,$tested); - } - - if (isset($old_php)) { - $php = $old_php; - } - - return $warn ? 'WARNED' : 'FAILED'; - } - - function generate_diff($wanted, $output, $return_value) - { - $w = explode("\n", $wanted); - $o = explode("\n", $output); - $w1 = array_diff_assoc($w,$o); - $o1 = array_diff_assoc($o,$w); - $w2 = array(); - $o2 = array(); - foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1).$val; - foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1).$val; - $diff = array_merge($w2, $o2); - ksort($diff); - if ($return_value) { - $extra = "##EXPECTED: $return_value[0]\r\n##RETURNED: $return_value[1]"; - } else { - $extra = ''; - } - return implode("\r\n", $diff) . $extra; - } - - // - // Write the given text to a temporary file, and return the filename. - // - - function save_text($filename, $text) - { - if (!$fp = fopen($filename, 'w')) { - return PEAR::raiseError("Cannot open file '" . $filename . "' (save_text)"); - } - fwrite($fp,$text); - fclose($fp); - if (1 < DETAILED) echo " -FILE $filename {{{ -$text -}}} -"; - } - -} -?> \ No newline at end of file diff --git a/3rdparty/README b/3rdparty/README new file mode 100644 index 00000000000..e577d414ada --- /dev/null +++ b/3rdparty/README @@ -0,0 +1,2 @@ +the 3rdparty libraries are now located in a seperate repository. just copy https://gitorious.org/owncloud/3rdparty into this directory and everything will work + diff --git a/3rdparty/Sabre.includes.php b/3rdparty/Sabre.includes.php deleted file mode 100644 index d41b287b77d..00000000000 --- a/3rdparty/Sabre.includes.php +++ /dev/null @@ -1,127 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - return false; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - abstract function deleteCalendar($calendarId); - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calnedar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * @param string $calendarId - * @return array - */ - abstract function getCalendarObjects($calendarId); - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - abstract function getCalendarObject($calendarId,$objectUri); - - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - abstract function createCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - abstract function updateCalendarObject($calendarId,$objectUri,$calendarData); - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - abstract function deleteCalendarObject($calendarId,$objectUri); - -} diff --git a/3rdparty/Sabre/CalDAV/Backend/PDO.php b/3rdparty/Sabre/CalDAV/Backend/PDO.php deleted file mode 100644 index 7b1b33b912e..00000000000 --- a/3rdparty/Sabre/CalDAV/Backend/PDO.php +++ /dev/null @@ -1,386 +0,0 @@ - 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Creates the backend - * - * @param PDO $pdo - */ - public function __construct(PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') { - - $this->pdo = $pdo; - $this->calendarTableName = $calendarTableName; - $this->calendarObjectTableName = $calendarObjectTableName; - - } - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principalUri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - - $fields = array_values($this->propertyMap); - $fields[] = 'id'; - $fields[] = 'uri'; - $fields[] = 'ctag'; - $fields[] = 'components'; - $fields[] = 'principaluri'; - - // Making fields a comma-delimited list - $fields = implode(', ', $fields); - $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM `".$this->calendarTableName."` WHERE principaluri = ?"); - $stmt->execute(array($principalUri)); - - $calendars = array(); - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $components = explode(',',$row['components']); - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), - ); - - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - - } - - return $calendars; - - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - */ - public function createCalendar($principalUri,$calendarUri, array $properties) { - - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { - throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $myValue = $properties[$xmlName]; - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - $stmt = $this->pdo->prepare("INSERT INTO `".$this->calendarTableName."` (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); - $stmt->execute($values); - - return $this->pdo->lastInsertId(); - - } - - /** - * Updates properties for a calendar. - * - * The mutations array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existant property is always succesful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $mutations - * @return bool|array - */ - public function updateCalendar($calendarId, array $mutations) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($mutations as $propertyName=>$propertyValue) { - - // We don't know about this property. - if (!isset($this->propertyMap[$propertyName])) { - $hasError = true; - $result[403][$propertyName] = null; - unset($mutations[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($mutations as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - - // Now we're generating the sql query. - $valuesSql = array(); - foreach($newValues as $fieldName=>$value) { - $valuesSql[] = $fieldName . ' = ?'; - } - $valuesSql[] = 'ctag = ctag + 1'; - - $stmt = $this->pdo->prepare("UPDATE `" . $this->calendarTableName . "` SET " . implode(', ',$valuesSql) . " WHERE id = ?"); - $newValues['id'] = $calendarId; - $stmt->execute(array_values($newValues)); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarTableName.'` WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Returns all calendar objects within a calendar. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calnedar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - - $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - return $stmt->fetchAll(); - - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId, $objectUri)); - return $stmt->fetch(); - - } - - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - - $stmt = $this->pdo->prepare('INSERT INTO `'.$this->calendarObjectTableName.'` (calendarid, uri, calendardata, lastmodified) VALUES (?,?,?,?)'); - $stmt->execute(array($calendarId,$objectUri,$calendarData,time())); - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData) { - - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarObjectTableName.'` SET calendardata = ?, lastmodified = ? WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarData,time(),$calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE `'. $this->calendarTableName .'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - -} diff --git a/3rdparty/Sabre/CalDAV/Calendar.php b/3rdparty/Sabre/CalDAV/Calendar.php deleted file mode 100644 index 0d2b3875771..00000000000 --- a/3rdparty/Sabre/CalDAV/Calendar.php +++ /dev/null @@ -1,318 +0,0 @@ -caldavBackend = $caldavBackend; - $this->principalBackend = $principalBackend; - $this->calendarInfo = $calendarInfo; - - - } - - /** - * Returns the name of the calendar - * - * @return string - */ - public function getName() { - - return $this->calendarInfo['uri']; - - } - - /** - * Updates properties such as the display name and description - * - * @param array $mutations - * @return array - */ - public function updateProperties($mutations) { - - return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); - - } - - /** - * Returns the list of properties - * - * @param array $properties - * @return array - */ - public function getProperties($requestedProperties) { - - $response = array(); - - foreach($requestedProperties as $prop) switch($prop) { - - case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : - $response[$prop] = new Sabre_CalDAV_Property_SupportedCalendarData(); - break; - case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : - $response[$prop] = new Sabre_CalDAV_Property_SupportedCollationSet(); - break; - case '{DAV:}owner' : - $response[$prop] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF,$this->calendarInfo['principaluri']); - break; - default : - if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; - break; - - } - return $response; - - } - - /** - * Returns a calendar object - * - * The contained calendar objects are for example Events or Todo's. - * - * @param string $name - * @return Sabre_DAV_ICalendarObject - */ - public function getChild($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_FileNotFound('Calendar object not found'); - return new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - - } - - /** - * Returns the full list of calendar objects - * - * @return array - */ - public function getChildren() { - - $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); - } - return $children; - - } - - /** - * Checks if a child-node exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); - if (!$obj) - return false; - else - return true; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in calendars. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating collections in calendar objects is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid ICalendar string. - * - * @param string $name - * @param resource $calendarData - * @return void - */ - public function createFile($name,$calendarData = null) { - - $calendarData = stream_get_contents($calendarData); - // Converting to UTF-8, if needed - $calendarData = Sabre_DAV_StringUtil::ensureUTF8($calendarData); - - $supportedComponents = $this->calendarInfo['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set']; - if ($supportedComponents) { - $supportedComponents = $supportedComponents->getValue(); - } else { - $supportedComponents = null; - } - Sabre_CalDAV_ICalendarUtil::validateICalendarObject($calendarData, $supportedComponents); - - $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); - - } - - /** - * Deletes the calendar. - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); - - } - - /** - * Renames the calendar. Note that most calendars use the - * {DAV:}displayname to display a name to display a name. - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Renaming calendars is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - - -} diff --git a/3rdparty/Sabre/CalDAV/CalendarObject.php b/3rdparty/Sabre/CalDAV/CalendarObject.php deleted file mode 100644 index 0c99f18deb7..00000000000 --- a/3rdparty/Sabre/CalDAV/CalendarObject.php +++ /dev/null @@ -1,260 +0,0 @@ -caldavBackend = $caldavBackend; - - if (!isset($objectData['calendarid'])) { - throw new InvalidArgumentException('The objectData argument must contain a \'calendarid\' property'); - } - if (!isset($objectData['uri'])) { - throw new InvalidArgumentException('The objectData argument must contain an \'uri\' property'); - } - - $this->calendarInfo = $calendarInfo; - $this->objectData = $objectData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->objectData['uri']; - - } - - /** - * Returns the ICalendar-formatted object - * - * @return string - */ - public function get() { - - // Pre-populating the 'calendardata' is optional, if we don't have it - // already we fetch it from the backend. - if (!isset($this->objectData['calendardata'])) { - $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']); - } - return $this->objectData['calendardata']; - - } - - /** - * Updates the ICalendar-formatted object - * - * @param string $calendarData - * @return void - */ - public function put($calendarData) { - - if (is_resource($calendarData)) - $calendarData = stream_get_contents($calendarData); - - // Converting to UTF-8, if needed - $calendarData = Sabre_DAV_StringUtil::ensureUTF8($calendarData); - - $supportedComponents = $this->calendarInfo['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set']; - if ($supportedComponents) { - $supportedComponents = $supportedComponents->getValue(); - } else { - $supportedComponents = null; - } - Sabre_CalDAV_ICalendarUtil::validateICalendarObject($calendarData, $supportedComponents); - - $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData); - $this->objectData['calendardata'] = $calendarData; - - } - - /** - * Deletes the calendar object - * - * @return void - */ - public function delete() { - - $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/calendar'; - - } - - /** - * Returns an ETag for this object. - * - * The ETag is an arbritrary string, but MUST be surrounded by double-quotes. - * - * @return string - */ - public function getETag() { - - if (isset($this->objectData['etag'])) { - return $this->objectData['etag']; - } else { - return '"' . md5($this->get()). '"'; - } - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return time - */ - public function getLastModified() { - - return $this->objectData['lastmodified']; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - return strlen($this->objectData['calendardata']); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->calendarInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - -} - diff --git a/3rdparty/Sabre/CalDAV/CalendarRootNode.php b/3rdparty/Sabre/CalDAV/CalendarRootNode.php deleted file mode 100644 index 69669a9d7fd..00000000000 --- a/3rdparty/Sabre/CalDAV/CalendarRootNode.php +++ /dev/null @@ -1,75 +0,0 @@ -caldavBackend = $caldavBackend; - - } - - /** - * Returns the nodename - * - * We're overriding this, because the default will be the 'principalPrefix', - * and we want it to be Sabre_CalDAV_Plugin::CALENDAR_ROOT - * - * @return void - */ - public function getName() { - - return Sabre_CalDAV_Plugin::CALENDAR_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new Sabre_CalDAV_UserCalendars($this->principalBackend, $this->caldavBackend, $principal['uri']); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php b/3rdparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php deleted file mode 100644 index 656b7286a66..00000000000 --- a/3rdparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php +++ /dev/null @@ -1,18 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return void - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?',$uri,2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_CalDAV_Calendar)) return; - - $this->server->httpResponse->setHeader('Content-Type','text/calendar'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($this->generateICS($this->server->tree->getChildren($uri))); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all calendar objects, and builds one big ics export - * - * @param array $nodes - * @return void - */ - public function generateICS(array $nodes) { - - $calendar = new Sabre_VObject_Component('vcalendar'); - $calendar->version = '2.0'; - $calendar->prodid = '-//SabreDAV//SabreDAV ' . Sabre_DAV_Version::VERSION . '//EN'; - $calendar->calscale = 'GREGORIAN'; - - $collectedTimezones = array(); - - $timezones = array(); - $objects = array(); - - foreach($nodes as $node) { - - $nodeData = $node->get(); - $nodeComp = Sabre_VObject_Reader::read($nodeData); - - foreach($nodeComp->children() as $child) { - - switch($child->name) { - case 'VEVENT' : - case 'VTODO' : - case 'VJOURNAL' : - $objects[] = $child; - break; - - // VTIMEZONE is special, because we need to filter out the duplicates - case 'VTIMEZONE' : - // Naively just checking tzid. - if (in_array((string)$child->TZID, $collectedTimezones)) continue; - - $timezones[] = $child; - $collectedTimezones[] = $child->TZID; - break; - - - } - - - } - - - } - - foreach($timezones as $tz) $calendar->add($tz); - foreach($objects as $obj) $calendar->add($obj); - - return $calendar->serialize(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/ICalendar.php b/3rdparty/Sabre/CalDAV/ICalendar.php deleted file mode 100644 index 8193dff3a83..00000000000 --- a/3rdparty/Sabre/CalDAV/ICalendar.php +++ /dev/null @@ -1,18 +0,0 @@ -registerXPathNameSpace('cal','urn:ietf:params:xml:ns:xcal'); - - // Check if there's only 1 component - $components = array('vevent','vtodo','vjournal','vfreebusy'); - $componentsFound = array(); - - foreach($components as $component) { - $test = $xcal->xpath('/cal:iCalendar/cal:vcalendar/cal:' . $component); - if (is_array($test)) $componentsFound = array_merge($componentsFound, $test); - } - if (count($componentsFound)<1) { - throw new Sabre_CalDAV_Exception_InvalidICalendarObject('One VEVENT, VTODO, VJOURNAL or VFREEBUSY must be specified. 0 found.'); - } - $component = $componentsFound[0]; - - if (is_null($allowedComponents)) return true; - - // Check if the component is allowed - $name = $component->getName(); - if (!in_array(strtoupper($name),$allowedComponents)) { - throw new Sabre_CalDAV_Exception_InvalidICalendarObject(strtoupper($name) . ' is not allowed in this calendar.'); - } - - if (count($xcal->xpath('/cal:iCalendar/cal:vcalendar/cal:method'))>0) { - throw new Sabre_CalDAV_Exception_InvalidICalendarObject('The METHOD property is not allowed in calendar objects'); - } - - return true; - - } - - /** - * Converts ICalendar data to XML. - * - * Properties are converted to lowercase xml elements. Parameters are; - * converted to attributes. BEGIN:VEVENT is converted to and - * END:VEVENT as well as other components. - * - * It's a very loose parser. If any line does not conform to the spec, it - * will simply be ignored. It will try to detect if \r\n or \n line endings - * are used. - * - * @todo Currently quoted attributes are not parsed correctly. - * @see http://tools.ietf.org/html/draft-royer-calsch-xcal-03 - * @param string $icalData - * @return string. - */ - static function toXCAL($icalData) { - - // Detecting line endings - $lb="\r\n"; - if (strpos($icalData,"\r\n")!==false) $lb = "\r\n"; - elseif (strpos($icalData,"\n")!==false) $lb = "\n"; - - // Splitting up items per line - $lines = explode($lb,$icalData); - - // Properties can be folded over 2 lines. In this case the second - // line will be preceeded by a space or tab. - $lines2 = array(); - foreach($lines as $line) { - - if (!$line) continue; - if ($line[0]===" " || $line[0]==="\t") { - $lines2[count($lines2)-1].=substr($line,1); - continue; - } - - $lines2[]=$line; - - } - - $xml = '' . "\n"; - $xml.= "\n"; - - $spaces = 2; - foreach($lines2 as $line) { - - $matches = array(); - // This matches PROPERTYNAME;ATTRIBUTES:VALUE - if (!preg_match('/^([^:^;]*)(?:;([^:]*))?:(.*)$/',$line,$matches)) - continue; - - $propertyName = strtolower($matches[1]); - $attributes = $matches[2]; - $value = $matches[3]; - - // If the line was in the format BEGIN:COMPONENT or END:COMPONENT, we need to special case it. - if ($propertyName === 'begin') { - $xml.=str_repeat(" ",$spaces); - $xml.='<' . strtolower($value) . ">\n"; - $spaces+=2; - continue; - } elseif ($propertyName === 'end') { - $spaces-=2; - $xml.=str_repeat(" ",$spaces); - $xml.='\n"; - continue; - } - - $xml.=str_repeat(" ",$spaces); - $xml.='<' . $propertyName; - if ($attributes) { - // There can be multiple attributes - $attributes = explode(';',$attributes); - foreach($attributes as $att) { - - list($attName,$attValue) = explode('=',$att,2); - $attName = strtolower($attName); - if ($attName === 'language') $attName='xml:lang'; - $xml.=' ' . $attName . '="' . htmlspecialchars($attValue) . '"'; - - } - } - - $xml.='>'. htmlspecialchars(trim($value)) . '\n"; - - } - $xml.=""; - return $xml; - - } - -} - diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php deleted file mode 100644 index 02747c8395e..00000000000 --- a/3rdparty/Sabre/CalDAV/Plugin.php +++ /dev/null @@ -1,788 +0,0 @@ -server->tree->getNodeForPath($parent); - - if ($node instanceof Sabre_DAV_IExtendedCollection) { - try { - $node->getChild($name); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - return array('MKCALENDAR'); - } - } - return array(); - - } - - /** - * Returns a list of features for the DAV: HTTP header. - * - * @return array - */ - public function getFeatures() { - - return array('calendar-access', 'calendar-proxy'); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'caldav'; - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_CalDAV_ICalendar || $node instanceof Sabre_CalDAV_ICalendarObject) { - return array( - '{' . self::NS_CALDAV . '}calendar-multiget', - '{' . self::NS_CALDAV . '}calendar-query', - ); - } - return array(); - - } - - /** - * Initializes the plugin - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - - $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; - $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; - - $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre_CalDAV_Property_SupportedCalendarComponentSet'; - - $server->resourceTypeMapping['Sabre_CalDAV_ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; - $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; - $server->resourceTypeMapping['Sabre_CalDAV_Principal_ProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; - - array_push($server->protectedProperties, - - '{' . self::NS_CALDAV . '}supported-calendar-component-set', - '{' . self::NS_CALDAV . '}supported-calendar-data', - '{' . self::NS_CALDAV . '}max-resource-size', - '{' . self::NS_CALDAV . '}min-date-time', - '{' . self::NS_CALDAV . '}max-date-time', - '{' . self::NS_CALDAV . '}max-instances', - '{' . self::NS_CALDAV . '}max-attendees-per-instance', - '{' . self::NS_CALDAV . '}calendar-home-set', - '{' . self::NS_CALDAV . '}supported-collation-set', - '{' . self::NS_CALDAV . '}calendar-data', - - // scheduling extension - '{' . self::NS_CALDAV . '}calendar-user-address-set', - - // CalendarServer extensions - '{' . self::NS_CALENDARSERVER . '}getctag', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', - '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for' - - ); - } - - /** - * This function handles support for the MKCALENDAR method - * - * @param string $method - * @return bool - */ - public function unknownMethod($method, $uri) { - - if ($method!=='MKCALENDAR') return; - - $this->httpMkCalendar($uri); - // false is returned to stop the unknownMethod event - return false; - - } - - /** - * This functions handles REPORT requests specific to CalDAV - * - * @param string $reportName - * @param DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CALDAV.'}calendar-multiget' : - $this->calendarMultiGetReport($dom); - return false; - case '{'.self::NS_CALDAV.'}calendar-query' : - $this->calendarQueryReport($dom); - return false; - - } - - - } - - /** - * This function handles the MKCALENDAR HTTP method, which creates - * a new calendar. - * - * @param string $uri - * @return void - */ - public function httpMkCalendar($uri) { - - // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support - // for clients matching iCal in the user agent - //$ua = $this->server->httpRequest->getHeader('User-Agent'); - //if (strpos($ua,'iCal/')!==false) { - // throw new Sabre_DAV_Exception_Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); - //} - - $body = $this->server->httpRequest->getBody(true); - $properties = array(); - - if ($body) { - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - foreach($dom->firstChild->childNodes as $child) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue; - foreach(Sabre_DAV_XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) { - $properties[$k] = $prop; - } - - } - } - - $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); - - $this->server->createCollection($uri,$resourceType,$properties); - - $this->server->httpResponse->sendStatus(201); - $this->server->httpResponse->setHeader('Content-Length',0); - } - - /** - * beforeGetProperties - * - * This method handler is invoked before any after properties for a - * resource are fetched. This allows us to add in any CalDAV specific - * properties. - * - * @param string $path - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { - - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - // calendar-home-set property - $calHome = '{' . self::NS_CALDAV . '}calendar-home-set'; - if (in_array($calHome,$requestedProperties)) { - $principalId = $node->getName(); - $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/'; - unset($requestedProperties[$calHome]); - $returnedProperties[200][$calHome] = new Sabre_DAV_Property_Href($calendarHomePath); - } - - // calendar-user-address-set property - $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set'; - if (in_array($calProp,$requestedProperties)) { - - $addresses = $node->getAlternateUriSet(); - $addresses[] = $this->server->getBaseUri() . $node->getPrincipalUrl(); - unset($requestedProperties[$calProp]); - $returnedProperties[200][$calProp] = new Sabre_DAV_Property_HrefList($addresses, false); - - } - - // These two properties are shortcuts for ical to easily find - // other principals this principal has access to. - $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for'; - $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for'; - if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) { - - $membership = $node->getGroupMembership(); - $readList = array(); - $writeList = array(); - - foreach($membership as $group) { - - $groupNode = $this->server->tree->getNodeForPath($group); - - // If the node is either ap proxy-read or proxy-write - // group, we grab the parent principal and add it to the - // list. - if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyRead) { - list($readList[]) = Sabre_DAV_URLUtil::splitPath($group); - } - if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyWrite) { - list($writeList[]) = Sabre_DAV_URLUtil::splitPath($group); - } - - } - if (in_array($propRead,$requestedProperties)) { - unset($requestedProperties[$propRead]); - $returnedProperties[200][$propRead] = new Sabre_DAV_Property_HrefList($readList); - } - if (in_array($propWrite,$requestedProperties)) { - unset($requestedProperties[$propWrite]); - $returnedProperties[200][$propWrite] = new Sabre_DAV_Property_HrefList($writeList); - } - - } - - } // instanceof IPrincipal - - - if ($node instanceof Sabre_CalDAV_ICalendarObject) { - // The calendar-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $calDataProp = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data'; - if (in_array($calDataProp, $requestedProperties)) { - unset($requestedProperties[$calDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - // Taking out \r to not screw up the xml output - $returnedProperties[200][$calDataProp] = str_replace("\r","", $val); - - } - } - - } - - /** - * This function handles the calendar-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param DOMNode $dom - * @return void - */ - public function calendarMultiGetReport($dom) { - - $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); - foreach($hrefElems as $elem) { - $uri = $this->server->calculateUri($elem->nodeValue); - list($objProps) = $this->server->getPropertiesForPath($uri,$properties); - $propertyList[]=$objProps; - - } - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList)); - - } - - /** - * This function handles the calendar-query REPORT - * - * This report is used by clients to request calendar objects based on - * complex conditions. - * - * @param DOMNode $dom - * @return void - */ - public function calendarQueryReport($dom) { - - $requestedProperties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - - $filterNode = $dom->getElementsByTagNameNS('urn:ietf:params:xml:ns:caldav','filter'); - if ($filterNode->length!==1) { - throw new Sabre_DAV_Exception_BadRequest('The calendar-query report must have a filter element'); - } - $filters = Sabre_CalDAV_XMLUtil::parseCalendarQueryFilters($filterNode->item(0)); - - $requestedCalendarData = true; - - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { - // We always retrieve calendar-data, as we need it for filtering. - $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; - - // If calendar-data wasn't explicitly requested, we need to remove - // it after processing. - $requestedCalendarData = false; - } - - // These are the list of nodes that potentially match the requirement - $candidateNodes = $this->server->getPropertiesForPath($this->server->getRequestUri(),$requestedProperties,$this->server->getHTTPDepth(0)); - - $verifiedNodes = array(); - - foreach($candidateNodes as $node) { - - // If the node didn't have a calendar-data property, it must not be a calendar object - if (!isset($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) continue; - - if ($this->validateFilters($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'],$filters)) { - - if (!$requestedCalendarData) { - unset($node[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); - } - $verifiedNodes[] = $node; - } - - } - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($verifiedNodes)); - - } - - - /** - * Verify if a list of filters applies to the calendar data object - * - * The calendarData object must be a valid iCalendar blob. The list of - * filters must be formatted as parsed by Sabre_CalDAV_Plugin::parseCalendarQueryFilters - * - * @param string $calendarData - * @param array $filters - * @return bool - */ - public function validateFilters($calendarData,$filters) { - - // We are converting the calendar object to an XML structure - // This makes it far easier to parse - $xCalendarData = Sabre_CalDAV_ICalendarUtil::toXCal($calendarData); - $xml = simplexml_load_string($xCalendarData); - $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:xcal'); - - foreach($filters as $xpath=>$filter) { - - // if-not-defined comes first - if (isset($filter['is-not-defined'])) { - if (!$xml->xpath($xpath)) - continue; - else - return false; - - } - - $elem = $xml->xpath($xpath); - - if (!$elem) return false; - $elem = $elem[0]; - - if (isset($filter['time-range'])) { - - switch($elem->getName()) { - case 'vevent' : - $result = $this->validateTimeRangeFilterForEvent($xml,$xpath,$filter); - if ($result===false) return false; - break; - case 'vtodo' : - $result = $this->validateTimeRangeFilterForTodo($xml,$xpath,$filter); - if ($result===false) return false; - break; - case 'vjournal' : - case 'vfreebusy' : - case 'valarm' : - // TODO: not implemented - break; - - /* - - case 'vjournal' : - $result = $this->validateTimeRangeFilterForJournal($xml,$xpath,$filter); - if ($result===false) return false; - break; - case 'vfreebusy' : - $result = $this->validateTimeRangeFilterForFreeBusy($xml,$xpath,$filter); - if ($result===false) return false; - break; - case 'valarm' : - $result = $this->validateTimeRangeFilterForAlarm($xml,$xpath,$filter); - if ($result===false) return false; - break; - - */ - - } - - } - - if (isset($filter['text-match'])) { - $currentString = (string)$elem; - - $isMatching = Sabre_DAV_StringUtil::textMatch($currentString, $filter['text-match']['value'], $filter['text-match']['collation']); - if ($filter['text-match']['negate-condition'] && $isMatching) return false; - if (!$filter['text-match']['negate-condition'] && !$isMatching) return false; - - } - - } - return true; - - } - - /** - * Checks whether a time-range filter matches an event. - * - * @param SimpleXMLElement $xml Event as xml object - * @param string $currentXPath XPath to check - * @param array $currentFilter Filter information - * @return void - */ - private function validateTimeRangeFilterForEvent(SimpleXMLElement $xml,$currentXPath,array $currentFilter) { - - // Grabbing the DTSTART property - $xdtstart = $xml->xpath($currentXPath.'/c:dtstart'); - if (!count($xdtstart)) { - throw new Sabre_DAV_Exception_BadRequest('DTSTART property missing from calendar object'); - } - - // The dtstart can be both a date, or datetime property - if ((string)$xdtstart[0]['value']==='DATE' || strlen((string)$xdtstart[0])===8) { - $isDateTime = false; - } else { - $isDateTime = true; - } - - // Determining the timezone - if ($tzid = (string)$xdtstart[0]['tzid']) { - $tz = new DateTimeZone($tzid); - } else { - $tz = null; - } - if ($isDateTime) { - $dtstart = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdtstart[0],$tz); - } else { - $dtstart = Sabre_CalDAV_XMLUtil::parseICalendarDate((string)$xdtstart[0]); - } - - - // Grabbing the DTEND property - $xdtend = $xml->xpath($currentXPath.'/c:dtend'); - $dtend = null; - - if (count($xdtend)) { - // Determining the timezone - if ($tzid = (string)$xdtend[0]['tzid']) { - $tz = new DateTimeZone($tzid); - } else { - $tz = null; - } - - // Since the VALUE prameter of both DTSTART and DTEND must be the same - // we can assume we don't need to check the VALUE paramter of DTEND. - if ($isDateTime) { - $dtend = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdtend[0],$tz); - } else { - $dtend = Sabre_CalDAV_XMLUtil::parseICalendarDate((string)$xdtend[0],$tz); - } - - } - - if (is_null($dtend)) { - // The DTEND property was not found. We will first see if the event has a duration - // property - - $xduration = $xml->xpath($currentXPath.'/c:duration'); - if (count($xduration)) { - $duration = Sabre_CalDAV_XMLUtil::parseICalendarDuration((string)$xduration[0]); - - // Making sure that the duration is bigger than 0 seconds. - $tempDT = clone $dtstart; - $tempDT->modify($duration); - if ($tempDT > $dtstart) { - - // use DTEND = DTSTART + DURATION - $dtend = $tempDT; - } else { - // use DTEND = DTSTART - $dtend = $dtstart; - } - - } - } - - if (is_null($dtend)) { - if ($isDateTime) { - // DTEND = DTSTART - $dtend = $dtstart; - } else { - // DTEND = DTSTART + 1 DAY - $dtend = clone $dtstart; - $dtend->modify('+1 day'); - } - } - // TODO: we need to properly parse RRULE's, but it's very difficult. - // For now, we're always returning events if they have an RRULE at all. - $rrule = $xml->xpath($currentXPath.'/c:rrule'); - $hasRrule = (count($rrule))>0; - - if (!is_null($currentFilter['time-range']['start']) && $currentFilter['time-range']['start'] >= $dtend) return false; - if (!is_null($currentFilter['time-range']['end']) && $currentFilter['time-range']['end'] <= $dtstart && !$hasRrule) return false; - return true; - - } - - private function validateTimeRangeFilterForTodo(SimpleXMLElement $xml,$currentXPath,array $filter) { - - // Gathering all relevant elements - - $dtStart = null; - $duration = null; - $due = null; - $completed = null; - $created = null; - - $xdt = $xml->xpath($currentXPath.'/c:dtstart'); - if (count($xdt)) { - // The dtstart can be both a date, or datetime property - if ((string)$xdt[0]['value']==='DATE') { - $isDateTime = false; - } else { - $isDateTime = true; - } - - // Determining the timezone - if ($tzid = (string)$xdt[0]['tzid']) { - $tz = new DateTimeZone($tzid); - } else { - $tz = null; - } - if ($isDateTime) { - $dtStart = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdt[0],$tz); - } else { - $dtStart = Sabre_CalDAV_XMLUtil::parseICalendarDate((string)$xdt[0]); - } - } - - // Only need to grab duration if dtStart is set - if (!is_null($dtStart)) { - - $xduration = $xml->xpath($currentXPath.'/c:duration'); - if (count($xduration)) { - $duration = Sabre_CalDAV_XMLUtil::parseICalendarDuration((string)$xduration[0]); - } - - } - - if (!is_null($dtStart) && !is_null($duration)) { - - // Comparision from RFC 4791: - // (start <= DTSTART+DURATION) AND ((end > DTSTART) OR (end >= DTSTART+DURATION)) - - $end = clone $dtStart; - $end->modify($duration); - - if( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] <= $end) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] > $dtStart || $filter['time-range']['end'] >= $end) ) { - return true; - } else { - return false; - } - - } - - // Need to grab the DUE property - $xdt = $xml->xpath($currentXPath.'/c:due'); - if (count($xdt)) { - // The due property can be both a date, or datetime property - if ((string)$xdt[0]['value']==='DATE') { - $isDateTime = false; - } else { - $isDateTime = true; - } - // Determining the timezone - if ($tzid = (string)$xdt[0]['tzid']) { - $tz = new DateTimeZone($tzid); - } else { - $tz = null; - } - if ($isDateTime) { - $due = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdt[0],$tz); - } else { - $due = Sabre_CalDAV_XMLUtil::parseICalendarDate((string)$xdt[0]); - } - } - - if (!is_null($dtStart) && !is_null($due)) { - - // Comparision from RFC 4791: - // ((start < DUE) OR (start <= DTSTART)) AND ((end > DTSTART) OR (end >= DUE)) - - if( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] < $due || $filter['time-range']['start'] < $dtstart) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] >= $due) ) { - return true; - } else { - return false; - } - - } - - if (!is_null($dtStart)) { - - // Comparision from RFC 4791 - // (start <= DTSTART) AND (end > DTSTART) - if ( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] <= $dtStart) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] > $dtStart) ) { - return true; - } else { - return false; - } - - } - - if (!is_null($due)) { - - // Comparison from RFC 4791 - // (start < DUE) AND (end >= DUE) - if ( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] < $due) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] >= $due) ) { - return true; - } else { - return false; - } - - } - // Need to grab the COMPLETED property - $xdt = $xml->xpath($currentXPath.'/c:completed'); - if (count($xdt)) { - $completed = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdt[0]); - } - // Need to grab the CREATED property - $xdt = $xml->xpath($currentXPath.'/c:created'); - if (count($xdt)) { - $created = Sabre_CalDAV_XMLUtil::parseICalendarDateTime((string)$xdt[0]); - } - - if (!is_null($completed) && !is_null($created)) { - // Comparison from RFC 4791 - // ((start <= CREATED) OR (start <= COMPLETED)) AND ((end >= CREATED) OR (end >= COMPLETED)) - if( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] <= $created || $filter['time-range']['start'] <= $completed) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] >= $created || $filter['time-range']['end'] >= $completed)) { - return true; - } else { - return false; - } - } - - if (!is_null($completed)) { - // Comparison from RFC 4791 - // (start <= COMPLETED) AND (end >= COMPLETED) - if( (is_null($filter['time-range']['start']) || $filter['time-range']['start'] <= $completed) && - (is_null($filter['time-range']['end']) || $filter['time-range']['end'] >= $completed)) { - return true; - } else { - return false; - } - } - - if (!is_null($created)) { - // Comparison from RFC 4791 - // (end > CREATED) - if( (is_null($filter['time-range']['end']) || $filter['time-range']['end'] > $created) ) { - return true; - } else { - return false; - } - } - - // Everything else is TRUE - return true; - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/Collection.php b/3rdparty/Sabre/CalDAV/Principal/Collection.php deleted file mode 100644 index 13435b2448e..00000000000 --- a/3rdparty/Sabre/CalDAV/Principal/Collection.php +++ /dev/null @@ -1,31 +0,0 @@ -principalBackend, $principalInfo); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php b/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php deleted file mode 100644 index f531d85d1ff..00000000000 --- a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php +++ /dev/null @@ -1,178 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-read'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws Sabre_DAV_Exception_Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of altenative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php b/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php deleted file mode 100644 index 4d8face2060..00000000000 --- a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php +++ /dev/null @@ -1,178 +0,0 @@ -principalInfo = $principalInfo; - $this->principalBackend = $principalBackend; - - } - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - return 'calendar-proxy-write'; - - } - - /** - * Returns the last modification time - * - * @return null - */ - public function getLastModified() { - - return null; - - } - - /** - * Deletes the current node - * - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to delete node'); - - } - - /** - * Renames the node - * - * @throws Sabre_DAV_Exception_Forbidden - * @param string $name The new name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to rename file'); - - } - - - /** - * Returns a list of altenative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - return array(); - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalInfo['uri'] . '/' . $this->getName(); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); - - } - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $principals) { - - $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); - - } - - /** - * Returns the displayname - * - * This should be a human readable name for the principal. - * If none is available, return the nodename. - * - * @return string - */ - public function getDisplayName() { - - return $this->getName(); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Principal/User.php b/3rdparty/Sabre/CalDAV/Principal/User.php deleted file mode 100644 index 034629b89b3..00000000000 --- a/3rdparty/Sabre/CalDAV/Principal/User.php +++ /dev/null @@ -1,122 +0,0 @@ -principalBackend, $this->principalProperties); - - if ($name === 'calendar-proxy-write') - return new Sabre_CalDAV_Principal_ProxyWrite($this->principalBackend, $this->principalProperties); - - throw new Sabre_DAV_Exception_FileNotFound('Node with name ' . $name . ' was not found'); - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - return array( - new Sabre_CalDAV_Principal_ProxyRead($this->principalBackend, $this->principalProperties), - new Sabre_CalDAV_Principal_ProxyWrite($this->principalBackend, $this->principalProperties), - ); - - } - - /** - * Checks if a child-node with the specified name exists - * - * @return bool - */ - public function childExists($name) { - - return $name === 'calendar-proxy-read' || $name === 'calendar-proxy-write'; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - ); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php deleted file mode 100644 index 1bbaca6b8a7..00000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php +++ /dev/null @@ -1,85 +0,0 @@ -components = $components; - - } - - /** - * Returns the list of supported components - * - * @return array - */ - public function getValue() { - - return $this->components; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->components as $component) { - - $xcomp = $doc->createElement('cal:comp'); - $xcomp->setAttribute('name',$component); - $node->appendChild($xcomp); - - } - - } - - /** - * Unserializes the DOMElement back into a Property class. - * - * @param DOMElement $node - * @return void - */ - static function unserialize(DOMElement $node) { - - $components = array(); - foreach($node->childNodes as $childNode) { - if (Sabre_DAV_XMLUtil::toClarkNotation($childNode)==='{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}comp') { - $components[] = $childNode->getAttribute('name'); - } - } - return new self($components); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php deleted file mode 100644 index 5010ee6d525..00000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php +++ /dev/null @@ -1,38 +0,0 @@ -ownerDocument; - - $prefix = isset($server->xmlNamespaces[Sabre_CalDAV_Plugin::NS_CALDAV])?$server->xmlNamespaces[Sabre_CalDAV_Plugin::NS_CALDAV]:'cal'; - - $caldata = $doc->createElement($prefix . ':calendar-data'); - $caldata->setAttribute('content-type','text/calendar'); - $caldata->setAttribute('version','2.0'); - - $node->appendChild($caldata); - } - -} diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php deleted file mode 100644 index e585e9db3d8..00000000000 --- a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php +++ /dev/null @@ -1,44 +0,0 @@ -ownerDocument; - - $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); - if (!$prefix) $prefix = 'cal'; - - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;octet') - ); - $node->appendChild( - $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') - ); - - - } - -} diff --git a/3rdparty/Sabre/CalDAV/Server.php b/3rdparty/Sabre/CalDAV/Server.php deleted file mode 100644 index 969d69c6279..00000000000 --- a/3rdparty/Sabre/CalDAV/Server.php +++ /dev/null @@ -1,65 +0,0 @@ -authRealm); - $this->addPlugin($authPlugin); - - $aclPlugin = new Sabre_DAVACL_Plugin(); - $this->addPlugin($aclPlugin); - - $caldavPlugin = new Sabre_CalDAV_Plugin(); - $this->addPlugin($caldavPlugin); - - } - -} diff --git a/3rdparty/Sabre/CalDAV/UserCalendars.php b/3rdparty/Sabre/CalDAV/UserCalendars.php deleted file mode 100644 index f52d65e9a73..00000000000 --- a/3rdparty/Sabre/CalDAV/UserCalendars.php +++ /dev/null @@ -1,280 +0,0 @@ -principalBackend = $principalBackend; - $this->caldavBackend = $caldavBackend; - $this->principalInfo = $principalBackend->getPrincipalByPath($userUri); - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalInfo['uri']); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_Forbidden(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_Forbidden(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return Sabre_CalDAV_Calendar - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new Sabre_DAV_Exception_FileNotFound('Calendar with name \'' . $name . '\' could not be found'); - - } - - /** - * Checks if a calendar exists. - * - * @param string $name - * @todo needs optimizing - * @return bool - */ - public function childExists($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return true; - - } - return false; - - } - - /** - * Returns a list of calendars - * - * @return array - */ - public function getChildren() { - - $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); - $objs = array(); - foreach($calendars as $calendar) { - $objs[] = new Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); - } - return $objs; - - } - - /** - * Creates a new calendar - * - * @param string $name - * @param string $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar',$resourceType) || count($resourceType)!==2) { - throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType for this collection'); - } - $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalInfo['uri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - - -} diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php deleted file mode 100644 index df8fe1f6bd6..00000000000 --- a/3rdparty/Sabre/CalDAV/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -childNodes as $child) { - - switch(Sabre_DAV_XMLUtil::toClarkNotation($child)) { - - case '{urn:ietf:params:xml:ns:caldav}comp-filter' : - case '{urn:ietf:params:xml:ns:caldav}prop-filter' : - - $filterName = $basePath . '/' . 'c:' . strtolower($child->getAttribute('name')); - $filters[$filterName] = array(); - - self::parseCalendarQueryFilters($child, $filterName,$filters); - break; - - case '{urn:ietf:params:xml:ns:caldav}time-range' : - - if ($start = $child->getAttribute('start')) { - $start = self::parseICalendarDateTime($start); - } else { - $start = null; - } - if ($end = $child->getAttribute('end')) { - $end = self::parseICalendarDateTime($end); - } else { - $end = null; - } - - if (!is_null($start) && !is_null($end) && $end <= $start) { - throw new Sabre_DAV_Exception_BadRequest('The end-date must be larger than the start-date in the time-range filter'); - } - - $filters[$basePath]['time-range'] = array( - 'start' => $start, - 'end' => $end - ); - break; - - case '{urn:ietf:params:xml:ns:caldav}is-not-defined' : - $filters[$basePath]['is-not-defined'] = true; - break; - - case '{urn:ietf:params:xml:ns:caldav}param-filter' : - - $filterName = $basePath . '/@' . strtolower($child->getAttribute('name')); - $filters[$filterName] = array(); - self::parseCalendarQueryFilters($child, $filterName, $filters); - break; - - case '{urn:ietf:params:xml:ns:caldav}text-match' : - - $collation = $child->getAttribute('collation'); - if (!$collation) $collation = 'i;ascii-casemap'; - - $filters[$basePath]['text-match'] = array( - 'collation' => ($collation == 'default'?'i;ascii-casemap':$collation), - 'negate-condition' => $child->getAttribute('negate-condition')==='yes', - 'value' => $child->nodeValue, - ); - break; - - } - - } - - return $filters; - - } - - /** - * Parses an iCalendar (rfc5545) formatted datetime and returns a DateTime object - * - * Specifying a reference timezone is optional. It will only be used - * if the non-UTC format is used. The argument is used as a reference, the - * returned DateTime object will still be in the UTC timezone. - * - * @param string $dt - * @param DateTimeZone $tz - * @return DateTime - */ - static public function parseICalendarDateTime($dt,DateTimeZone $tz = null) { - - // Format is YYYYMMDD + "T" + hhmmss - $result = preg_match('/^([1-3][0-9]{3})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches); - - if (!$result) { - throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar datetime value is incorrect: ' . $dt); - } - - if ($matches[7]==='Z' || is_null($tz)) { - $tz = new DateTimeZone('UTC'); - } - $date = new DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] .':' . $matches[6], $tz); - - // Still resetting the timezone, to normalize everything to UTC - $date->setTimeZone(new DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (rfc5545) formatted datetime and returns a DateTime object - * - * @param string $date - * @param DateTimeZone $tz - * @return DateTime - */ - static public function parseICalendarDate($date) { - - // Format is YYYYMMDD - $result = preg_match('/^([1-3][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches); - - if (!$result) { - throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar date value is incorrect: ' . $date); - } - - $date = new DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new DateTimeZone('UTC')); - return $date; - - } - - /** - * Parses an iCalendar (RFC5545) formatted duration and returns a string suitable - * for strtotime or DateTime::modify. - * - * NOTE: When we require PHP 5.3 this can be replaced by the DateTimeInterval object, which - * supports ISO 8601 Intervals, which is a superset of ICalendar durations. - * - * For now though, we're just gonna live with this messy system - * - * @param string $duration - * @return string - */ - static public function parseICalendarDuration($duration) { - - $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); - if (!$result) { - throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar duration value is incorrect: ' . $duration); - } - - $parts = array( - 'week', - 'day', - 'hour', - 'minute', - 'second', - ); - - $newDur = ''; - foreach($parts as $part) { - if (isset($matches[$part]) && $matches[$part]) { - $newDur.=' '.$matches[$part] . ' ' . $part . 's'; - } - } - - $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); - return $newDur; - - } - -} diff --git a/3rdparty/Sabre/CardDAV/AddressBook.php b/3rdparty/Sabre/CardDAV/AddressBook.php deleted file mode 100644 index 471ca7b338a..00000000000 --- a/3rdparty/Sabre/CardDAV/AddressBook.php +++ /dev/null @@ -1,293 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - - } - - /** - * Returns the name of the addressbook - * - * @return string - */ - public function getName() { - - return $this->addressBookInfo['uri']; - - } - - /** - * Returns a card - * - * @param string $name - * @return Sabre_DAV_Card - */ - public function getChild($name) { - - $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); - if (!$obj) throw new Sabre_DAV_Exception_FileNotFound('Card not found'); - return new Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - - } - - /** - * Returns the full list of cards - * - * @return array - */ - public function getChildren() { - - $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); - $children = array(); - foreach($objs as $obj) { - $children[] = new Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); - } - return $children; - - } - - /** - * Creates a new directory - * - * We actually block this, as subdirectories are not allowed in addressbooks. - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating collections in addressbooks is not allowed'); - - } - - /** - * Creates a new file - * - * The contents of the new file must be a valid VCARD - * - * @param string $name - * @param resource $vcardData - * @return void - */ - public function createFile($name,$vcardData = null) { - - $vcardData = stream_get_contents($vcardData); - // Converting to UTF-8, if needed - $vcardData = Sabre_DAV_StringUtil::ensureUTF8($vcardData); - - $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData); - - } - - /** - * Deletes the entire addressbook. - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']); - - } - - /** - * Renames the addressbook - * - * @param string $newName - * @return void - */ - public function setName($newName) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Renaming addressbooks is not yet supported'); - - } - - /** - * Returns the last modification date as a unix timestamp. - * - * @return void - */ - public function getLastModified() { - - return null; - - } - - /** - * Updates properties on this node, - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existant property is always succesful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - public function updateProperties($mutations) { - - return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations); - - } - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * @param array $properties - * @return void - */ - public function getProperties($properties) { - - $response = array(); - foreach($properties as $propertyName) { - - if (isset($this->addressBookInfo[$propertyName])) { - - $response[$propertyName] = $this->addressBookInfo[$propertyName]; - - } - - } - - return $response; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - - -} diff --git a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php deleted file mode 100644 index 08adc3b8157..00000000000 --- a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php +++ /dev/null @@ -1,211 +0,0 @@ -dom = $dom; - - $this->xpath = new DOMXPath($dom); - $this->xpath->registerNameSpace('card',Sabre_CardDAV_Plugin::NS_CARDDAV); - - } - - /** - * Parses the request. - * - * @param DOMNode $dom - * @return void - */ - public function parse() { - - $filterNode = null; - - $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)'); - if (is_nan($limit)) $limit = null; - - $filter = $this->xpath->query('/card:addressbook-query/card:filter'); - if ($filter->length !== 1) { - throw new Sabre_DAV_Exception_BadRequest('Only one filter element is allowed'); - } - - $filter = $filter->item(0); - $test = $this->xpath->evaluate('string(@test)', $filter); - if (!$test) $test = self::TEST_ANYOF; - if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { - throw new Sabre_DAV_Exception_BadRequest('The test attribute must either hold "anyof" or "allof"'); - } - - $propFilters = array(); - - $propFilterNodes = $this->xpath->query('card:prop-filter', $filter); - for($ii=0; $ii < $propFilterNodes->length; $ii++) { - - $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii)); - - - } - - $this->filters = $propFilters; - $this->limit = $limit; - $this->requestedProperties = array_keys(Sabre_DAV_XMLUtil::parseProperties($this->dom->firstChild)); - $this->test = $test; - - } - - /** - * Parses the prop-filter xml element - * - * @param DOMElement $propFilterNode - * @return array - */ - protected function parsePropFilterNode(DOMElement $propFilterNode) { - - $propFilter = array(); - $propFilter['name'] = $propFilterNode->getAttribute('name'); - $propFilter['test'] = $propFilterNode->getAttribute('test'); - if (!$propFilter['test']) $propFilter['test'] = 'anyof'; - - $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0; - - $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode); - - $propFilter['param-filters'] = array(); - - - for($ii=0;$ii<$paramFilterNodes->length;$ii++) { - - $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii)); - - } - $propFilter['text-matches'] = array(); - $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode); - - for($ii=0;$ii<$textMatchNodes->length;$ii++) { - - $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii)); - - } - - return $propFilter; - - } - - /** - * Parses the param-filter element - * - * @param DOMElement $paramFilterNode - * @return array - */ - public function parseParamFilterNode(DOMElement $paramFilterNode) { - - $paramFilter = array(); - $paramFilter['name'] = $paramFilterNode->getAttribute('name'); - $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0; - $paramFilter['text-match'] = null; - - $textMatch = $this->xpath->query('card:text-match', $paramFilterNode); - if ($textMatch->length>0) { - $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0)); - } - - return $paramFilter; - - } - - /** - * Text match - * - * @param DOMElement $textMatchNode - * @return void - */ - public function parseTextMatchNode(DOMElement $textMatchNode) { - - $matchType = $textMatchNode->getAttribute('match-type'); - if (!$matchType) $matchType = 'contains'; - - if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) { - throw new Sabre_DAV_Exception_BadRequest('Unknown match-type: ' . $matchType); - } - - $negateCondition = $textMatchNode->getAttribute('negate-condition'); - $negateCondition = $negateCondition==='yes'; - $collation = $textMatchNode->getAttribute('collation'); - if (!$collation) $collation = 'i;unicode-casemap'; - - return array( - 'negate-condition' => $negateCondition, - 'collation' => $collation, - 'match-type' => $matchType, - 'value' => $textMatchNode->nodeValue - ); - - - } - -} diff --git a/3rdparty/Sabre/CardDAV/AddressBookRoot.php b/3rdparty/Sabre/CardDAV/AddressBookRoot.php deleted file mode 100644 index 1a80efba35e..00000000000 --- a/3rdparty/Sabre/CardDAV/AddressBookRoot.php +++ /dev/null @@ -1,78 +0,0 @@ -carddavBackend = $carddavBackend; - parent::__construct($principalBackend, $principalPrefix); - - } - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - return Sabre_CardDAV_Plugin::ADDRESSBOOK_ROOT; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principal - * @return Sabre_DAV_INode - */ - public function getChildForPrincipal(array $principal) { - - return new Sabre_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); - - } - -} diff --git a/3rdparty/Sabre/CardDAV/Backend/Abstract.php b/3rdparty/Sabre/CardDAV/Backend/Abstract.php deleted file mode 100644 index 1f0253ddab8..00000000000 --- a/3rdparty/Sabre/CardDAV/Backend/Abstract.php +++ /dev/null @@ -1,121 +0,0 @@ -pdo = $pdo; - $this->addressBooksTableName = $addressBooksTableName; - $this->cardsTableName = $cardsTableName; - - } - - /** - * Returns the list of addressbooks for a specific user. - * - * @param string $principalUri - * @return array - */ - public function getAddressBooksForUser($principalUri) { - - $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM `'.$this->addressBooksTableName.'` WHERE principaluri = ?'); - $result = $stmt->execute(array($principalUri)); - - $addressBooks = array(); - - foreach($stmt->fetchAll() as $row) { - - $addressBooks[] = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{DAV:}displayname' => $row['displayname'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], - '{http://calendarserver.org/ns/}getctag' => $row['ctag'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}supported-address-data' => - new Sabre_CardDAV_Property_SupportedAddressData(), - ); - - } - - return $addressBooks; - - } - - - /** - * Updates an addressbook's properties - * - * See Sabre_DAV_IProperties for a description of the mutations array, as - * well as the return value. - * - * @param mixed $addressBookId - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateAddressBook($addressBookId, array $mutations) { - - $updates = array(); - - foreach($mutations as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $updates['displayname'] = $newValue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $updates['description'] = $newValue; - break; - default : - // If any unsupported values were being updated, we must - // let the entire request fail. - return false; - } - - } - - // No values are being updated? - if (!$updates) { - return false; - } - - $query = 'UPDATE `' . $this->addressBooksTableName . '` SET ctag = ctag + 1 '; - foreach($updates as $key=>$value) { - $query.=', `' . $key . '` = :' . $key . ' '; - } - $query.=' WHERE id = :addressbookid'; - - $stmt = $this->pdo->prepare($query); - $updates['addressbookid'] = $addressBookId; - - $stmt->execute($updates); - - return true; - - } - - /** - * Creates a new address book - * - * @param string $principalUri - * @param string $url Just the 'basename' of the url. - * @param array $properties - * @return void - */ - public function createAddressBook($principalUri, $url, array $properties) { - - $values = array( - 'displayname' => null, - 'description' => null, - 'principaluri' => $principalUri, - 'uri' => $url, - ); - - foreach($properties as $property=>$newValue) { - - switch($property) { - case '{DAV:}displayname' : - $values['displayname'] = $newValue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $values['description'] = $newValue; - break; - default : - throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); - } - - } - - $query = 'INSERT INTO `' . $this->addressBooksTableName . '` (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)'; - $stmt = $this->pdo->prepare($query); - $stmt->execute($values); - - } - - /** - * Deletes an entire addressbook and all its contents - * - * @param int $addressBookId - * @return void - */ - public function deleteAddressBook($addressBookId) { - - $stmt = $this->pdo->prepare('DELETE FROM `' . $this->cardsTableName . '` WHERE addressbookid = ?'); - $stmt->execute(array($addressBookId)); - - $stmt = $this->pdo->prepare('DELETE FROM `' . $this->addressBooksTableName . '` WHERE id = ?'); - $stmt->execute(array($addressBookId)); - - } - - /** - * Returns all cards for a specific addressbook id. - * - * @param mixed $addressbookId - * @return array - */ - public function getCards($addressbookId) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM `' . $this->cardsTableName . '` WHERE addressbookid = ?'); - $stmt->execute(array($addressbookId)); - - return $stmt->fetchAll(PDO::FETCH_ASSOC); - - - } - /** - * Returns a specfic card - * - * @param mixed $addressBookId - * @param string $cardUri - * @return array - */ - public function getCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM `' . $this->cardsTableName . '` WHERE addressbookid = ? AND uri = ? LIMIT 1'); - $stmt->execute(array($addressBookId, $cardUri)); - - $result = $stmt->fetchAll(PDO::FETCH_ASSOC); - - return (count($result)>0?$result[0]:false); - - } - - /** - * Creates a new card - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return bool - */ - public function createCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('INSERT INTO `' . $this->cardsTableName . '` (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)'); - - $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE `' . $this->addressBooksTableName . '` SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return $result; - - } - - /** - * Updates a card - * - * @param mixed $addressBookId - * @param string $cardUri - * @param string $cardData - * @return bool - */ - public function updateCard($addressBookId, $cardUri, $cardData) { - - $stmt = $this->pdo->prepare('UPDATE `' . $this->cardsTableName . '` SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?'); - $result = $stmt->execute(array($cardData, time(), $cardUri, $addressBookId)); - - $stmt2 = $this->pdo->prepare('UPDATE `' . $this->addressBooksTableName . '` SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return $stmt->rowCount()===1; - - } - - /** - * Deletes a card - * - * @param mixed $addressBookId - * @param string $cardUri - * @return bool - */ - public function deleteCard($addressBookId, $cardUri) { - - $stmt = $this->pdo->prepare('DELETE FROM `' . $this->cardsTableName . '` WHERE addressbookid = ? AND uri = ?'); - $stmt->execute(array($addressBookId, $cardUri)); - - $stmt2 = $this->pdo->prepare('UPDATE `' . $this->addressBooksTableName . '` SET ctag = ctag + 1 WHERE id = ?'); - $stmt2->execute(array($addressBookId)); - - return $stmt->rowCount()===1; - - } -} diff --git a/3rdparty/Sabre/CardDAV/Card.php b/3rdparty/Sabre/CardDAV/Card.php deleted file mode 100644 index 2844eaf7ed6..00000000000 --- a/3rdparty/Sabre/CardDAV/Card.php +++ /dev/null @@ -1,220 +0,0 @@ -carddavBackend = $carddavBackend; - $this->addressBookInfo = $addressBookInfo; - $this->cardData = $cardData; - - } - - /** - * Returns the uri for this object - * - * @return string - */ - public function getName() { - - return $this->cardData['uri']; - - } - - /** - * Returns the VCard-formatted object - * - * @return string - */ - public function get() { - - $cardData = $this->cardData['carddata']; - $s = fopen('php://temp','r+'); - fwrite($s, $cardData); - rewind($s); - return $s; - - } - - /** - * Updates the VCard-formatted object - * - * @param string $cardData - * @return void - */ - public function put($cardData) { - - if (is_resource($cardData)) - $cardData = stream_get_contents($cardData); - - // Converting to UTF-8, if needed - $cardData = Sabre_DAV_StringUtil::ensureUTF8($cardData); - - $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData); - $this->cardData['carddata'] = $cardData; - - } - - /** - * Deletes the card - * - * @return void - */ - public function delete() { - - $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']); - - } - - /** - * Returns the mime content-type - * - * @return string - */ - public function getContentType() { - - return 'text/x-vcard'; - - } - - /** - * Returns an ETag for this object - * - * @return string - */ - public function getETag() { - - return '"' . md5($this->cardData['carddata']) . '"'; - - } - - /** - * Returns the last modification date as a unix timestamp - * - * @return time - */ - public function getLastModified() { - - return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null; - - } - - /** - * Returns the size of this object in bytes - * - * @return int - */ - public function getSize() { - - return strlen($this->cardData['carddata']); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->addressBookInfo['principaluri']; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->addressBookInfo['principaluri'], - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - -} - diff --git a/3rdparty/Sabre/CardDAV/IAddressBook.php b/3rdparty/Sabre/CardDAV/IAddressBook.php deleted file mode 100644 index a0dffb30aea..00000000000 --- a/3rdparty/Sabre/CardDAV/IAddressBook.php +++ /dev/null @@ -1,18 +0,0 @@ -subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); - $server->subscribeEvent('report', array($this,'report')); - - /* Namespaces */ - $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; - - /* Mapping Interfaces to {DAV:}resourcetype values */ - $server->resourceTypeMapping['Sabre_CardDAV_IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; - $server->resourceTypeMapping['Sabre_CardDAV_IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; - - /* Adding properties that may never be changed */ - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; - $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size'; - - - $this->server = $server; - - } - - /** - * Returns a list of supported features. - * - * This is used in the DAV: header in the OPTIONS and PROPFIND requests. - * - * @return array - */ - public function getFeatures() { - - return array('addressbook'); - - } - - /** - * Returns a list of reports this plugin supports. - * - * This will be used in the {DAV:}supported-report-set property. - * Note that you still need to subscribe to the 'report' event to actually - * implement them - * - * @param string $uri - * @return array - */ - public function getSupportedReportSet($uri) { - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_CardDAV_IAddressBook || $node instanceof Sabre_CardDAV_ICard) { - return array( - '{' . self::NS_CARDDAV . '}addressbook-multiget', - '{' . self::NS_CARDDAV . '}addressbook-query', - ); - } - return array(); - - } - - - /** - * Adds all CardDAV-specific properties - * - * @param string $path - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @return void - */ - public function beforeGetProperties($path, Sabre_DAV_INode $node, array &$requestedProperties, array &$returnedProperties) { - - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - // calendar-home-set property - $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set'; - if (in_array($addHome,$requestedProperties)) { - $principalId = $node->getName(); - $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/'; - unset($requestedProperties[array_search($addHome, $requestedProperties)]); - $returnedProperties[200][$addHome] = new Sabre_DAV_Property_Href($addressbookHomePath); - } - - $directories = '{' . self::NS_CARDDAV . '}directory-gateway'; - if ($this->directories && in_array($directories, $requestedProperties)) { - unset($requestedProperties[array_search($directories, $requestedProperties)]); - $returnedProperties[200][$directories] = new Sabre_DAV_Property_HrefList($this->directories); - } - - } - - if ($node instanceof Sabre_CardDAV_ICard) { - - // The address-data property is not supposed to be a 'real' - // property, but in large chunks of the spec it does act as such. - // Therefore we simply expose it as a property. - $addressDataProp = '{' . self::NS_CARDDAV . '}address-data'; - if (in_array($addressDataProp, $requestedProperties)) { - unset($requestedProperties[$addressDataProp]); - $val = $node->get(); - if (is_resource($val)) - $val = stream_get_contents($val); - - // Taking out \r to not screw up the xml output - $returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); - - } - } - - } - - /** - * This functions handles REPORT requests specific to CardDAV - * - * @param string $reportName - * @param DOMNode $dom - * @return bool - */ - public function report($reportName,$dom) { - - switch($reportName) { - case '{'.self::NS_CARDDAV.'}addressbook-multiget' : - $this->addressbookMultiGetReport($dom); - return false; - case '{'.self::NS_CARDDAV.'}addressbook-query' : - $this->addressBookQueryReport($dom); - return false; - default : - return; - - } - - - } - - /** - * This function handles the addressbook-multiget REPORT. - * - * This report is used by the client to fetch the content of a series - * of urls. Effectively avoiding a lot of redundant requests. - * - * @param DOMNode $dom - * @return void - */ - public function addressbookMultiGetReport($dom) { - - $properties = array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)); - - $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); - $propertyList = array(); - - foreach($hrefElems as $elem) { - - $uri = $this->server->calculateUri($elem->nodeValue); - list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties); - - } - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList)); - - } - - /** - * This function handles the addressbook-query REPORT - * - * This report is used by the client to filter an addressbook based on a - * complex query. - * - * @param DOMNode $dom - * @return void - */ - protected function addressbookQueryReport($dom) { - - $query = new Sabre_CardDAV_AddressBookQueryParser($dom); - $query->parse(); - - $depth = $this->server->getHTTPDepth(0); - - if ($depth==0) { - $candidateNodes = array( - $this->server->tree->getNodeForPath($this->server->getRequestUri()) - ); - } else { - $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); - } - - $validNodes = array(); - foreach($candidateNodes as $node) { - - if (!$node instanceof Sabre_CardDAV_ICard) - continue; - - $blob = $node->get(); - if (is_resource($blob)) { - $blob = stream_get_contents($blob); - } - - if (!$this->validateFilters($blob, $query->filters, $query->test)) { - continue; - } - - $validNodes[] = $node; - - if ($query->limit && $query->limit <= count($validNodes)) { - // We hit the maximum number of items, we can stop now. - break; - } - - } - - $result = array(); - foreach($validNodes as $validNode) { - if ($depth==0) { - $href = $this->server->getRequestUri(); - } else { - $href = $this->server->getRequestUri() . '/' . $validNode->getName(); - } - - list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0); - - } - - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result)); - - } - - /** - * Validates if a vcard makes it throught a list of filters. - * - * @param string $vcardData - * @param array $filters - * @param string $test anyof or allof (which means OR or AND) - * @return bool - */ - public function validateFilters($vcardData, array $filters, $test) { - - $vcard = Sabre_VObject_Reader::read($vcardData); - - $success = true; - - foreach($filters as $filter) { - - $isDefined = isset($vcard->{$filter['name']}); - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) { - - // We only need to check for existence - $success = $isDefined; - - } else { - - $vProperties = $vcard->select($filter['name']); - - $results = array(); - if ($filter['param-filters']) { - $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']); - } - if ($filter['text-matches']) { - $texts = array(); - foreach($vProperties as $vProperty) - $texts[] = $vProperty->value; - - $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']); - } - - if (count($results)===1) { - $success = $results[0]; - } else { - if ($filter['test'] === 'anyof') { - $success = $results[0] || $results[1]; - } else { - $success = $results[0] && $results[1]; - } - } - - } // else - - // There are two conditions where we can already determine wether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } // foreach - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a param-filter can be applied to a specific property. - * - * @todo currently we're only validating the first parameter of the passed - * property. Any subsequence parameters with the same name are - * ignored. - * @param Sabre_VObject_Property $vProperty - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateParamFilters(array $vProperties, array $filters, $test) { - - $success = false; - foreach($filters as $filter) { - - $isDefined = false; - foreach($vProperties as $vProperty) { - $isDefined = isset($vProperty[$filter['name']]); - if ($isDefined) break; - } - - if ($filter['is-not-defined']) { - if ($isDefined) { - $success = false; - } else { - $success = true; - } - - // If there's no text-match, we can just check for existence - } elseif (!$filter['text-match'] || !$isDefined) { - - $success = $isDefined; - - } else { - - $texts = array(); - $success = false; - foreach($vProperties as $vProperty) { - // If we got all the way here, we'll need to validate the - // text-match filter. - $success = Sabre_DAV_StringUtil::textMatch($vProperty[$filter['name']]->value, $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']); - if ($success) break; - } - if ($filter['text-match']['negate-condition']) { - $success = !$success; - } - - } // else - - // There are two conditions where we can already determine wether - // or not this filter succeeds. - if ($test==='anyof' && $success) { - return true; - } - if ($test==='allof' && !$success) { - return false; - } - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - /** - * Validates if a text-filter can be applied to a specific property. - * - * @param array $texts - * @param array $filters - * @param string $test - * @return bool - */ - protected function validateTextMatches(array $texts, array $filters, $test) { - - foreach($filters as $filter) { - - $success = false; - foreach($texts as $haystack) { - $success = Sabre_DAV_StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']); - - // Breaking on the first match - if ($success) break; - } - if ($filter['negate-condition']) { - $success = !$success; - } - - if ($success && $test==='anyof') - return true; - - if (!$success && $test=='allof') - return false; - - - } - - // If we got all the way here, it means we haven't been able to - // determine early if the test failed or not. - // - // This implies for 'anyof' that the test failed, and for 'allof' that - // we succeeded. Sounds weird, but makes sense. - return $test==='allof'; - - } - - -} diff --git a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php b/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php deleted file mode 100644 index d57d3a6e7bd..00000000000 --- a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php +++ /dev/null @@ -1,69 +0,0 @@ - 'text/vcard', 'version' => '3.0'), - array('contentType' => 'text/vcard', 'version' => '4.0'), - ); - } - - $this->supportedData = $supportedData; - - } - - /** - * Serializes the property in a DOMDocument - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - - $prefix = - isset($server->xmlNamespaces[Sabre_CardDAV_Plugin::NS_CARDDAV]) ? - $server->xmlNamespaces[Sabre_CardDAV_Plugin::NS_CARDDAV] : - 'card'; - - foreach($this->supportedData as $supported) { - - $caldata = $doc->createElementNS(Sabre_CardDAV_Plugin::NS_CARDDAV, $prefix . ':address-data-type'); - $caldata->setAttribute('content-type',$supported['contentType']); - $caldata->setAttribute('version',$supported['version']); - $node->appendChild($caldata); - - } - - } - -} diff --git a/3rdparty/Sabre/CardDAV/UserAddressBooks.php b/3rdparty/Sabre/CardDAV/UserAddressBooks.php deleted file mode 100644 index e9f2de7f741..00000000000 --- a/3rdparty/Sabre/CardDAV/UserAddressBooks.php +++ /dev/null @@ -1,240 +0,0 @@ -carddavBackend = $carddavBackend; - $this->principalUri = $principalUri; - - } - - /** - * Returns the name of this object - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalUri); - return $name; - - } - - /** - * Updates the name of this object - * - * @param string $name - * @return void - */ - public function setName($name) { - - throw new Sabre_DAV_Exception_MethodNotAllowed(); - - } - - /** - * Deletes this object - * - * @return void - */ - public function delete() { - - throw new Sabre_DAV_Exception_MethodNotAllowed(); - - } - - /** - * Returns the last modification date - * - * @return int - */ - public function getLastModified() { - - return null; - - } - - /** - * Creates a new file under this object. - * - * This is currently not allowed - * - * @param string $filename - * @param resource $data - * @return void - */ - public function createFile($filename, $data=null) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new files in this collection is not supported'); - - } - - /** - * Creates a new directory under this object. - * - * This is currently not allowed. - * - * @param string $filename - * @return void - */ - public function createDirectory($filename) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Creating new collections in this collection is not supported'); - - } - - /** - * Returns a single calendar, by name - * - * @param string $name - * @todo needs optimizing - * @return Sabre_CardDAV_AddressBook - */ - public function getChild($name) { - - foreach($this->getChildren() as $child) { - if ($name==$child->getName()) - return $child; - - } - throw new Sabre_DAV_Exception_FileNotFound('Addressbook with name \'' . $name . '\' could not be found'); - - } - - /** - * Returns a list of addressbooks - * - * @return array - */ - public function getChildren() { - - $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); - $objs = array(); - foreach($addressbooks as $addressbook) { - $objs[] = new Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); - } - return $objs; - - } - - /** - * Creates a new addressbook - * - * @param string $name - * @param array $resourceType - * @param array $properties - * @return void - */ - public function createExtendedCollection($name, array $resourceType, array $properties) { - - if (!in_array('{'.Sabre_CardDAV_Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) { - throw new Sabre_DAV_Exception_InvalidResourceType('Unknown resourceType for this collection'); - } - $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalUri; - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalUri, - 'protected' => true, - ), - array( - 'privilege' => '{DAV:}write', - 'principal' => $this->principalUri, - 'protected' => true, - ), - - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); - - } - - -} diff --git a/3rdparty/Sabre/CardDAV/Version.php b/3rdparty/Sabre/CardDAV/Version.php deleted file mode 100644 index 900fbf5e75c..00000000000 --- a/3rdparty/Sabre/CardDAV/Version.php +++ /dev/null @@ -1,26 +0,0 @@ -currentUser; - } - - - /** - * Authenticates the user based on the current request. - * - * If authentication is succesful, true must be returned. - * If authentication fails, an exception must be thrown. - * - * @throws Sabre_DAV_Exception_NotAuthenticated - * @return bool - */ - public function authenticate(Sabre_DAV_Server $server,$realm) { - - $auth = new Sabre_HTTP_BasicAuth(); - $auth->setHTTPRequest($server->httpRequest); - $auth->setHTTPResponse($server->httpResponse); - $auth->setRealm($realm); - $userpass = $auth->getUserPass(); - if (!$userpass) { - $auth->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('No basic authentication headers were found'); - } - - // Authenticates the user - if (!$this->validateUserPass($userpass[0],$userpass[1])) { - $auth->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('Username or password does not match'); - } - $this->currentUser = $userpass[0]; - return true; - } - - -} - diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php deleted file mode 100644 index 5bdc72753ec..00000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php +++ /dev/null @@ -1,96 +0,0 @@ -setHTTPRequest($server->httpRequest); - $digest->setHTTPResponse($server->httpResponse); - - $digest->setRealm($realm); - $digest->init(); - - $username = $digest->getUsername(); - - // No username was given - if (!$username) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('No digest authentication headers were found'); - } - - $hash = $this->getDigestHash($realm, $username); - // If this was false, the user account didn't exist - if ($hash===false || is_null($hash)) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('The supplied username was not on file'); - } - if (!is_string($hash)) { - throw new Sabre_DAV_Exception('The returned value from getDigestHash must be a string or null'); - } - - // If this was false, the password or part of the hash was incorrect. - if (!$digest->validateA1($hash)) { - $digest->requireLogin(); - throw new Sabre_DAV_Exception_NotAuthenticated('Incorrect username'); - } - - $this->currentUser = $username; - return true; - - } - - /** - * Returns the currently logged in username. - * - * @return string|null - */ - public function getCurrentUser() { - - return $this->currentUser; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php b/3rdparty/Sabre/DAV/Auth/Backend/Apache.php deleted file mode 100644 index 6bcd76bdcb0..00000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php +++ /dev/null @@ -1,60 +0,0 @@ -httpRequest->getRawServerValue('REMOTE_USER'); - if (is_null($remoteUser)) { - throw new Sabre_DAV_Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured'); - } - - $this->remoteUser = $remoteUser; - return true; - - } - - /** - * Returns information about the currently logged in user. - * - * If nobody is currently logged in, this method should return null. - * - * @return array|null - */ - public function getCurrentUser() { - - return $this->remoteUser; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Auth/Backend/File.php b/3rdparty/Sabre/DAV/Auth/Backend/File.php deleted file mode 100644 index db1f04c4772..00000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/File.php +++ /dev/null @@ -1,76 +0,0 @@ -loadFile($filename); - - } - - /** - * Loads an htdigest-formatted file. This method can be called multiple times if - * more than 1 file is used. - * - * @param string $filename - * @return void - */ - public function loadFile($filename) { - - foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) { - - if (substr_count($line, ":") !== 2) - throw new Sabre_DAV_Exception('Malformed htdigest file. Every line should contain 2 colons'); - - list($username,$realm,$A1) = explode(':',$line); - - if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) - throw new Sabre_DAV_Exception('Malformed htdigest file. Invalid md5 hash'); - - $this->users[$realm . ':' . $username] = $A1; - - } - - } - - /** - * Returns a users' information - * - * @param string $realm - * @param string $username - * @return string - */ - public function getDigestHash($realm, $username) { - - return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php b/3rdparty/Sabre/DAV/Auth/Backend/PDO.php deleted file mode 100644 index 0301503601e..00000000000 --- a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php +++ /dev/null @@ -1,66 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns the digest hash for a user. - * - * @param string $realm - * @param string $username - * @return string|null - */ - public function getDigestHash($realm,$username) { - - $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM `'.$this->tableName.'` WHERE username = ?'); - $stmt->execute(array($username)); - $result = $stmt->fetchAll(); - - if (!count($result)) return; - - return $result[0]['digesta1']; - - } - -} diff --git a/3rdparty/Sabre/DAV/Auth/IBackend.php b/3rdparty/Sabre/DAV/Auth/IBackend.php deleted file mode 100644 index 1f67af4c2d9..00000000000 --- a/3rdparty/Sabre/DAV/Auth/IBackend.php +++ /dev/null @@ -1,34 +0,0 @@ -authBackend = $authBackend; - $this->realm = $realm; - - } - - /** - * Initializes the plugin. This function is automatically called by the server - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'auth'; - - } - - /** - * Returns the current users' principal uri. - * - * If nobody is logged in, this will return null. - * - * @return string|null - */ - public function getCurrentUser() { - - $userInfo = $this->authBackend->getCurrentUser(); - if (!$userInfo) return null; - - return $userInfo; - - } - - /** - * This method is called before any HTTP method and forces users to be authenticated - * - * @param string $method - * @throws Sabre_DAV_Exception_NotAuthenticated - * @return bool - */ - public function beforeMethod($method, $uri) { - - $this->authBackend->authenticate($this->server,$this->realm); - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/GuessContentType.php b/3rdparty/Sabre/DAV/Browser/GuessContentType.php deleted file mode 100644 index ee8c698d782..00000000000 --- a/3rdparty/Sabre/DAV/Browser/GuessContentType.php +++ /dev/null @@ -1,97 +0,0 @@ - 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - - // groupware - 'ics' => 'text/calendar', - 'vcf' => 'text/x-vcard', - - // text - 'txt' => 'text/plain', - - ); - - /** - * Initializes the plugin - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - // Using a relatively low priority (200) to allow other extensions - // to set the content-type first. - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200); - - } - - /** - * Handler for teh afterGetProperties event - * - * @param string $path - * @param array $properties - * @return void - */ - public function afterGetProperties($path, &$properties) { - - if (array_key_exists('{DAV:}getcontenttype', $properties[404])) { - - list(, $fileName) = Sabre_DAV_URLUtil::splitPath($path); - $contentType = $this->getContentType($fileName); - - if ($contentType) { - $properties[200]['{DAV:}getcontenttype'] = $contentType; - unset($properties[404]['{DAV:}getcontenttype']); - } - - } - - } - - /** - * Simple method to return the contenttype - * - * @param string $fileName - * @return string - */ - protected function getContentType($fileName) { - - // Just grabbing the extension - $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1)); - if (isset($this->extensionMap[$extension])) - return $this->extensionMap[$extension]; - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php b/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php deleted file mode 100644 index a66b57a3a90..00000000000 --- a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php +++ /dev/null @@ -1,54 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - } - - /** - * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request - * - * @param string $method - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method!='GET') return true; - - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_DAV_IFile) return; - - $this->server->invokeMethod('PROPFIND',$uri); - return false; - - } - -} diff --git a/3rdparty/Sabre/DAV/Browser/Plugin.php b/3rdparty/Sabre/DAV/Browser/Plugin.php deleted file mode 100644 index cd5617babb1..00000000000 --- a/3rdparty/Sabre/DAV/Browser/Plugin.php +++ /dev/null @@ -1,285 +0,0 @@ -enablePost = $enablePost; - - } - - /** - * Initializes the plugin and subscribes to events - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); - if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler')); - } - - /** - * This method intercepts GET requests to collections and returns the html - * - * @param string $method - * @return bool - */ - public function httpGetInterceptor($method, $uri) { - - if ($method!='GET') return true; - - try { - $node = $this->server->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - // We're simply stopping when the file isn't found to not interfere - // with other plugins. - return; - } - if ($node instanceof Sabre_DAV_IFile) - return; - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8'); - - $this->server->httpResponse->sendBody( - $this->generateDirectoryIndex($uri) - ); - - return false; - - } - - /** - * Handles POST requests for tree operations - * - * This method is not yet used. - * - * @param string $method - * @return bool - */ - public function httpPOSTHandler($method, $uri) { - - if ($method!='POST') return true; - if (isset($_POST['sabreAction'])) switch($_POST['sabreAction']) { - - case 'mkcol' : - if (isset($_POST['name']) && trim($_POST['name'])) { - // Using basename() because we won't allow slashes - list(, $folderName) = Sabre_DAV_URLUtil::splitPath(trim($_POST['name'])); - $this->server->createDirectory($uri . '/' . $folderName); - } - break; - case 'put' : - if ($_FILES) $file = current($_FILES); - else break; - $newName = trim($file['name']); - list(, $newName) = Sabre_DAV_URLUtil::splitPath(trim($file['name'])); - if (isset($_POST['name']) && trim($_POST['name'])) - $newName = trim($_POST['name']); - - // Making sure we only have a 'basename' component - list(, $newName) = Sabre_DAV_URLUtil::splitPath($newName); - - - if (is_uploaded_file($file['tmp_name'])) { - $parent = $this->server->tree->getNodeForPath(trim($uri,'/')); - $parent->createFile($newName,fopen($file['tmp_name'],'r')); - } - - } - $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri()); - return false; - - } - - /** - * Escapes a string for html. - * - * @param string $value - * @return void - */ - public function escapeHTML($value) { - - return htmlspecialchars($value,ENT_QUOTES,'UTF-8'); - - } - - /** - * Generates the html directory index for a given url - * - * @param string $path - * @return string - */ - public function generateDirectoryIndex($path) { - - $html = " - - Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . Sabre_DAV_Version::VERSION . " - - - -

    Index for " . $this->escapeHTML($path) . "/

    - - - "; - - $files = $this->server->getPropertiesForPath($path,array( - '{DAV:}displayname', - '{DAV:}resourcetype', - '{DAV:}getcontenttype', - '{DAV:}getcontentlength', - '{DAV:}getlastmodified', - ),1); - - $parent = $this->server->tree->getNodeForPath($path); - - - if ($path) { - - list($parentUri) = Sabre_DAV_URLUtil::splitPath($path); - $fullPath = Sabre_DAV_URLUtil::encodePath($this->server->getBaseUri() . $parentUri); - - $html.= " - - - - -"; - - } - - foreach($files as $k=>$file) { - - // This is the current directory, we can skip it - if (rtrim($file['href'],'/')==$path) continue; - - list(, $name) = Sabre_DAV_URLUtil::splitPath($file['href']); - - $type = null; - - - if (isset($file[200]['{DAV:}resourcetype'])) { - $type = $file[200]['{DAV:}resourcetype']->getValue(); - - // resourcetype can have multiple values - if (!is_array($type)) $type = array($type); - - foreach($type as $k=>$v) { - - // Some name mapping is preferred - switch($v) { - case '{DAV:}collection' : - $type[$k] = 'Collection'; - break; - case '{DAV:}principal' : - $type[$k] = 'Principal'; - break; - case '{urn:ietf:params:xml:ns:carddav}addressbook' : - $type[$k] = 'Addressbook'; - break; - case '{urn:ietf:params:xml:ns:caldav}calendar' : - $type[$k] = 'Calendar'; - break; - } - - } - $type = implode(', ', $type); - } - - // If no resourcetype was found, we attempt to use - // the contenttype property - if (!$type && isset($file[200]['{DAV:}getcontenttype'])) { - $type = $file[200]['{DAV:}getcontenttype']; - } - if (!$type) $type = 'Unknown'; - - $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:''; - $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(DateTime::ATOM):''; - - $fullPath = Sabre_DAV_URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/')); - - $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name; - - $name = $this->escapeHTML($name); - $displayName = $this->escapeHTML($displayName); - $type = $this->escapeHTML($type); - - $html.= " - - - - -"; - - } - - $html.= ""; - - if ($this->enablePost && $parent instanceof Sabre_DAV_ICollection) { - $html.= ''; - } - - $html.= "
    NameTypeSizeLast modified

    ..[parent]
    {$displayName}{$type}{$size}{$lastmodified}

    -

    Create new folder

    - - Name:
    - -
    -
    -

    Upload file

    - - Name (optional):
    - File:
    - -
    -
    -
    Generated by SabreDAV " . Sabre_DAV_Version::VERSION ."-". Sabre_DAV_Version::STABILITY . " (c)2007-2011 http://code.google.com/p/sabredav/
    - -"; - - return $html; - - } - -} diff --git a/3rdparty/Sabre/DAV/Client.php b/3rdparty/Sabre/DAV/Client.php deleted file mode 100644 index fc6a6fff083..00000000000 --- a/3rdparty/Sabre/DAV/Client.php +++ /dev/null @@ -1,431 +0,0 @@ -$validSetting = $settings[$validSetting]; - } - } - - $this->propertyMap['{DAV:}resourcetype'] = 'Sabre_DAV_Property_ResourceType'; - - } - - /** - * Does a PROPFIND request - * - * The list of requested properties must be specified as an array, in clark - * notation. - * - * The returned array will contain a list of filenames as keys, and - * properties as values. - * - * The properties array will contain the list of properties. Only properties - * that are actually returned from the server (without error) will be - * returned, anything else is discarded. - * - * Depth should be either 0 or 1. A depth of 1 will cause a request to be - * made to the server to also return all child resources. - * - * @param string $url - * @param array $properties - * @param int $depth - * @return array - */ - public function propFind($url, array $properties, $depth = 0) { - - $body = '' . "\n"; - $body.= '' . "\n"; - $body.= ' ' . "\n"; - - foreach($properties as $property) { - - list( - $namespace, - $elementName - ) = Sabre_DAV_XMLUtil::parseClarkNotation($property); - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - } - - $body.= ' ' . "\n"; - $body.= ''; - - $response = $this->request('PROPFIND', $url, $body, array( - 'Depth' => $depth, - 'Content-Type' => 'application/xml' - )); - - $result = $this->parseMultiStatus($response['body']); - - // If depth was 0, we only return the top item - if ($depth===0) { - reset($result); - $result = current($result); - return $result[200]; - } - - $newResult = array(); - foreach($result as $href => $statusList) { - - $newResult[$href] = $statusList[200]; - - } - - return $newResult; - - } - - /** - * Updates a list of properties on the server - * - * The list of properties must have clark-notation properties for the keys, - * and the actual (string) value for the value. If the value is null, an - * attempt is made to delete the property. - * - * @todo Must be building the request using the DOM, and does not yet - * support complex properties. - * @param string $url - * @param array $properties - * @return void - */ - public function propPatch($url, array $properties) { - - $body = '' . "\n"; - $body.= '' . "\n"; - - foreach($properties as $propName => $propValue) { - - list( - $namespace, - $elementName - ) = Sabre_DAV_XMLUtil::parseClarkNotation($propName); - - if ($propValue === null) { - - $body.="\n"; - - if ($namespace === 'DAV:') { - $body.=' ' . "\n"; - } else { - $body.=" \n"; - } - - $body.="\n"; - - } else { - - $body.="\n"; - if ($namespace === 'DAV:') { - $body.=' '; - } else { - $body.=" "; - } - // Shitty.. i know - $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8'); - if ($namespace === 'DAV:') { - $body.='' . "\n"; - } else { - $body.="\n"; - } - $body.="\n"; - - } - - } - - $body.= ''; - - $response = $this->request('PROPPATCH', $url, $body, array( - 'Content-Type' => 'application/xml' - )); - - } - - /** - * Performs an HTTP options request - * - * This method returns all the features from the 'DAV:' header as an array. - * If there was no DAV header, or no contents this method will return an - * empty array. - * - * @return array - */ - public function options() { - - $result = $this->request('OPTIONS'); - if (!isset($result['headers']['dav'])) { - return array(); - } - - $features = explode(',', $result['headers']['dav']); - foreach($features as &$v) { - $v = trim($v); - } - return $features; - - } - - /** - * Performs an actual HTTP request, and returns the result. - * - * If the specified url is relative, it will be expanded based on the base - * url. - * - * The returned array contains 3 keys: - * * body - the response body - * * httpCode - a HTTP code (200, 404, etc) - * * headers - a list of response http headers. The header names have - * been lowercased. - * - * @param string $method - * @param string $url - * @param string $body - * @param array $headers - * @return array - */ - public function request($method, $url = '', $body = null, $headers = array()) { - - $url = $this->getAbsoluteUrl($url); - - $curlSettings = array( - CURLOPT_RETURNTRANSFER => true, - CURLOPT_CUSTOMREQUEST => $method, - CURLOPT_POSTFIELDS => $body, - // Return headers as part of the response - CURLOPT_HEADER => true - ); - - // Adding HTTP headers - $nHeaders = array(); - foreach($headers as $key=>$value) { - - $nHeaders[] = $key . ': ' . $value; - - } - $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders; - - if ($this->proxy) { - $curlSettings[CURLOPT_PROXY] = $this->proxy; - } - - if ($this->userName) { - $curlSettings[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC | CURLAUTH_DIGEST; - $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; - } - - list( - $response, - $curlInfo, - $curlErrNo, - $curlError - ) = $this->curlRequest($url, $curlSettings); - - $headerBlob = substr($response, 0, $curlInfo['header_size']); - $response = substr($response, $curlInfo['header_size']); - - // In the case of 100 Continue, or redirects we'll have multiple lists - // of headers for each separate HTTP response. We can easily split this - // because they are separated by \r\n\r\n - $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); - - // We only care about the last set of headers - $headerBlob = $headerBlob[count($headerBlob)-1]; - - // Splitting headers - $headerBlob = explode("\r\n", $headerBlob); - - $headers = array(); - foreach($headerBlob as $header) { - $parts = explode(':', $header, 2); - if (count($parts)==2) { - $headers[strtolower(trim($parts[0]))] = trim($parts[1]); - } - } - - $response = array( - 'body' => $response, - 'statusCode' => $curlInfo['http_code'], - 'headers' => $headers - ); - - if ($curlErrNo) { - throw new Sabre_DAV_Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')'); - } - - if ($response['statusCode']>=400) { - throw new Sabre_DAV_Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); - } - - return $response; - - } - - /** - * Wrapper for all curl functions. - * - * The only reason this was split out in a separate method, is so it - * becomes easier to unittest. - * - * @param string $url - * @param array $settings - * @return - */ - protected function curlRequest($url, $settings) { - - $curl = curl_init($url); - curl_setopt_array($curl, $settings); - - return array( - curl_exec($curl), - curl_getinfo($curl), - curl_errno($curl), - curl_error($curl) - ); - - } - - /** - * Returns the full url based on the given url (which may be relative). All - * urls are expanded based on the base url as given by the server. - * - * @param string $url - * @return string - */ - protected function getAbsoluteUrl($url) { - - // If the url starts with http:// or https://, the url is already absolute. - if (preg_match('/^http(s?):\/\//', $url)) { - return $url; - } - - // If the url starts with a slash, we must calculate the url based off - // the root of the base url. - if (strpos($url,'/') === 0) { - $parts = parse_url($this->baseUri); - return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; - } - - // Otherwise... - return $this->baseUri . $url; - - } - - /** - * Parses a WebDAV multistatus response body - * - * This method returns an array with the following structure - * - * array( - * 'url/to/resource' => array( - * '200' => array( - * '{DAV:}property1' => 'value1', - * '{DAV:}property2' => 'value2', - * ), - * '404' => array( - * '{DAV:}property1' => null, - * '{DAV:}property2' => null, - * ), - * ) - * 'url/to/resource2' => array( - * .. etc .. - * ) - * ) - * - * - * @param string $body xml body - * @return array - */ - public function parseMultiStatus($body) { - - $body = Sabre_DAV_XMLUtil::convertDAVNamespace($body); - - $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); - if ($responseXML===false) { - throw new InvalidArgumentException('The passed data is not valid XML'); - } - - $responseXML->registerXPathNamespace('d','DAV:'); - - $propResult = array(); - - foreach($responseXML->xpath('d:response') as $response) { - - $response->registerXPathNamespace('d','DAV:'); - $href = $response->xpath('d:href'); - $href = (string)$href[0]; - - $properties = array(); - - foreach($response->xpath('d:propstat') as $propStat) { - - $propStat->registerXPathNamespace('d','DAV:'); - $status = $propStat->xpath('d:status'); - list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); - - $properties[$statusCode] = Sabre_DAV_XMLUtil::parseProperties(dom_import_simplexml($propStat), $this->propertyMap); - - } - - $propResult[$href] = $properties; - - } - - return $propResult; - - } - -} diff --git a/3rdparty/Sabre/DAV/Collection.php b/3rdparty/Sabre/DAV/Collection.php deleted file mode 100644 index 9da04c12792..00000000000 --- a/3rdparty/Sabre/DAV/Collection.php +++ /dev/null @@ -1,90 +0,0 @@ -getChildren() as $child) { - - if ($child->getName()==$name) return $child; - - } - throw new Sabre_DAV_Exception_FileNotFound('File not found: ' . $name); - - } - - /** - * Checks is a child-node exists. - * - * It is generally a good idea to try and override this. Usually it can be optimized. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - try { - - $this->getChild($name); - return true; - - } catch(Sabre_DAV_Exception_FileNotFound $e) { - - return false; - - } - - } - - /** - * Creates a new file in the directory - * - * @param string $name Name of the file - * @param resource $data Initial payload, passed as a readable stream resource. - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function createFile($name, $data = null) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to create file (filename ' . $name . ')'); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @throws Sabre_DAV_Exception_Forbidden - * @return void - */ - public function createDirectory($name) { - - throw new Sabre_DAV_Exception_Forbidden('Permission denied to create directory'); - - } - - -} - diff --git a/3rdparty/Sabre/DAV/Directory.php b/3rdparty/Sabre/DAV/Directory.php deleted file mode 100644 index 86af4827b3e..00000000000 --- a/3rdparty/Sabre/DAV/Directory.php +++ /dev/null @@ -1,17 +0,0 @@ -lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock'); - $errorNode->appendChild($error); - if (!is_object($this->lock)) var_dump($this->lock); - $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/FileNotFound.php b/3rdparty/Sabre/DAV/Exception/FileNotFound.php deleted file mode 100644 index b20e4a2fb3f..00000000000 --- a/3rdparty/Sabre/DAV/Exception/FileNotFound.php +++ /dev/null @@ -1,28 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:valid-resourcetype'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php deleted file mode 100644 index 47032cffc75..00000000000 --- a/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php +++ /dev/null @@ -1,39 +0,0 @@ -message = 'The locktoken supplied does not match any locks on this entity'; - - } - - /** - * This method allows the exception to include additonal information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/Locked.php b/3rdparty/Sabre/DAV/Exception/Locked.php deleted file mode 100644 index b4bb2e0378c..00000000000 --- a/3rdparty/Sabre/DAV/Exception/Locked.php +++ /dev/null @@ -1,67 +0,0 @@ -lock = $lock; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 423; - - } - - /** - * This method allows the exception to include additonal information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - if ($this->lock) { - $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted'); - $errorNode->appendChild($error); - if (!is_object($this->lock)) var_dump($this->lock); - $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php b/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php deleted file mode 100644 index 02c145ffeb6..00000000000 --- a/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php +++ /dev/null @@ -1,44 +0,0 @@ -getAllowedMethods($server->getRequestUri()); - - return array( - 'Allow' => strtoupper(implode(', ',$methods)), - ); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php b/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php deleted file mode 100644 index 1faffddfa00..00000000000 --- a/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php +++ /dev/null @@ -1,28 +0,0 @@ -header = $header; - - } - - /** - * Returns the HTTP statuscode for this exception - * - * @return int - */ - public function getHTTPCode() { - - return 412; - - } - - /** - * This method allows the exception to include additonal information into the WebDAV error response - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - if ($this->header) { - $prop = $errorNode->ownerDocument->createElement('s:header'); - $prop->nodeValue = $this->header; - $errorNode->appendChild($prop); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php b/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php deleted file mode 100644 index e4ed601b16c..00000000000 --- a/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php +++ /dev/null @@ -1,30 +0,0 @@ -ownerDocument->createElementNS('DAV:','d:supported-report'); - $errorNode->appendChild($error); - - } - -} diff --git a/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php deleted file mode 100644 index 37abbd729d1..00000000000 --- a/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php +++ /dev/null @@ -1,29 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * @param string $name - * @throws Sabre_DAV_Exception_FileNotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new Sabre_DAV_Exception_FileNotFound('File with name ' . $path . ' could not be located'); - - if (is_dir($path)) { - - return new Sabre_DAV_FS_Directory($path); - - } else { - - return new Sabre_DAV_FS_File($path); - - } - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return void - */ - public function delete() { - - foreach($this->getChildren() as $child) $child->delete(); - rmdir($this->path); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FS/File.php b/3rdparty/Sabre/DAV/FS/File.php deleted file mode 100644 index 262187d7e8a..00000000000 --- a/3rdparty/Sabre/DAV/FS/File.php +++ /dev/null @@ -1,89 +0,0 @@ -path,$data); - - } - - /** - * Returns the data - * - * @return string - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return void - */ - public function delete() { - - unlink($this->path); - - } - - /** - * Returns the size of the node, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbritrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - * - * @return mixed - */ - public function getETag() { - - return null; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - * - * @return mixed - */ - public function getContentType() { - - return null; - - } - -} - diff --git a/3rdparty/Sabre/DAV/FS/Node.php b/3rdparty/Sabre/DAV/FS/Node.php deleted file mode 100644 index b8d7bcfe846..00000000000 --- a/3rdparty/Sabre/DAV/FS/Node.php +++ /dev/null @@ -1,81 +0,0 @@ -path = $path; - - } - - - - /** - * Returns the name of the node - * - * @return string - */ - public function getName() { - - list(, $name) = Sabre_DAV_URLUtil::splitPath($this->path); - return $name; - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path); - list(, $newName) = Sabre_DAV_URLUtil::splitPath($name); - - $newPath = $parentPath . '/' . $newName; - rename($this->path,$newPath); - - $this->path = $newPath; - - } - - - - /** - * Returns the last modification time, as a unix timestamp - * - * @return int - */ - public function getLastModified() { - - return filemtime($this->path); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/Directory.php b/3rdparty/Sabre/DAV/FSExt/Directory.php deleted file mode 100644 index c43d4385ac7..00000000000 --- a/3rdparty/Sabre/DAV/FSExt/Directory.php +++ /dev/null @@ -1,135 +0,0 @@ -path . '/' . $name; - file_put_contents($newPath,$data); - - } - - /** - * Creates a new subdirectory - * - * @param string $name - * @return void - */ - public function createDirectory($name) { - - // We're not allowing dots - if ($name=='.' || $name=='..') throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - $newPath = $this->path . '/' . $name; - mkdir($newPath); - - } - - /** - * Returns a specific child node, referenced by its name - * - * @param string $name - * @throws Sabre_DAV_Exception_FileNotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - $path = $this->path . '/' . $name; - - if (!file_exists($path)) throw new Sabre_DAV_Exception_FileNotFound('File could not be located'); - if ($name=='.' || $name=='..') throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - - if (is_dir($path)) { - - return new Sabre_DAV_FSExt_Directory($path); - - } else { - - return new Sabre_DAV_FSExt_File($path); - - } - - } - - /** - * Checks if a child exists. - * - * @param string $name - * @return bool - */ - public function childExists($name) { - - if ($name=='.' || $name=='..') - throw new Sabre_DAV_Exception_Forbidden('Permission denied to . and ..'); - - $path = $this->path . '/' . $name; - return file_exists($path); - - } - - /** - * Returns an array with all the child nodes - * - * @return Sabre_DAV_INode[] - */ - public function getChildren() { - - $nodes = array(); - foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node); - return $nodes; - - } - - /** - * Deletes all files in this directory, and then itself - * - * @return void - */ - public function delete() { - - // Deleting all children - foreach($this->getChildren() as $child) $child->delete(); - - // Removing resource info, if its still around - if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav'); - - // Removing the directory itself - rmdir($this->path); - - return parent::delete(); - - } - - /** - * Returns available diskspace information - * - * @return array - */ - public function getQuotaInfo() { - - return array( - disk_total_space($this->path)-disk_free_space($this->path), - disk_free_space($this->path) - ); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/File.php b/3rdparty/Sabre/DAV/FSExt/File.php deleted file mode 100644 index 7a8e7a11f21..00000000000 --- a/3rdparty/Sabre/DAV/FSExt/File.php +++ /dev/null @@ -1,88 +0,0 @@ -path,$data); - - } - - /** - * Returns the data - * - * @return string - */ - public function get() { - - return fopen($this->path,'r'); - - } - - /** - * Delete the current file - * - * @return void - */ - public function delete() { - - unlink($this->path); - return parent::delete(); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbritrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - */ - public function getETag() { - - return '"' . md5_file($this->path). '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - */ - public function getContentType() { - - return null; - - } - - /** - * Returns the size of the file, in bytes - * - * @return int - */ - public function getSize() { - - return filesize($this->path); - - } - -} - diff --git a/3rdparty/Sabre/DAV/FSExt/Node.php b/3rdparty/Sabre/DAV/FSExt/Node.php deleted file mode 100644 index 9e36222bfd3..00000000000 --- a/3rdparty/Sabre/DAV/FSExt/Node.php +++ /dev/null @@ -1,276 +0,0 @@ -getResourceData(); - $locks = $resourceData['locks']; - foreach($locks as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($locks[$k]); - } - return $locks; - - } - - /** - * Locks this node - * - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return void - */ - function lock(Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - - $resourceData = $this->getResourceData(); - if (!isset($resourceData['locks'])) $resourceData['locks'] = array(); - $current = null; - foreach($resourceData['locks'] as $k=>$lock) { - if ($lock->token === $lockInfo->token) $current = $k; - } - if (!is_null($current)) $resourceData['locks'][$current] = $lockInfo; - else $resourceData['locks'][] = $lockInfo; - - $this->putResourceData($resourceData); - - } - - /** - * Removes a lock from this node - * - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - function unlock(Sabre_DAV_Locks_LockInfo $lockInfo) { - - //throw new Sabre_DAV_Exception('bla'); - $resourceData = $this->getResourceData(); - foreach($resourceData['locks'] as $k=>$lock) { - - if ($lock->token === $lockInfo->token) { - - unset($resourceData['locks'][$k]); - $this->putResourceData($resourceData); - return true; - - } - } - return false; - - } - - /** - * Updates properties on this node, - * - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateProperties($properties) { - - $resourceData = $this->getResourceData(); - - $result = array(); - - foreach($properties as $propertyName=>$propertyValue) { - - // If it was null, we need to delete the property - if (is_null($propertyValue)) { - if (isset($resourceData['properties'][$propertyName])) { - unset($resourceData['properties'][$propertyName]); - } - } else { - $resourceData['properties'][$propertyName] = $propertyValue; - } - - } - - $this->putResourceData($resourceData); - return true; - } - - /** - * Returns a list of properties for this nodes.; - * - * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author - * If the array is empty, all properties should be returned - * - * @param array $properties - * @return void - */ - function getProperties($properties) { - - $resourceData = $this->getResourceData(); - - // if the array was empty, we need to return everything - if (!$properties) return $resourceData['properties']; - - $props = array(); - foreach($properties as $property) { - if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property]; - } - - return $props; - - } - - /** - * Returns the path to the resource file - * - * @return string - */ - protected function getResourceInfoPath() { - - list($parentDir) = Sabre_DAV_URLUtil::splitPath($this->path); - return $parentDir . '/.sabredav'; - - } - - /** - * Returns all the stored resource information - * - * @return array - */ - protected function getResourceData() { - - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return array('locks'=>array(), 'properties' => array()); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!isset($data[$this->getName()])) { - return array('locks'=>array(), 'properties' => array()); - } - - $data = $data[$this->getName()]; - if (!isset($data['locks'])) $data['locks'] = array(); - if (!isset($data['properties'])) $data['properties'] = array(); - return $data; - - } - - /** - * Updates the resource information - * - * @param array $newData - * @return void - */ - protected function putResourceData(array $newData) { - - $path = $this->getResourceInfoPath(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - $data[$this->getName()] = $newData; - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($data)); - fclose($handle); - - } - - /** - * Renames the node - * - * @param string $name The new name - * @return void - */ - public function setName($name) { - - list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path); - list(, $newName) = Sabre_DAV_URLUtil::splitPath($name); - $newPath = $parentPath . '/' . $newName; - - // We're deleting the existing resourcedata, and recreating it - // for the new path. - $resourceData = $this->getResourceData(); - $this->deleteResourceData(); - - rename($this->path,$newPath); - $this->path = $newPath; - $this->putResourceData($resourceData); - - - } - - public function deleteResourceData() { - - // When we're deleting this node, we also need to delete any resource information - $path = $this->getResourceInfoPath(); - if (!file_exists($path)) return true; - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - $data = ''; - - rewind($handle); - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (isset($data[$this->getName()])) unset($data[$this->getName()]); - ftruncate($handle,0); - rewind($handle); - fwrite($handle,serialize($data)); - fclose($handle); - - } - - public function delete() { - - return $this->deleteResourceData(); - - } - -} - diff --git a/3rdparty/Sabre/DAV/File.php b/3rdparty/Sabre/DAV/File.php deleted file mode 100644 index b74bd9525b3..00000000000 --- a/3rdparty/Sabre/DAV/File.php +++ /dev/null @@ -1,81 +0,0 @@ - array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param array $mutations - * @return bool|array - */ - function updateProperties($mutations); - - /** - * Returns a list of properties for this nodes. - * - * The properties list is a list of propertynames the client requested, - * encoded in clark-notation {xmlnamespace}tagname - * - * If the array is empty, it means 'all properties' were requested. - * - * @param array $properties - * @return void - */ - function getProperties($properties); - -} - diff --git a/3rdparty/Sabre/DAV/IQuota.php b/3rdparty/Sabre/DAV/IQuota.php deleted file mode 100644 index 8ff1a4597f8..00000000000 --- a/3rdparty/Sabre/DAV/IQuota.php +++ /dev/null @@ -1,27 +0,0 @@ -dataDir = $dataDir; - - } - - protected function getFileNameForUri($uri) { - - return $this->dataDir . '/sabredav_' . md5($uri) . '.locks'; - - } - - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $lockList = array(); - $currentPath = ''; - - foreach(explode('/',$uri) as $uriPart) { - - // weird algorithm that can probably be improved, but we're traversing the path top down - if ($currentPath) $currentPath.='/'; - $currentPath.=$uriPart; - - $uriLocks = $this->getData($currentPath); - - foreach($uriLocks as $uriLock) { - - // Unless we're on the leaf of the uri-tree we should ingore locks with depth 0 - if($uri==$currentPath || $uriLock->depth!=0) { - $uriLock->uri = $currentPath; - $lockList[] = $uriLock; - } - - } - - } - - // Checking if we can remove any of these locks - foreach($lockList as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($lockList[$k]); - } - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - if ($lock->token == $lockInfo->token) unset($locks[$k]); - } - $locks[] = $lockInfo; - $this->putData($uri,$locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($uri,$locks); - return true; - - } - } - return false; - - } - - /** - * Returns the stored data for a uri - * - * @param string $uri - * @return array - */ - protected function getData($uri) { - - $path = $this->getFilenameForUri($uri); - if (!file_exists($path)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'r'); - flock($handle,LOCK_SH); - $data = ''; - - // Reading data until the eof - while(!feof($handle)) { - $data.=fread($handle,8192); - } - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Updates the lock information - * - * @param string $uri - * @param array $newData - * @return void - */ - protected function putData($uri,array $newData) { - - $path = $this->getFileNameForUri($uri); - - // opening up the file, and creating a shared lock - $handle = fopen($path,'a+'); - flock($handle,LOCK_EX); - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/Backend/File.php b/3rdparty/Sabre/DAV/Locks/Backend/File.php deleted file mode 100644 index f65b20c4306..00000000000 --- a/3rdparty/Sabre/DAV/Locks/Backend/File.php +++ /dev/null @@ -1,175 +0,0 @@ -locksFile = $locksFile; - - } - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - $newLocks = array(); - $currentPath = ''; - - $locks = $this->getData(); - foreach($locks as $lock) { - - if ($lock->uri === $uri || - //deep locks on parents - ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) || - - // locks on children - ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) { - - $newLocks[] = $lock; - - } - - } - - // Checking if we can remove any of these locks - foreach($newLocks as $k=>$lock) { - if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]); - } - return $newLocks; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 1800; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - if ($lock->token == $lockInfo->token) unset($locks[$k]); - } - $locks[] = $lockInfo; - $this->putData($locks); - return true; - - } - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - $locks = $this->getLocks($uri,false); - foreach($locks as $k=>$lock) { - - if ($lock->token == $lockInfo->token) { - - unset($locks[$k]); - $this->putData($locks); - return true; - - } - } - return false; - - } - - /** - * Loads the lockdata from the filesystem. - * - * @return array - */ - protected function getData() { - - if (!file_exists($this->locksFile)) return array(); - - // opening up the file, and creating a shared lock - $handle = fopen($this->locksFile,'r'); - flock($handle,LOCK_SH); - - // Reading data until the eof - $data = stream_get_contents($handle); - - // We're all good - fclose($handle); - - // Unserializing and checking if the resource file contains data for this file - $data = unserialize($data); - if (!$data) return array(); - return $data; - - } - - /** - * Saves the lockdata - * - * @param array $newData - * @return void - */ - protected function putData(array $newData) { - - // opening up the file, and creating an exclusive lock - $handle = fopen($this->locksFile,'a+'); - flock($handle,LOCK_EX); - - // We can only truncate and rewind once the lock is acquired. - ftruncate($handle,0); - rewind($handle); - - fwrite($handle,serialize($newData)); - fclose($handle); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php b/3rdparty/Sabre/DAV/Locks/Backend/PDO.php deleted file mode 100644 index c3923af19d3..00000000000 --- a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php +++ /dev/null @@ -1,165 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - - } - - /** - * Returns a list of Sabre_DAV_Locks_LockInfo objects - * - * This method should return all the locks for a particular uri, including - * locks that might be set on a parent uri. - * - * If returnChildLocks is set to true, this method should also look for - * any locks in the subtree of the uri for locks. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks) { - - // NOTE: the following 10 lines or so could be easily replaced by - // pure sql. MySQL's non-standard string concatination prevents us - // from doing this though. - $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM `'.$this->tableName.'` WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)'; - $params = array(time(),$uri); - - // We need to check locks for every part in the uri. - $uriParts = explode('/',$uri); - - // We already covered the last part of the uri - array_pop($uriParts); - - $currentPath=''; - - foreach($uriParts as $part) { - - if ($currentPath) $currentPath.='/'; - $currentPath.=$part; - - $query.=' OR (depth!=0 AND uri = ?)'; - $params[] = $currentPath; - - } - - if ($returnChildLocks) { - - $query.=' OR (uri LIKE ?)'; - $params[] = $uri . '/%'; - - } - $query.=')'; - - $stmt = $this->pdo->prepare($query); - $stmt->execute($params); - $result = $stmt->fetchAll(); - - $lockList = array(); - foreach($result as $row) { - - $lockInfo = new Sabre_DAV_Locks_LockInfo(); - $lockInfo->owner = $row['owner']; - $lockInfo->token = $row['token']; - $lockInfo->timeout = $row['timeout']; - $lockInfo->created = $row['created']; - $lockInfo->scope = $row['scope']; - $lockInfo->depth = $row['depth']; - $lockInfo->uri = $row['uri']; - $lockList[] = $lockInfo; - - } - - return $lockList; - - } - - /** - * Locks a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - // We're making the lock timeout 30 minutes - $lockInfo->timeout = 30*60; - $lockInfo->created = time(); - $lockInfo->uri = $uri; - - $locks = $this->getLocks($uri,false); - $exists = false; - foreach($locks as $k=>$lock) { - if ($lock->token == $lockInfo->token) $exists = true; - } - - if ($exists) { - $stmt = $this->pdo->prepare('UPDATE `'.$this->tableName.'` SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } else { - $stmt = $this->pdo->prepare('INSERT INTO `'.$this->tableName.'` (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)'); - $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); - } - - return true; - - } - - - - /** - * Removes a lock from a uri - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return bool - */ - public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->tableName.'` WHERE uri = ? AND token = ?'); - $stmt->execute(array($uri,$lockInfo->token)); - - return $stmt->rowCount()===1; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Locks/LockInfo.php b/3rdparty/Sabre/DAV/Locks/LockInfo.php deleted file mode 100644 index 6a064466f40..00000000000 --- a/3rdparty/Sabre/DAV/Locks/LockInfo.php +++ /dev/null @@ -1,81 +0,0 @@ -addPlugin($lockPlugin); - * - * @package Sabre - * @subpackage DAV - * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin { - - /** - * locksBackend - * - * @var Sabre_DAV_Locks_Backend_Abstract - */ - private $locksBackend; - - /** - * server - * - * @var Sabre_DAV_Server - */ - private $server; - - /** - * __construct - * - * @param Sabre_DAV_Locks_Backend_Abstract $locksBackend - * @return void - */ - public function __construct(Sabre_DAV_Locks_Backend_Abstract $locksBackend = null) { - - $this->locksBackend = $locksBackend; - - } - - /** - * Initializes the plugin - * - * This method is automatically called by the Server class after addPlugin. - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50); - $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties')); - - } - - /** - * Returns a plugin name. - * - * Using this name other plugins will be able to access other plugins - * using Sabre_DAV_Server::getPlugin - * - * @return string - */ - public function getPluginName() { - - return 'locks'; - - } - - /** - * This method is called by the Server if the user used an HTTP method - * the server didn't recognize. - * - * This plugin intercepts the LOCK and UNLOCK methods. - * - * @param string $method - * @return bool - */ - public function unknownMethod($method, $uri) { - - switch($method) { - - case 'LOCK' : $this->httpLock($uri); return false; - case 'UNLOCK' : $this->httpUnlock($uri); return false; - - } - - } - - /** - * This method is called after most properties have been found - * it allows us to add in any Lock-related properties - * - * @param string $path - * @param array $properties - * @return bool - */ - public function afterGetProperties($path,&$newProperties) { - - foreach($newProperties[404] as $propName=>$discard) { - - $node = null; - - switch($propName) { - - case '{DAV:}supportedlock' : - $val = false; - if ($this->locksBackend) $val = true; - else { - if (!$node) $node = $this->server->tree->getNodeForPath($path); - if ($node instanceof Sabre_DAV_ILockable) $val = true; - } - $newProperties[200][$propName] = new Sabre_DAV_Property_SupportedLock($val); - unset($newProperties[404][$propName]); - break; - - case '{DAV:}lockdiscovery' : - $newProperties[200][$propName] = new Sabre_DAV_Property_LockDiscovery($this->getLocks($path)); - unset($newProperties[404][$propName]); - break; - - } - - - } - return true; - - } - - - /** - * This method is called before the logic for any HTTP method is - * handled. - * - * This plugin uses that feature to intercept access to locked resources. - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - switch($method) { - - case 'DELETE' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'MKCOL' : - case 'PROPPATCH' : - case 'PUT' : - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'MOVE' : - $lastLock = null; - if (!$this->validateLock(array( - $uri, - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - ),$lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - case 'COPY' : - $lastLock = null; - if (!$this->validateLock( - $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), - $lastLock, true)) - throw new Sabre_DAV_Exception_Locked($lastLock); - break; - } - - return true; - - } - - /** - * Use this method to tell the server this plugin defines additional - * HTTP methods. - * - * This method is passed a uri. It should only return HTTP methods that are - * available for the specified uri. - * - * @param string $uri - * @return array - */ - public function getHTTPMethods($uri) { - - if ($this->locksBackend || - $this->server->tree->getNodeForPath($uri) instanceof Sabre_DAV_ILocks) { - return array('LOCK','UNLOCK'); - } - return array(); - - } - - /** - * Returns a list of features for the HTTP OPTIONS Dav: header. - * - * In this case this is only the number 2. The 2 in the Dav: header - * indicates the server supports locks. - * - * @return array - */ - public function getFeatures() { - - return array(2); - - } - - /** - * Returns all lock information on a particular uri - * - * This function should return an array with Sabre_DAV_Locks_LockInfo objects. If there are no locks on a file, return an empty array. - * - * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree - * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object - * for any possible locks and return those as well. - * - * @param string $uri - * @param bool $returnChildLocks - * @return array - */ - public function getLocks($uri, $returnChildLocks = false) { - - $lockList = array(); - $currentPath = ''; - foreach(explode('/',$uri) as $uriPart) { - - $uriLocks = array(); - if ($currentPath) $currentPath.='/'; - $currentPath.=$uriPart; - - try { - - $node = $this->server->tree->getNodeForPath($currentPath); - if ($node instanceof Sabre_DAV_ILockable) $uriLocks = $node->getLocks(); - - } catch (Sabre_DAV_Exception_FileNotFound $e){ - // In case the node didn't exist, this could be a lock-null request - } - - foreach($uriLocks as $uriLock) { - - // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0 - if($uri==$currentPath || $uriLock->depth!=0) { - $uriLock->uri = $currentPath; - $lockList[] = $uriLock; - } - - } - - } - if ($this->locksBackend) - $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks)); - - return $lockList; - - } - - /** - * Locks an uri - * - * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock - * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type - * of lock (shared or exclusive) and the owner of the lock - * - * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock - * - * Additionally, a lock can be requested for a non-existant file. In these case we're obligated to create an empty file as per RFC4918:S7.3 - * - * @param string $uri - * @return void - */ - protected function httpLock($uri) { - - $lastLock = null; - if (!$this->validateLock($uri,$lastLock)) { - - // If the existing lock was an exclusive lock, we need to fail - if (!$lastLock || $lastLock->scope == Sabre_DAV_Locks_LockInfo::EXCLUSIVE) { - //var_dump($lastLock); - throw new Sabre_DAV_Exception_ConflictingLock($lastLock); - } - - } - - if ($body = $this->server->httpRequest->getBody(true)) { - // This is a new lock request - $lockInfo = $this->parseLockRequest($body); - $lockInfo->depth = $this->server->getHTTPDepth(); - $lockInfo->uri = $uri; - if($lastLock && $lockInfo->scope != Sabre_DAV_Locks_LockInfo::SHARED) throw new Sabre_DAV_Exception_ConflictingLock($lastLock); - - } elseif ($lastLock) { - - // This must have been a lock refresh - $lockInfo = $lastLock; - - // The resource could have been locked through another uri. - if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri; - - } else { - - // There was neither a lock refresh nor a new lock request - throw new Sabre_DAV_Exception_BadRequest('An xml body is required for lock requests'); - - } - - if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout; - - $newFile = false; - - // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first - try { - $node = $this->server->tree->getNodeForPath($uri); - - // We need to call the beforeWriteContent event for RFC3744 - $this->server->broadcastEvent('beforeWriteContent',array($uri)); - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - // It didn't, lets create it - $this->server->createFile($uri,fopen('php://memory','r')); - $newFile = true; - - } - - $this->lockNode($uri,$lockInfo); - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->setHeader('Lock-Token','token . '>'); - $this->server->httpResponse->sendStatus($newFile?201:200); - $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo)); - - } - - /** - * Unlocks a uri - * - * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header - * The server should return 204 (No content) on success - * - * @param string $uri - * @return void - */ - protected function httpUnlock($uri) { - - $lockToken = $this->server->httpRequest->getHeader('Lock-Token'); - - // If the locktoken header is not supplied, we need to throw a bad request exception - if (!$lockToken) throw new Sabre_DAV_Exception_BadRequest('No lock token was supplied'); - - $locks = $this->getLocks($uri); - - // Windows sometimes forgets to include < and > in the Lock-Token - // header - if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>'; - - foreach($locks as $lock) { - - if ('token . '>' == $lockToken) { - - $this->server->broadcastEvent('beforeUnlock',array($uri, $lock)); - $this->unlockNode($uri,$lock); - $this->server->httpResponse->setHeader('Content-Length','0'); - $this->server->httpResponse->sendStatus(204); - return; - - } - - } - - // If we got here, it means the locktoken was invalid - throw new Sabre_DAV_Exception_LockTokenMatchesRequestUri(); - - } - - /** - * Locks a uri - * - * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored - * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return void - */ - public function lockNode($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return; - - try { - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_DAV_ILockable) return $node->lock($lockInfo); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - // In case the node didn't exist, this could be a lock-null request - } - if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo); - throw new Sabre_DAV_Exception_MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.'); - - } - - /** - * Unlocks a uri - * - * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return void - */ - public function unlockNode($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - - if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return; - try { - $node = $this->server->tree->getNodeForPath($uri); - if ($node instanceof Sabre_DAV_ILockable) return $node->unlock($lockInfo); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - // In case the node didn't exist, this could be a lock-null request - } - - if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo); - - } - - - /** - * Returns the contents of the HTTP Timeout header. - * - * The method formats the header into an integer. - * - * @return int - */ - public function getTimeoutHeader() { - - $header = $this->server->httpRequest->getHeader('Timeout'); - - if ($header) { - - if (stripos($header,'second-')===0) $header = (int)(substr($header,7)); - else if (strtolower($header)=='infinite') $header=Sabre_DAV_Locks_LockInfo::TIMEOUT_INFINITE; - else throw new Sabre_DAV_Exception_BadRequest('Invalid HTTP timeout header'); - - } else { - - $header = 0; - - } - - return $header; - - } - - /** - * Generates the response for successfull LOCK requests - * - * @param Sabre_DAV_Locks_LockInfo $lockInfo - * @return string - */ - protected function generateLockResponse(Sabre_DAV_Locks_LockInfo $lockInfo) { - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - - $prop = $dom->createElementNS('DAV:','d:prop'); - $dom->appendChild($prop); - - $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery'); - $prop->appendChild($lockDiscovery); - - $lockObj = new Sabre_DAV_Property_LockDiscovery(array($lockInfo),true); - $lockObj->serialize($this->server,$lockDiscovery); - - return $dom->saveXML(); - - } - - /** - * validateLock should be called when a write operation is about to happen - * It will check if the requested url is locked, and see if the correct lock tokens are passed - * - * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri - * @param mixed $lastLock This variable will be populated with the last checked lock object (Sabre_DAV_Locks_LockInfo) - * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees. - * @return bool - */ - protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) { - - if (is_null($urls)) { - $urls = array($this->server->getRequestUri()); - } elseif (is_string($urls)) { - $urls = array($urls); - } elseif (!is_array($urls)) { - throw new Sabre_DAV_Exception('The urls parameter should either be null, a string or an array'); - } - - $conditions = $this->getIfConditions(); - - // We're going to loop through the urls and make sure all lock conditions are satisfied - foreach($urls as $url) { - - $locks = $this->getLocks($url, $checkChildLocks); - - // If there were no conditions, but there were locks, we fail - if (!$conditions && $locks) { - reset($locks); - $lastLock = current($locks); - return false; - } - - // If there were no locks or conditions, we go to the next url - if (!$locks && !$conditions) continue; - - foreach($conditions as $condition) { - - if (!$condition['uri']) { - $conditionUri = $this->server->getRequestUri(); - } else { - $conditionUri = $this->server->calculateUri($condition['uri']); - } - - // If the condition has a url, and it isn't part of the affected url at all, check the next condition - if ($conditionUri && strpos($url,$conditionUri)!==0) continue; - - // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken - // At least 1 condition has to be satisfied - foreach($condition['tokens'] as $conditionToken) { - - $etagValid = true; - $lockValid = true; - - // key 2 can contain an etag - if ($conditionToken[2]) { - - $uri = $conditionUri?$conditionUri:$this->server->getRequestUri(); - $node = $this->server->tree->getNodeForPath($uri); - $etagValid = $node->getETag()==$conditionToken[2]; - - } - - // key 1 can contain a lock token - if ($conditionToken[1]) { - - $lockValid = false; - // Match all the locks - foreach($locks as $lockIndex=>$lock) { - - $lockToken = 'opaquelocktoken:' . $lock->token; - - // Checking NOT - if (!$conditionToken[0] && $lockToken != $conditionToken[1]) { - - // Condition valid, onto the next - $lockValid = true; - break; - } - if ($conditionToken[0] && $lockToken == $conditionToken[1]) { - - $lastLock = $lock; - // Condition valid and lock matched - unset($locks[$lockIndex]); - $lockValid = true; - break; - - } - - } - - } - - // If, after checking both etags and locks they are stil valid, - // we can continue with the next condition. - if ($etagValid && $lockValid) continue 2; - } - // No conditions matched, so we fail - throw new Sabre_DAV_Exception_PreconditionFailed('The tokens provided in the if header did not match','If'); - } - - // Conditions were met, we'll also need to check if all the locks are gone - if (count($locks)) { - - reset($locks); - - // There's still locks, we fail - $lastLock = current($locks); - return false; - - } - - - } - - // We got here, this means every condition was satisfied - return true; - - } - - /** - * This method is created to extract information from the WebDAV HTTP 'If:' header - * - * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information - * The function will return an array, containg structs with the following keys - * - * * uri - the uri the condition applies to. If this is returned as an - * empty string, this implies it's referring to the request url. - * * tokens - The lock token. another 2 dimensional array containg 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token) - * * etag - an etag, if supplied - * - * @return void - */ - public function getIfConditions() { - - $header = $this->server->httpRequest->getHeader('If'); - if (!$header) return array(); - - $matches = array(); - - $regex = '/(?:\<(?P.*?)\>\s)?\((?PNot\s)?(?:\<(?P[^\>]*)\>)?(?:\s?)(?:\[(?P[^\]]*)\])?\)/im'; - preg_match_all($regex,$header,$matches,PREG_SET_ORDER); - - $conditions = array(); - - foreach($matches as $match) { - - $condition = array( - 'uri' => $match['uri'], - 'tokens' => array( - array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'') - ), - ); - - if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array( - $match['not']?0:1, - $match['token'], - isset($match['etag'])?$match['etag']:'' - ); - else { - $conditions[] = $condition; - } - - } - - return $conditions; - - } - - /** - * Parses a webdav lock xml body, and returns a new Sabre_DAV_Locks_LockInfo object - * - * @param string $body - * @return Sabre_DAV_Locks_LockInfo - */ - protected function parseLockRequest($body) { - - $xml = simplexml_load_string($body,null,LIBXML_NOWARNING); - $xml->registerXPathNamespace('d','DAV:'); - $lockInfo = new Sabre_DAV_Locks_LockInfo(); - - $children = $xml->children("DAV:"); - $lockInfo->owner = (string)$children->owner; - - $lockInfo->token = Sabre_DAV_UUIDUtil::getUUID(); - $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0?Sabre_DAV_Locks_LockInfo::EXCLUSIVE:Sabre_DAV_Locks_LockInfo::SHARED; - - return $lockInfo; - - } - - -} diff --git a/3rdparty/Sabre/DAV/Mount/Plugin.php b/3rdparty/Sabre/DAV/Mount/Plugin.php deleted file mode 100644 index f93a1aa25a1..00000000000 --- a/3rdparty/Sabre/DAV/Mount/Plugin.php +++ /dev/null @@ -1,79 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?mount - * - * @param string $method - * @return void - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='mount') return; - - $currentUri = $this->server->httpRequest->getAbsoluteUri(); - - // Stripping off everything after the ? - list($currentUri) = explode('?',$currentUri); - - $this->davMount($currentUri); - - // Returning false to break the event chain - return false; - - } - - /** - * Generates the davmount response - * - * @param string $uri absolute uri - * @return void - */ - public function davMount($uri) { - - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml'); - ob_start(); - echo '', "\n"; - echo "\n"; - echo " ", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "\n"; - echo ""; - $this->server->httpResponse->sendBody(ob_get_clean()); - - } - - -} diff --git a/3rdparty/Sabre/DAV/Node.php b/3rdparty/Sabre/DAV/Node.php deleted file mode 100644 index 0510df5fdf2..00000000000 --- a/3rdparty/Sabre/DAV/Node.php +++ /dev/null @@ -1,55 +0,0 @@ -rootNode = $rootNode; - - } - - /** - * Returns the INode object for the requested path - * - * @param string $path - * @return Sabre_DAV_INode - */ - public function getNodeForPath($path) { - - $path = trim($path,'/'); - if (isset($this->cache[$path])) return $this->cache[$path]; - - //if (!$path || $path=='.') return $this->rootNode; - $currentNode = $this->rootNode; - $i=0; - // We're splitting up the path variable into folder/subfolder components and traverse to the correct node.. - foreach(explode('/',$path) as $pathPart) { - - // If this part of the path is just a dot, it actually means we can skip it - if ($pathPart=='.' || $pathPart=='') continue; - - if (!($currentNode instanceof Sabre_DAV_ICollection)) - throw new Sabre_DAV_Exception_FileNotFound('Could not find node at path: ' . $path); - - $currentNode = $currentNode->getChild($pathPart); - - } - - $this->cache[$path] = $currentNode; - return $currentNode; - - } - - /** - * This function allows you to check if a node exists. - * - * @param string $path - * @return bool - */ - public function nodeExists($path) { - - try { - - // The root always exists - if ($path==='') return true; - - list($parent, $base) = Sabre_DAV_URLUtil::splitPath($path); - - $parentNode = $this->getNodeForPath($parent); - if (!$parentNode instanceof Sabre_DAV_ICollection) return false; - return $parentNode->childExists($base); - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - return false; - - } - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - $children = $node->getChildren(); - foreach($children as $child) { - - $this->cache[trim($path,'/') . '/' . $child->getName()] = $child; - - } - return $children; - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - // We don't care enough about sub-paths - // flushing the entire cache - $path = trim($path,'/'); - foreach($this->cache as $nodePath=>$node) { - if ($nodePath == $path || strpos($nodePath,$path.'/')===0) - unset($this->cache[$nodePath]); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property.php b/3rdparty/Sabre/DAV/Property.php deleted file mode 100644 index 577535b0127..00000000000 --- a/3rdparty/Sabre/DAV/Property.php +++ /dev/null @@ -1,25 +0,0 @@ -time = $time; - } elseif (is_int($time) || ctype_digit($time)) { - $this->time = new DateTime('@' . $time); - } else { - $this->time = new DateTime($time); - } - - // Setting timezone to UTC - $this->time->setTimezone(new DateTimeZone('UTC')); - - } - - /** - * serialize - * - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $prop) { - - $doc = $prop->ownerDocument; - $prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/'); - $prop->setAttribute('b:dt','dateTime.rfc1123'); - $prop->nodeValue = $this->time->format(DateTime::RFC1123); - - } - - /** - * getTime - * - * @return DateTime - */ - public function getTime() { - - return $this->time; - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/Href.php b/3rdparty/Sabre/DAV/Property/Href.php deleted file mode 100644 index 3294ff2ac68..00000000000 --- a/3rdparty/Sabre/DAV/Property/Href.php +++ /dev/null @@ -1,91 +0,0 @@ -href = $href; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uri - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - $elem->nodeValue = ($this->autoPrefix?$server->getBaseUri():'') . $this->href; - $dom->appendChild($elem); - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. For non-compatible elements null will be returned. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_Href - */ - static function unserialize(DOMElement $dom) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { - return new self($dom->firstChild->textContent,false); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/HrefList.php b/3rdparty/Sabre/DAV/Property/HrefList.php deleted file mode 100644 index 76a5512901c..00000000000 --- a/3rdparty/Sabre/DAV/Property/HrefList.php +++ /dev/null @@ -1,96 +0,0 @@ -hrefs = $hrefs; - $this->autoPrefix = $autoPrefix; - - } - - /** - * Returns the uris - * - * @return array - */ - public function getHrefs() { - - return $this->hrefs; - - } - - /** - * Serializes this property. - * - * It will additionally prepend the href property with the server's base uri. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - $prefix = $server->xmlNamespaces['DAV:']; - - foreach($this->hrefs as $href) { - $elem = $dom->ownerDocument->createElement($prefix . ':href'); - $elem->nodeValue = ($this->autoPrefix?$server->getBaseUri():'') . $href; - $dom->appendChild($elem); - } - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode {DAV:}href values. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_Href - */ - static function unserialize(DOMElement $dom) { - - $hrefs = array(); - foreach($dom->childNodes as $child) { - if (Sabre_DAV_XMLUtil::toClarkNotation($child)==='{DAV:}href') { - $hrefs[] = $child->textContent; - } - } - return new self($hrefs, false); - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/IHref.php b/3rdparty/Sabre/DAV/Property/IHref.php deleted file mode 100644 index 29d76a44fcd..00000000000 --- a/3rdparty/Sabre/DAV/Property/IHref.php +++ /dev/null @@ -1,25 +0,0 @@ -locks = $locks; - $this->revealLockToken = $revealLockToken; - - } - - /** - * serialize - * - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $prop) { - - $doc = $prop->ownerDocument; - - foreach($this->locks as $lock) { - - $activeLock = $doc->createElementNS('DAV:','d:activelock'); - $prop->appendChild($activeLock); - - $lockScope = $doc->createElementNS('DAV:','d:lockscope'); - $activeLock->appendChild($lockScope); - - $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==Sabre_DAV_Locks_LockInfo::EXCLUSIVE?'exclusive':'shared'))); - - $lockType = $doc->createElementNS('DAV:','d:locktype'); - $activeLock->appendChild($lockType); - - $lockType->appendChild($doc->createElementNS('DAV:','d:write')); - - /* {DAV:}lockroot */ - if (!self::$hideLockRoot) { - $lockRoot = $doc->createElementNS('DAV:','d:lockroot'); - $activeLock->appendChild($lockRoot); - $href = $doc->createElementNS('DAV:','d:href'); - $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri)); - $lockRoot->appendChild($href); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == Sabre_DAV_Server::DEPTH_INFINITY?'infinity':$lock->depth))); - $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout)); - - if ($this->revealLockToken) { - $lockToken = $doc->createElementNS('DAV:','d:locktoken'); - $activeLock->appendChild($lockToken); - $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token)); - } - - $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner)); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/ResourceType.php b/3rdparty/Sabre/DAV/Property/ResourceType.php deleted file mode 100644 index 2c606c22d60..00000000000 --- a/3rdparty/Sabre/DAV/Property/ResourceType.php +++ /dev/null @@ -1,125 +0,0 @@ -resourceType = array(); - elseif ($resourceType === Sabre_DAV_Server::NODE_DIRECTORY) - $this->resourceType = array('{DAV:}collection'); - elseif (is_array($resourceType)) - $this->resourceType = $resourceType; - else - $this->resourceType = array($resourceType); - - } - - /** - * serialize - * - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $prop) { - - $propName = null; - $rt = $this->resourceType; - - foreach($rt as $resourceType) { - if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) { - - if (isset($server->xmlNamespaces[$propName[1]])) { - $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2])); - } else { - $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2])); - } - - } - } - - } - - /** - * Returns the values in clark-notation - * - * For example array('{DAV:}collection') - * - * @return array - */ - public function getValue() { - - return $this->resourceType; - - } - - /** - * Checks if the principal contains a certain value - * - * @param string $type - * @return bool - */ - public function is($type) { - - return in_array($type, $this->resourceType); - - } - - /** - * Adds a resourcetype value to this property - * - * @param string $type - * @return void - */ - public function add($type) { - - $this->resourceType[] = $type; - $this->resourceType = array_unique($this->resourceType); - - } - - /** - * Unserializes a DOM element into a ResourceType property. - * - * @param DOMElement $dom - * @return void - */ - static public function unserialize(DOMElement $dom) { - - $value = array(); - foreach($dom->childNodes as $child) { - - $value[] = Sabre_DAV_XMLUtil::toClarkNotation($child); - - } - - return new self($value); - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/Response.php b/3rdparty/Sabre/DAV/Property/Response.php deleted file mode 100644 index 7d3a2db0387..00000000000 --- a/3rdparty/Sabre/DAV/Property/Response.php +++ /dev/null @@ -1,156 +0,0 @@ -href = $href; - $this->responseProperties = $responseProperties; - - } - - /** - * Returns the url - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Returns the property list - * - * @return array - */ - public function getResponseProperties() { - - return $this->responseProperties; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - $document = $dom->ownerDocument; - $properties = $this->responseProperties; - - $xresponse = $document->createElement('d:response'); - $dom->appendChild($xresponse); - - $uri = Sabre_DAV_URLUtil::encodePath($this->href); - - // Adding the baseurl to the beginning of the url - $uri = $server->getBaseUri() . $uri; - - $xresponse->appendChild($document->createElement('d:href',$uri)); - - // The properties variable is an array containing properties, grouped by - // HTTP status - foreach($properties as $httpStatus=>$propertyGroup) { - - // The 'href' is also in this array, and it's special cased. - // We will ignore it - if ($httpStatus=='href') continue; - - // If there are no properties in this group, we can also just carry on - if (!count($propertyGroup)) continue; - - $xpropstat = $document->createElement('d:propstat'); - $xresponse->appendChild($xpropstat); - - $xprop = $document->createElement('d:prop'); - $xpropstat->appendChild($xprop); - - $nsList = $server->xmlNamespaces; - - foreach($propertyGroup as $propertyName=>$propertyValue) { - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - // special case for empty namespaces - if ($propName[1]=='') { - - $currentProperty = $document->createElement($propName[2]); - $xprop->appendChild($currentProperty); - $currentProperty->setAttribute('xmlns',''); - - } else { - - if (!isset($nsList[$propName[1]])) { - $nsList[$propName[1]] = 'x' . count($nsList); - } - - // If the namespace was defined in the top-level xml namespaces, it means - // there was already a namespace declaration, and we don't have to worry about it. - if (isset($server->xmlNamespaces[$propName[1]])) { - $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]); - } else { - $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]); - } - $xprop->appendChild($currentProperty); - - } - - if (is_scalar($propertyValue)) { - $text = $document->createTextNode($propertyValue); - $currentProperty->appendChild($text); - } elseif ($propertyValue instanceof Sabre_DAV_Property) { - $propertyValue->serialize($server,$currentProperty); - } elseif (!is_null($propertyValue)) { - throw new Sabre_DAV_Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); - } - - } - - $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus))); - - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/ResponseList.php b/3rdparty/Sabre/DAV/Property/ResponseList.php deleted file mode 100644 index cd70b12861d..00000000000 --- a/3rdparty/Sabre/DAV/Property/ResponseList.php +++ /dev/null @@ -1,58 +0,0 @@ -responses = $responses; - - } - - /** - * serialize - * - * @param Sabre_DAV_Server $server - * @param DOMElement $dom - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $dom) { - - foreach($this->responses as $response) { - $response->serialize($server, $dom); - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Property/SupportedLock.php b/3rdparty/Sabre/DAV/Property/SupportedLock.php deleted file mode 100644 index 01e63f58d9d..00000000000 --- a/3rdparty/Sabre/DAV/Property/SupportedLock.php +++ /dev/null @@ -1,76 +0,0 @@ -supportsLocks = $supportsLocks; - - } - - /** - * serialize - * - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $prop) { - - $doc = $prop->ownerDocument; - - if (!$this->supportsLocks) return null; - - $lockEntry1 = $doc->createElementNS('DAV:','d:lockentry'); - $lockEntry2 = $doc->createElementNS('DAV:','d:lockentry'); - - $prop->appendChild($lockEntry1); - $prop->appendChild($lockEntry2); - - $lockScope1 = $doc->createElementNS('DAV:','d:lockscope'); - $lockScope2 = $doc->createElementNS('DAV:','d:lockscope'); - $lockType1 = $doc->createElementNS('DAV:','d:locktype'); - $lockType2 = $doc->createElementNS('DAV:','d:locktype'); - - $lockEntry1->appendChild($lockScope1); - $lockEntry1->appendChild($lockType1); - $lockEntry2->appendChild($lockScope2); - $lockEntry2->appendChild($lockType2); - - $lockScope1->appendChild($doc->createElementNS('DAV:','d:exclusive')); - $lockScope2->appendChild($doc->createElementNS('DAV:','d:shared')); - - $lockType1->appendChild($doc->createElementNS('DAV:','d:write')); - $lockType2->appendChild($doc->createElementNS('DAV:','d:write')); - - //$frag->appendXML(''); - //$frag->appendXML(''); - - } - -} - diff --git a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php b/3rdparty/Sabre/DAV/Property/SupportedReportSet.php deleted file mode 100644 index acd9219c0f7..00000000000 --- a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php +++ /dev/null @@ -1,110 +0,0 @@ -addReport($reports); - - } - - /** - * Adds a report to this property - * - * The report must be a string in clark-notation. - * Multiple reports can be specified as an array. - * - * @param mixed $report - * @return void - */ - public function addReport($report) { - - if (!is_array($report)) $report = array($report); - - foreach($report as $r) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$r)) - throw new Sabre_DAV_Exception('Reportname must be in clark-notation'); - - $this->reports[] = $r; - - } - - } - - /** - * Returns the list of supported reports - * - * @return array - */ - public function getValue() { - - return $this->reports; - - } - - /** - * Serializes the node - * - * @param Sabre_DAV_Server $server - * @param DOMElement $prop - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $prop) { - - foreach($this->reports as $reportName) { - - $supportedReport = $prop->ownerDocument->createElement('d:supported-report'); - $prop->appendChild($supportedReport); - - $report = $prop->ownerDocument->createElement('d:report'); - $supportedReport->appendChild($report); - - preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches); - - list(, $namespace, $element) = $matches; - - $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null; - - if ($prefix) { - $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element)); - } else { - $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element)); - } - - } - - } - -} diff --git a/3rdparty/Sabre/DAV/Server.php b/3rdparty/Sabre/DAV/Server.php deleted file mode 100644 index 3d76d4f1918..00000000000 --- a/3rdparty/Sabre/DAV/Server.php +++ /dev/null @@ -1,1941 +0,0 @@ - 'd', - 'http://sabredav.org/ns' => 's', - ); - - /** - * The propertymap can be used to map properties from - * requests to property classes. - * - * @var array - */ - public $propertyMap = array( - '{DAV:}resourcetype' => 'Sabre_DAV_Property_ResourceType', - ); - - public $protectedProperties = array( - // RFC4918 - '{DAV:}getcontentlength', - '{DAV:}getetag', - '{DAV:}getlastmodified', - '{DAV:}lockdiscovery', - '{DAV:}resourcetype', - '{DAV:}supportedlock', - - // RFC4331 - '{DAV:}quota-available-bytes', - '{DAV:}quota-used-bytes', - - // RFC3744 - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - - ); - - /** - * This is a flag that allow or not showing file, line and code - * of the exception in the returned XML - * - * @var bool - */ - public $debugExceptions = false; - - /** - * This property allows you to automatically add the 'resourcetype' value - * based on a node's classname or interface. - * - * The preset ensures that {DAV:}collection is automaticlly added for nodes - * implementing Sabre_DAV_ICollection. - * - * @var array - */ - public $resourceTypeMapping = array( - 'Sabre_DAV_ICollection' => '{DAV:}collection', - ); - - - /** - * Sets up the server - * - * If a Sabre_DAV_Tree object is passed as an argument, it will - * use it as the directory tree. If a Sabre_DAV_INode is passed, it - * will create a Sabre_DAV_ObjectTree and use the node as the root. - * - * If nothing is passed, a Sabre_DAV_SimpleCollection is created in - * a Sabre_DAV_ObjectTree. - * - * If an array is passed, we automatically create a root node, and use - * the nodes in the array as top-level children. - * - * @param Sabre_DAV_Tree $tree The tree object - * @return void - */ - public function __construct($treeOrNode = null) { - - if ($treeOrNode instanceof Sabre_DAV_Tree) { - $this->tree = $treeOrNode; - } elseif ($treeOrNode instanceof Sabre_DAV_INode) { - $this->tree = new Sabre_DAV_ObjectTree($treeOrNode); - } elseif (is_array($treeOrNode)) { - - // If it's an array, a list of nodes was passed, and we need to - // create the root node. - foreach($treeOrNode as $node) { - if (!($node instanceof Sabre_DAV_INode)) { - throw new Sabre_DAV_Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement Sabre_DAV_INode'); - } - } - - $root = new Sabre_DAV_SimpleCollection('root', $treeOrNode); - $this->tree = new Sabre_DAV_ObjectTree($root); - - } elseif (is_null($treeOrNode)) { - $root = new Sabre_DAV_SimpleCollection('root'); - $this->tree = new Sabre_DAV_ObjectTree($root); - } else { - throw new Sabre_DAV_Exception('Invalid argument passed to constructor. Argument must either be an instance of Sabre_DAV_Tree, Sabre_DAV_INode, an array or null'); - } - $this->httpResponse = new Sabre_HTTP_Response(); - $this->httpRequest = new Sabre_HTTP_Request(); - - } - - /** - * Starts the DAV Server - * - * @return void - */ - public function exec() { - - try { - - $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri()); - - } catch (Exception $e) { - - $DOM = new DOMDocument('1.0','utf-8'); - $DOM->formatOutput = true; - - $error = $DOM->createElementNS('DAV:','d:error'); - $error->setAttribute('xmlns:s',self::NS_SABREDAV); - $DOM->appendChild($error); - - $error->appendChild($DOM->createElement('s:exception',get_class($e))); - $error->appendChild($DOM->createElement('s:message',$e->getMessage())); - if ($this->debugExceptions) { - $error->appendChild($DOM->createElement('s:file',$e->getFile())); - $error->appendChild($DOM->createElement('s:line',$e->getLine())); - $error->appendChild($DOM->createElement('s:code',$e->getCode())); - $error->appendChild($DOM->createElement('s:stacktrace',$e->getTraceAsString())); - - } - $error->appendChild($DOM->createElement('s:sabredav-version',Sabre_DAV_Version::VERSION)); - - if($e instanceof Sabre_DAV_Exception) { - - $httpCode = $e->getHTTPCode(); - $e->serialize($this,$error); - $headers = $e->getHTTPHeaders($this); - - } else { - - $httpCode = 500; - $headers = array(); - - } - $headers['Content-Type'] = 'application/xml; charset=utf-8'; - - $this->httpResponse->sendStatus($httpCode); - $this->httpResponse->setHeaders($headers); - $this->httpResponse->sendBody($DOM->saveXML()); - - } - - } - - /** - * Sets the base server uri - * - * @param string $uri - * @return void - */ - public function setBaseUri($uri) { - - // If the baseUri does not end with a slash, we must add it - if ($uri[strlen($uri)-1]!=='/') - $uri.='/'; - - $this->baseUri = $uri; - - } - - /** - * Returns the base responding uri - * - * @return string - */ - public function getBaseUri() { - - if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri(); - return $this->baseUri; - - } - - /** - * This method attempts to detect the base uri. - * Only the PATH_INFO variable is considered. - * - * If this variable is not set, the root (/) is assumed. - * - * @return void - */ - public function guessBaseUri() { - - $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO'); - $uri = $this->httpRequest->getRawServerValue('REQUEST_URI'); - - // If PATH_INFO is found, we can assume it's accurate. - if (!empty($pathInfo)) { - - // We need to make sure we ignore the QUERY_STRING part - if ($pos = strpos($uri,'?')) - $uri = substr($uri,0,$pos); - - // PATH_INFO is only set for urls, such as: /example.php/path - // in that case PATH_INFO contains '/path'. - // Note that REQUEST_URI is percent encoded, while PATH_INFO is - // not, Therefore they are only comparable if we first decode - // REQUEST_INFO as well. - $decodedUri = Sabre_DAV_URLUtil::decodePath($uri); - - // A simple sanity check: - if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) { - $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo)); - return rtrim($baseUri,'/') . '/'; - } - - throw new Sabre_DAV_Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.'); - - } - - // The last fallback is that we're just going to assume the server root. - return '/'; - - } - - /** - * Adds a plugin to the server - * - * For more information, console the documentation of Sabre_DAV_ServerPlugin - * - * @param Sabre_DAV_ServerPlugin $plugin - * @return void - */ - public function addPlugin(Sabre_DAV_ServerPlugin $plugin) { - - $this->plugins[$plugin->getPluginName()] = $plugin; - $plugin->initialize($this); - - } - - /** - * Returns an initialized plugin by it's name. - * - * This function returns null if the plugin was not found. - * - * @param string $name - * @return Sabre_DAV_ServerPlugin - */ - public function getPlugin($name) { - - if (isset($this->plugins[$name])) - return $this->plugins[$name]; - - // This is a fallback and deprecated. - foreach($this->plugins as $plugin) { - if (get_class($plugin)===$name) return $plugin; - } - - return null; - - } - - /** - * Returns all plugins - * - * @return array - */ - public function getPlugins() { - - return $this->plugins; - - } - - - - /** - * Subscribe to an event. - * - * When the event is triggered, we'll call all the specified callbacks. - * It is possible to control the order of the callbacks through the - * priority argument. - * - * This is for example used to make sure that the authentication plugin - * is triggered before anything else. If it's not needed to change this - * number, it is recommended to ommit. - * - * @param string $event - * @param callback $callback - * @param int $priority - * @return void - */ - public function subscribeEvent($event, $callback, $priority = 100) { - - if (!isset($this->eventSubscriptions[$event])) { - $this->eventSubscriptions[$event] = array(); - } - while(isset($this->eventSubscriptions[$event][$priority])) $priority++; - $this->eventSubscriptions[$event][$priority] = $callback; - ksort($this->eventSubscriptions[$event]); - - } - - /** - * Broadcasts an event - * - * This method will call all subscribers. If one of the subscribers returns false, the process stops. - * - * The arguments parameter will be sent to all subscribers - * - * @param string $eventName - * @param array $arguments - * @return bool - */ - public function broadcastEvent($eventName,$arguments = array()) { - - if (isset($this->eventSubscriptions[$eventName])) { - - foreach($this->eventSubscriptions[$eventName] as $subscriber) { - - $result = call_user_func_array($subscriber,$arguments); - if ($result===false) return false; - - } - - } - - return true; - - } - - /** - * Handles a http request, and execute a method based on its name - * - * @param string $method - * @param string $uri - * @return void - */ - public function invokeMethod($method, $uri) { - - $method = strtoupper($method); - - if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return; - - // Make sure this is a HTTP method we support - $internalMethods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'MKCOL', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - if (in_array($method,$internalMethods)) { - - call_user_func(array($this,'http' . $method), $uri); - - } else { - - if ($this->broadcastEvent('unknownMethod',array($method, $uri))) { - // Unsupported method - throw new Sabre_DAV_Exception_NotImplemented(); - } - - } - - } - - // {{{ HTTP Method implementations - - /** - * HTTP OPTIONS - * - * @param string $uri - * @return void - */ - protected function httpOptions($uri) { - - $methods = $this->getAllowedMethods($uri); - - $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods))); - $features = array('1','3', 'extended-mkcol'); - - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - $this->httpResponse->setHeader('MS-Author-Via','DAV'); - $this->httpResponse->setHeader('Accept-Ranges','bytes'); - $this->httpResponse->setHeader('X-Sabre-Version',Sabre_DAV_Version::VERSION); - $this->httpResponse->setHeader('Content-Length',0); - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP GET - * - * This method simply fetches the contents of a uri, like normal - * - * @param string $uri - * @return void - */ - protected function httpGet($uri) { - - $node = $this->tree->getNodeForPath($uri,0); - - if (!$this->checkPreconditions(true)) return false; - - if (!($node instanceof Sabre_DAV_IFile)) throw new Sabre_DAV_Exception_NotImplemented('GET is only implemented on File objects'); - $body = $node->get(); - - // Converting string into stream, if needed. - if (is_string($body)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$body); - rewind($stream); - $body = $stream; - } - - /* - * TODO: getetag, getlastmodified, getsize should also be used using - * this method - */ - $httpHeaders = $this->getHTTPHeaders($uri); - - /* ContentType needs to get a default, because many webservers will otherwise - * default to text/html, and we don't want this for security reasons. - */ - if (!isset($httpHeaders['Content-Type'])) { - $httpHeaders['Content-Type'] = 'application/octet-stream'; - } - - - if (isset($httpHeaders['Content-Length'])) { - - $nodeSize = $httpHeaders['Content-Length']; - - // Need to unset Content-Length, because we'll handle that during figuring out the range - unset($httpHeaders['Content-Length']); - - } else { - $nodeSize = null; - } - - $this->httpResponse->setHeaders($httpHeaders); - - $range = $this->getHTTPRange(); - $ifRange = $this->httpRequest->getHeader('If-Range'); - $ignoreRangeHeader = false; - - // If ifRange is set, and range is specified, we first need to check - // the precondition. - if ($nodeSize && $range && $ifRange) { - - // if IfRange is parsable as a date we'll treat it as a DateTime - // otherwise, we must treat it as an etag. - try { - $ifRangeDate = new DateTime($ifRange); - - // It's a date. We must check if the entity is modified since - // the specified date. - if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true; - else { - $modified = new DateTime($httpHeaders['Last-Modified']); - if($modified > $ifRangeDate) $ignoreRangeHeader = true; - } - - } catch (Exception $e) { - - // It's an entity. We can do a simple comparison. - if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true; - elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true; - } - } - - // We're only going to support HTTP ranges if the backend provided a filesize - if (!$ignoreRangeHeader && $nodeSize && $range) { - - // Determining the exact byte offsets - if (!is_null($range[0])) { - - $start = $range[0]; - $end = $range[1]?$range[1]:$nodeSize-1; - if($start >= $nodeSize) - throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')'); - - if($end < $start) throw new Sabre_DAV_Exception_RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); - if($end >= $nodeSize) $end = $nodeSize-1; - - } else { - - $start = $nodeSize-$range[1]; - $end = $nodeSize-1; - - if ($start<0) $start = 0; - - } - - // New read/write stream - $newStream = fopen('php://temp','r+'); - - stream_copy_to_stream($body, $newStream, $end-$start+1, $start); - rewind($newStream); - - $this->httpResponse->setHeader('Content-Length', $end-$start+1); - $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize); - $this->httpResponse->sendStatus(206); - $this->httpResponse->sendBody($newStream); - - - } else { - - if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize); - $this->httpResponse->sendStatus(200); - $this->httpResponse->sendBody($body); - - } - - } - - /** - * HTTP HEAD - * - * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body - * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again - * - * @param string $uri - * @return void - */ - protected function httpHead($uri) { - - $node = $this->tree->getNodeForPath($uri); - /* This information is only collection for File objects. - * Ideally we want to throw 405 Method Not Allowed for every - * non-file, but MS Office does not like this - */ - if ($node instanceof Sabre_DAV_IFile) { - $headers = $this->getHTTPHeaders($this->getRequestUri()); - if (!isset($headers['Content-Type'])) { - $headers['Content-Type'] = 'application/octet-stream'; - } - $this->httpResponse->setHeaders($headers); - } - $this->httpResponse->sendStatus(200); - - } - - /** - * HTTP Delete - * - * The HTTP delete method, deletes a given uri - * - * @param string $uri - * @return void - */ - protected function httpDelete($uri) { - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - - $this->httpResponse->sendStatus(204); - $this->httpResponse->setHeader('Content-Length','0'); - - } - - - /** - * WebDAV PROPFIND - * - * This WebDAV method requests information about an uri resource, or a list of resources - * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value - * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory) - * - * The request body contains an XML data structure that has a list of properties the client understands - * The response body is also an xml document, containing information about every uri resource and the requested properties - * - * It has to return a HTTP 207 Multi-status status code - * - * @param string $uri - * @return void - */ - protected function httpPropfind($uri) { - - // $xml = new Sabre_DAV_XMLReader(file_get_contents('php://input')); - $requestedProperties = $this->parsePropfindRequest($this->httpRequest->getBody(true)); - - $depth = $this->getHTTPDepth(1); - // The only two options for the depth of a propfind is 0 or 1 - if ($depth!=0) $depth = 1; - - $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth); - - // This is a multi-status response - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - // Normally this header is only needed for OPTIONS responses, however.. - // iCal seems to also depend on these being set for PROPFIND. Since - // this is not harmful, we'll add it. - $features = array('1','3', 'extended-mkcol'); - foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); - $this->httpResponse->setHeader('DAV',implode(', ',$features)); - - $data = $this->generateMultiStatus($newProperties); - $this->httpResponse->sendBody($data); - - } - - /** - * WebDAV PROPPATCH - * - * This method is called to update properties on a Node. The request is an XML body with all the mutations. - * In this XML body it is specified which properties should be set/updated and/or deleted - * - * @param string $uri - * @return void - */ - protected function httpPropPatch($uri) { - - $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true)); - - $result = $this->updateProperties($uri, $newProperties); - - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } - - /** - * HTTP PUT method - * - * This HTTP method updates a file, or creates a new one. - * - * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 200 Ok - * - * @param string $uri - * @return void - */ - protected function httpPut($uri) { - - $body = $this->httpRequest->getBody(); - - // Intercepting Content-Range - if ($this->httpRequest->getHeader('Content-Range')) { - /** - Content-Range is dangerous for PUT requests: PUT per definition - stores a full resource. draft-ietf-httpbis-p2-semantics-15 says - in section 7.6: - An origin server SHOULD reject any PUT request that contains a - Content-Range header field, since it might be misinterpreted as - partial content (or might be partial content that is being mistakenly - PUT as a full representation). Partial content updates are possible - by targeting a separately identified resource with state that - overlaps a portion of the larger resource, or by using a different - method that has been specifically defined for partial updates (for - example, the PATCH method defined in [RFC5789]). - This clarifies RFC2616 section 9.6: - The recipient of the entity MUST NOT ignore any Content-* - (e.g. Content-Range) headers that it does not understand or implement - and MUST return a 501 (Not Implemented) response in such cases. - OTOH is a PUT request with a Content-Range currently the only way to - continue an aborted upload request and is supported by curl, mod_dav, - Tomcat and others. Since some clients do use this feature which results - in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject - all PUT requests with a Content-Range for now. - */ - - throw new Sabre_DAV_Exception_NotImplemented('PUT with Content-Range is not allowed.'); - } - - // Intercepting the Finder problem - if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) { - - /** - Many webservers will not cooperate well with Finder PUT requests, - because it uses 'Chunked' transfer encoding for the request body. - - The symptom of this problem is that Finder sends files to the - server, but they arrive as 0-lenght files in PHP. - - If we don't do anything, the user might think they are uploading - files successfully, but they end up empty on the server. Instead, - we throw back an error if we detect this. - - The reason Finder uses Chunked, is because it thinks the files - might change as it's being uploaded, and therefore the - Content-Length can vary. - - Instead it sends the X-Expected-Entity-Length header with the size - of the file at the very start of the request. If this header is set, - but we don't get a request body we will fail the request to - protect the end-user. - */ - - // Only reading first byte - $firstByte = fread($body,1); - if (strlen($firstByte)!==1) { - throw new Sabre_DAV_Exception_Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.'); - } - - // The body needs to stay intact, so we copy everything to a - // temporary stream. - - $newBody = fopen('php://temp','r+'); - fwrite($newBody,$firstByte); - stream_copy_to_stream($body, $newBody); - rewind($newBody); - - $body = $newBody; - - } - - if ($this->tree->nodeExists($uri)) { - - $node = $this->tree->getNodeForPath($uri); - - // Checking If-None-Match and related headers. - if (!$this->checkPreconditions()) return; - - // If the node is a collection, we'll deny it - if (!($node instanceof Sabre_DAV_IFile)) throw new Sabre_DAV_Exception_Conflict('PUT is not allowed on non-files.'); - if (!$this->broadcastEvent('beforeWriteContent',array($this->getRequestUri()))) return false; - - $node->put($body); - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus(204); - - } else { - - // If we got here, the resource didn't exist yet. - if (!$this->createFile($this->getRequestUri(),$body)) { - // For one reason or another the file was not created. - return; - } - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus(201); - - } - - } - - - /** - * WebDAV MKCOL - * - * The MKCOL method is used to create a new collection (directory) on the server - * - * @param string $uri - * @return void - */ - protected function httpMkcol($uri) { - - $requestBody = $this->httpRequest->getBody(true); - - if ($requestBody) { - - $contentType = $this->httpRequest->getHeader('Content-Type'); - if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) { - - // We must throw 415 for unsupport mkcol bodies - throw new Sabre_DAV_Exception_UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type'); - - } - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($requestBody); - if (Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') { - - // We must throw 415 for unsupport mkcol bodies - throw new Sabre_DAV_Exception_UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.'); - - } - - $properties = array(); - foreach($dom->firstChild->childNodes as $childNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue; - $properties = array_merge($properties, Sabre_DAV_XMLUtil::parseProperties($childNode, $this->propertyMap)); - - } - if (!isset($properties['{DAV:}resourcetype'])) - throw new Sabre_DAV_Exception_BadRequest('The mkcol request must include a {DAV:}resourcetype property'); - - $resourceType = $properties['{DAV:}resourcetype']->getValue(); - unset($properties['{DAV:}resourcetype']); - - } else { - - $properties = array(); - $resourceType = array('{DAV:}collection'); - - } - - $result = $this->createCollection($uri, $resourceType, $properties); - - if (is_array($result)) { - $this->httpResponse->sendStatus(207); - $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - - $this->httpResponse->sendBody( - $this->generateMultiStatus(array($result)) - ); - - } else { - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus(201); - } - - } - - /** - * WebDAV HTTP MOVE method - * - * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return void - */ - protected function httpMove($uri) { - - $moveInfo = $this->getCopyAndMoveInfo(); - - // If the destination is part of the source tree, we must fail - if ($moveInfo['destination']==$uri) - throw new Sabre_DAV_Exception_Forbidden('Source and destination uri are identical.'); - - if ($moveInfo['destinationExists']) { - - if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false; - $this->tree->delete($moveInfo['destination']); - - } - - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false; - if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false; - $this->tree->move($uri,$moveInfo['destination']); - $this->broadcastEvent('afterBind',array($moveInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201); - - } - - /** - * WebDAV HTTP COPY method - * - * This method copies one uri to a different uri, and works much like the MOVE request - * A lot of the actual request processing is done in getCopyMoveInfo - * - * @param string $uri - * @return void - */ - protected function httpCopy($uri) { - - $copyInfo = $this->getCopyAndMoveInfo(); - // If the destination is part of the source tree, we must fail - if ($copyInfo['destination']==$uri) - throw new Sabre_DAV_Exception_Forbidden('Source and destination uri are identical.'); - - if ($copyInfo['destinationExists']) { - if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false; - $this->tree->delete($copyInfo['destination']); - - } - if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false; - $this->tree->copy($uri,$copyInfo['destination']); - $this->broadcastEvent('afterBind',array($copyInfo['destination'])); - - // If a resource was overwritten we should send a 204, otherwise a 201 - $this->httpResponse->setHeader('Content-Length','0'); - $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201); - - } - - - - /** - * HTTP REPORT method implementation - * - * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253) - * It's used in a lot of extensions, so it made sense to implement it into the core. - * - * @param string $uri - * @return void - */ - protected function httpReport($uri) { - - $body = $this->httpRequest->getBody(true); - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $reportName = Sabre_DAV_XMLUtil::toClarkNotation($dom->firstChild); - - if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { - - // If broadcastEvent returned true, it means the report was not supported - throw new Sabre_DAV_Exception_ReportNotImplemented(); - - } - - } - - // }}} - // {{{ HTTP/WebDAV protocol helpers - - /** - * Returns an array with all the supported HTTP methods for a specific uri. - * - * @param string $uri - * @return array - */ - public function getAllowedMethods($uri) { - - $methods = array( - 'OPTIONS', - 'GET', - 'HEAD', - 'DELETE', - 'PROPFIND', - 'PUT', - 'PROPPATCH', - 'COPY', - 'MOVE', - 'REPORT' - ); - - // The MKCOL is only allowed on an unmapped uri - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - $methods[] = 'MKCOL'; - } - - // We're also checking if any of the plugins register any new methods - foreach($this->plugins as $plugin) $methods = array_merge($methods,$plugin->getHTTPMethods($uri)); - array_unique($methods); - - return $methods; - - } - - /** - * Gets the uri for the request, keeping the base uri into consideration - * - * @return string - */ - public function getRequestUri() { - - return $this->calculateUri($this->httpRequest->getUri()); - - } - - /** - * Calculates the uri for a request, making sure that the base uri is stripped out - * - * @param string $uri - * @throws Sabre_DAV_Exception_Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri - * @return string - */ - public function calculateUri($uri) { - - if ($uri[0]!='/' && strpos($uri,'://')) { - - $uri = parse_url($uri,PHP_URL_PATH); - - } - - $uri = str_replace('//','/',$uri); - - if (strpos($uri,$this->getBaseUri())===0) { - - return trim(Sabre_DAV_URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/'); - - // A special case, if the baseUri was accessed without a trailing - // slash, we'll accept it as well. - } elseif ($uri.'/' === $this->getBaseUri()) { - - return ''; - - } else { - - throw new Sabre_DAV_Exception_Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')'); - - } - - } - - /** - * Returns the HTTP depth header - * - * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the Sabre_DAV_Server::DEPTH_INFINITY object - * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existant - * - * @param mixed $default - * @return int - */ - public function getHTTPDepth($default = self::DEPTH_INFINITY) { - - // If its not set, we'll grab the default - $depth = $this->httpRequest->getHeader('Depth'); - - if (is_null($depth)) return $default; - - if ($depth == 'infinity') return self::DEPTH_INFINITY; - - - // If its an unknown value. we'll grab the default - if (!ctype_digit($depth)) return $default; - - return (int)$depth; - - } - - /** - * Returns the HTTP range header - * - * This method returns null if there is no well-formed HTTP range request - * header or array($start, $end). - * - * The first number is the offset of the first byte in the range. - * The second number is the offset of the last byte in the range. - * - * If the second offset is null, it should be treated as the offset of the last byte of the entity - * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity - * - * return $mixed - */ - public function getHTTPRange() { - - $range = $this->httpRequest->getHeader('range'); - if (is_null($range)) return null; - - // Matching "Range: bytes=1234-5678: both numbers are optional - - if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; - - if ($matches[1]==='' && $matches[2]==='') return null; - - return array( - $matches[1]!==''?$matches[1]:null, - $matches[2]!==''?$matches[2]:null, - ); - - } - - - /** - * Returns information about Copy and Move requests - * - * This function is created to help getting information about the source and the destination for the - * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions - * - * The returned value is an array with the following keys: - * * destination - Destination path - * * destinationExists - Wether or not the destination is an existing url (and should therefore be overwritten) - * - * @return array - */ - public function getCopyAndMoveInfo() { - - // Collecting the relevant HTTP headers - if (!$this->httpRequest->getHeader('Destination')) throw new Sabre_DAV_Exception_BadRequest('The destination header was not supplied'); - $destination = $this->calculateUri($this->httpRequest->getHeader('Destination')); - $overwrite = $this->httpRequest->getHeader('Overwrite'); - if (!$overwrite) $overwrite = 'T'; - if (strtoupper($overwrite)=='T') $overwrite = true; - elseif (strtoupper($overwrite)=='F') $overwrite = false; - // We need to throw a bad request exception, if the header was invalid - else throw new Sabre_DAV_Exception_BadRequest('The HTTP Overwrite header should be either T or F'); - - list($destinationDir) = Sabre_DAV_URLUtil::splitPath($destination); - - try { - $destinationParent = $this->tree->getNodeForPath($destinationDir); - if (!($destinationParent instanceof Sabre_DAV_ICollection)) throw new Sabre_DAV_Exception_UnsupportedMediaType('The destination node is not a collection'); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - // If the destination parent node is not found, we throw a 409 - throw new Sabre_DAV_Exception_Conflict('The destination node is not found'); - } - - try { - - $destinationNode = $this->tree->getNodeForPath($destination); - - // If this succeeded, it means the destination already exists - // we'll need to throw precondition failed in case overwrite is false - if (!$overwrite) throw new Sabre_DAV_Exception_PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite'); - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - // Destination didn't exist, we're all good - $destinationNode = false; - - - - } - - // These are the three relevant properties we need to return - return array( - 'destination' => $destination, - 'destinationExists' => $destinationNode==true, - 'destinationNode' => $destinationNode, - ); - - } - - /** - * Returns a list of properties for a path - * - * This is a simplified version getPropertiesForPath. - * if you aren't interested in status codes, but you just - * want to have a flat list of properties. Use this method. - * - * @param string $path - * @param array $propertyNames - */ - public function getProperties($path, $propertyNames) { - - $result = $this->getPropertiesForPath($path,$propertyNames,0); - return $result[0][200]; - - } - - /** - * Returns a list of HTTP headers for a particular resource - * - * The generated http headers are based on properties provided by the - * resource. The method basically provides a simple mapping between - * DAV property and HTTP header. - * - * The headers are intended to be used for HEAD and GET requests. - * - * @param string $path - */ - public function getHTTPHeaders($path) { - - $propertyMap = array( - '{DAV:}getcontenttype' => 'Content-Type', - '{DAV:}getcontentlength' => 'Content-Length', - '{DAV:}getlastmodified' => 'Last-Modified', - '{DAV:}getetag' => 'ETag', - ); - - $properties = $this->getProperties($path,array_keys($propertyMap)); - - $headers = array(); - foreach($propertyMap as $property=>$header) { - if (!isset($properties[$property])) continue; - - if (is_scalar($properties[$property])) { - $headers[$header] = $properties[$property]; - - // GetLastModified gets special cased - } elseif ($properties[$property] instanceof Sabre_DAV_Property_GetLastModified) { - $headers[$header] = $properties[$property]->getTime()->format(DateTime::RFC1123); - } - - } - - return $headers; - - } - - /** - * Returns a list of properties for a given path - * - * The path that should be supplied should have the baseUrl stripped out - * The list of properties should be supplied in Clark notation. If the list is empty - * 'allprops' is assumed. - * - * If a depth of 1 is requested child elements will also be returned. - * - * @param string $path - * @param array $propertyNames - * @param int $depth - * @return array - */ - public function getPropertiesForPath($path,$propertyNames = array(),$depth = 0) { - - if ($depth!=0) $depth = 1; - - $returnPropertyList = array(); - - $parentNode = $this->tree->getNodeForPath($path); - $nodes = array( - $path => $parentNode - ); - if ($depth==1 && $parentNode instanceof Sabre_DAV_ICollection) { - foreach($this->tree->getChildren($path) as $childNode) - $nodes[$path . '/' . $childNode->getName()] = $childNode; - } - - // If the propertyNames array is empty, it means all properties are requested. - // We shouldn't actually return everything we know though, and only return a - // sensible list. - $allProperties = count($propertyNames)==0; - - foreach($nodes as $myPath=>$node) { - - $currentPropertyNames = $propertyNames; - - $newProperties = array( - '200' => array(), - '404' => array(), - ); - - if ($allProperties) { - // Default list of propertyNames, when all properties were requested. - $currentPropertyNames = array( - '{DAV:}getlastmodified', - '{DAV:}getcontentlength', - '{DAV:}resourcetype', - '{DAV:}quota-used-bytes', - '{DAV:}quota-available-bytes', - '{DAV:}getetag', - '{DAV:}getcontenttype', - ); - } - - // If the resourceType was not part of the list, we manually add it - // and mark it for removal. We need to know the resourcetype in order - // to make certain decisions about the entry. - // WebDAV dictates we should add a / and the end of href's for collections - $removeRT = false; - if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) { - $currentPropertyNames[] = '{DAV:}resourcetype'; - $removeRT = true; - } - - $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties)); - // If this method explicitly returned false, we must ignore this - // node as it is inacessible. - if ($result===false) continue; - - if (count($currentPropertyNames) > 0) { - - if ($node instanceof Sabre_DAV_IProperties) - $newProperties['200'] = $newProperties[200] + $node->getProperties($currentPropertyNames); - - } - - - foreach($currentPropertyNames as $prop) { - - if (isset($newProperties[200][$prop])) continue; - - switch($prop) { - case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Sabre_DAV_Property_GetLastModified($node->getLastModified()); break; - case '{DAV:}getcontentlength' : if ($node instanceof Sabre_DAV_IFile) $newProperties[200][$prop] = (int)$node->getSize(); break; - case '{DAV:}quota-used-bytes' : - if ($node instanceof Sabre_DAV_IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[0]; - } - break; - case '{DAV:}quota-available-bytes' : - if ($node instanceof Sabre_DAV_IQuota) { - $quotaInfo = $node->getQuotaInfo(); - $newProperties[200][$prop] = $quotaInfo[1]; - } - break; - case '{DAV:}getetag' : if ($node instanceof Sabre_DAV_IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break; - case '{DAV:}getcontenttype' : if ($node instanceof Sabre_DAV_IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break; - case '{DAV:}supported-report-set' : - $reports = array(); - foreach($this->plugins as $plugin) { - $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath)); - } - $newProperties[200][$prop] = new Sabre_DAV_Property_SupportedReportSet($reports); - break; - case '{DAV:}resourcetype' : - $newProperties[200]['{DAV:}resourcetype'] = new Sabre_DAV_Property_ResourceType(); - foreach($this->resourceTypeMapping as $className => $resourceType) { - if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType); - } - break; - - } - - // If we were unable to find the property, we will list it as 404. - if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null; - - } - - $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties)); - - $newProperties['href'] = trim($myPath,'/'); - - // Its is a WebDAV recommendation to add a trailing slash to collectionnames. - // Apple's iCal also requires a trailing slash for principals (rfc 3744). - // Therefore we add a trailing / for any non-file. This might need adjustments - // if we find there are other edge cases. - if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype']) && count($newProperties[200]['{DAV:}resourcetype']->getValue())>0) $newProperties['href'] .='/'; - - // If the resourcetype property was manually added to the requested property list, - // we will remove it again. - if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']); - - $returnPropertyList[] = $newProperties; - - } - - return $returnPropertyList; - - } - - /** - * This method is invoked by sub-systems creating a new file. - * - * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin). - * It was important to get this done through a centralized function, - * allowing plugins to intercept this using the beforeCreateFile event. - * - * This method will return true if the file was actually created - * - * @param string $uri - * @param resource $data - * @return bool - */ - public function createFile($uri,$data) { - - list($dir,$name) = Sabre_DAV_URLUtil::splitPath($uri); - - if (!$this->broadcastEvent('beforeBind',array($uri))) return false; - if (!$this->broadcastEvent('beforeCreateFile',array($uri,$data))) return false; - - $parent = $this->tree->getNodeForPath($dir); - $parent->createFile($name,$data); - $this->tree->markDirty($dir); - - $this->broadcastEvent('afterBind',array($uri)); - - return true; - } - - /** - * This method is invoked by sub-systems creating a new directory. - * - * @param string $uri - * @return void - */ - public function createDirectory($uri) { - - $this->createCollection($uri,array('{DAV:}collection'),array()); - - } - - /** - * Use this method to create a new collection - * - * The {DAV:}resourcetype is specified using the resourceType array. - * At the very least it must contain {DAV:}collection. - * - * The properties array can contain a list of additional properties. - * - * @param string $uri The new uri - * @param array $resourceType The resourceType(s) - * @param array $properties A list of properties - * @return void - */ - public function createCollection($uri, array $resourceType, array $properties) { - - list($parentUri,$newName) = Sabre_DAV_URLUtil::splitPath($uri); - - // Making sure {DAV:}collection was specified as resourceType - if (!in_array('{DAV:}collection', $resourceType)) { - throw new Sabre_DAV_Exception_InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection'); - } - - - // Making sure the parent exists - try { - - $parent = $this->tree->getNodeForPath($parentUri); - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - throw new Sabre_DAV_Exception_Conflict('Parent node does not exist'); - - } - - // Making sure the parent is a collection - if (!$parent instanceof Sabre_DAV_ICollection) { - throw new Sabre_DAV_Exception_Conflict('Parent node is not a collection'); - } - - - - // Making sure the child does not already exist - try { - $parent->getChild($newName); - - // If we got here.. it means there's already a node on that url, and we need to throw a 405 - throw new Sabre_DAV_Exception_MethodNotAllowed('The resource you tried to create already exists'); - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - // This is correct - } - - - if (!$this->broadcastEvent('beforeBind',array($uri))) return; - - // There are 2 modes of operation. The standard collection - // creates the directory, and then updates properties - // the extended collection can create it directly. - if ($parent instanceof Sabre_DAV_IExtendedCollection) { - - $parent->createExtendedCollection($newName, $resourceType, $properties); - - } else { - - // No special resourcetypes are supported - if (count($resourceType)>1) { - throw new Sabre_DAV_Exception_InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.'); - } - - $parent->createDirectory($newName); - $rollBack = false; - $exception = null; - $errorResult = null; - - if (count($properties)>0) { - - try { - - $errorResult = $this->updateProperties($uri, $properties); - if (!isset($errorResult[200])) { - $rollBack = true; - } - - } catch (Sabre_DAV_Exception $e) { - - $rollBack = true; - $exception = $e; - - } - - } - - if ($rollBack) { - if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; - $this->tree->delete($uri); - - // Re-throwing exception - if ($exception) throw $exception; - - return $errorResult; - } - - } - $this->tree->markDirty($parentUri); - $this->broadcastEvent('afterBind',array($uri)); - - } - - /** - * This method updates a resource's properties - * - * The properties array must be a list of properties. Array-keys are - * property names in clarknotation, array-values are it's values. - * If a property must be deleted, the value should be null. - * - * Note that this request should either completely succeed, or - * completely fail. - * - * The response is an array with statuscodes for keys, which in turn - * contain arrays with propertynames. This response can be used - * to generate a multistatus body. - * - * @param string $uri - * @param array $properties - * @return array - */ - public function updateProperties($uri, array $properties) { - - // we'll start by grabbing the node, this will throw the appropriate - // exceptions if it doesn't. - $node = $this->tree->getNodeForPath($uri); - - $result = array( - 200 => array(), - 403 => array(), - 424 => array(), - ); - $remainingProperties = $properties; - $hasError = false; - - // Running through all properties to make sure none of them are protected - if (!$hasError) foreach($properties as $propertyName => $value) { - if(in_array($propertyName, $this->protectedProperties)) { - $result[403][$propertyName] = null; - unset($remainingProperties[$propertyName]); - $hasError = true; - } - } - - if (!$hasError) { - // Allowing plugins to take care of property updating - $hasError = !$this->broadcastEvent('updateProperties',array( - &$remainingProperties, - &$result, - $node - )); - } - - // If the node is not an instance of Sabre_DAV_IProperties, every - // property is 403 Forbidden - if (!$hasError && count($remainingProperties) && !($node instanceof Sabre_DAV_IProperties)) { - $hasError = true; - foreach($properties as $propertyName=> $value) { - $result[403][$propertyName] = null; - } - $remainingProperties = array(); - } - - // Only if there were no errors we may attempt to update the resource - if (!$hasError) { - - if (count($remainingProperties)>0) { - - $updateResult = $node->updateProperties($remainingProperties); - - if ($updateResult===true) { - // success - foreach($remainingProperties as $propertyName=>$value) { - $result[200][$propertyName] = null; - } - - } elseif ($updateResult===false) { - // The node failed to update the properties for an - // unknown reason - foreach($remainingProperties as $propertyName=>$value) { - $result[403][$propertyName] = null; - } - - } elseif (is_array($updateResult)) { - - // The node has detailed update information - // We need to merge the results with the earlier results. - foreach($updateResult as $status => $props) { - if (is_array($props)) { - if (!isset($result[$status])) - $result[$status] = array(); - - $result[$status] = array_merge($result[$status], $updateResult[$status]); - } - } - - } else { - throw new Sabre_DAV_Exception('Invalid result from updateProperties'); - } - $remainingProperties = array(); - } - - } - - foreach($remainingProperties as $propertyName=>$value) { - // if there are remaining properties, it must mean - // there's a dependency failure - $result[424][$propertyName] = null; - } - - // Removing empty array values - foreach($result as $status=>$props) { - - if (count($props)===0) unset($result[$status]); - - } - $result['href'] = $uri; - return $result; - - } - - /** - * This method checks the main HTTP preconditions. - * - * Currently these are: - * * If-Match - * * If-None-Match - * * If-Modified-Since - * * If-Unmodified-Since - * - * The method will return true if all preconditions are met - * The method will return false, or throw an exception if preconditions - * failed. If false is returned the operation should be aborted, and - * the appropriate HTTP response headers are already set. - * - * Normally this method will throw 412 Precondition Failed for failures - * related to If-None-Match, If-Match and If-Unmodified Since. It will - * set the status to 304 Not Modified for If-Modified_since. - * - * If the $handleAsGET argument is set to true, it will also return 304 - * Not Modified for failure of the If-None-Match precondition. This is the - * desired behaviour for HTTP GET and HTTP HEAD requests. - * - * @return bool - */ - public function checkPreconditions($handleAsGET = false) { - - $uri = $this->getRequestUri(); - $node = null; - $lastMod = null; - $etag = null; - - if ($ifMatch = $this->httpRequest->getHeader('If-Match')) { - - // If-Match contains an entity tag. Only if the entity-tag - // matches we are allowed to make the request succeed. - // If the entity-tag is '*' we are only allowed to make the - // request succeed if a resource exists at that url. - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match'); - } - - // Only need to check entity tags if they are not * - if ($ifMatch!=='*') { - - // There can be multiple etags - $ifMatch = explode(',',$ifMatch); - $haveMatch = false; - foreach($ifMatch as $ifMatchItem) { - - // Stripping any extra spaces - $ifMatchItem = trim($ifMatchItem,' '); - - $etag = $node->getETag(); - if ($etag===$ifMatchItem) { - $haveMatch = true; - } - } - if (!$haveMatch) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); - } - } - } - - if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) { - - // The If-None-Match header contains an etag. - // Only if the ETag does not match the current ETag, the request will succeed - // The header can also contain *, in which case the request - // will only succeed if the entity does not exist at all. - $nodeExists = true; - if (!$node) { - try { - $node = $this->tree->getNodeForPath($uri); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - $nodeExists = false; - } - } - if ($nodeExists) { - $haveMatch = false; - if ($ifNoneMatch==='*') $haveMatch = true; - else { - - // There might be multiple etags - $ifNoneMatch = explode(',', $ifNoneMatch); - $etag = $node->getETag(); - - foreach($ifNoneMatch as $ifNoneMatchItem) { - - // Stripping any extra spaces - $ifNoneMatchItem = trim($ifNoneMatchItem,' '); - - if ($etag===$ifNoneMatchItem) $haveMatch = true; - - } - - } - - if ($haveMatch) { - if ($handleAsGET) { - $this->httpResponse->sendStatus(304); - return false; - } else { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match'); - } - } - } - - } - - if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) { - - // The If-Modified-Since header contains a date. We - // will only return the entity if it has been changed since - // that date. If it hasn't been changed, we return a 304 - // header - // Note that this header only has to be checked if there was no If-None-Match header - // as per the HTTP spec. - $date = Sabre_HTTP_Util::parseHTTPDate($ifModifiedSince); - - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new DateTime('@' . $lastMod); - if ($lastMod <= $date) { - $this->httpResponse->sendStatus(304); - return false; - } - } - } - } - - if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) { - - // The If-Unmodified-Since will allow allow the request if the - // entity has not changed since the specified date. - $date = Sabre_HTTP_Util::parseHTTPDate($ifUnmodifiedSince); - - // We must only check the date if it's valid - if ($date) { - if (is_null($node)) { - $node = $this->tree->getNodeForPath($uri); - } - $lastMod = $node->getLastModified(); - if ($lastMod) { - $lastMod = new DateTime('@' . $lastMod); - if ($lastMod > $date) { - throw new Sabre_DAV_Exception_PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since'); - } - } - } - - } - return true; - - } - - // }}} - // {{{ XML Readers & Writers - - - /** - * Generates a WebDAV propfind response body based on a list of nodes - * - * @param array $fileProperties The list with nodes - * @param array $requestedProperties The properties that should be returned - * @return string - */ - public function generateMultiStatus(array $fileProperties) { - - $dom = new DOMDocument('1.0','utf-8'); - //$dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($fileProperties as $entry) { - - $href = $entry['href']; - unset($entry['href']); - - $response = new Sabre_DAV_Property_Response($href,$entry); - $response->serialize($this,$multiStatus); - - } - - return $dom->saveXML(); - - } - - /** - * This method parses a PropPatch request - * - * PropPatch changes the properties for a resource. This method - * returns a list of properties. - * - * The keys in the returned array contain the property name (e.g.: {DAV:}displayname, - * and the value contains the property value. If a property is to be removed the value - * will be null. - * - * @param string $body xml body - * @return array list of properties in need of updating or deletion - */ - public function parsePropPatchRequest($body) { - - //We'll need to change the DAV namespace declaration to something else in order to make it parsable - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $newProperties = array(); - - foreach($dom->firstChild->childNodes as $child) { - - if ($child->nodeType !== XML_ELEMENT_NODE) continue; - - $operation = Sabre_DAV_XMLUtil::toClarkNotation($child); - - if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue; - - $innerProperties = Sabre_DAV_XMLUtil::parseProperties($child, $this->propertyMap); - - foreach($innerProperties as $propertyName=>$propertyValue) { - - if ($operation==='{DAV:}remove') { - $propertyValue = null; - } - - $newProperties[$propertyName] = $propertyValue; - - } - - } - - return $newProperties; - - } - - /** - * This method parses the PROPFIND request and returns its information - * - * This will either be a list of properties, or an empty array; in which case - * an {DAV:}allprop was requested. - * - * @param string $body - * @return array - */ - public function parsePropFindRequest($body) { - - // If the propfind body was empty, it means IE is requesting 'all' properties - if (!$body) return array(); - - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); - return array_keys(Sabre_DAV_XMLUtil::parseProperties($elem)); - - } - - // }}} - -} - diff --git a/3rdparty/Sabre/DAV/ServerPlugin.php b/3rdparty/Sabre/DAV/ServerPlugin.php deleted file mode 100644 index 6909f600c21..00000000000 --- a/3rdparty/Sabre/DAV/ServerPlugin.php +++ /dev/null @@ -1,90 +0,0 @@ -name = $name; - foreach($children as $child) { - - if (!($child instanceof Sabre_DAV_INode)) throw new Sabre_DAV_Exception('Only instances of Sabre_DAV_INode are allowed to be passed in the children argument'); - $this->addChild($child); - - } - - } - - /** - * Adds a new childnode to this collection - * - * @param Sabre_DAV_INode $child - * @return void - */ - public function addChild(Sabre_DAV_INode $child) { - - $this->children[$child->getName()] = $child; - - } - - /** - * Returns the name of the collection - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns a child object, by its name. - * - * This method makes use of the getChildren method to grab all the child nodes, and compares the name. - * Generally its wise to override this, as this can usually be optimized - * - * @param string $name - * @throws Sabre_DAV_Exception_FileNotFound - * @return Sabre_DAV_INode - */ - public function getChild($name) { - - if (isset($this->children[$name])) return $this->children[$name]; - throw new Sabre_DAV_Exception_FileNotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\''); - - } - - /** - * Returns a list of children for this collection - * - * @return array - */ - public function getChildren() { - - return array_values($this->children); - - } - - -} - diff --git a/3rdparty/Sabre/DAV/SimpleDirectory.php b/3rdparty/Sabre/DAV/SimpleDirectory.php deleted file mode 100644 index 516a3aa907c..00000000000 --- a/3rdparty/Sabre/DAV/SimpleDirectory.php +++ /dev/null @@ -1,21 +0,0 @@ -name = $name; - $this->contents = $contents; - $this->mimeType = $mimeType; - - } - - /** - * Returns the node name for this file. - * - * This name is used to construct the url. - * - * @return string - */ - public function getName() { - - return $this->name; - - } - - /** - * Returns the data - * - * This method may either return a string or a readable stream resource - * - * @return mixed - */ - public function get() { - - return $this->contents; - - } - - /** - * Returns the size of the file, in bytes. - * - * @return int - */ - public function getSize() { - - return strlen($this->contents); - - } - - /** - * Returns the ETag for a file - * - * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. - * The ETag is an arbritrary string, but MUST be surrounded by double-quotes. - * - * Return null if the ETag can not effectively be determined - */ - public function getETag() { - - return '"' . md5($this->contents) . '"'; - - } - - /** - * Returns the mime-type for a file - * - * If null is returned, we'll assume application/octet-stream - */ - public function getContentType() { - - return $this->mimeType; - - } - -} - -?> diff --git a/3rdparty/Sabre/DAV/StringUtil.php b/3rdparty/Sabre/DAV/StringUtil.php deleted file mode 100644 index 440cf6866ca..00000000000 --- a/3rdparty/Sabre/DAV/StringUtil.php +++ /dev/null @@ -1,91 +0,0 @@ -dataDir = $dataDir; - - } - - /** - * Initialize the plugin - * - * This is called automatically be the Server class after this plugin is - * added with Sabre_DAV_Server::addPlugin() - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeMethod',array($this,'beforeMethod')); - $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile')); - - } - - /** - * This method is called before any HTTP method handler - * - * This method intercepts any GET, DELETE, PUT and PROPFIND calls to - * filenames that are known to match the 'temporary file' regex. - * - * @param string $method - * @return bool - */ - public function beforeMethod($method, $uri) { - - if (!$tempLocation = $this->isTempFile($uri)) - return true; - - switch($method) { - case 'GET' : - return $this->httpGet($tempLocation); - case 'PUT' : - return $this->httpPut($tempLocation); - case 'PROPFIND' : - return $this->httpPropfind($tempLocation, $uri); - case 'DELETE' : - return $this->httpDelete($tempLocation); - } - return true; - - } - - /** - * This method is invoked if some subsystem creates a new file. - * - * This is used to deal with HTTP LOCK requests which create a new - * file. - * - * @param string $uri - * @param resource $data - * @return bool - */ - public function beforeCreateFile($uri,$data) { - - if ($tempPath = $this->isTempFile($uri)) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - file_put_contents($tempPath,$data); - return false; - } - return true; - - } - - /** - * This method will check if the url matches the temporary file pattern - * if it does, it will return an path based on $this->dataDir for the - * temporary file storage. - * - * @param string $path - * @return boolean|string - */ - protected function isTempFile($path) { - - // We're only interested in the basename. - list(, $tempPath) = Sabre_DAV_URLUtil::splitPath($path); - - foreach($this->temporaryFilePatterns as $tempFile) { - - if (preg_match($tempFile,$tempPath)) { - return $this->dataDir . '/sabredav_' . md5($path) . '.tempfile'; - } - - } - - return false; - - } - - - /** - * This method handles the GET method for temporary files. - * If the file doesn't exist, it will return false which will kick in - * the regular system for the GET method. - * - * @param string $tempLocation - * @return bool - */ - public function httpGet($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('Content-Type','application/octet-stream'); - $hR->setHeader('Content-Length',filesize($tempLocation)); - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(200); - $hR->sendBody(fopen($tempLocation,'r')); - return false; - - } - - /** - * This method handles the PUT method. - * - * @param string $tempLocation - * @return bool - */ - public function httpPut($tempLocation) { - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - - $newFile = !file_exists($tempLocation); - - if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) { - throw new Sabre_DAV_Exception_PreconditionFailed('The resource already exists, and an If-None-Match header was supplied'); - } - - file_put_contents($tempLocation,$this->server->httpRequest->getBody()); - $hR->sendStatus($newFile?201:200); - return false; - - } - - /** - * This method handles the DELETE method. - * - * If the file didn't exist, it will return false, which will make the - * standard HTTP DELETE handler kick in. - * - * @param string $tempLocation - * @return bool - */ - public function httpDelete($tempLocation) { - - if (!file_exists($tempLocation)) return true; - - unlink($tempLocation); - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(204); - return false; - - } - - /** - * This method handles the PROPFIND method. - * - * It's a very lazy method, it won't bother checking the request body - * for which properties were requested, and just sends back a default - * set of properties. - * - * @param string $tempLocation - * @return void - */ - public function httpPropfind($tempLocation, $uri) { - - if (!file_exists($tempLocation)) return true; - - $hR = $this->server->httpResponse; - $hR->setHeader('X-Sabre-Temp','true'); - $hR->sendStatus(207); - $hR->setHeader('Content-Type','application/xml; charset=utf-8'); - - $requestedProps = $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true)); - - $properties = array( - 'href' => $uri, - 200 => array( - '{DAV:}getlastmodified' => new Sabre_DAV_Property_GetLastModified(filemtime($tempLocation)), - '{DAV:}getcontentlength' => filesize($tempLocation), - '{DAV:}resourcetype' => new Sabre_DAV_Property_ResourceType(null), - '{'.Sabre_DAV_Server::NS_SABREDAV.'}tempFile' => true, - - ), - ); - - $data = $this->server->generateMultiStatus(array($properties)); - $hR->sendBody($data); - return false; - - } - - -} diff --git a/3rdparty/Sabre/DAV/Tree.php b/3rdparty/Sabre/DAV/Tree.php deleted file mode 100644 index 98e6f62c9e5..00000000000 --- a/3rdparty/Sabre/DAV/Tree.php +++ /dev/null @@ -1,192 +0,0 @@ -getNodeForPath($path); - return true; - - } catch (Sabre_DAV_Exception_FileNotFound $e) { - - return false; - - } - - } - - /** - * Copies a file from path to another - * - * @param string $sourcePath The source location - * @param string $destinationPath The full destination path - * @return void - */ - public function copy($sourcePath, $destinationPath) { - - $sourceNode = $this->getNodeForPath($sourcePath); - - // grab the dirname and basename components - list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath); - - $destinationParent = $this->getNodeForPath($destinationDir); - $this->copyNode($sourceNode,$destinationParent,$destinationName); - - $this->markDirty($destinationDir); - - } - - /** - * Moves a file from one location to another - * - * @param string $sourcePath The path to the file which should be moved - * @param string $destinationPath The full destination path, so not just the destination parent node - * @return int - */ - public function move($sourcePath, $destinationPath) { - - list($sourceDir, $sourceName) = Sabre_DAV_URLUtil::splitPath($sourcePath); - list($destinationDir, $destinationName) = Sabre_DAV_URLUtil::splitPath($destinationPath); - - if ($sourceDir===$destinationDir) { - $renameable = $this->getNodeForPath($sourcePath); - $renameable->setName($destinationName); - } else { - $this->copy($sourcePath,$destinationPath); - $this->getNodeForPath($sourcePath)->delete(); - } - $this->markDirty($sourceDir); - $this->markDirty($destinationDir); - - } - - /** - * Deletes a node from the tree - * - * @param string $path - * @return void - */ - public function delete($path) { - - $node = $this->getNodeForPath($path); - $node->delete(); - - list($parent) = Sabre_DAV_URLUtil::splitPath($path); - $this->markDirty($parent); - - } - - /** - * Returns a list of childnodes for a given path. - * - * @param string $path - * @return array - */ - public function getChildren($path) { - - $node = $this->getNodeForPath($path); - return $node->getChildren(); - - } - - /** - * This method is called with every tree update - * - * Examples of tree updates are: - * * node deletions - * * node creations - * * copy - * * move - * * renaming nodes - * - * If Tree classes implement a form of caching, this will allow - * them to make sure caches will be expired. - * - * If a path is passed, it is assumed that the entire subtree is dirty - * - * @param string $path - * @return void - */ - public function markDirty($path) { - - - } - - /** - * copyNode - * - * @param Sabre_DAV_INode $source - * @param Sabre_DAV_ICollection $destination - * @return void - */ - protected function copyNode(Sabre_DAV_INode $source,Sabre_DAV_ICollection $destinationParent,$destinationName = null) { - - if (!$destinationName) $destinationName = $source->getName(); - - if ($source instanceof Sabre_DAV_IFile) { - - $data = $source->get(); - - // If the body was a string, we need to convert it to a stream - if (is_string($data)) { - $stream = fopen('php://temp','r+'); - fwrite($stream,$data); - rewind($stream); - $data = $stream; - } - $destinationParent->createFile($destinationName,$data); - $destination = $destinationParent->getChild($destinationName); - - } elseif ($source instanceof Sabre_DAV_ICollection) { - - $destinationParent->createDirectory($destinationName); - - $destination = $destinationParent->getChild($destinationName); - foreach($source->getChildren() as $child) { - - $this->copyNode($child,$destination); - - } - - } - if ($source instanceof Sabre_DAV_IProperties && $destination instanceof Sabre_DAV_IProperties) { - - $props = $source->getProperties(array()); - $destination->updateProperties($props); - - } - - } - -} - diff --git a/3rdparty/Sabre/DAV/Tree/Filesystem.php b/3rdparty/Sabre/DAV/Tree/Filesystem.php deleted file mode 100644 index 5c611047e07..00000000000 --- a/3rdparty/Sabre/DAV/Tree/Filesystem.php +++ /dev/null @@ -1,124 +0,0 @@ -basePath = $basePath; - - } - - /** - * Returns a new node for the given path - * - * @param string $path - * @return void - */ - public function getNodeForPath($path) { - - $realPath = $this->getRealPath($path); - if (!file_exists($realPath)) throw new Sabre_DAV_Exception_FileNotFound('File at location ' . $realPath . ' not found'); - if (is_dir($realPath)) { - return new Sabre_DAV_FS_Directory($path); - } else { - return new Sabre_DAV_FS_File($path); - } - - } - - /** - * Returns the real filesystem path for a webdav url. - * - * @param string $publicPath - * @return string - */ - protected function getRealPath($publicPath) { - - return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/'); - - } - - /** - * Copies a file or directory. - * - * This method must work recursively and delete the destination - * if it exists - * - * @param string $source - * @param string $destination - * @return void - */ - public function copy($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - $this->realCopy($source,$destination); - - } - - /** - * Used by self::copy - * - * @param string $source - * @param string $destination - * @return void - */ - protected function realCopy($source,$destination) { - - if (is_file($source)) { - copy($source,$destination); - } else { - mkdir($destination); - foreach(scandir($source) as $subnode) { - - if ($subnode=='.' || $subnode=='..') continue; - $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode); - - } - } - - } - - /** - * Moves a file or directory recursively. - * - * If the destination exists, delete it first. - * - * @param string $source - * @param string $destination - * @return void - */ - public function move($source,$destination) { - - $source = $this->getRealPath($source); - $destination = $this->getRealPath($destination); - rename($source,$destination); - - } - -} - diff --git a/3rdparty/Sabre/DAV/URLUtil.php b/3rdparty/Sabre/DAV/URLUtil.php deleted file mode 100644 index 8f38749264b..00000000000 --- a/3rdparty/Sabre/DAV/URLUtil.php +++ /dev/null @@ -1,125 +0,0 @@ - - * will be returned as: - * {http://www.example.org}myelem - * - * This format is used throughout the SabreDAV sourcecode. - * Elements encoded with the urn:DAV namespace will - * be returned as if they were in the DAV: namespace. This is to avoid - * compatibility problems. - * - * This function will return null if a nodetype other than an Element is passed. - * - * @param DOMElement $dom - * @return string - */ - static function toClarkNotation(DOMNode $dom) { - - if ($dom->nodeType !== XML_ELEMENT_NODE) return null; - - // Mapping back to the real namespace, in case it was dav - if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; - - // Mapping to clark notation - return '{' . $ns . '}' . $dom->localName; - - } - - /** - * Parses a clark-notation string, and returns the namespace and element - * name components. - * - * If the string was invalid, it will throw an InvalidArgumentException. - * - * @param string $str - * @throws InvalidArgumentException - * @return array - */ - static function parseClarkNotation($str) { - - if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) { - throw new InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string'); - } - - return array( - $matches[1], - $matches[2] - ); - - } - - /** - * This method takes an XML document (as string) and converts all instances of the - * DAV: namespace to urn:DAV - * - * This is unfortunately needed, because the DAV: namespace violates the xml namespaces - * spec, and causes the DOM to throw errors - */ - static function convertDAVNamespace($xmlDocument) { - - // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: - // namespace is actually a violation of the XML namespaces specification, and will cause errors - return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); - - } - - /** - * This method provides a generic way to load a DOMDocument for WebDAV use. - * - * This method throws a Sabre_DAV_Exception_BadRequest exception for any xml errors. - * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. - * - * @param string $xml - * @throws Sabre_DAV_Exception_BadRequest - * @return DOMDocument - */ - static function loadDOMDocument($xml) { - - if (empty($xml)) - throw new Sabre_DAV_Exception_BadRequest('Empty XML document sent'); - - // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower) - // does not support this, so we must intercept this and convert to UTF-8. - if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") { - - // Note: the preceeding byte sequence is "]*)encoding="UTF-16"([^>]*)>|u','',$xml); - - } - - // Retaining old error setting - $oldErrorSetting = libxml_use_internal_errors(true); - - // Clearing any previous errors - libxml_clear_errors(); - - $dom = new DOMDocument(); - $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); - - // We don't generally care about any whitespace - $dom->preserveWhiteSpace = false; - - if ($error = libxml_get_last_error()) { - libxml_clear_errors(); - throw new Sabre_DAV_Exception_BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')'); - } - - // Restoring old mechanism for error handling - if ($oldErrorSetting===false) libxml_use_internal_errors(false); - - return $dom; - - } - - /** - * Parses all WebDAV properties out of a DOM Element - * - * Generally WebDAV properties are encloded in {DAV:}prop elements. This - * method helps by going through all these and pulling out the actual - * propertynames, making them array keys and making the property values, - * well.. the array values. - * - * If no value was given (self-closing element) null will be used as the - * value. This is used in for example PROPFIND requests. - * - * Complex values are supported through the propertyMap argument. The - * propertyMap should have the clark-notation properties as it's keys, and - * classnames as values. - * - * When any of these properties are found, the unserialize() method will be - * (statically) called. The result of this method is used as the value. - * - * @param DOMElement $parentNode - * @param array $propertyMap - * @return array - */ - static function parseProperties(DOMElement $parentNode, array $propertyMap = array()) { - - $propList = array(); - foreach($parentNode->childNodes as $propNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($propNode)!=='{DAV:}prop') continue; - - foreach($propNode->childNodes as $propNodeData) { - - /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */ - if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue; - - $propertyName = Sabre_DAV_XMLUtil::toClarkNotation($propNodeData); - if (isset($propertyMap[$propertyName])) { - $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData); - } else { - $propList[$propertyName] = $propNodeData->textContent; - } - } - - - } - return $propList; - - } - -} diff --git a/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php b/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php deleted file mode 100644 index a361e054610..00000000000 --- a/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php +++ /dev/null @@ -1,121 +0,0 @@ -principalPrefix = $principalPrefix; - $this->principalBackend = $principalBackend; - - } - - /** - * This method returns a node for a principal. - * - * The passed array contains principal information, and is guaranteed to - * at least contain a uri item. Other properties may or may not be - * supplied by the authentication backend. - * - * @param array $principalInfo - * @return Sabre_DAVACL_IPrincipal - */ - abstract function getChildForPrincipal(array $principalInfo); - - /** - * Returns the name of this collection. - * - * @return string - */ - public function getName() { - - list(,$name) = Sabre_DAV_URLUtil::splitPath($this->principalPrefix); - return $name; - - } - - /** - * Return the list of users - * - * @return void - */ - public function getChildren() { - - if ($this->disableListing) - throw new Sabre_DAV_Exception_MethodNotAllowed('Listing members of this collection is disabled'); - - $children = array(); - foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) { - - $children[] = $this->getChildForPrincipal($principalInfo); - - - } - return $children; - - } - - /** - * Returns a child object, by its name. - * - * @param string $name - * @throws Sabre_DAV_Exception_FileNotFound - * @return Sabre_DAV_IPrincipal - */ - public function getChild($name) { - - $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name); - if (!$principalInfo) throw new Sabre_DAV_Exception_FileNotFound('Principal with name ' . $name . ' not found'); - return $this->getChildForPrincipal($principalInfo); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php b/3rdparty/Sabre/DAVACL/Exception/AceConflict.php deleted file mode 100644 index d10aeb4345c..00000000000 --- a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php +++ /dev/null @@ -1,34 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-ace-conflict'); - $errorNode->appendChild($np); - - } - -} - -?> diff --git a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php b/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php deleted file mode 100644 index 024ab6641f3..00000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php +++ /dev/null @@ -1,80 +0,0 @@ -uri = $uri; - $this->privileges = $privileges; - - } - - /** - * Adds in extra information in the xml response. - * - * This method adds the {DAV:}need-privileges element as defined in rfc3744 - * - * @param Sabre_DAV_Server $server - * @param DOMElement $errorNode - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $errorNode) { - - $doc = $errorNode->ownerDocument; - - $np = $doc->createElementNS('DAV:','d:need-privileges'); - $errorNode->appendChild($np); - - foreach($this->privileges as $privilege) { - - $resource = $doc->createElementNS('DAV:','d:resource'); - $np->appendChild($resource); - - $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri)); - - $priv = $doc->createElementNS('DAV:','d:privilege'); - $resource->appendChild($priv); - - preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts); - $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2])); - - - } - - } - -} - diff --git a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php b/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php deleted file mode 100644 index 60f49ebff4a..00000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php +++ /dev/null @@ -1,34 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:no-abstract'); - $errorNode->appendChild($np); - - } - -} - -?> diff --git a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php deleted file mode 100644 index e056dc9e4f7..00000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php +++ /dev/null @@ -1,34 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:recognized-principal'); - $errorNode->appendChild($np); - - } - -} - -?> diff --git a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php deleted file mode 100644 index 27db7cdd7dd..00000000000 --- a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php +++ /dev/null @@ -1,34 +0,0 @@ -ownerDocument; - - $np = $doc->createElementNS('DAV:','d:not-supported-privilege'); - $errorNode->appendChild($np); - - } - -} - -?> diff --git a/3rdparty/Sabre/DAVACL/IACL.php b/3rdparty/Sabre/DAVACL/IACL.php deleted file mode 100644 index 506be4248d7..00000000000 --- a/3rdparty/Sabre/DAVACL/IACL.php +++ /dev/null @@ -1,58 +0,0 @@ -getCurrentUserPrivilegeSet($uri); - - if (is_null($acl)) { - if ($this->allowAccessToNodesWithoutACL) { - return true; - } else { - if ($throwExceptions) - throw new Sabre_DAVACL_Exception_NeedPrivileges($uri,$privileges); - else - return false; - - } - } - - $failed = array(); - foreach($privileges as $priv) { - - if (!in_array($priv, $acl)) { - $failed[] = $priv; - } - - } - - if ($failed) { - if ($throwExceptions) - throw new Sabre_DAVACL_Exception_NeedPrivileges($uri,$failed); - else - return false; - } - return true; - - } - - /** - * Returns the standard users' principal. - * - * This is one authorative principal url for the current user. - * This method will return null if the user wasn't logged in. - * - * @return string|null - */ - public function getCurrentUserPrincipal() { - - $authPlugin = $this->server->getPlugin('auth'); - if (is_null($authPlugin)) return null; - - $userName = $authPlugin->getCurrentUser(); - if (!$userName) return null; - - return $this->defaultUsernamePath . '/' . $userName; - - } - - /** - * Returns a list of principals that's associated to the current - * user, either directly or through group membership. - * - * @return array - */ - public function getCurrentUserPrincipals() { - - $currentUser = $this->getCurrentUserPrincipal(); - - if (is_null($currentUser)) return array(); - - $check = array($currentUser); - $principals = array($currentUser); - - while(count($check)) { - - $principal = array_shift($check); - - $node = $this->server->tree->getNodeForPath($principal); - if ($node instanceof Sabre_DAVACL_IPrincipal) { - foreach($node->getGroupMembership() as $groupMember) { - - if (!in_array($groupMember, $principals)) { - - $check[] = $groupMember; - $principals[] = $groupMember; - - } - - } - - } - - } - - return $principals; - - } - - /** - * Returns the supported privilege structure for this ACL plugin. - * - * See RFC3744 for more details. Currently we default on a simple, - * standard structure. - * - * @return array - */ - public function getSupportedPrivilegeSet() { - - return array( - 'privilege' => '{DAV:}all', - 'abstract' => true, - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}read-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}read-current-user-privilege-set', - 'abstract' => true, - ), - ), - ), // {DAV:}read - array( - 'privilege' => '{DAV:}write', - 'aggregates' => array( - array( - 'privilege' => '{DAV:}write-acl', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-properties', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}write-content', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}bind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unbind', - 'abstract' => true, - ), - array( - 'privilege' => '{DAV:}unlock', - 'abstract' => true, - ), - ), - ), // {DAV:}write - ), - ); // {DAV:}all - - } - - /** - * Returns the supported privilege set as a flat list - * - * This is much easier to parse. - * - * The returned list will be index by privilege name. - * The value is a struct containing the following properties: - * - aggregates - * - abstract - * - concrete - * - * @return array - */ - final public function getFlatPrivilegeSet() { - - $privs = $this->getSupportedPrivilegeSet(); - - $flat = array(); - $this->getFPSTraverse($privs, null, $flat); - - return $flat; - - } - - /** - * Traverses the privilege set tree for reordering - * - * This function is solely used by getFlatPrivilegeSet, and would have been - * a closure if it wasn't for the fact I need to support PHP 5.2. - * - * @return void - */ - final private function getFPSTraverse($priv, $concrete, &$flat) { - - $myPriv = array( - 'privilege' => $priv['privilege'], - 'abstract' => isset($priv['abstract']) && $priv['abstract'], - 'aggregates' => array(), - 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'], - ); - - if (isset($priv['aggregates'])) - foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege']; - - $flat[$priv['privilege']] = $myPriv; - - if (isset($priv['aggregates'])) { - - foreach($priv['aggregates'] as $subPriv) { - - $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat); - - } - - } - - } - - /** - * Returns the full ACL list. - * - * Either a uri or a Sabre_DAV_INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - public function getACL($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - if ($node instanceof Sabre_DAVACL_IACL) { - return $node->getACL(); - } - return null; - - } - - /** - * Returns a list of privileges the current user has - * on a particular node. - * - * Either a uri or a Sabre_DAV_INode may be passed. - * - * null will be returned if the node doesn't support ACLs. - * - * @param string|Sabre_DAV_INode $node - * @return array - */ - public function getCurrentUserPrivilegeSet($node) { - - if (is_string($node)) { - $node = $this->server->tree->getNodeForPath($node); - } - - $acl = $this->getACL($node); - if (is_null($acl)) return null; - - $principals = $this->getCurrentUserPrincipals(); - - $collected = array(); - - foreach($acl as $ace) { - - if (in_array($ace['principal'], $principals)) { - $collected[] = $ace; - } - - } - - // Now we deduct all aggregated privileges. - $flat = $this->getFlatPrivilegeSet(); - - $collected2 = array(); - foreach($collected as $privilege) { - - $collected2[] = $privilege['privilege']; - foreach($flat[$privilege['privilege']]['aggregates'] as $subPriv) { - if (!in_array($subPriv, $collected2)) - $collected2[] = $subPriv; - } - - } - - return $collected2; - - } - - /** - * Sets up the plugin - * - * This method is automatically called by the server class. - * - * @param Sabre_DAV_Server $server - * @return void - */ - public function initialize(Sabre_DAV_Server $server) { - - $this->server = $server; - $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); - - $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20); - $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20); - $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20); - $server->subscribeEvent('updateProperties',array($this,'updateProperties')); - $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20); - $server->subscribeEvent('report',array($this,'report')); - $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod')); - - array_push($server->protectedProperties, - '{DAV:}alternate-URI-set', - '{DAV:}principal-URL', - '{DAV:}group-membership', - '{DAV:}principal-collection-set', - '{DAV:}current-user-principal', - '{DAV:}supported-privilege-set', - '{DAV:}current-user-privilege-set', - '{DAV:}acl', - '{DAV:}acl-restrictions', - '{DAV:}inherited-acl-set', - '{DAV:}owner', - '{DAV:}group' - ); - - // Automatically mapping nodes implementing IPrincipal to the - // {DAV:}principal resourcetype. - $server->resourceTypeMapping['Sabre_DAVACL_IPrincipal'] = '{DAV:}principal'; - - // Mapping the group-member-set property to the HrefList property - // class. - $server->propertyMap['{DAV:}group-member-set'] = 'Sabre_DAV_Property_HrefList'; - - } - - - /* {{{ Event handlers */ - - /** - * Triggered before any method is handled - * - * @param string $method - * @param string $uri - * @return void - */ - public function beforeMethod($method, $uri) { - - $exists = $this->server->tree->nodeExists($uri); - - // If the node doesn't exists, none of these checks apply - if (!$exists) return; - - switch($method) { - - case 'GET' : - case 'HEAD' : - case 'OPTIONS' : - // For these 3 we only need to know if the node is readable. - $this->checkPrivileges($uri,'{DAV:}read'); - break; - - case 'PUT' : - case 'LOCK' : - case 'UNLOCK' : - // This method requires the write-content priv if the node - // already exists, and bind on the parent if the node is being - // created. - // The bind privilege is handled in the beforeBind event. - $this->checkPrivileges($uri,'{DAV:}write-content'); - break; - - - case 'PROPPATCH' : - $this->checkPrivileges($uri,'{DAV:}write-properties'); - break; - - case 'ACL' : - $this->checkPrivileges($uri,'{DAV:}write-acl'); - break; - - case 'COPY' : - case 'MOVE' : - // Copy requires read privileges on the entire source tree. - // If the target exists write-content normally needs to be - // checked, however, we're deleting the node beforehand and - // creating a new one after, so this is handled by the - // beforeUnbind event. - // - // The creation of the new node is handled by the beforeBind - // event. - // - // If MOVE is used beforeUnbind will also be used to check if - // the sourcenode can be deleted. - $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE); - - break; - - } - - } - - /** - * Triggered before a new node is created. - * - * This allows us to check permissions for any operation that creates a - * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE. - * - * @param string $uri - * @return void - */ - public function beforeBind($uri) { - - list($parentUri,$nodeName) = Sabre_DAV_URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}bind'); - - } - - /** - * Triggered before a node is deleted - * - * This allows us to check permissions for any operation that will delete - * an existing node. - * - * @param string $uri - * @return void - */ - public function beforeUnbind($uri) { - - list($parentUri,$nodeName) = Sabre_DAV_URLUtil::splitPath($uri); - $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS); - - } - - /** - * Triggered before a node is unlocked. - * - * @param string $uri - * @param Sabre_DAV_Locks_LockInfo $lock - * @TODO: not yet implemented - * @return void - */ - public function beforeUnlock($uri, Sabre_DAV_Locks_LockInfo $lock) { - - - } - - /** - * Triggered before properties are looked up in specific nodes. - * - * @param string $uri - * @param Sabre_DAV_INode $node - * @param array $requestedProperties - * @param array $returnedProperties - * @TODO really should be broken into multiple methods, or even a class. - * @return void - */ - public function beforeGetProperties($uri, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties) { - - // Checking the read permission - if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) { - - // User is not allowed to read properties - if ($this->hideNodesFromListings) { - return false; - } - - // Marking all requested properties as '403'. - foreach($requestedProperties as $key=>$requestedProperty) { - unset($requestedProperties[$key]); - $returnedProperties[403][$requestedProperty] = null; - } - return; - - } - - /* Adding principal properties */ - if ($node instanceof Sabre_DAVACL_IPrincipal) { - - if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}alternate-URI-set'] = new Sabre_DAV_Property_HrefList($node->getAlternateUriSet()); - - } - if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}principal-URL'] = new Sabre_DAV_Property_Href($node->getPrincipalUrl() . '/'); - - } - if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-member-set'] = new Sabre_DAV_Property_HrefList($node->getGroupMemberSet()); - - } - if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}group-membership'] = new Sabre_DAV_Property_HrefList($node->getGroupMembership()); - - } - - if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) { - - $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName(); - - } - - } - if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $val = $this->principalCollectionSet; - // Ensuring all collections end with a slash - foreach($val as $k=>$v) $val[$k] = $v . '/'; - $returnedProperties[200]['{DAV:}principal-collection-set'] = new Sabre_DAV_Property_HrefList($val); - - } - if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) { - - unset($requestedProperties[$index]); - if ($url = $this->getCurrentUserPrincipal()) { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF, $url . '/'); - } else { - $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::UNAUTHENTICATED); - } - - } - if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) { - - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Sabre_DAVACL_Property_SupportedPrivilegeSet($this->getSupportedPrivilegeSet()); - - } - if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) { - $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null; - unset($requestedProperties[$index]); - } else { - $val = $this->getCurrentUserPrivilegeSet($node); - if (!is_null($val)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Sabre_DAVACL_Property_CurrentUserPrivilegeSet($val); - } - } - - } - - /* The ACL property contains all the permissions */ - if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) { - - if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) { - - unset($requestedProperties[$index]); - $returnedProperties[403]['{DAV:}acl'] = null; - - } else { - - $acl = $this->getACL($node); - if (!is_null($acl)) { - unset($requestedProperties[$index]); - $returnedProperties[200]['{DAV:}acl'] = new Sabre_DAVACL_Property_Acl($this->getACL($node)); - } - - } - - } - - } - - /** - * This method intercepts PROPPATCH methods and make sure the - * group-member-set is updated correctly. - * - * @param array $propertyDelta - * @param array $result - * @param Sabre_DAV_INode $node - * @return void - */ - public function updateProperties(&$propertyDelta, &$result, Sabre_DAV_INode $node) { - - if (!array_key_exists('{DAV:}group-member-set', $propertyDelta)) - return; - - if (is_null($propertyDelta['{DAV:}group-member-set'])) { - $memberSet = array(); - } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof Sabre_DAV_Property_HrefList) { - $memberSet = $propertyDelta['{DAV:}group-member-set']->getHrefs(); - } else { - throw new Sabre_DAV_Exception('The group-member-set property MUST be an instance of Sabre_DAV_Property_HrefList or null'); - } - - if (!($node instanceof Sabre_DAVACL_IPrincipal)) { - $result[403]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - // Returning false will stop the updateProperties process - return false; - } - - $node->setGroupMemberSet($memberSet); - - $result[200]['{DAV:}group-member-set'] = null; - unset($propertyDelta['{DAV:}group-member-set']); - - } - - /** - * This method handels HTTP REPORT requests - * - * @param string $reportName - * @param DOMNode $dom - * @return void - */ - public function report($reportName, $dom) { - - switch($reportName) { - - case '{DAV:}principal-property-search' : - $this->principalPropertySearchReport($dom); - return false; - case '{DAV:}principal-search-property-set' : - $this->principalSearchPropertySetReport($dom); - return false; - case '{DAV:}expand-property' : - $this->expandPropertyReport($dom); - return false; - - } - - } - - /** - * This event is triggered for any HTTP method that is not known by the - * webserver. - * - * @param string $method - * @param string $uri - * @return void - */ - public function unknownMethod($method, $uri) { - - if ($method!=='ACL') return; - - $this->httpACL($uri); - return false; - - } - - /** - * This method is responsible for handling the 'ACL' event. - * - * @param string $uri - * @return void - */ - public function httpACL($uri) { - - $body = $this->server->httpRequest->getBody(true); - $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body); - - $newAcl = - Sabre_DAVACL_Property_Acl::unserialize($dom->firstChild) - ->getPrivileges(); - - // Normalizing urls - foreach($newAcl as $k=>$newAce) { - $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']); - } - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_DAVACL_IACL)) { - throw new Sabre_DAV_Exception_MethodNotAllowed('This node does not support the ACL method'); - } - - $oldAcl = $this->getACL($node); - - $supportedPrivileges = $this->getFlatPrivilegeSet(); - - /* Checking if protected principals from the existing principal set are - not overwritten. */ - foreach($oldAcl as $k=>$oldAce) { - - if (!isset($oldAce['protected']) || !$oldAce['protected']) continue; - - $found = false; - foreach($newAcl as $newAce) { - if ( - $newAce['privilege'] === $oldAce['privilege'] && - $newAce['principal'] === $oldAce['principal'] && - $newAce['protected'] - ) - $found = true; - } - - if (!$found) - throw new Sabre_DAVACL_Exception_AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request'); - - } - - foreach($newAcl as $k=>$newAce) { - - // Do we recognize the privilege - if (!isset($supportedPrivileges[$newAce['privilege']])) { - throw new Sabre_DAVACL_Exception_NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server'); - } - - if ($supportedPrivileges[$newAce['privilege']]['abstract']) { - throw new Sabre_DAVACL_Exception_NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege'); - } - - // Looking up the principal - try { - $principal = $this->server->tree->getNodeForPath($newAce['principal']); - } catch (Sabre_DAV_Exception_FileNotFound $e) { - throw new Sabre_DAVACL_Exception_NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist'); - } - if (!($principal instanceof Sabre_DAVACL_IPrincipal)) { - throw new Sabre_DAVACL_Exception_NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal'); - } - - } - $node->setACL($newAcl); - - } - - /* }}} */ - - /* Reports {{{ */ - - /** - * The expand-property report is defined in RFC3253 section 3-8. - * - * This report is very similar to a standard PROPFIND. The difference is - * that it has the additional ability to look at properties containing a - * {DAV:}href element, follow that property and grab additional elements - * there. - * - * Other rfc's, such as ACL rely on this report, so it made sense to put - * it in this plugin. - * - * @param DOMElement $dom - * @return void - */ - protected function expandPropertyReport($dom) { - - $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild); - $depth = $this->server->getHTTPDepth(0); - $requestUri = $this->server->getRequestUri(); - - $result = $this->expandProperties($requestUri,$requestedProperties,$depth); - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $multiStatus = $dom->createElement('d:multistatus'); - $dom->appendChild($multiStatus); - - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); - - } - - foreach($result as $response) { - $response->serialize($this->server, $multiStatus); - } - - $xml = $dom->saveXML(); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->sendBody($xml); - - } - - /** - * This method is used by expandPropertyReport to parse - * out the entire HTTP request. - * - * @param DOMElement $node - * @return array - */ - protected function parseExpandPropertyReportRequest($node) { - - $requestedProperties = array(); - do { - - if (Sabre_DAV_XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue; - - if ($node->firstChild) { - - $children = $this->parseExpandPropertyReportRequest($node->firstChild); - - } else { - - $children = array(); - - } - - $namespace = $node->getAttribute('namespace'); - if (!$namespace) $namespace = 'DAV:'; - - $propName = '{'.$namespace.'}' . $node->getAttribute('name'); - $requestedProperties[$propName] = $children; - - } while ($node = $node->nextSibling); - - return $requestedProperties; - - } - - /** - * This method expands all the properties and returns - * a list with property values - * - * @param array $path - * @param array $requestedProperties the list of required properties - * @param array $depth - */ - protected function expandProperties($path,array $requestedProperties,$depth) { - - $foundProperties = $this->server->getPropertiesForPath($path,array_keys($requestedProperties),$depth); - - $result = array(); - - foreach($foundProperties as $node) { - - foreach($requestedProperties as $propertyName=>$childRequestedProperties) { - - // We're only traversing if sub-properties were requested - if(count($childRequestedProperties)===0) continue; - - // We only have to do the expansion if the property was found - // and it contains an href element. - if (!array_key_exists($propertyName,$node[200])) continue; - - if ($node[200][$propertyName] instanceof Sabre_DAV_Property_IHref) { - $hrefs = array($node[200][$propertyName]->getHref()); - } elseif ($node[200][$propertyName] instanceof Sabre_DAV_Property_HrefList) { - $hrefs = $node[200][$propertyName]->getHrefs(); - } - - $childProps = array(); - foreach($hrefs as $href) { - $childProps = array_merge($childProps, $this->expandProperties($href,$childRequestedProperties,0)); - } - $node[200][$propertyName] = new Sabre_DAV_Property_ResponseList($childProps); - - } - $result[] = new Sabre_DAV_Property_Response($path, $node); - - } - - return $result; - - } - - /** - * principalSearchPropertySetReport - * - * This method responsible for handing the - * {DAV:}principal-search-property-set report. This report returns a list - * of properties the client may search on, using the - * {DAV:}principal-property-search report. - * - * @param DOMDocument $dom - * @return void - */ - protected function principalSearchPropertySetReport(DOMDocument $dom) { - - $searchProperties = array( - '{DAV:}displayname' => 'display name' - ); - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new Sabre_DAV_Exception_BadRequest('This report is only defined when Depth: 0'); - } - - if ($dom->firstChild->hasChildNodes()) - throw new Sabre_DAV_Exception_BadRequest('The principal-search-property-set report element is not allowed to have child elements'); - - $dom = new DOMDocument('1.0','utf-8'); - $dom->formatOutput = true; - $root = $dom->createElement('d:principal-search-property-set'); - $dom->appendChild($root); - // Adding in default namespaces - foreach($this->server->xmlNamespaces as $namespace=>$prefix) { - - $root->setAttribute('xmlns:' . $prefix,$namespace); - - } - - $nsList = $this->server->xmlNamespaces; - - foreach($searchProperties as $propertyName=>$description) { - - $psp = $dom->createElement('d:principal-search-property'); - $root->appendChild($psp); - - $prop = $dom->createElement('d:prop'); - $psp->appendChild($prop); - - $propName = null; - preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); - - $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]); - $prop->appendChild($currentProperty); - - $descriptionElem = $dom->createElement('d:description'); - $descriptionElem->setAttribute('xml:lang','en'); - $descriptionElem->appendChild($dom->createTextNode($description)); - $psp->appendChild($descriptionElem); - - - } - - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody($dom->saveXML()); - - } - - /** - * principalPropertySearchReport - * - * This method is reponsible for handing the - * {DAV:}principal-property-search report. This report can be used for - * clients to search for groups of principals, based on the value of one - * or more properties. - * - * @param DOMDocument $dom - * @return void - */ - protected function principalPropertySearchReport(DOMDocument $dom) { - - $searchableProperties = array( - '{DAV:}displayname' => 'display name' - - ); - - list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom); - - $result = array(); - - if ($applyToPrincipalCollectionSet) { - $uris = array(); - } else { - $uris = array($this->server->getRequestUri()); - } - - $lookupResults = array(); - foreach($uris as $uri) { - - $p = array_keys($searchProperties); - $p[] = '{DAV:}resourcetype'; - $r = $this->server->getPropertiesForPath($uri, $p, 1); - - // The first item in the results is the parent, so we get rid of it. - array_shift($r); - $lookupResults = array_merge($lookupResults, $r); - } - - $matches = array(); - - foreach($lookupResults as $lookupResult) { - - // We're only looking for principals - if (!isset($lookupResult[200]['{DAV:}resourcetype']) || - (!($lookupResult[200]['{DAV:}resourcetype'] instanceof Sabre_DAV_Property_ResourceType)) || - !$lookupResult[200]['{DAV:}resourcetype']->is('{DAV:}principal')) continue; - - foreach($searchProperties as $searchProperty=>$searchValue) { - if (!isset($searchableProperties[$searchProperty])) { - // If a property is not 'searchable', the spec dictates - // this is not a match. - continue; - } - - if (isset($lookupResult[200][$searchProperty]) && - mb_stripos($lookupResult[200][$searchProperty], $searchValue, 0, 'UTF-8')!==false) { - $matches[] = $lookupResult['href']; - } - - } - - } - - $matchProperties = array(); - - foreach($matches as $match) { - - list($result) = $this->server->getPropertiesForPath($match, $requestedProperties, 0); - $matchProperties[] = $result; - - } - - $xml = $this->server->generateMultiStatus($matchProperties); - $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); - $this->server->httpResponse->sendStatus(207); - $this->server->httpResponse->sendBody($xml); - - } - - /** - * parsePrincipalPropertySearchReportRequest - * - * This method parses the request body from a - * {DAV:}principal-property-search report. - * - * This method returns an array with two elements: - * 1. an array with properties to search on, and their values - * 2. a list of propertyvalues that should be returned for the request. - * - * @param DOMDocument $dom - * @return array - */ - protected function parsePrincipalPropertySearchReportRequest($dom) { - - $httpDepth = $this->server->getHTTPDepth(0); - if ($httpDepth!==0) { - throw new Sabre_DAV_Exception_BadRequest('This report is only defined when Depth: 0'); - } - - $searchProperties = array(); - - $applyToPrincipalCollectionSet = false; - - // Parsing the search request - foreach($dom->firstChild->childNodes as $searchNode) { - - if (Sabre_DAV_XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') - $applyToPrincipalCollectionSet = true; - - if (Sabre_DAV_XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search') - continue; - - $propertyName = null; - $propertyValue = null; - - foreach($searchNode->childNodes as $childNode) { - - switch(Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { - - case '{DAV:}prop' : - $property = Sabre_DAV_XMLUtil::parseProperties($searchNode); - reset($property); - $propertyName = key($property); - break; - - case '{DAV:}match' : - $propertyValue = $childNode->textContent; - break; - - } - - - } - - if (is_null($propertyName) || is_null($propertyValue)) - throw new Sabre_DAV_Exception_BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue); - - $searchProperties[$propertyName] = $propertyValue; - - } - - return array($searchProperties, array_keys(Sabre_DAV_XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet); - - } - - - /* }}} */ - -} diff --git a/3rdparty/Sabre/DAVACL/Principal.php b/3rdparty/Sabre/DAVACL/Principal.php deleted file mode 100644 index 790603c900f..00000000000 --- a/3rdparty/Sabre/DAVACL/Principal.php +++ /dev/null @@ -1,263 +0,0 @@ -principalBackend = $principalBackend; - $this->principalProperties = $principalProperties; - - } - - /** - * Returns the full principal url - * - * @return string - */ - public function getPrincipalUrl() { - - return $this->principalProperties['uri']; - - } - - /** - * Returns a list of altenative urls for a principal - * - * This can for example be an email address, or ldap url. - * - * @return array - */ - public function getAlternateUriSet() { - - $uris = array(); - if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) { - - $uris = $this->principalProperties['{DAV:}alternate-URI-set']; - - } - - if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) { - $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address']; - } - - return array_unique($uris); - - } - - /** - * Returns the list of group members - * - * If this principal is a group, this function should return - * all member principal uri's for the group. - * - * @return array - */ - public function getGroupMemberSet() { - - return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']); - - } - - /** - * Returns the list of groups this principal is member of - * - * If this principal is a member of a (list of) groups, this function - * should return a list of principal uri's for it's members. - * - * @return array - */ - public function getGroupMembership() { - - return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']); - - } - - - /** - * Sets a list of group members - * - * If this principal is a group, this method sets all the group members. - * The list of members is always overwritten, never appended to. - * - * This method should throw an exception if the members could not be set. - * - * @param array $principals - * @return void - */ - public function setGroupMemberSet(array $groupMembers) { - - $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers); - - } - - - /** - * Returns this principals name. - * - * @return string - */ - public function getName() { - - $uri = $this->principalProperties['uri']; - list(, $name) = Sabre_DAV_URLUtil::splitPath($uri); - - return $name; - - } - - /** - * Returns the name of the user - * - * @return void - */ - public function getDisplayName() { - - if (isset($this->principalProperties['{DAV:}displayname'])) { - return $this->principalProperties['{DAV:}displayname']; - } else { - return $this->getName(); - } - - } - - /** - * Returns a list of properties - * - * @param array $requestedProperties - * @return void - */ - public function getProperties($requestedProperties) { - - $newProperties = array(); - foreach($requestedProperties as $propName) { - - if (isset($this->principalProperties[$propName])) { - $newProperties[$propName] = $this->principalProperties[$propName]; - } - - } - - return $newProperties; - - } - - /** - * Updates this principals properties. - * - * Currently this is not supported - * - * @param array $properties - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateProperties($properties) { - - return false; - - } - - /** - * Returns the owner principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getOwner() { - - return $this->principalProperties['uri']; - - - } - - /** - * Returns a group principal - * - * This must be a url to a principal, or null if there's no owner - * - * @return string|null - */ - public function getGroup() { - - return null; - - } - - /** - * Returns a list of ACE's for this node. - * - * Each ACE has the following properties: - * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are - * currently the only supported privileges - * * 'principal', a url to the principal who owns the node - * * 'protected' (optional), indicating that this ACE is not allowed to - * be updated. - * - * @return array - */ - public function getACL() { - - return array( - array( - 'privilege' => '{DAV:}read', - 'principal' => $this->principalProperties['uri'], - 'protected' => true, - ), - ); - - } - - /** - * Updates the ACL - * - * This method will receive a list of new ACE's. - * - * @param array $acl - * @return void - */ - public function setACL(array $acl) { - - throw new Sabre_DAV_Exception_MethodNotAllowed('Updating ACLs is not allowed here'); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php b/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php deleted file mode 100644 index 55bd1903c9b..00000000000 --- a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php +++ /dev/null @@ -1,206 +0,0 @@ -pdo = $pdo; - $this->tableName = $tableName; - $this->groupMembersTableName = $groupMembersTableName; - - } - - - /** - * Returns a list of principals based on a prefix. - * - * This prefix will often contain something like 'principals'. You are only - * expected to return principals that are in this base path. - * - * You are expected to return at least a 'uri' for every user, you can - * return any additional properties if you wish so. Common properties are: - * {DAV:}displayname - * {http://sabredav.org/ns}email-address - This is a custom SabreDAV - * field that's actualy injected in a number of other properties. If - * you have an email address, use this property. - * - * @param string $prefixPath - * @return array - */ - public function getPrincipalsByPrefix($prefixPath) { - $result = $this->pdo->query('SELECT uri, email, displayname FROM `'. $this->tableName . '`'); - - $principals = array(); - - while($row = $result->fetch(PDO::FETCH_ASSOC)) { - - // Checking if the principal is in the prefix - list($rowPrefix) = Sabre_DAV_URLUtil::splitPath($row['uri']); - if ($rowPrefix !== $prefixPath) continue; - - $principals[] = array( - 'uri' => $row['uri'], - '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']), - '{http://sabredav.org/ns}email-address' => $row['email'], - ); - - } - - return $principals; - - } - - /** - * Returns a specific principal, specified by it's path. - * The returned structure should be the exact same as from - * getPrincipalsByPrefix. - * - * @param string $path - * @return array - */ - public function getPrincipalByPath($path) { - - $stmt = $this->pdo->prepare('SELECT id, uri, email, displayname FROM `'.$this->tableName.'` WHERE uri = ?'); - $stmt->execute(array($path)); - - $users = array(); - - $row = $stmt->fetch(PDO::FETCH_ASSOC); - if (!$row) return; - - return array( - 'id' => $row['id'], - 'uri' => $row['uri'], - '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']), - '{http://sabredav.org/ns}email-address' => $row['email'], - ); - - } - - /** - * Returns the list of members for a group-principal - * - * @param string $principal - * @return array - */ - public function getGroupMemberSet($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM `'.$this->groupMembersTableName.'` AS groupmembers LEFT JOIN `'.$this->tableName.'` AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Returns the list of groups a principal is a member of - * - * @param string $principal - * @return array - */ - public function getGroupMembership($principal) { - - $principal = $this->getPrincipalByPath($principal); - if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); - - $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM `'.$this->groupMembersTableName.'` AS groupmembers LEFT JOIN `'.$this->tableName.'` AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?'); - $stmt->execute(array($principal['id'])); - - $result = array(); - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $result[] = $row['uri']; - } - return $result; - - } - - /** - * Updates the list of group members for a group principal. - * - * The principals should be passed as a list of uri's. - * - * @param string $principal - * @param array $members - * @return void - */ - public function setGroupMemberSet($principal, array $members) { - - // Grabbing the list of principal id's. - $stmt = $this->pdo->prepare('SELECT id, uri FROM `'.$this->tableName.'` WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');'); - $stmt->execute(array_merge(array($principal), $members)); - - $memberIds = array(); - $principalId = null; - - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - if ($row['uri'] == $principal) { - $principalId = $row['id']; - } else { - $memberIds[] = $row['id']; - } - } - if (!$principalId) throw new Sabre_DAV_Exception('Principal not found'); - - // Wiping out old members - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->groupMembersTableName.'` WHERE principal_id = ?;'); - $stmt->execute(array($principalId)); - - foreach($memberIds as $memberId) { - - $stmt = $this->pdo->prepare('INSERT INTO `'.$this->groupMembersTableName.'` (principal_id, member_id) VALUES (?, ?);'); - $stmt->execute(array($principalId, $memberId)); - - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/PrincipalCollection.php b/3rdparty/Sabre/DAVACL/PrincipalCollection.php deleted file mode 100644 index 4d22bf8aa75..00000000000 --- a/3rdparty/Sabre/DAVACL/PrincipalCollection.php +++ /dev/null @@ -1,35 +0,0 @@ -principalBackend, $principal); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/Acl.php b/3rdparty/Sabre/DAVACL/Property/Acl.php deleted file mode 100644 index e41e7411310..00000000000 --- a/3rdparty/Sabre/DAVACL/Property/Acl.php +++ /dev/null @@ -1,186 +0,0 @@ -privileges = $privileges; - $this->prefixBaseUrl = $prefixBaseUrl; - - } - - /** - * Returns the list of privileges for this property - * - * @return array - */ - public function getPrivileges() { - - return $this->privileges; - - } - - /** - * Serializes the property into a DOMElement - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $ace) { - - $this->serializeAce($doc, $node, $ace, $server); - - } - - } - - /** - * Unserializes the {DAV:}acl xml element. - * - * @param DOMElement $dom - * @return Sabre_DAVACL_Property_Acl - */ - static public function unserialize(DOMElement $dom) { - - $privileges = array(); - $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); - for($ii=0; $ii < $xaces->length; $ii++) { - - $xace = $xaces->item($ii); - $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); - if ($principal->length !== 1) { - throw new Sabre_DAV_Exception_BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); - } - $principal = Sabre_DAVACL_Property_Principal::unserialize($principal->item(0)); - - if ($principal->getType()!==Sabre_DAVACL_Property_Principal::HREF) { - throw new Sabre_DAV_Exception_NotImplemented('Currently only uri based principals are support, {DAV:}all, {DAV:}unauthenticated and {DAV:}authenticated are not implemented yet'); - } - - $principal = $principal->getHref(); - $protected = false; - - if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { - $protected = true; - } - - $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); - if ($grants->length < 1) { - throw new Sabre_DAV_Exception_NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); - } - $grant = $grants->item(0); - - $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); - for($jj=0; $jj<$xprivs->length; $jj++) { - - $xpriv = $xprivs->item($jj); - - $privilegeName = null; - - for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { - - $childNode = $xpriv->childNodes->item($kk); - if ($t = Sabre_DAV_XMLUtil::toClarkNotation($childNode)) { - $privilegeName = $t; - break; - } - } - if (is_null($privilegeName)) { - throw new Sabre_DAV_Exception_BadRequest('{DAV:}privilege elements must have a privilege element contained within them.'); - } - - $privileges[] = array( - 'principal' => $principal, - 'protected' => $protected, - 'privilege' => $privilegeName, - ); - - } - - } - - return new self($privileges); - - } - - /** - * Serializes a single access control entry. - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param array $ace - * @param Sabre_DAV_Server $server - * @return void - */ - private function serializeAce($doc,$node,$ace, $server) { - - $xace = $doc->createElementNS('DAV:','d:ace'); - $node->appendChild($xace); - - $principal = $doc->createElementNS('DAV:','d:principal'); - $xace->appendChild($principal); - $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/')); - - $grant = $doc->createElementNS('DAV:','d:grant'); - $xace->appendChild($grant); - - $privParts = null; - - preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts); - - $xprivilege = $doc->createElementNS('DAV:','d:privilege'); - $grant->appendChild($xprivilege); - - $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($ace['protected']) && $ace['protected']) - $xace->appendChild($doc->createElement('d:protected')); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php deleted file mode 100644 index 72274597b31..00000000000 --- a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php +++ /dev/null @@ -1,75 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property in the DOM - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - foreach($this->privileges as $privName) { - - $this->serializePriv($doc,$node,$privName); - - } - - } - - /** - * Serializes one privilege - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param string $privName - * @return void - */ - protected function serializePriv($doc,$node,$privName) { - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $node->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/Principal.php b/3rdparty/Sabre/DAVACL/Property/Principal.php deleted file mode 100644 index dad9a3550fb..00000000000 --- a/3rdparty/Sabre/DAVACL/Property/Principal.php +++ /dev/null @@ -1,154 +0,0 @@ -type = $type; - - if ($type===self::HREF && is_null($href)) { - throw new Sabre_DAV_Exception('The href argument must be specified for the HREF principal type.'); - } - $this->href = $href; - - } - - /** - * Returns the principal type - * - * @return int - */ - public function getType() { - - return $this->type; - - } - - /** - * Returns the principal uri. - * - * @return string - */ - public function getHref() { - - return $this->href; - - } - - /** - * Serializes the property into a DOMElement. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server, DOMElement $node) { - - $prefix = $server->xmlNamespaces['DAV:']; - switch($this->type) { - - case self::UNAUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':unauthenticated') - ); - break; - case self::AUTHENTICATED : - $node->appendChild( - $node->ownerDocument->createElement($prefix . ':authenticated') - ); - break; - case self::HREF : - $href = $node->ownerDocument->createElement($prefix . ':href'); - $href->nodeValue = $server->getBaseUri() . $this->href; - $node->appendChild($href); - break; - - } - - } - - /** - * Deserializes a DOM element into a property object. - * - * @param DOMElement $dom - * @return Sabre_DAV_Property_Principal - */ - static public function unserialize(DOMElement $dom) { - - $parent = $dom->firstChild; - while(!Sabre_DAV_XMLUtil::toClarkNotation($parent)) { - $parent = $parent->nextSibling; - } - - switch(Sabre_DAV_XMLUtil::toClarkNotation($parent)) { - - case '{DAV:}unauthenticated' : - return new self(self::UNAUTHENTICATED); - case '{DAV:}authenticated' : - return new self(self::AUTHENTICATED); - case '{DAV:}href': - return new self(self::HREF, $parent->textContent); - default : - throw new Sabre_DAV_Exception_BadRequest('Unexpected element (' . Sabre_DAV_XMLUtil::toClarkNotation($parent) . '). Could not deserialize'); - - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php deleted file mode 100644 index 93c3895035d..00000000000 --- a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php +++ /dev/null @@ -1,92 +0,0 @@ -privileges = $privileges; - - } - - /** - * Serializes the property into a domdocument. - * - * @param Sabre_DAV_Server $server - * @param DOMElement $node - * @return void - */ - public function serialize(Sabre_DAV_Server $server,DOMElement $node) { - - $doc = $node->ownerDocument; - $this->serializePriv($doc, $node, $this->privileges); - - } - - /** - * Serializes a property - * - * This is a recursive function. - * - * @param DOMDocument $doc - * @param DOMElement $node - * @param array $privilege - * @return void - */ - private function serializePriv($doc,$node,$privilege) { - - $xsp = $doc->createElementNS('DAV:','d:supported-privilege'); - $node->appendChild($xsp); - - $xp = $doc->createElementNS('DAV:','d:privilege'); - $xsp->appendChild($xp); - - $privParts = null; - preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts); - - $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); - - if (isset($privilege['abstract']) && $privilege['abstract']) { - $xsp->appendChild($doc->createElementNS('DAV:','d:abstract')); - } - - if (isset($privilege['description'])) { - $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description'])); - } - - if (isset($privilege['aggregates'])) { - foreach($privilege['aggregates'] as $subPrivilege) { - $this->serializePriv($doc,$xsp,$subPrivilege); - } - } - - } - -} diff --git a/3rdparty/Sabre/DAVACL/Version.php b/3rdparty/Sabre/DAVACL/Version.php deleted file mode 100644 index 124463e311e..00000000000 --- a/3rdparty/Sabre/DAVACL/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -httpRequest->getHeader('Authorization'); - $authHeader = explode(' ',$authHeader); - - if ($authHeader[0]!='AWS' || !isset($authHeader[1])) { - $this->errorCode = self::ERR_NOAWSHEADER; - return false; - } - - list($this->accessKey,$this->signature) = explode(':',$authHeader[1]); - - return true; - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getAccessKey() { - - return $this->accessKey; - - } - - /** - * Validates the signature based on the secretKey - * - * @return bool - */ - public function validate($secretKey) { - - $contentMD5 = $this->httpRequest->getHeader('Content-MD5'); - - if ($contentMD5) { - // We need to validate the integrity of the request - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - - if ($contentMD5!=base64_encode(md5($body,true))) { - // content-md5 header did not match md5 signature of body - $this->errorCode = self::ERR_MD5CHECKSUMWRONG; - return false; - } - - } - - if (!$requestDate = $this->httpRequest->getHeader('x-amz-date')) - $requestDate = $this->httpRequest->getHeader('Date'); - - if (!$this->validateRFC2616Date($requestDate)) - return false; - - $amzHeaders = $this->getAmzHeaders(); - - $signature = base64_encode( - $this->hmacsha1($secretKey, - $this->httpRequest->getMethod() . "\n" . - $contentMD5 . "\n" . - $this->httpRequest->getHeader('Content-type') . "\n" . - $requestDate . "\n" . - $amzHeaders . - $this->httpRequest->getURI() - ) - ); - - if ($this->signature != $signature) { - - $this->errorCode = self::ERR_INVALIDSIGNATURE; - return false; - - } - - return true; - - } - - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','AWS'); - $this->httpResponse->sendStatus(401); - - } - - /** - * Makes sure the supplied value is a valid RFC2616 date. - * - * If we would just use strtotime to get a valid timestamp, we have no way of checking if a - * user just supplied the word 'now' for the date header. - * - * This function also makes sure the Date header is within 15 minutes of the operating - * system date, to prevent replay attacks. - * - * @param string $dateHeader - * @return bool - */ - protected function validateRFC2616Date($dateHeader) { - - $date = Sabre_HTTP_Util::parseHTTPDate($dateHeader); - - // Unknown format - if (!$date) { - $this->errorCode = self::ERR_INVALIDDATEFORMAT; - return false; - } - - $min = new DateTime('-15 minutes'); - $max = new DateTime('+15 minutes'); - - // We allow 15 minutes around the current date/time - if ($date > $max || $date < $min) { - $this->errorCode = self::ERR_REQUESTTIMESKEWED; - return false; - } - - return $date; - - } - - /** - * Returns a list of AMZ headers - * - * @return void - */ - protected function getAmzHeaders() { - - $amzHeaders = array(); - $headers = $this->httpRequest->getHeaders(); - foreach($headers as $headerName => $headerValue) { - if (strpos(strtolower($headerName),'x-amz-')===0) { - $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n"; - } - } - ksort($amzHeaders); - - $headerStr = ''; - foreach($amzHeaders as $h=>$v) { - $headerStr.=$h.':'.$v; - } - - return $headerStr; - - } - - /** - * Generates an HMAC-SHA1 signature - * - * @param string $key - * @param string $message - * @return string - */ - private function hmacsha1($key, $message) { - - $blocksize=64; - if (strlen($key)>$blocksize) - $key=pack('H*', sha1($key)); - $key=str_pad($key,$blocksize,chr(0x00)); - $ipad=str_repeat(chr(0x36),$blocksize); - $opad=str_repeat(chr(0x5c),$blocksize); - $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message)))); - return $hmac; - - } - -} diff --git a/3rdparty/Sabre/HTTP/AbstractAuth.php b/3rdparty/Sabre/HTTP/AbstractAuth.php deleted file mode 100644 index eb528f6fdee..00000000000 --- a/3rdparty/Sabre/HTTP/AbstractAuth.php +++ /dev/null @@ -1,111 +0,0 @@ -httpResponse = new Sabre_HTTP_Response(); - $this->httpRequest = new Sabre_HTTP_Request(); - - } - - /** - * Sets an alternative HTTP response object - * - * @param Sabre_HTTP_Response $response - * @return void - */ - public function setHTTPResponse(Sabre_HTTP_Response $response) { - - $this->httpResponse = $response; - - } - - /** - * Sets an alternative HTTP request object - * - * @param Sabre_HTTP_Request $request - * @return void - */ - public function setHTTPRequest(Sabre_HTTP_Request $request) { - - $this->httpRequest = $request; - - } - - - /** - * Sets the realm - * - * The realm is often displayed in authentication dialog boxes - * Commonly an application name displayed here - * - * @param string $realm - * @return void - */ - public function setRealm($realm) { - - $this->realm = $realm; - - } - - /** - * Returns the realm - * - * @return string - */ - public function getRealm() { - - return $this->realm; - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - abstract public function requireLogin(); - -} diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php deleted file mode 100644 index 35c22d22dc3..00000000000 --- a/3rdparty/Sabre/HTTP/BasicAuth.php +++ /dev/null @@ -1,61 +0,0 @@ -httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) { - - return array($user,$pass); - - } - - // Most other webservers - $auth = $this->httpRequest->getHeader('Authorization'); - - if (!$auth) return false; - - if (strpos(strtolower($auth),'basic')!==0) return false; - - return explode(':', base64_decode(substr($auth, 6))); - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"'); - $this->httpResponse->sendStatus(401); - - } - -} diff --git a/3rdparty/Sabre/HTTP/DigestAuth.php b/3rdparty/Sabre/HTTP/DigestAuth.php deleted file mode 100644 index 5e755929571..00000000000 --- a/3rdparty/Sabre/HTTP/DigestAuth.php +++ /dev/null @@ -1,234 +0,0 @@ -nonce = uniqid(); - $this->opaque = md5($this->realm); - parent::__construct(); - - } - - /** - * Gathers all information from the headers - * - * This method needs to be called prior to anything else. - * - * @return void - */ - public function init() { - - $digest = $this->getDigest(); - $this->digestParts = $this->parseDigest($digest); - - } - - /** - * Sets the quality of protection value. - * - * Possible values are: - * Sabre_HTTP_DigestAuth::QOP_AUTH - * Sabre_HTTP_DigestAuth::QOP_AUTHINT - * - * Multiple values can be specified using logical OR. - * - * QOP_AUTHINT ensures integrity of the request body, but this is not - * supported by most HTTP clients. QOP_AUTHINT also requires the entire - * request body to be md5'ed, which can put strains on CPU and memory. - * - * @param int $qop - * @return void - */ - public function setQOP($qop) { - - $this->qop = $qop; - - } - - /** - * Validates the user. - * - * The A1 parameter should be md5($username . ':' . $realm . ':' . $password); - * - * @param string $A1 - * @return bool - */ - public function validateA1($A1) { - - $this->A1 = $A1; - return $this->validate(); - - } - - /** - * Validates authentication through a password. The actual password must be provided here. - * It is strongly recommended not store the password in plain-text and use validateA1 instead. - * - * @param string $password - * @return bool - */ - public function validatePassword($password) { - - $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password); - return $this->validate(); - - } - - /** - * Returns the username for the request - * - * @return string - */ - public function getUsername() { - - return $this->digestParts['username']; - - } - - /** - * Validates the digest challenge - * - * @return bool - */ - protected function validate() { - - $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri']; - - if ($this->digestParts['qop']=='auth-int') { - // Making sure we support this qop value - if (!($this->qop & self::QOP_AUTHINT)) return false; - // We need to add an md5 of the entire request body to the A2 part of the hash - $body = $this->httpRequest->getBody(true); - $this->httpRequest->setBody($body,true); - $A2 .= ':' . md5($body); - } else { - - // We need to make sure we support this qop value - if (!($this->qop & self::QOP_AUTH)) return false; - } - - $A2 = md5($A2); - - $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}"); - - return $this->digestParts['response']==$validResponse; - - - } - - /** - * Returns an HTTP 401 header, forcing login - * - * This should be called when username and password are incorrect, or not supplied at all - * - * @return void - */ - public function requireLogin() { - - $qop = ''; - switch($this->qop) { - case self::QOP_AUTH : $qop = 'auth'; break; - case self::QOP_AUTHINT : $qop = 'auth-int'; break; - case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break; - } - - $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"'); - $this->httpResponse->sendStatus(401); - - } - - - /** - * This method returns the full digest string. - * - * It should be compatibile with mod_php format and other webservers. - * - * If the header could not be found, null will be returned - * - * @return mixed - */ - public function getDigest() { - - // mod_php - $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST'); - if ($digest) return $digest; - - // most other servers - $digest = $this->httpRequest->getHeader('Authorization'); - - if ($digest && strpos(strtolower($digest),'digest')===0) { - return substr($digest,7); - } else { - return null; - } - - } - - - /** - * Parses the different pieces of the digest string into an array. - * - * This method returns false if an incomplete digest was supplied - * - * @param string $digest - * @return mixed - */ - protected function parseDigest($digest) { - - // protect against missing data - $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); - $data = array(); - - preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER); - - foreach ($matches as $m) { - $data[$m[1]] = $m[2] ? $m[2] : $m[3]; - unset($needed_parts[$m[1]]); - } - - return $needed_parts ? false : $data; - - } - -} diff --git a/3rdparty/Sabre/HTTP/Request.php b/3rdparty/Sabre/HTTP/Request.php deleted file mode 100644 index 95a64171aab..00000000000 --- a/3rdparty/Sabre/HTTP/Request.php +++ /dev/null @@ -1,243 +0,0 @@ -_SERVER = $serverData; - else $this->_SERVER =& $_SERVER; - - } - - /** - * Returns the value for a specific http header. - * - * This method returns null if the header did not exist. - * - * @param string $name - * @return string - */ - public function getHeader($name) { - - $name = strtoupper(str_replace(array('-'),array('_'),$name)); - if (isset($this->_SERVER['HTTP_' . $name])) { - return $this->_SERVER['HTTP_' . $name]; - } - - // There's a few headers that seem to end up in the top-level - // server array. - switch($name) { - case 'CONTENT_TYPE' : - case 'CONTENT_LENGTH' : - if (isset($this->_SERVER[$name])) { - return $this->_SERVER[$name]; - } - break; - - } - return; - - } - - /** - * Returns all (known) HTTP headers. - * - * All headers are converted to lower-case, and additionally all underscores - * are automatically converted to dashes - * - * @return array - */ - public function getHeaders() { - - $hdrs = array(); - foreach($this->_SERVER as $key=>$value) { - - switch($key) { - case 'CONTENT_LENGTH' : - case 'CONTENT_TYPE' : - $hdrs[strtolower(str_replace('_','-',$key))] = $value; - break; - default : - if (strpos($key,'HTTP_')===0) { - $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value; - } - break; - } - - } - - return $hdrs; - - } - - /** - * Returns the HTTP request method - * - * This is for example POST or GET - * - * @return string - */ - public function getMethod() { - - return $this->_SERVER['REQUEST_METHOD']; - - } - - /** - * Returns the requested uri - * - * @return string - */ - public function getUri() { - - return $this->_SERVER['REQUEST_URI']; - - } - - /** - * Will return protocol + the hostname + the uri - * - * @return void - */ - public function getAbsoluteUri() { - - // Checking if the request was made through HTTPS. The last in line is for IIS - $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off'); - return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri(); - - } - - /** - * Returns everything after the ? from the current url - * - * @return string - */ - public function getQueryString() { - - return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:''; - - } - - /** - * Returns the HTTP request body body - * - * This method returns a readable stream resource. - * If the asString parameter is set to true, a string is sent instead. - * - * @param bool asString - * @return resource - */ - public function getBody($asString = false) { - - if (is_null($this->body)) { - if (!is_null(self::$defaultInputStream)) { - $this->body = self::$defaultInputStream; - } else { - $this->body = fopen('php://input','r'); - self::$defaultInputStream = $this->body; - } - } - if ($asString) { - $body = stream_get_contents($this->body); - return $body; - } else { - return $this->body; - } - - } - - /** - * Sets the contents of the HTTP request body - * - * This method can either accept a string, or a readable stream resource. - * - * If the setAsDefaultInputStream is set to true, it means for this run of the - * script the supplied body will be used instead of php://input. - * - * @param mixed $body - * @param bool $setAsDefaultInputStream - * @return void - */ - public function setBody($body,$setAsDefaultInputStream = false) { - - if(is_resource($body)) { - $this->body = $body; - } else { - - $stream = fopen('php://temp','r+'); - fputs($stream,$body); - rewind($stream); - // String is assumed - $this->body = $stream; - } - if ($setAsDefaultInputStream) { - self::$defaultInputStream = $this->body; - } - - } - - /** - * Returns a specific item from the _SERVER array. - * - * Do not rely on this feature, it is for internal use only. - * - * @param string $field - * @return string - */ - public function getRawServerValue($field) { - - return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; - - } - -} - diff --git a/3rdparty/Sabre/HTTP/Response.php b/3rdparty/Sabre/HTTP/Response.php deleted file mode 100644 index dce6feac553..00000000000 --- a/3rdparty/Sabre/HTTP/Response.php +++ /dev/null @@ -1,152 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authorative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC 4918 - 208 => 'Already Reported', // RFC 5842 - 226 => 'IM Used', // RFC 3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Reserved', - 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', - 418 => 'I\'m a teapot', // RFC 2324 - 422 => 'Unprocessable Entity', // RFC 4918 - 423 => 'Locked', // RFC 4918 - 424 => 'Failed Dependency', // RFC 4918 - 426 => 'Upgrade required', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version not supported', - 506 => 'Variant Also Negotiates', - 507 => 'Unsufficient Storage', // RFC 4918 - 508 => 'Loop Detected', // RFC 5842 - 509 => 'Bandwidth Limit Exceeded', // non-standard - 510 => 'Not extended', - ); - - return 'HTTP/1.1 ' . $code . ' ' . $msg[$code]; - - } - - /** - * Sends an HTTP status header to the client - * - * @param int $code HTTP status code - * @return void - */ - public function sendStatus($code) { - - if (!headers_sent()) - return header($this->getStatusMessage($code)); - else return false; - - } - - /** - * Sets an HTTP header for the response - * - * @param string $name - * @param string $value - * @return void - */ - public function setHeader($name, $value, $replace = true) { - - $value = str_replace(array("\r","\n"),array('\r','\n'),$value); - if (!headers_sent()) - return header($name . ': ' . $value, $replace); - else return false; - - } - - /** - * Sets a bunch of HTTP Headers - * - * headersnames are specified as keys, value in the array value - * - * @param array $headers - * @return void - */ - public function setHeaders(array $headers) { - - foreach($headers as $key=>$value) - $this->setHeader($key, $value); - - } - - /** - * Sends the entire response body - * - * This method can accept either an open filestream, or a string. - * - * @param mixed $body - * @return void - */ - public function sendBody($body) { - - if (is_resource($body)) { - - fpassthru($body); - - } else { - - // We assume a string - echo $body; - - } - - } - -} diff --git a/3rdparty/Sabre/HTTP/Util.php b/3rdparty/Sabre/HTTP/Util.php deleted file mode 100644 index 8a6bd7df487..00000000000 --- a/3rdparty/Sabre/HTTP/Util.php +++ /dev/null @@ -1,65 +0,0 @@ -= 0) - return new DateTime('@' . $realDate, new DateTimeZone('UTC')); - - return false; - - } - -} diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php deleted file mode 100644 index 67be232fc26..00000000000 --- a/3rdparty/Sabre/HTTP/Version.php +++ /dev/null @@ -1,24 +0,0 @@ -name = strtoupper($name); - if (!is_null($iterator)) $this->iterator = $iterator; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = "BEGIN:" . $this->name . "\r\n"; - foreach($this->children as $child) $str.=$child->serialize(); - $str.= "END:" . $this->name . "\r\n"; - - return $str; - - } - - - /** - * Adds a new componenten or element - * - * You can call this method with the following syntaxes: - * - * add(Sabre_VObject_Element $element) - * add(string $name, $value) - * - * The first version adds an Element - * The second adds a property as a string. - * - * @param mixed $item - * @param mixed $itemValue - * @return void - */ - public function add($item, $itemValue = null) { - - if ($item instanceof Sabre_VObject_Element) { - if (!is_null($itemValue)) { - throw new InvalidArgumentException('The second argument must not be specified, when passing a VObject'); - } - $item->parent = $this; - $this->children[] = $item; - } elseif(is_string($item)) { - - if (!is_scalar($itemValue)) { - throw new InvalidArgumentException('The second argument must be scalar'); - } - $item = new Sabre_VObject_Property($item,$itemValue); - $item->parent = $this; - $this->children[] = $item; - - } else { - - throw new InvalidArgumentException('The first argument must either be a Sabre_VObject_Element or a string'); - - } - - } - - /** - * Returns an iterable list of children - * - * @return Sabre_VObject_ElementList - */ - public function children() { - - return new Sabre_VObject_ElementList($this->children); - - } - - /** - * Returns an array with elements that match the specified name. - * - * This function is also aware of MIME-Directory groups (as they appear in - * vcards). This means that if a property is grouped as "HOME.EMAIL", it - * will also be returned when searching for just "EMAIL". If you want to - * search for a property in a specific group, you can select on the entire - * string ("HOME.EMAIL"). If you want to search on a specific property that - * has not been assigned a group, specify ".EMAIL". - * - * Keys are retained from the 'children' array, which may be confusing in - * certain cases. - * - * @param string $name - * @return array - */ - public function select($name) { - - $group = null; - $name = strtoupper($name); - if (strpos($name,'.')!==false) { - list($group,$name) = explode('.', $name, 2); - } - - $result = array(); - foreach($this->children as $key=>$child) { - - if ( - strtoupper($child->name) === $name && - (is_null($group) || ( $child instanceof Sabre_VObject_Property && strtoupper($child->group) === $group)) - ) { - - $result[$key] = $child; - - } - } - - reset($result); - return $result; - - } - - /* Magic property accessors {{{ */ - - /** - * Using 'get' you will either get a propery or component, - * - * If there were no child-elements found with the specified name, - * null is returned. - * - * @param string $name - * @return void - */ - public function __get($name) { - - $matches = $this->select($name); - if (count($matches)===0) { - return null; - } else { - $firstMatch = current($matches); - $firstMatch->setIterator(new Sabre_VObject_ElementList(array_values($matches))); - return $firstMatch; - } - - } - - /** - * This method checks if a sub-element with the specified name exists. - * - * @param string $name - * @return bool - */ - public function __isset($name) { - - $matches = $this->select($name); - return count($matches)>0; - - } - - /** - * Using the setter method you can add properties or subcomponents - * - * You can either pass a Sabre_VObject_Component, Sabre_VObject_Property - * object, or a string to automatically create a Property. - * - * If the item already exists, it will be removed. If you want to add - * a new item with the same name, always use the add() method. - * - * @param string $name - * @param mixed $value - * @return void - */ - public function __set($name, $value) { - - $matches = $this->select($name); - $overWrite = count($matches)?key($matches):null; - - if ($value instanceof Sabre_VObject_Component || $value instanceof Sabre_VObject_Property) { - $value->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $value; - } else { - $this->children[] = $value; - } - } elseif (is_scalar($value)) { - $property = new Sabre_VObject_Property($name,$value); - $property->parent = $this; - if (!is_null($overWrite)) { - $this->children[$overWrite] = $property; - } else { - $this->children[] = $property; - } - } else { - throw new InvalidArgumentException('You must pass a Sabre_VObject_Component, Sabre_VObject_Property or scalar type'); - } - - } - - /** - * Removes all properties and components within this component. - * - * @param string $name - * @return void - */ - public function __unset($name) { - - $matches = $this->select($name); - foreach($matches as $k=>$child) { - - unset($this->children[$k]); - $child->parent = null; - - } - - } - - /* }}} */ - -} diff --git a/3rdparty/Sabre/VObject/Element.php b/3rdparty/Sabre/VObject/Element.php deleted file mode 100644 index 8d2b0aaacd1..00000000000 --- a/3rdparty/Sabre/VObject/Element.php +++ /dev/null @@ -1,15 +0,0 @@ -setValue($dt->format('Ymd\\THis')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case self::UTC : - $dt->setTimeZone(new DateTimeZone('UTC')); - $this->setValue($dt->format('Ymd\\THis\\Z')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case self::LOCALTZ : - $this->setValue($dt->format('Ymd\\THis')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE-TIME'); - $this->offsetSet('TZID', $dt->getTimeZone()->getName()); - break; - case self::DATE : - $this->setValue($dt->format('Ymd')); - $this->offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - $this->offsetSet('VALUE','DATE'); - break; - default : - throw new InvalidArgumentException('You must pass a valid dateType constant'); - - } - $this->dateTime = $dt; - $this->dateType = $dateType; - - } - - /** - * Returns the current DateTime value. - * - * If no value was set, this method returns null. - * - * @return DateTime|null - */ - public function getDateTime() { - - if ($this->dateTime) - return $this->dateTime; - - list( - $this->dateType, - $this->dateTime - ) = self::parseData($this->value, $this); - return $this->dateTime; - - } - - /** - * Returns the type of Date format. - * - * This method returns one of the format constants. If no date was set, - * this method will return null. - * - * @return int|null - */ - public function getDateType() { - - if ($this->dateType) - return $this->dateType; - - list( - $this->dateType, - $this->dateTime, - ) = self::parseData($this->value, $this); - return $this->dateType; - - } - - /** - * Parses the internal data structure to figure out what the current date - * and time is. - * - * The returned array contains two elements: - * 1. A 'DateType' constant (as defined on this class), or null. - * 2. A DateTime object (or null) - * - * @param string|null $propertyValue The string to parse (yymmdd or - * ymmddThhmmss, etc..) - * @param Sabre_VObject_Property|null $property The instance of the - * property we're parsing. - * @return array - */ - static public function parseData($propertyValue, Sabre_VObject_Property $property = null) { - - if (is_null($propertyValue)) { - return array(null, null); - } - - $date = '(?P[1-2][0-9]{3})(?P[0-1][0-9])(?P[0-3][0-9])'; - $time = '(?P[0-2][0-9])(?P[0-5][0-9])(?P[0-5][0-9])'; - $regex = "/^$date(T$time(?PZ)?)?$/"; - - if (!preg_match($regex, $propertyValue, $matches)) { - throw new InvalidArgumentException($propertyValue . ' is not a valid DateTime or Date string'); - } - - if (!isset($matches['hour'])) { - // Date-only - return array( - self::DATE, - new DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00'), - ); - } - - $dateStr = - $matches['year'] .'-' . - $matches['month'] . '-' . - $matches['date'] . ' ' . - $matches['hour'] . ':' . - $matches['minute'] . ':' . - $matches['second']; - - if (isset($matches['isutc'])) { - $dt = new DateTime($dateStr,new DateTimeZone('UTC')); - $dt->setTimeZone(new DateTimeZone('UTC')); - return array( - self::UTC, - $dt - ); - } - - // Finding the timezone. - $tzid = $property['TZID']; - if (!$tzid) { - return array( - self::LOCAL, - new DateTime($dateStr) - ); - } - - try { - $tz = new DateTimeZone($tzid->value); - } catch (Exception $e) { - - // The id was invalid, we're going to try to find the information - // through the VTIMEZONE object. - - // First we find the root object - $root = $property; - while($root->parent) { - $root = $root->parent; - } - - if (isset($root->VTIMEZONE)) { - foreach($root->VTIMEZONE as $vtimezone) { - if (((string)$vtimezone->TZID) == $tzid) { - if (isset($vtimezone->{'X-LIC-LOCATION'})) { - $tzid = (string)$vtimezone->{'X-LIC-LOCATION'}; - } - } - } - } - - $tz = new DateTimeZone($tzid); - - } - $dt = new DateTime($dateStr, $tz); - $dt->setTimeZone($tz); - - return array( - self::LOCALTZ, - $dt - ); - - } - -} - -?> diff --git a/3rdparty/Sabre/VObject/Element/MultiDateTime.php b/3rdparty/Sabre/VObject/Element/MultiDateTime.php deleted file mode 100644 index dc6ca5abb80..00000000000 --- a/3rdparty/Sabre/VObject/Element/MultiDateTime.php +++ /dev/null @@ -1,168 +0,0 @@ -offsetUnset('VALUE'); - $this->offsetUnset('TZID'); - switch($dateType) { - - case Sabre_VObject_Element_DateTime::LOCAL : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd\\THis'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case Sabre_VObject_Element_DateTime::UTC : - $val = array(); - foreach($dt as $i) { - $i->setTimeZone(new DateTimeZone('UTC')); - $val[] = $i->format('Ymd\\THis\\Z'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - break; - case Sabre_VObject_Element_DateTime::LOCALTZ : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd\\THis'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE-TIME'); - $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName()); - break; - case Sabre_VObject_Element_DateTime::DATE : - $val = array(); - foreach($dt as $i) { - $val[] = $i->format('Ymd'); - } - $this->setValue(implode(',',$val)); - $this->offsetSet('VALUE','DATE'); - break; - default : - throw new InvalidArgumentException('You must pass a valid dateType constant'); - - } - $this->dateTimes = $dt; - $this->dateType = $dateType; - - } - - /** - * Returns the current DateTime value. - * - * If no value was set, this method returns null. - * - * @return array|null - */ - public function getDateTimes() { - - if ($this->dateTimes) - return $this->dateTimes; - - $dts = array(); - - if (!$this->value) { - $this->dateTimes = null; - $this->dateType = null; - return null; - } - - foreach(explode(',',$this->value) as $val) { - list( - $type, - $dt - ) = Sabre_VObject_Element_DateTime::parseData($val, $this); - $dts[] = $dt; - $this->dateType = $type; - } - $this->dateTimes = $dts; - return $this->dateTimes; - - } - - /** - * Returns the type of Date format. - * - * This method returns one of the format constants. If no date was set, - * this method will return null. - * - * @return int|null - */ - public function getDateType() { - - if ($this->dateType) - return $this->dateType; - - if (!$this->value) { - $this->dateTimes = null; - $this->dateType = null; - return null; - } - - $dts = array(); - foreach(explode(',',$this->value) as $val) { - list( - $type, - $dt - ) = Sabre_VObject_Element_DateTime::parseData($val, $this); - $dts[] = $dt; - $this->dateType = $type; - } - $this->dateTimes = $dts; - return $this->dateType; - - } - -} - -?> diff --git a/3rdparty/Sabre/VObject/ElementList.php b/3rdparty/Sabre/VObject/ElementList.php deleted file mode 100644 index 9922cd587bc..00000000000 --- a/3rdparty/Sabre/VObject/ElementList.php +++ /dev/null @@ -1,172 +0,0 @@ -vevent where there's multiple VEVENT objects. - * - * @package Sabre - * @subpackage VObject - * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class Sabre_VObject_ElementList implements Iterator, Countable, ArrayAccess { - - /** - * Inner elements - * - * @var array - */ - protected $elements = array(); - - /** - * Creates the element list. - * - * @param array $elements - */ - public function __construct(array $elements) { - - $this->elements = $elements; - - } - - /* {{{ Iterator interface */ - - /** - * Current position - * - * @var int - */ - private $key = 0; - - /** - * Returns current item in iteration - * - * @return Sabre_VObject_Element - */ - public function current() { - - return $this->elements[$this->key]; - - } - - /** - * To the next item in the iterator - * - * @return void - */ - public function next() { - - $this->key++; - - } - - /** - * Returns the current iterator key - * - * @return int - */ - public function key() { - - return $this->key; - - } - - /** - * Returns true if the current position in the iterator is a valid one - * - * @return bool - */ - public function valid() { - - return isset($this->elements[$this->key]); - - } - - /** - * Rewinds the iterator - * - * @return void - */ - public function rewind() { - - $this->key = 0; - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - return count($this->elements); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - return isset($this->elements[$offset]); - - } - - /** - * Gets an item through ArrayAccess. - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - return $this->elements[$offset]; - - } - - /** - * Sets an item through ArrayAccess. - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - throw new LogicException('You can not add new objects to an ElementList'); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - throw new LogicException('You can not remove objects from an ElementList'); - - } - - /* }}} */ - -} diff --git a/3rdparty/Sabre/VObject/Node.php b/3rdparty/Sabre/VObject/Node.php deleted file mode 100644 index 7100b62f1cb..00000000000 --- a/3rdparty/Sabre/VObject/Node.php +++ /dev/null @@ -1,149 +0,0 @@ -iterator)) - return $this->iterator; - - return new Sabre_VObject_ElementList(array($this)); - - } - - /** - * Sets the overridden iterator - * - * Note that this is not actually part of the iterator interface - * - * @param Sabre_VObject_ElementList $iterator - * @return void - */ - public function setIterator(Sabre_VObject_ElementList $iterator) { - - $this->iterator = $iterator; - - } - - /* }}} */ - - /* {{{ Countable interface */ - - /** - * Returns the number of elements - * - * @return int - */ - public function count() { - - $it = $this->getIterator(); - return $it->count(); - - } - - /* }}} */ - - /* {{{ ArrayAccess Interface */ - - - /** - * Checks if an item exists through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetExists($offset); - - } - - /** - * Gets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return mixed - */ - public function offsetGet($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetGet($offset); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset,$value) { - - $iterator = $this->getIterator(); - return $iterator->offsetSet($offset,$value); - - } - - /** - * Sets an item through ArrayAccess. - * - * This method just forwards the request to the inner iterator - * - * @param int $offset - * @return void - */ - public function offsetUnset($offset) { - - $iterator = $this->getIterator(); - return $iterator->offsetUnset($offset); - - } - - /* }}} */ - -} diff --git a/3rdparty/Sabre/VObject/Parameter.php b/3rdparty/Sabre/VObject/Parameter.php deleted file mode 100644 index 9ebab6ec69b..00000000000 --- a/3rdparty/Sabre/VObject/Parameter.php +++ /dev/null @@ -1,81 +0,0 @@ -name = strtoupper($name); - $this->value = $value; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $src = array( - '\\', - "\n", - ';', - ',', - ); - $out = array( - '\\\\', - '\n', - '\;', - '\,', - ); - - return $this->name . '=' . str_replace($src, $out, $this->value); - - } - - /** - * Called when this object is being cast to a string - * - * @return string - */ - public function __toString() { - - return $this->value; - - } - -} diff --git a/3rdparty/Sabre/VObject/ParseException.php b/3rdparty/Sabre/VObject/ParseException.php deleted file mode 100644 index ed4ef2e8592..00000000000 --- a/3rdparty/Sabre/VObject/ParseException.php +++ /dev/null @@ -1,12 +0,0 @@ -name = $name; - $this->group = $group; - if (!is_null($iterator)) $this->iterator = $iterator; - $this->setValue($value); - - } - - /** - * Updates the internal value - * - * @param string $value - * @return void - */ - public function setValue($value) { - - $this->value = $value; - - } - - /** - * Turns the object back into a serialized blob. - * - * @return string - */ - public function serialize() { - - $str = $this->name; - if ($this->group) $str = $this->group . '.' . $this->name; - - if (count($this->parameters)) { - foreach($this->parameters as $param) { - - $str.=';' . $param->serialize(); - - } - } - $src = array( - '\\', - "\n", - ); - $out = array( - '\\\\', - '\n', - ); - $str.=':' . str_replace($src, $out, $this->value); - - $out = ''; - while(strlen($str)>0) { - if (strlen($str)>75) { - $out.= substr($str,0,75) . "\r\n"; - $str = ' ' . substr($str,75); - } else { - $out.=$str . "\r\n"; - $str=''; - break; - } - } - - return $out; - - } - - /** - * Adds a new componenten or element - * - * You can call this method with the following syntaxes: - * - * add(Sabre_VObject_Parameter $element) - * add(string $name, $value) - * - * The first version adds an Parameter - * The second adds a property as a string. - * - * @param mixed $item - * @param mixed $itemValue - * @return void - */ - public function add($item, $itemValue = null) { - - if ($item instanceof Sabre_VObject_Parameter) { - if (!is_null($itemValue)) { - throw new InvalidArgumentException('The second argument must not be specified, when passing a VObject'); - } - $item->parent = $this; - $this->parameters[] = $item; - } elseif(is_string($item)) { - - if (!is_scalar($itemValue)) { - throw new InvalidArgumentException('The second argument must be scalar'); - } - $parameter = new Sabre_VObject_Parameter($item,$itemValue); - $parameter->parent = $this; - $this->parameters[] = $parameter; - - } else { - - throw new InvalidArgumentException('The first argument must either be a Sabre_VObject_Element or a string'); - - } - - } - - - /* ArrayAccess interface {{{ */ - - /** - * Checks if an array element exists - * - * @param mixed $name - * @return bool - */ - public function offsetExists($name) { - - if (is_int($name)) return parent::offsetExists($name); - - $name = strtoupper($name); - - foreach($this->parameters as $parameter) { - if ($parameter->name == $name) return true; - } - return false; - - } - - /** - * Returns a parameter, or parameter list. - * - * @param string $name - * @return Sabre_VObject_Element - */ - public function offsetGet($name) { - - if (is_int($name)) return parent::offsetGet($name); - $name = strtoupper($name); - - $result = array(); - foreach($this->parameters as $parameter) { - if ($parameter->name == $name) - $result[] = $parameter; - } - - if (count($result)===0) { - return null; - } elseif (count($result)===1) { - return $result[0]; - } else { - $result[0]->setIterator(new Sabre_VObject_ElementList($result)); - return $result[0]; - } - - } - - /** - * Creates a new parameter - * - * @param string $name - * @param mixed $value - * @return void - */ - public function offsetSet($name, $value) { - - if (is_int($name)) return parent::offsetSet($name, $value); - - if (is_scalar($value)) { - if (!is_string($name)) - throw new InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.'); - - $this->offsetUnset($name); - $parameter = new Sabre_VObject_Parameter($name, $value); - $parameter->parent = $this; - $this->parameters[] = $parameter; - - } elseif ($value instanceof Sabre_VObject_Parameter) { - if (!is_null($name)) - throw new InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a Sabre_VObject_Parameter. Add using $array[]=$parameterObject.'); - - $value->parent = $this; - $this->parameters[] = $value; - } else { - throw new InvalidArgumentException('You can only add parameters to the property object'); - } - - } - - /** - * Removes one or more parameters with the specified name - * - * @param string $name - * @return void - */ - public function offsetUnset($name) { - - if (is_int($name)) return parent::offsetUnset($name, $value); - $name = strtoupper($name); - - $result = array(); - foreach($this->parameters as $key=>$parameter) { - if ($parameter->name == $name) { - $parameter->parent = null; - unset($this->parameters[$key]); - } - - } - - } - - /* }}} */ - - /** - * Called when this object is being cast to a string - * - * @return string - */ - public function __toString() { - - return $this->value; - - } - - -} diff --git a/3rdparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php deleted file mode 100644 index 7d1c282838e..00000000000 --- a/3rdparty/Sabre/VObject/Reader.php +++ /dev/null @@ -1,191 +0,0 @@ - 'Sabre_VObject_Element_DateTime', - 'DTEND' => 'Sabre_VObject_Element_DateTime', - 'COMPLETED' => 'Sabre_VObject_Element_DateTime', - 'DUE' => 'Sabre_VObject_Element_DateTime', - 'EXDATE' => 'Sabre_VObject_Element_MultiDateTime', - ); - - /** - * Parses the file and returns the top component - * - * @param string $data - * @return Sabre_VObject_Element - */ - static function read($data) { - - // Normalizing newlines - $data = str_replace(array("\r","\n\n"), array("\n","\n"), $data); - - $lines = explode("\n", $data); - - // Unfolding lines - $lines2 = array(); - foreach($lines as $line) { - - // Skipping empty lines - if (!$line) continue; - - if ($line[0]===" " || $line[0]==="\t") { - $lines2[count($lines2)-1].=substr($line,1); - } else { - $lines2[] = $line; - } - - } - - unset($lines); - - reset($lines2); - - return self::readLine($lines2); - - } - - /** - * Reads and parses a single line. - * - * This method receives the full array of lines. The array pointer is used - * to traverse. - * - * @param array $lines - * @return Sabre_VObject_Element - */ - static private function readLine(&$lines) { - - $line = current($lines); - $lineNr = key($lines); - next($lines); - - // Components - if (stripos($line,"BEGIN:")===0) { - - // This is a component - $obj = new Sabre_VObject_Component(strtoupper(substr($line,6))); - - $nextLine = current($lines); - - while(stripos($nextLine,"END:")!==0) { - - $obj->add(self::readLine($lines)); - $nextLine = current($lines); - - if ($nextLine===false) - throw new Sabre_VObject_ParseException('Invalid VObject. Document ended prematurely.'); - - } - - // Checking component name of the 'END:' line. - if (substr($nextLine,4)!==$obj->name) { - throw new Sabre_VObject_ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"'); - } - next($lines); - - return $obj; - - } - - // Properties - //$result = preg_match('/(?P[A-Z0-9-]+)(?:;(?P^(?([^:^\"]|\"([^\"]*)\")*))?"; - $regex = "/^(?P$token)$parameters:(?P.*)$/i"; - - $result = preg_match($regex,$line,$matches); - - if (!$result) { - throw new Sabre_VObject_ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format'); - } - - $propertyName = strtoupper($matches['name']); - $propertyValue = stripcslashes($matches['value']); - - if (isset(self::$elementMap[$propertyName])) { - $className = self::$elementMap[$propertyName]; - } else { - $className = 'Sabre_VObject_Property'; - } - - $obj = new $className($propertyName, $propertyValue); - - if ($matches['parameters']) { - - foreach(self::readParameters($matches['parameters']) as $param) { - $obj->add($param); - } - } - - return $obj; - - - } - - /** - * Reads a parameter list from a property - * - * This method returns an array of Sabre_VObject_Parameter - * - * @param string $parameters - * @return array - */ - static private function readParameters($parameters) { - - $token = '[A-Z0-9-]+'; - - $paramValue = '(?P[^\"^;]*|"[^"]*")'; - - $regex = "/(?<=^|;)(?P$token)(=$paramValue(?=$|;))?/i"; - preg_match_all($regex, $parameters, $matches, PREG_SET_ORDER); - - $params = array(); - foreach($matches as $match) { - - $value = isset($match['paramValue'])?$match['paramValue']:null; - - if (isset($value[0])) { - // Stripping quotes, if needed - if ($value[0] === '"') $value = substr($value,1,strlen($value)-2); - } else { - $value = ''; - } - - $params[] = new Sabre_VObject_Parameter($match['paramName'], stripcslashes($value)); - - } - - return $params; - - } - - -} diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php deleted file mode 100644 index 937c367e222..00000000000 --- a/3rdparty/Sabre/VObject/Version.php +++ /dev/null @@ -1,24 +0,0 @@ - | -// +----------------------------------------------------------------------+ -// -// $Id: System.php,v 1.36 2004/06/15 16:33:46 pajoye Exp $ -// - -require_once( 'PEAR.php'); -require_once( 'Console/Getopt.php'); - -$GLOBALS['_System_temp_files'] = array(); - -/** -* System offers cross plattform compatible system functions -* -* Static functions for different operations. Should work under -* Unix and Windows. The names and usage has been taken from its respectively -* GNU commands. The functions will return (bool) false on error and will -* trigger the error with the PHP trigger_error() function (you can silence -* the error by prefixing a '@' sign after the function call). -* -* Documentation on this class you can find in: -* http://pear.php.net/manual/ -* -* Example usage: -* if (!@System::rm('-r file1 dir1')) { -* print "could not delete file1 or dir1"; -* } -* -* In case you need to to pass file names with spaces, -* pass the params as an array: -* -* System::rm(array('-r', $file1, $dir1)); -* -* @package System -* @author Tomas V.V.Cox -* @version $Revision: 1.36 $ -* @access public -* @see http://pear.php.net/manual/ -*/ -class System -{ - /** - * returns the commandline arguments of a function - * - * @param string $argv the commandline - * @param string $short_options the allowed option short-tags - * @param string $long_options the allowed option long-tags - * @return array the given options and there values - * @access private - */ - function _parseArgs($argv, $short_options, $long_options = null) - { - if (!is_array($argv) && $argv !== null) { - $argv = preg_split('/\s+/', $argv); - } - return Console_Getopt::getopt2($argv, $short_options); - } - - /** - * Output errors with PHP trigger_error(). You can silence the errors - * with prefixing a "@" sign to the function call: @System::mkdir(..); - * - * @param mixed $error a PEAR error or a string with the error message - * @return bool false - * @access private - */ - function raiseError($error) - { - if (PEAR::isError($error)) { - $error = $error->getMessage(); - } - trigger_error($error, E_USER_WARNING); - return false; - } - - /** - * Creates a nested array representing the structure of a directory - * - * System::_dirToStruct('dir1', 0) => - * Array - * ( - * [dirs] => Array - * ( - * [0] => dir1 - * ) - * - * [files] => Array - * ( - * [0] => dir1/file2 - * [1] => dir1/file3 - * ) - * ) - * @param string $sPath Name of the directory - * @param integer $maxinst max. deep of the lookup - * @param integer $aktinst starting deep of the lookup - * @return array the structure of the dir - * @access private - */ - - function _dirToStruct($sPath, $maxinst, $aktinst = 0) - { - $struct = array('dirs' => array(), 'files' => array()); - if (($dir = @opendir($sPath)) === false) { - System::raiseError("Could not open dir $sPath"); - return $struct; // XXX could not open error - } - $struct['dirs'][] = $sPath; // XXX don't add if '.' or '..' ? - $list = array(); - while ($file = readdir($dir)) { - if ($file != '.' && $file != '..') { - $list[] = $file; - } - } - closedir($dir); - sort($list); - if ($aktinst < $maxinst || $maxinst == 0) { - foreach($list as $val) { - $path = $sPath . DIRECTORY_SEPARATOR . $val; - if (is_dir($path)) { - $tmp = System::_dirToStruct($path, $maxinst, $aktinst+1); - $struct = array_merge_recursive($tmp, $struct); - } else { - $struct['files'][] = $path; - } - } - } - return $struct; - } - - /** - * Creates a nested array representing the structure of a directory and files - * - * @param array $files Array listing files and dirs - * @return array - * @see System::_dirToStruct() - */ - function _multipleToStruct($files) - { - $struct = array('dirs' => array(), 'files' => array()); - settype($files, 'array'); - foreach ($files as $file) { - if (is_dir($file)) { - $tmp = System::_dirToStruct($file, 0); - $struct = array_merge_recursive($tmp, $struct); - } else { - $struct['files'][] = $file; - } - } - return $struct; - } - - /** - * The rm command for removing files. - * Supports multiple files and dirs and also recursive deletes - * - * @param string $args the arguments for rm - * @return mixed PEAR_Error or true for success - * @access public - */ - function rm($args) - { - $opts = System::_parseArgs($args, 'rf'); // "f" do nothing but like it :-) - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - foreach($opts[0] as $opt) { - if ($opt[0] == 'r') { - $do_recursive = true; - } - } - $ret = true; - if (isset($do_recursive)) { - $struct = System::_multipleToStruct($opts[1]); - foreach($struct['files'] as $file) { - if (!@unlink($file)) { - $ret = false; - } - } - foreach($struct['dirs'] as $dir) { - if (!@rmdir($dir)) { - $ret = false; - } - } - } else { - foreach ($opts[1] as $file) { - $delete = (is_dir($file)) ? 'rmdir' : 'unlink'; - if (!@$delete($file)) { - $ret = false; - } - } - } - return $ret; - } - - /** - * Make directories. Note that we use call_user_func('mkdir') to avoid - * a problem with ZE2 calling System::mkDir instead of the native PHP func. - * - * @param string $args the name of the director(y|ies) to create - * @return bool True for success - * @access public - */ - function mkDir($args) - { - $opts = System::_parseArgs($args, 'pm:'); - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - $mode = 0777; // default mode - foreach($opts[0] as $opt) { - if ($opt[0] == 'p') { - $create_parents = true; - } elseif($opt[0] == 'm') { - // if the mode is clearly an octal number (starts with 0) - // convert it to decimal - if (strlen($opt[1]) && $opt[1]{0} == '0') { - $opt[1] = octdec($opt[1]); - } else { - // convert to int - $opt[1] += 0; - } - $mode = $opt[1]; - } - } - $ret = true; - if (isset($create_parents)) { - foreach($opts[1] as $dir) { - $dirstack = array(); - while (!@is_dir($dir) && $dir != DIRECTORY_SEPARATOR) { - array_unshift($dirstack, $dir); - $dir = dirname($dir); - } - while ($newdir = array_shift($dirstack)) { - if (!call_user_func('mkdir', $newdir, $mode)) { - $ret = false; - } - } - } - } else { - foreach($opts[1] as $dir) { - if (!@is_dir($dir) && !call_user_func('mkdir', $dir, $mode)) { - $ret = false; - } - } - } - return $ret; - } - - /** - * Concatenate files - * - * Usage: - * 1) $var = System::cat('sample.txt test.txt'); - * 2) System::cat('sample.txt test.txt > final.txt'); - * 3) System::cat('sample.txt test.txt >> final.txt'); - * - * Note: as the class use fopen, urls should work also (test that) - * - * @param string $args the arguments - * @return boolean true on success - * @access public - */ - function &cat($args) - { - $ret = null; - $files = array(); - if (!is_array($args)) { - $args = preg_split('/\s+/', $args); - } - for($i=0; $i < count($args); $i++) { - if ($args[$i] == '>') { - $mode = 'wb'; - $outputfile = $args[$i+1]; - break; - } elseif ($args[$i] == '>>') { - $mode = 'ab+'; - $outputfile = $args[$i+1]; - break; - } else { - $files[] = $args[$i]; - } - } - if (isset($mode)) { - if (!$outputfd = fopen($outputfile, $mode)) { - $err = System::raiseError("Could not open $outputfile"); - return $err; - } - $ret = true; - } - foreach ($files as $file) { - if (!$fd = fopen($file, 'r')) { - System::raiseError("Could not open $file"); - continue; - } - while ($cont = fread($fd, 2048)) { - if (isset($outputfd)) { - fwrite($outputfd, $cont); - } else { - $ret .= $cont; - } - } - fclose($fd); - } - if (@is_resource($outputfd)) { - fclose($outputfd); - } - return $ret; - } - - /** - * Creates temporary files or directories. This function will remove - * the created files when the scripts finish its execution. - * - * Usage: - * 1) $tempfile = System::mktemp("prefix"); - * 2) $tempdir = System::mktemp("-d prefix"); - * 3) $tempfile = System::mktemp(); - * 4) $tempfile = System::mktemp("-t /var/tmp prefix"); - * - * prefix -> The string that will be prepended to the temp name - * (defaults to "tmp"). - * -d -> A temporary dir will be created instead of a file. - * -t -> The target dir where the temporary (file|dir) will be created. If - * this param is missing by default the env vars TMP on Windows or - * TMPDIR in Unix will be used. If these vars are also missing - * c:\windows\temp or /tmp will be used. - * - * @param string $args The arguments - * @return mixed the full path of the created (file|dir) or false - * @see System::tmpdir() - * @access public - */ - function mktemp($args = null) - { - static $first_time = true; - $opts = System::_parseArgs($args, 't:d'); - if (PEAR::isError($opts)) { - return System::raiseError($opts); - } - foreach($opts[0] as $opt) { - if($opt[0] == 'd') { - $tmp_is_dir = true; - } elseif($opt[0] == 't') { - $tmpdir = $opt[1]; - } - } - $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp'; - if (!isset($tmpdir)) { - $tmpdir = System::tmpdir(); - } - if (!System::mkDir("-p $tmpdir")) { - return false; - } - $tmp = tempnam($tmpdir, $prefix); - if (isset($tmp_is_dir)) { - unlink($tmp); // be careful possible race condition here - if (!call_user_func('mkdir', $tmp, 0700)) { - return System::raiseError("Unable to create temporary directory $tmpdir"); - } - } - $GLOBALS['_System_temp_files'][] = $tmp; - if ($first_time) { - PEAR::registerShutdownFunc(array('System', '_removeTmpFiles')); - $first_time = false; - } - return $tmp; - } - - /** - * Remove temporary files created my mkTemp. This function is executed - * at script shutdown time - * - * @access private - */ - function _removeTmpFiles() - { - if (count($GLOBALS['_System_temp_files'])) { - $delete = $GLOBALS['_System_temp_files']; - array_unshift($delete, '-r'); - System::rm($delete); - } - } - - /** - * Get the path of the temporal directory set in the system - * by looking in its environments variables. - * Note: php.ini-recommended removes the "E" from the variables_order setting, - * making unavaible the $_ENV array, that s why we do tests with _ENV - * - * @return string The temporal directory on the system - */ - function tmpdir() - { - if (OS_WINDOWS) { - if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) { - return $var; - } - if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) { - return $var; - } - if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) { - return $var; - } - return getenv('SystemRoot') . '\temp'; - } - if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) { - return $var; - } - return '/tmp'; - } - - /** - * The "which" command (show the full path of a command) - * - * @param string $program The command to search for - * @return mixed A string with the full path or false if not found - * @author Stig Bakken - */ - function which($program, $fallback = false) - { - // is_executable() is not available on windows - if (OS_WINDOWS) { - $pear_is_executable = 'is_file'; - } else { - $pear_is_executable = 'is_executable'; - } - - // full path given - if (basename($program) != $program) { - return (@$pear_is_executable($program)) ? $program : $fallback; - } - - // XXX FIXME honor safe mode - $path_delim = OS_WINDOWS ? ';' : ':'; - $exe_suffixes = OS_WINDOWS ? array('.exe','.bat','.cmd','.com') : array(''); - $path_elements = explode($path_delim, getenv('PATH')); - foreach ($exe_suffixes as $suff) { - foreach ($path_elements as $dir) { - $file = $dir . DIRECTORY_SEPARATOR . $program . $suff; - if (@is_file($file) && @$pear_is_executable($file)) { - return $file; - } - } - } - return $fallback; - } - - /** - * The "find" command - * - * Usage: - * - * System::find($dir); - * System::find("$dir -type d"); - * System::find("$dir -type f"); - * System::find("$dir -name *.php"); - * System::find("$dir -name *.php -name *.htm*"); - * System::find("$dir -maxdepth 1"); - * - * Params implmented: - * $dir -> Start the search at this directory - * -type d -> return only directories - * -type f -> return only files - * -maxdepth -> max depth of recursion - * -name -> search pattern (bash style). Multiple -name param allowed - * - * @param mixed Either array or string with the command line - * @return array Array of found files - * - */ - function find($args) - { - if (!is_array($args)) { - $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); - } - $dir = array_shift($args); - $patterns = array(); - $depth = 0; - $do_files = $do_dirs = true; - for ($i = 0; $i < count($args); $i++) { - switch ($args[$i]) { - case '-type': - if (in_array($args[$i+1], array('d', 'f'))) { - if ($args[$i+1] == 'd') { - $do_files = false; - } else { - $do_dirs = false; - } - } - $i++; - break; - case '-name': - $patterns[] = "(" . preg_replace(array('/\./', '/\*/'), - array('\.', '.*'), - $args[$i+1]) - . ")"; - $i++; - break; - case '-maxdepth': - $depth = $args[$i+1]; - break; - } - } - $path = System::_dirToStruct($dir, $depth); - if ($do_files && $do_dirs) { - $files = array_merge($path['files'], $path['dirs']); - } elseif ($do_dirs) { - $files = $path['dirs']; - } else { - $files = $path['files']; - } - if (count($patterns)) { - $patterns = implode('|', $patterns); - $ret = array(); - for ($i = 0; $i < count($files); $i++) { - if (preg_match("#^$patterns\$#", $files[$i])) { - $ret[] = $files[$i]; - } - } - return $ret; - } - return $files; - } -} -?> diff --git a/3rdparty/XML/Parser.php b/3rdparty/XML/Parser.php deleted file mode 100644 index 38b4f8fe8a6..00000000000 --- a/3rdparty/XML/Parser.php +++ /dev/null @@ -1,667 +0,0 @@ - | -// | Tomas V.V.Cox | -// | Stephan Schmidt | -// +----------------------------------------------------------------------+ -// -// $Id: Parser.php,v 1.25 2005/03/25 17:13:10 schst Exp $ - -/** - * XML Parser class. - * - * This is an XML parser based on PHP's "xml" extension, - * based on the bundled expat library. - * - * @category XML - * @package XML_Parser - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Stephan Schmidt - */ - -/** - * uses PEAR's error handling - */ -require_once('PEAR.php'); - -/** - * resource could not be created - */ -define('XML_PARSER_ERROR_NO_RESOURCE', 200); - -/** - * unsupported mode - */ -define('XML_PARSER_ERROR_UNSUPPORTED_MODE', 201); - -/** - * invalid encoding was given - */ -define('XML_PARSER_ERROR_INVALID_ENCODING', 202); - -/** - * specified file could not be read - */ -define('XML_PARSER_ERROR_FILE_NOT_READABLE', 203); - -/** - * invalid input - */ -define('XML_PARSER_ERROR_INVALID_INPUT', 204); - -/** - * remote file cannot be retrieved in safe mode - */ -define('XML_PARSER_ERROR_REMOTE', 205); - -/** - * XML Parser class. - * - * This is an XML parser based on PHP's "xml" extension, - * based on the bundled expat library. - * - * Notes: - * - It requires PHP 4.0.4pl1 or greater - * - From revision 1.17, the function names used by the 'func' mode - * are in the format "xmltag_$elem", for example: use "xmltag_name" - * to handle the tags of your xml file. - * - * @category XML - * @package XML_Parser - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Stephan Schmidt - * @todo create XML_Parser_Namespace to parse documents with namespaces - * @todo create XML_Parser_Pull - * @todo Tests that need to be made: - * - mixing character encodings - * - a test using all expat handlers - * - options (folding, output charset) - * - different parsing modes - */ -class XML_Parser extends PEAR -{ - // {{{ properties - - /** - * XML parser handle - * - * @var resource - * @see xml_parser_create() - */ - var $parser; - - /** - * File handle if parsing from a file - * - * @var resource - */ - var $fp; - - /** - * Whether to do case folding - * - * If set to true, all tag and attribute names will - * be converted to UPPER CASE. - * - * @var boolean - */ - var $folding = true; - - /** - * Mode of operation, one of "event" or "func" - * - * @var string - */ - var $mode; - - /** - * Mapping from expat handler function to class method. - * - * @var array - */ - var $handler = array( - 'character_data_handler' => 'cdataHandler', - 'default_handler' => 'defaultHandler', - 'processing_instruction_handler' => 'piHandler', - 'unparsed_entity_decl_handler' => 'unparsedHandler', - 'notation_decl_handler' => 'notationHandler', - 'external_entity_ref_handler' => 'entityrefHandler' - ); - - /** - * source encoding - * - * @var string - */ - var $srcenc; - - /** - * target encoding - * - * @var string - */ - var $tgtenc; - - /** - * handler object - * - * @var object - */ - var $_handlerObj; - - // }}} - - /** - * PHP5 constructor - * - * @param string $srcenc source charset encoding, use NULL (default) to use - * whatever the document specifies - * @param string $mode how this parser object should work, "event" for - * startelement/endelement-type events, "func" - * to have it call functions named after elements - * @param string $tgenc a valid target encoding - */ - function __construct($srcenc = null, $mode = 'event', $tgtenc = null) - { - $this->PEAR('XML_Parser_Error'); - - $this->mode = $mode; - $this->srcenc = $srcenc; - $this->tgtenc = $tgtenc; - } - // }}} - - /** - * Sets the mode of the parser. - * - * Possible modes are: - * - func - * - event - * - * You can set the mode using the second parameter - * in the constructor. - * - * This method is only needed, when switching to a new - * mode at a later point. - * - * @access public - * @param string mode, either 'func' or 'event' - * @return boolean|object true on success, PEAR_Error otherwise - */ - function setMode($mode) - { - if ($mode != 'func' && $mode != 'event') { - $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE); - } - - $this->mode = $mode; - return true; - } - - /** - * Sets the object, that will handle the XML events - * - * This allows you to create a handler object independent of the - * parser object that you are using and easily switch the underlying - * parser. - * - * If no object will be set, XML_Parser assumes that you - * extend this class and handle the events in $this. - * - * @access public - * @param object object to handle the events - * @return boolean will always return true - * @since v1.2.0beta3 - */ - function setHandlerObj(&$obj) - { - $this->_handlerObj = &$obj; - return true; - } - - /** - * Init the element handlers - * - * @access private - */ - function _initHandlers() - { - if (!is_resource($this->parser)) { - return false; - } - - if (!is_object($this->_handlerObj)) { - $this->_handlerObj = &$this; - } - switch ($this->mode) { - - case 'func': - xml_set_object($this->parser, $this->_handlerObj); - xml_set_element_handler($this->parser, array(&$this, 'funcStartHandler'), array(&$this, 'funcEndHandler')); - break; - - case 'event': - xml_set_object($this->parser, $this->_handlerObj); - xml_set_element_handler($this->parser, 'startHandler', 'endHandler'); - break; - default: - return $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE); - break; - } - - - /** - * set additional handlers for character data, entities, etc. - */ - foreach ($this->handler as $xml_func => $method) { - if (method_exists($this->_handlerObj, $method)) { - $xml_func = 'xml_set_' . $xml_func; - $xml_func($this->parser, $method); - } - } - } - - // {{{ _create() - - /** - * create the XML parser resource - * - * Has been moved from the constructor to avoid - * problems with object references. - * - * Furthermore it allows us returning an error - * if something fails. - * - * @access private - * @return boolean|object true on success, PEAR_Error otherwise - * - * @see xml_parser_create - */ - function _create() - { - if ($this->srcenc === null) { - $xp = @xml_parser_create(); - } else { - $xp = @xml_parser_create($this->srcenc); - } - if (is_resource($xp)) { - if ($this->tgtenc !== null) { - if (!@xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING, - $this->tgtenc)) { - return $this->raiseError('invalid target encoding', XML_PARSER_ERROR_INVALID_ENCODING); - } - } - $this->parser = $xp; - $result = $this->_initHandlers($this->mode); - if ($this->isError($result)) { - return $result; - } - xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, $this->folding); - - return true; - } - return $this->raiseError('Unable to create XML parser resource.', XML_PARSER_ERROR_NO_RESOURCE); - } - - // }}} - // {{{ reset() - - /** - * Reset the parser. - * - * This allows you to use one parser instance - * to parse multiple XML documents. - * - * @access public - * @return boolean|object true on success, PEAR_Error otherwise - */ - function reset() - { - $result = $this->_create(); - if ($this->isError( $result )) { - return $result; - } - return true; - } - - // }}} - // {{{ setInputFile() - - /** - * Sets the input xml file to be parsed - * - * @param string Filename (full path) - * @return resource fopen handle of the given file - * @throws XML_Parser_Error - * @see setInput(), setInputString(), parse() - * @access public - */ - function setInputFile($file) - { - /** - * check, if file is a remote file - */ - if (preg_match('[^(http|ftp)://]', substr($file, 0, 10))) { - if (!ini_get('allow_url_fopen')) { - return $this->raiseError('Remote files cannot be parsed, as safe mode is enabled.', XML_PARSER_ERROR_REMOTE); - } - } - $fp = fopen($file, 'rb'); - if (is_resource($fp)) { - $this->fp = $fp; - return $fp; - } - return $this->raiseError('File could not be opened.', XML_PARSER_ERROR_FILE_NOT_READABLE); - } - - // }}} - // {{{ setInputString() - - /** - * XML_Parser::setInputString() - * - * Sets the xml input from a string - * - * @param string $data a string containing the XML document - * @return null - **/ - function setInputString($data) - { - $this->fp = $data; - return null; - } - - // }}} - // {{{ setInput() - - /** - * Sets the file handle to use with parse(). - * - * You should use setInputFile() or setInputString() if you - * pass a string - * - * @param mixed $fp Can be either a resource returned from fopen(), - * a URL, a local filename or a string. - * @access public - * @see parse() - * @uses setInputString(), setInputFile() - */ - function setInput($fp) - { - if (is_resource($fp)) { - $this->fp = $fp; - return true; - } - // see if it's an absolute URL (has a scheme at the beginning) - elseif (eregi('^[a-z]+://', substr($fp, 0, 10))) { - return $this->setInputFile($fp); - } - // see if it's a local file - elseif (file_exists($fp)) { - return $this->setInputFile($fp); - } - // it must be a string - else { - $this->fp = $fp; - return true; - } - - return $this->raiseError('Illegal input format', XML_PARSER_ERROR_INVALID_INPUT); - } - - // }}} - // {{{ parse() - - /** - * Central parsing function. - * - * @return true|object PEAR error returns true on success, or a PEAR_Error otherwise - * @access public - */ - function parse() - { - /** - * reset the parser - */ - $result = $this->reset(); - if ($this->isError($result)) { - return $result; - } - // if $this->fp was fopened previously - if (is_resource($this->fp)) { - - while ($data = fread($this->fp, 4096)) { - if (!$this->_parseString($data, feof($this->fp))) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - } - // otherwise, $this->fp must be a string - } else { - if (!$this->_parseString($this->fp, true)) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - } - $this->free(); - - return true; - } - - /** - * XML_Parser::_parseString() - * - * @param string $data - * @param boolean $eof - * @return bool - * @access private - * @see parseString() - **/ - function _parseString($data, $eof = false) - { - return xml_parse($this->parser, $data, $eof); - } - - // }}} - // {{{ parseString() - - /** - * XML_Parser::parseString() - * - * Parses a string. - * - * @param string $data XML data - * @param boolean $eof If set and TRUE, data is the last piece of data sent in this parser - * @throws XML_Parser_Error - * @return Pear Error|true true on success or a PEAR Error - * @see _parseString() - */ - function parseString($data, $eof = false) - { - if (!isset($this->parser) || !is_resource($this->parser)) { - $this->reset(); - } - - if (!$this->_parseString($data, $eof)) { - $error = &$this->raiseError(); - $this->free(); - return $error; - } - - if ($eof === true) { - $this->free(); - } - return true; - } - - /** - * XML_Parser::free() - * - * Free the internal resources associated with the parser - * - * @return null - **/ - function free() - { - if (isset($this->parser) && is_resource($this->parser)) { - xml_parser_free($this->parser); - unset( $this->parser ); - } - if (isset($this->fp) && is_resource($this->fp)) { - fclose($this->fp); - } - unset($this->fp); - return null; - } - - /** - * XML_Parser::raiseError() - * - * Throws a XML_Parser_Error - * - * @param string $msg the error message - * @param integer $ecode the error message code - * @return XML_Parser_Error - **/ - function raiseError($msg = null, $ecode = 0,$mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - $msg = !is_null($msg) ? $msg : $this->parser; - $err = new XML_Parser_Error($msg, $ecode); - return parent::raiseError($err); - } - - // }}} - // {{{ funcStartHandler() - - function funcStartHandler($xp, $elem, $attribs) - { - $func = 'xmltag_' . $elem; - if (strchr($func, '.')) { - $func = str_replace('.', '_', $func); - } - if (method_exists($this->_handlerObj, $func)) { - call_user_func(array(&$this->_handlerObj, $func), $xp, $elem, $attribs); - } elseif (method_exists($this->_handlerObj, 'xmltag')) { - call_user_func(array(&$this->_handlerObj, 'xmltag'), $xp, $elem, $attribs); - } - } - - // }}} - // {{{ funcEndHandler() - - function funcEndHandler($xp, $elem) - { - $func = 'xmltag_' . $elem . '_'; - if (strchr($func, '.')) { - $func = str_replace('.', '_', $func); - } - if (method_exists($this->_handlerObj, $func)) { - call_user_func(array(&$this->_handlerObj, $func), $xp, $elem); - } elseif (method_exists($this->_handlerObj, 'xmltag_')) { - call_user_func(array(&$this->_handlerObj, 'xmltag_'), $xp, $elem); - } - } - - // }}} - // {{{ startHandler() - - /** - * - * @abstract - */ - function startHandler($xp, $elem, $attribs) - { - return NULL; - } - - // }}} - // {{{ endHandler() - - /** - * - * @abstract - */ - function endHandler($xp, $elem) - { - return NULL; - } - - - // }}}me -} - -/** - * error class, replaces PEAR_Error - * - * An instance of this class will be returned - * if an error occurs inside XML_Parser. - * - * There are three advantages over using the standard PEAR_Error: - * - All messages will be prefixed - * - check for XML_Parser error, using is_a( $error, 'XML_Parser_Error' ) - * - messages can be generated from the xml_parser resource - * - * @package XML_Parser - * @access public - * @see PEAR_Error - */ -class XML_Parser_Error extends PEAR_Error -{ - // {{{ properties - - /** - * prefix for all messages - * - * @var string - */ - var $error_message_prefix = 'XML_Parser: '; - - // }}} - // {{{ constructor() - /** - * construct a new error instance - * - * You may either pass a message or an xml_parser resource as first - * parameter. If a resource has been passed, the last error that - * happened will be retrieved and returned. - * - * @access public - * @param string|resource message or parser resource - * @param integer error code - * @param integer error handling - * @param integer error level - */ - function XML_Parser_Error($msgorparser = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) - { - if (is_resource($msgorparser)) { - $code = xml_get_error_code($msgorparser); - $msgorparser = sprintf('%s at XML input line %d', - xml_error_string($code), - xml_get_current_line_number($msgorparser)); - } - $this->PEAR_Error($msgorparser, $code, $mode, $level); - } - // }}} -} -?> \ No newline at end of file diff --git a/3rdparty/XML/RPC.php b/3rdparty/XML/RPC.php deleted file mode 100644 index 096b22a0ab5..00000000000 --- a/3rdparty/XML/RPC.php +++ /dev/null @@ -1,1951 +0,0 @@ - - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version CVS: $Id: RPC.php,v 1.83 2005/08/14 20:25:35 danielc Exp $ - * @link http://pear.php.net/package/XML_RPC - */ - - -if (!function_exists('xml_parser_create')) { - PEAR::loadExtension('xml'); -} - -/**#@+ - * Error constants - */ -/** - * Parameter values don't match parameter types - */ -define('XML_RPC_ERROR_INVALID_TYPE', 101); -/** - * Parameter declared to be numeric but the values are not - */ -define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102); -/** - * Communication error - */ -define('XML_RPC_ERROR_CONNECTION_FAILED', 103); -/** - * The array or struct has already been started - */ -define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104); -/** - * Incorrect parameters submitted - */ -define('XML_RPC_ERROR_INCORRECT_PARAMS', 105); -/** - * Programming error by developer - */ -define('XML_RPC_ERROR_PROGRAMMING', 106); -/**#@-*/ - - -/** - * Data types - * @global string $GLOBALS['XML_RPC_I4'] - */ -$GLOBALS['XML_RPC_I4'] = 'i4'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Int'] - */ -$GLOBALS['XML_RPC_Int'] = 'int'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Boolean'] - */ -$GLOBALS['XML_RPC_Boolean'] = 'boolean'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Double'] - */ -$GLOBALS['XML_RPC_Double'] = 'double'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_String'] - */ -$GLOBALS['XML_RPC_String'] = 'string'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_DateTime'] - */ -$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Base64'] - */ -$GLOBALS['XML_RPC_Base64'] = 'base64'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Array'] - */ -$GLOBALS['XML_RPC_Array'] = 'array'; - -/** - * Data types - * @global string $GLOBALS['XML_RPC_Struct'] - */ -$GLOBALS['XML_RPC_Struct'] = 'struct'; - - -/** - * Data type meta-types - * @global array $GLOBALS['XML_RPC_Types'] - */ -$GLOBALS['XML_RPC_Types'] = array( - $GLOBALS['XML_RPC_I4'] => 1, - $GLOBALS['XML_RPC_Int'] => 1, - $GLOBALS['XML_RPC_Boolean'] => 1, - $GLOBALS['XML_RPC_String'] => 1, - $GLOBALS['XML_RPC_Double'] => 1, - $GLOBALS['XML_RPC_DateTime'] => 1, - $GLOBALS['XML_RPC_Base64'] => 1, - $GLOBALS['XML_RPC_Array'] => 2, - $GLOBALS['XML_RPC_Struct'] => 3, -); - - -/** - * Error message numbers - * @global array $GLOBALS['XML_RPC_err'] - */ -$GLOBALS['XML_RPC_err'] = array( - 'unknown_method' => 1, - 'invalid_return' => 2, - 'incorrect_params' => 3, - 'introspect_unknown' => 4, - 'http_error' => 5, - 'not_response_object' => 6, - 'invalid_request' => 7, -); - -/** - * Error message strings - * @global array $GLOBALS['XML_RPC_str'] - */ -$GLOBALS['XML_RPC_str'] = array( - 'unknown_method' => 'Unknown method', - 'invalid_return' => 'Invalid return payload: enable debugging to examine incoming payload', - 'incorrect_params' => 'Incorrect parameters passed to method', - 'introspect_unknown' => 'Can\'t introspect: method unknown', - 'http_error' => 'Didn\'t receive 200 OK from remote server.', - 'not_response_object' => 'The requested method didn\'t return an XML_RPC_Response object.', - 'invalid_request' => 'Invalid request payload', -); - - -/** - * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII) - * @global string $GLOBALS['XML_RPC_defencoding'] - */ -$GLOBALS['XML_RPC_defencoding'] = 'UTF-8'; - -/** - * User error codes start at 800 - * @global int $GLOBALS['XML_RPC_erruser'] - */ -$GLOBALS['XML_RPC_erruser'] = 800; - -/** - * XML parse error codes start at 100 - * @global int $GLOBALS['XML_RPC_errxml'] - */ -$GLOBALS['XML_RPC_errxml'] = 100; - - -/** - * Compose backslashes for escaping regexp - * @global string $GLOBALS['XML_RPC_backslash'] - */ -$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92); - - -/** - * Valid parents of XML elements - * @global array $GLOBALS['XML_RPC_valid_parents'] - */ -$GLOBALS['XML_RPC_valid_parents'] = array( - 'BOOLEAN' => array('VALUE'), - 'I4' => array('VALUE'), - 'INT' => array('VALUE'), - 'STRING' => array('VALUE'), - 'DOUBLE' => array('VALUE'), - 'DATETIME.ISO8601' => array('VALUE'), - 'BASE64' => array('VALUE'), - 'ARRAY' => array('VALUE'), - 'STRUCT' => array('VALUE'), - 'PARAM' => array('PARAMS'), - 'METHODNAME' => array('METHODCALL'), - 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'), - 'MEMBER' => array('STRUCT'), - 'NAME' => array('MEMBER'), - 'DATA' => array('ARRAY'), - 'FAULT' => array('METHODRESPONSE'), - 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'), -); - - -/** - * Stores state during parsing - * - * quick explanation of components: - * + ac = accumulates values - * + qt = decides if quotes are needed for evaluation - * + cm = denotes struct or array (comma needed) - * + isf = indicates a fault - * + lv = indicates "looking for a value": implements the logic - * to allow values with no types to be strings - * + params = stores parameters in method calls - * + method = stores method name - * - * @global array $GLOBALS['XML_RPC_xh'] - */ -$GLOBALS['XML_RPC_xh'] = array(); - - -/** - * Start element handler for the XML parser - * - * @return void - */ -function XML_RPC_se($parser_resource, $name, $attrs) -{ - global $XML_RPC_xh, $XML_RPC_DateTime, $XML_RPC_String, $XML_RPC_valid_parents; - $parser = (int) $parser_resource; - - // if invalid xmlrpc already detected, skip all processing - if ($XML_RPC_xh[$parser]['isf'] >= 2) { - return; - } - - // check for correct element nesting - // top level element can only be of 2 types - if (count($XML_RPC_xh[$parser]['stack']) == 0) { - if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') { - $XML_RPC_xh[$parser]['isf'] = 2; - $XML_RPC_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element'; - return; - } - } else { - // not top level element: see if parent is OK - if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) { - $name = preg_replace('[^a-zA-Z0-9._-]', '', $name); - $XML_RPC_xh[$parser]['isf'] = 2; - $XML_RPC_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$XML_RPC_xh[$parser]['stack'][0]}"; - return; - } - } - - switch ($name) { - case 'STRUCT': - $XML_RPC_xh[$parser]['cm']++; - - // turn quoting off - $XML_RPC_xh[$parser]['qt'] = 0; - - $cur_val = array(); - $cur_val['value'] = array(); - $cur_val['members'] = 1; - array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val); - break; - - case 'ARRAY': - $XML_RPC_xh[$parser]['cm']++; - - // turn quoting off - $XML_RPC_xh[$parser]['qt'] = 0; - - $cur_val = array(); - $cur_val['value'] = array(); - $cur_val['members'] = 0; - array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val); - break; - - case 'NAME': - $XML_RPC_xh[$parser]['ac'] = ''; - break; - - case 'FAULT': - $XML_RPC_xh[$parser]['isf'] = 1; - break; - - case 'PARAM': - $XML_RPC_xh[$parser]['valuestack'] = array(); - break; - - case 'VALUE': - $XML_RPC_xh[$parser]['lv'] = 1; - $XML_RPC_xh[$parser]['vt'] = $XML_RPC_String; - $XML_RPC_xh[$parser]['ac'] = ''; - $XML_RPC_xh[$parser]['qt'] = 0; - // look for a value: if this is still 1 by the - // time we reach the first data segment then the type is string - // by implication and we need to add in a quote - break; - - case 'I4': - case 'INT': - case 'STRING': - case 'BOOLEAN': - case 'DOUBLE': - case 'DATETIME.ISO8601': - case 'BASE64': - $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator - - if ($name == 'DATETIME.ISO8601' || $name == 'STRING') { - $XML_RPC_xh[$parser]['qt'] = 1; - - if ($name == 'DATETIME.ISO8601') { - $XML_RPC_xh[$parser]['vt'] = $XML_RPC_DateTime; - } - - } elseif ($name == 'BASE64') { - $XML_RPC_xh[$parser]['qt'] = 2; - } else { - // No quoting is required here -- but - // at the end of the element we must check - // for data format errors. - $XML_RPC_xh[$parser]['qt'] = 0; - } - break; - - case 'MEMBER': - $XML_RPC_xh[$parser]['ac'] = ''; - break; - - case 'DATA': - case 'METHODCALL': - case 'METHODNAME': - case 'METHODRESPONSE': - case 'PARAMS': - // valid elements that add little to processing - break; - } - - - // Save current element to stack - array_unshift($XML_RPC_xh[$parser]['stack'], $name); - - if ($name != 'VALUE') { - $XML_RPC_xh[$parser]['lv'] = 0; - } -} - -/** - * End element handler for the XML parser - * - * @return void - */ -function XML_RPC_ee($parser_resource, $name) -{ - global $XML_RPC_xh, $XML_RPC_Types, $XML_RPC_String; - $parser = (int) $parser_resource; - - if ($XML_RPC_xh[$parser]['isf'] >= 2) { - return; - } - - // push this element from stack - // NB: if XML validates, correct opening/closing is guaranteed and - // we do not have to check for $name == $curr_elem. - // we also checked for proper nesting at start of elements... - $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']); - - switch ($name) { - case 'STRUCT': - case 'ARRAY': - $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']); - $XML_RPC_xh[$parser]['value'] = $cur_val['value']; - $XML_RPC_xh[$parser]['vt'] = strtolower($name); - $XML_RPC_xh[$parser]['cm']--; - break; - - case 'NAME': - $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac']; - break; - - case 'BOOLEAN': - // special case here: we translate boolean 1 or 0 into PHP - // constants true or false - if ($XML_RPC_xh[$parser]['ac'] == '1') { - $XML_RPC_xh[$parser]['ac'] = 'true'; - } else { - $XML_RPC_xh[$parser]['ac'] = 'false'; - } - - $XML_RPC_xh[$parser]['vt'] = strtolower($name); - // Drop through intentionally. - - case 'I4': - case 'INT': - case 'STRING': - case 'DOUBLE': - case 'DATETIME.ISO8601': - case 'BASE64': - if ($XML_RPC_xh[$parser]['qt'] == 1) { - // we use double quotes rather than single so backslashification works OK - $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac']; - } elseif ($XML_RPC_xh[$parser]['qt'] == 2) { - $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']); - } elseif ($name == 'BOOLEAN') { - $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac']; - } else { - // we have an I4, INT or a DOUBLE - // we must check that only 0123456789-. are characters here - if (!ereg("^[+-]?[0123456789 \t\.]+$", $XML_RPC_xh[$parser]['ac'])) { - XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE', - XML_RPC_ERROR_NON_NUMERIC_FOUND); - $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND; - } else { - // it's ok, add it on - $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac']; - } - } - - $XML_RPC_xh[$parser]['ac'] = ''; - $XML_RPC_xh[$parser]['qt'] = 0; - $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value - break; - - case 'VALUE': - // deal with a string value - if (strlen($XML_RPC_xh[$parser]['ac']) > 0 && - $XML_RPC_xh[$parser]['vt'] == $XML_RPC_String) { - $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac']; - } - - $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']); - - $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']); - if (is_array($cur_val)) { - if ($cur_val['members']==0) { - $cur_val['value'][] = $temp; - } else { - $XML_RPC_xh[$parser]['value'] = $temp; - } - array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val); - } else { - $XML_RPC_xh[$parser]['value'] = $temp; - } - break; - - case 'MEMBER': - $XML_RPC_xh[$parser]['ac'] = ''; - $XML_RPC_xh[$parser]['qt'] = 0; - - $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']); - if (is_array($cur_val)) { - if ($cur_val['members']==1) { - $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value']; - } - array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val); - } - break; - - case 'DATA': - $XML_RPC_xh[$parser]['ac'] = ''; - $XML_RPC_xh[$parser]['qt'] = 0; - break; - - case 'PARAM': - $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value']; - break; - - case 'METHODNAME': - case 'RPCMETHODNAME': - $XML_RPC_xh[$parser]['method'] = ereg_replace("^[\n\r\t ]+", '', - $XML_RPC_xh[$parser]['ac']); - break; - } - - // if it's a valid type name, set the type - if (isset($XML_RPC_Types[strtolower($name)])) { - $XML_RPC_xh[$parser]['vt'] = strtolower($name); - } -} - -/** - * Character data handler for the XML parser - * - * @return void - */ -function XML_RPC_cd($parser_resource, $data) -{ - global $XML_RPC_xh, $XML_RPC_backslash; - $parser = (int) $parser_resource; - - if ($XML_RPC_xh[$parser]['lv'] != 3) { - // "lookforvalue==3" means that we've found an entire value - // and should discard any further character data - - if ($XML_RPC_xh[$parser]['lv'] == 1) { - // if we've found text and we're just in a then - // turn quoting on, as this will be a string - $XML_RPC_xh[$parser]['qt'] = 1; - // and say we've found a value - $XML_RPC_xh[$parser]['lv'] = 2; - } - - // replace characters that eval would - // do special things with - if (!isset($XML_RPC_xh[$parser]['ac'])) { - $XML_RPC_xh[$parser]['ac'] = ''; - } - $XML_RPC_xh[$parser]['ac'] .= $data; - } -} - -/** - * The common methods and properties for all of the XML_RPC classes - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Base { - - /** - * PEAR Error handling - * - * @return object PEAR_Error object - */ - function raiseError($msg, $code) - { - include_once 'PEAR.php'; - if (is_object(@$this)) { - return PEAR::raiseError(get_class($this) . ': ' . $msg, $code); - } else { - return PEAR::raiseError('XML_RPC: ' . $msg, $code); - } - } - - /** - * Tell whether something is a PEAR_Error object - * - * @param mixed $value the item to check - * - * @return bool whether $value is a PEAR_Error object or not - * - * @access public - */ - function isError($value) - { - return is_a($value, 'PEAR_Error'); - } -} - -/** - * The methods and properties for submitting XML RPC requests - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Client extends XML_RPC_Base { - - /** - * The path and name of the RPC server script you want the request to go to - * @var string - */ - var $path = ''; - - /** - * The name of the remote server to connect to - * @var string - */ - var $server = ''; - - /** - * The protocol to use in contacting the remote server - * @var string - */ - var $protocol = 'http://'; - - /** - * The port for connecting to the remote server - * - * The default is 80 for http:// connections - * and 443 for https:// and ssl:// connections. - * - * @var integer - */ - var $port = 80; - - /** - * A user name for accessing the RPC server - * @var string - * @see XML_RPC_Client::setCredentials() - */ - var $username = ''; - - /** - * A password for accessing the RPC server - * @var string - * @see XML_RPC_Client::setCredentials() - */ - var $password = ''; - - /** - * The name of the proxy server to use, if any - * @var string - */ - var $proxy = ''; - - /** - * The protocol to use in contacting the proxy server, if any - * @var string - */ - var $proxy_protocol = 'http://'; - - /** - * The port for connecting to the proxy server - * - * The default is 8080 for http:// connections - * and 443 for https:// and ssl:// connections. - * - * @var integer - */ - var $proxy_port = 8080; - - /** - * A user name for accessing the proxy server - * @var string - */ - var $proxy_user = ''; - - /** - * A password for accessing the proxy server - * @var string - */ - var $proxy_pass = ''; - - /** - * The error number, if any - * @var integer - */ - var $errno = 0; - - /** - * The error message, if any - * @var string - */ - var $errstr = ''; - - /** - * The current debug mode (1 = on, 0 = off) - * @var integer - */ - var $debug = 0; - - /** - * The HTTP headers for the current request. - * @var string - */ - var $headers = ''; - - - /** - * Sets the object's properties - * - * @param string $path the path and name of the RPC server script - * you want the request to go to - * @param string $server the URL of the remote server to connect to. - * If this parameter doesn't specify a - * protocol and $port is 443, ssl:// is - * assumed. - * @param integer $port a port for connecting to the remote server. - * Defaults to 80 for http:// connections and - * 443 for https:// and ssl:// connections. - * @param string $proxy the URL of the proxy server to use, if any. - * If this parameter doesn't specify a - * protocol and $port is 443, ssl:// is - * assumed. - * @param integer $proxy_port a port for connecting to the remote server. - * Defaults to 8080 for http:// connections and - * 443 for https:// and ssl:// connections. - * @param string $proxy_user a user name for accessing the proxy server - * @param string $proxy_pass a password for accessing the proxy server - * - * @return void - */ - function XML_RPC_Client($path, $server, $port = 0, - $proxy = '', $proxy_port = 0, - $proxy_user = '', $proxy_pass = '') - { - $this->path = $path; - $this->proxy_user = $proxy_user; - $this->proxy_pass = $proxy_pass; - - preg_match('@^(http://|https://|ssl://)?(.*)$@', $server, $match); - if ($match[1] == '') { - if ($port == 443) { - $this->server = $match[2]; - $this->protocol = 'ssl://'; - $this->port = 443; - } else { - $this->server = $match[2]; - if ($port) { - $this->port = $port; - } - } - } elseif ($match[1] == 'http://') { - $this->server = $match[2]; - if ($port) { - $this->port = $port; - } - } else { - $this->server = $match[2]; - $this->protocol = 'ssl://'; - if ($port) { - $this->port = $port; - } else { - $this->port = 443; - } - } - - if ($proxy) { - preg_match('@^(http://|https://|ssl://)?(.*)$@', $proxy, $match); - if ($match[1] == '') { - if ($proxy_port == 443) { - $this->proxy = $match[2]; - $this->proxy_protocol = 'ssl://'; - $this->proxy_port = 443; - } else { - $this->proxy = $match[2]; - if ($proxy_port) { - $this->proxy_port = $proxy_port; - } - } - } elseif ($match[1] == 'http://') { - $this->proxy = $match[2]; - if ($proxy_port) { - $this->proxy_port = $proxy_port; - } - } else { - $this->proxy = $match[2]; - $this->proxy_protocol = 'ssl://'; - if ($proxy_port) { - $this->proxy_port = $proxy_port; - } else { - $this->proxy_port = 443; - } - } - } - } - - /** - * Change the current debug mode - * - * @param int $in where 1 = on, 0 = off - * - * @return void - */ - function setDebug($in) - { - if ($in) { - $this->debug = 1; - } else { - $this->debug = 0; - } - } - - /** - * Set username and password properties for connecting to the RPC server - * - * @param string $u the user name - * @param string $p the password - * - * @return void - * - * @see XML_RPC_Client::$username, XML_RPC_Client::$password - */ - function setCredentials($u, $p) - { - $this->username = $u; - $this->password = $p; - } - - /** - * Transmit the RPC request via HTTP 1.0 protocol - * - * @param object $msg the XML_RPC_Message object - * @param int $timeout how many seconds to wait for the request - * - * @return object an XML_RPC_Response object. 0 is returned if any - * problems happen. - * - * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(), - * XML_RPC_Client::setCredentials() - */ - function send($msg, $timeout = 0) - { - if (strtolower(get_class($msg)) != 'xml_rpc_message') { - $this->errstr = 'send()\'s $msg parameter must be an' - . ' XML_RPC_Message object.'; - $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING); - return 0; - } - $msg->debug = $this->debug; - return $this->sendPayloadHTTP10($msg, $this->server, $this->port, - $timeout, $this->username, - $this->password); - } - - /** - * Transmit the RPC request via HTTP 1.0 protocol - * - * Requests should be sent using XML_RPC_Client send() rather than - * calling this method directly. - * - * @param object $msg the XML_RPC_Message object - * @param string $server the server to send the request to - * @param int $port the server port send the request to - * @param int $timeout how many seconds to wait for the request - * before giving up - * @param string $username a user name for accessing the RPC server - * @param string $password a password for accessing the RPC server - * - * @return object an XML_RPC_Response object. 0 is returned if any - * problems happen. - * - * @access protected - * @see XML_RPC_Client::send() - */ - function sendPayloadHTTP10($msg, $server, $port, $timeout = 0, - $username = '', $password = '') - { - /* - * If we're using a proxy open a socket to the proxy server - * instead to the xml-rpc server - */ - if ($this->proxy) { - if ($this->proxy_protocol == 'http://') { - $protocol = ''; - } else { - $protocol = $this->proxy_protocol; - } - if ($timeout > 0) { - $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port, - $this->errno, $this->errstr, $timeout); - } else { - $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port, - $this->errno, $this->errstr); - } - } else { - if ($this->protocol == 'http://') { - $protocol = ''; - } else { - $protocol = $this->protocol; - } - if ($timeout > 0) { - $fp = @fsockopen($protocol . $server, $port, - $this->errno, $this->errstr, $timeout); - } else { - $fp = @fsockopen($protocol . $server, $port, - $this->errno, $this->errstr); - } - } - - /* - * Just raising the error without returning it is strange, - * but keep it here for backwards compatibility. - */ - if (!$fp && $this->proxy) { - $this->raiseError('Connection to proxy server ' - . $this->proxy . ':' . $this->proxy_port - . ' failed. ' . $this->errstr, - XML_RPC_ERROR_CONNECTION_FAILED); - return 0; - } elseif (!$fp) { - $this->raiseError('Connection to RPC server ' - . $server . ':' . $port - . ' failed. ' . $this->errstr, - XML_RPC_ERROR_CONNECTION_FAILED); - return 0; - } - - if ($timeout) { - /* - * Using socket_set_timeout() because stream_set_timeout() - * was introduced in 4.3.0, but we need to support 4.2.0. - */ - socket_set_timeout($fp, $timeout); - } - - // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly - if ($username != $this->username) { - $this->setCredentials($username, $password); - } - - // Only create the payload if it was not created previously - if (empty($msg->payload)) { - $msg->createPayload(); - } - $this->createHeaders($msg); - - $op = $this->headers . "\r\n\r\n"; - $op .= $msg->payload; - - if (!fputs($fp, $op, strlen($op))) { - $this->errstr = 'Write error'; - return 0; - } - $resp = $msg->parseResponseFile($fp); - - $meta = socket_get_status($fp); - if ($meta['timed_out']) { - fclose($fp); - $this->errstr = 'RPC server did not send response before timeout.'; - $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED); - return 0; - } - - fclose($fp); - return $resp; - } - - /** - * Determines the HTTP headers and puts it in the $headers property - * - * @param object $msg the XML_RPC_Message object - * - * @return boolean TRUE if okay, FALSE if the message payload isn't set. - * - * @access protected - */ - function createHeaders($msg) - { - if (empty($msg->payload)) { - return false; - } - if ($this->proxy) { - $this->headers = 'POST ' . $this->protocol . $this->server; - if ($this->proxy_port) { - $this->headers .= ':' . $this->port; - } - } else { - $this->headers = 'POST '; - } - $this->headers .= $this->path. " HTTP/1.0\r\n"; - - $this->headers .= "User-Agent: PEAR XML_RPC\r\n"; - $this->headers .= 'Host: ' . $this->server . "\r\n"; - - if ($this->proxy && $this->proxy_user) { - $this->headers .= 'Proxy-Authorization: Basic ' - . base64_encode("$this->proxy_user:$this->proxy_pass") - . "\r\n"; - } - - // thanks to Grant Rauscher for this - if ($this->username) { - $this->headers .= 'Authorization: Basic ' - . base64_encode("$this->username:$this->password") - . "\r\n"; - } - - $this->headers .= "Content-Type: text/xml\r\n"; - $this->headers .= 'Content-Length: ' . strlen($msg->payload); - return true; - } -} - -/** - * The methods and properties for interpreting responses to XML RPC requests - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Response extends XML_RPC_Base -{ - var $xv; - var $fn; - var $fs; - var $hdrs; - - /** - * @return void - */ - function XML_RPC_Response($val, $fcode = 0, $fstr = '') - { - if ($fcode != 0) { - $this->fn = $fcode; - $this->fs = htmlspecialchars($fstr); - } else { - $this->xv = $val; - } - } - - /** - * @return int the error code - */ - function faultCode() - { - if (isset($this->fn)) { - return $this->fn; - } else { - return 0; - } - } - - /** - * @return string the error string - */ - function faultString() - { - return $this->fs; - } - - /** - * @return mixed the value - */ - function value() - { - return $this->xv; - } - - /** - * @return string the error message in XML format - */ - function serialize() - { - $rs = "\n"; - if ($this->fn) { - $rs .= " - - - - faultCode - " . $this->fn . " - - - faultString - " . $this->fs . " - - - -"; - } else { - $rs .= "\n\n" . $this->xv->serialize() . - "\n"; - } - $rs .= "\n"; - return $rs; - } -} - -/** - * The methods and properties for composing XML RPC messages - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Message extends XML_RPC_Base -{ - /** - * The current debug mode (1 = on, 0 = off) - * @var integer - */ - var $debug = 0; - - /** - * The encoding to be used for outgoing messages - * - * Defaults to the value of $GLOBALS['XML_RPC_defencoding'] - * - * @var string - * @see XML_RPC_Message::setSendEncoding(), - * $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header() - */ - var $send_encoding = ''; - - /** - * The method presently being evaluated - * @var string - */ - var $methodname = ''; - - /** - * @var array - */ - var $params = array(); - - /** - * The XML message being generated - * @var string - */ - var $payload = ''; - - /** - * @return void - */ - function XML_RPC_Message($meth, $pars = 0) - { - $this->methodname = $meth; - if (is_array($pars) && sizeof($pars) > 0) { - for ($i = 0; $i < sizeof($pars); $i++) { - $this->addParam($pars[$i]); - } - } - } - - /** - * Produces the XML declaration including the encoding attribute - * - * The encoding is determined by this class' $send_encoding - * property. If the $send_encoding property is not set, use - * $GLOBALS['XML_RPC_defencoding']. - * - * @return string the XML declaration and element - * - * @see XML_RPC_Message::setSendEncoding(), - * XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding'] - */ - function xml_header() - { - global $XML_RPC_defencoding; - if (!$this->send_encoding) { - $this->send_encoding = $XML_RPC_defencoding; - } - return 'send_encoding . '"?>' - . "\n\n"; - } - - /** - * @return string the closing tag - */ - function xml_footer() - { - return "\n"; - } - - /** - * @return void - * - * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer() - */ - function createPayload() - { - $this->payload = $this->xml_header(); - $this->payload .= '' . $this->methodname . "\n"; - $this->payload .= "\n"; - for ($i = 0; $i < sizeof($this->params); $i++) { - $p = $this->params[$i]; - $this->payload .= "\n" . $p->serialize() . "\n"; - } - $this->payload .= "\n"; - $this->payload .= $this->xml_footer(); - $this->payload = ereg_replace("[\r\n]+", "\r\n", $this->payload); - } - - /** - * @return string the name of the method - */ - function method($meth = '') - { - if ($meth != '') { - $this->methodname = $meth; - } - return $this->methodname; - } - - /** - * @return string the payload - */ - function serialize() - { - $this->createPayload(); - return $this->payload; - } - - /** - * @return void - */ - function addParam($par) - { - $this->params[] = $par; - } - - /** - * Obtains an XML_RPC_Value object for the given parameter - * - * @param int $i the index number of the parameter to obtain - * - * @return object the XML_RPC_Value object. - * If the parameter doesn't exist, an XML_RPC_Response object. - * - * @since Returns XML_RPC_Response object on error since Release 1.3.0 - */ - function getParam($i) - { - global $XML_RPC_err, $XML_RPC_str; - - if (isset($this->params[$i])) { - return $this->params[$i]; - } else { - $this->raiseError('The submitted request did not contain this parameter', - XML_RPC_ERROR_INCORRECT_PARAMS); - return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'], - $XML_RPC_str['incorrect_params']); - } - } - - /** - * @return int the number of parameters - */ - function getNumParams() - { - return sizeof($this->params); - } - - /** - * Sets the XML declaration's encoding attribute - * - * @param string $type the encoding type (ISO-8859-1, UTF-8 or US-ASCII) - * - * @return void - * - * @see XML_RPC_Message::$send_encoding, XML_RPC_Message::xml_header() - * @since Method available since Release 1.2.0 - */ - function setSendEncoding($type) - { - $this->send_encoding = $type; - } - - /** - * Determine the XML's encoding via the encoding attribute - * in the XML declaration - * - * If the encoding parameter is not set or is not ISO-8859-1, UTF-8 - * or US-ASCII, $XML_RPC_defencoding will be returned. - * - * @param string $data the XML that will be parsed - * - * @return string the encoding to be used - * - * @link http://php.net/xml_parser_create - * @since Method available since Release 1.2.0 - */ - function getEncoding($data) - { - global $XML_RPC_defencoding; - - if (preg_match('/<\?xml[^>]*\s*encoding\s*=\s*[\'"]([^"\']*)[\'"]/i', - $data, $match)) - { - $match[1] = trim(strtoupper($match[1])); - switch ($match[1]) { - case 'ISO-8859-1': - case 'UTF-8': - case 'US-ASCII': - return $match[1]; - break; - - default: - return $XML_RPC_defencoding; - } - } else { - return $XML_RPC_defencoding; - } - } - - /** - * @return object a new XML_RPC_Response object - */ - function parseResponseFile($fp) - { - $ipd = ''; - while ($data = @fread($fp, 8192)) { - $ipd .= $data; - } - return $this->parseResponse($ipd); - } - - /** - * @return object a new XML_RPC_Response object - */ - function parseResponse($data = '') - { - global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding; - - $encoding = $this->getEncoding($data); - $parser_resource = xml_parser_create($encoding); - $parser = (int) $parser_resource; - - $XML_RPC_xh = array(); - $XML_RPC_xh[$parser] = array(); - - $XML_RPC_xh[$parser]['cm'] = 0; - $XML_RPC_xh[$parser]['isf'] = 0; - $XML_RPC_xh[$parser]['ac'] = ''; - $XML_RPC_xh[$parser]['qt'] = ''; - $XML_RPC_xh[$parser]['stack'] = array(); - $XML_RPC_xh[$parser]['valuestack'] = array(); - - xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true); - xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee'); - xml_set_character_data_handler($parser_resource, 'XML_RPC_cd'); - - $hdrfnd = 0; - if ($this->debug) { - print "\n
    ---GOT---\n";
    -            print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
    -            print "\n---END---
    \n"; - } - - // See if response is a 200 or a 100 then a 200, else raise error. - // But only do this if we're using the HTTP protocol. - if (ereg('^HTTP', $data) && - !ereg('^HTTP/[0-9\.]+ 200 ', $data) && - !preg_match('@^HTTP/[0-9\.]+ 10[0-9]([A-Za-z ]+)?[\r\n]+HTTP/[0-9\.]+ 200@', $data)) - { - $errstr = substr($data, 0, strpos($data, "\n") - 1); - if(defined("DEBUG") && DEBUG) {error_log('HTTP error, got response: ' . $errstr);} - $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'], - $XML_RPC_str['http_error'] . ' (' . - $errstr . ')'); - xml_parser_free($parser_resource); - return $r; - } - - // gotta get rid of headers here - if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) { - $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos); - $data = substr($data, $brpos + 4); - $hdrfnd = 1; - } - - /* - * be tolerant of junk after methodResponse - * (e.g. javascript automatically inserted by free hosts) - * thanks to Luca Mariano - */ - $data = substr($data, 0, strpos($data, "") + 17); - - if (!xml_parse($parser_resource, $data, sizeof($data))) { - // thanks to Peter Kocks - if (xml_get_current_line_number($parser_resource) == 1) { - $errstr = 'XML error at line 1, check URL'; - } else { - $errstr = sprintf('XML error: %s at line %d', - xml_error_string(xml_get_error_code($parser_resource)), - xml_get_current_line_number($parser_resource)); - } - if(defined("DEBUG") && DEBUG) {error_log($errstr);} - $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], - $XML_RPC_str['invalid_return']); - xml_parser_free($parser_resource); - return $r; - } - - xml_parser_free($parser_resource); - - if ($this->debug) { - print "\n
    ---PARSED---\n";
    -            var_dump($XML_RPC_xh[$parser]['value']);
    -            print "---END---
    \n"; - } - - if ($XML_RPC_xh[$parser]['isf'] > 1) { - $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], - $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']); - } elseif (!is_object($XML_RPC_xh[$parser]['value'])) { - // then something odd has happened - // and it's time to generate a client side error - // indicating something odd went on - $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], - $XML_RPC_str['invalid_return']); - } else { - $v = $XML_RPC_xh[$parser]['value']; - $allOK=1; - if ($XML_RPC_xh[$parser]['isf']) { - $f = $v->structmem('faultCode'); - $fs = $v->structmem('faultString'); - $r = new XML_RPC_Response($v, $f->scalarval(), - $fs->scalarval()); - } else { - $r = new XML_RPC_Response($v); - } - } - $r->hdrs = split("\r?\n", $XML_RPC_xh[$parser]['ha'][1]); - return $r; - } -} - -/** - * The methods and properties that represent data in XML RPC format - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Value extends XML_RPC_Base -{ - var $me = array(); - var $mytype = 0; - - /** - * @return void - */ - function XML_RPC_Value($val = -1, $type = '') - { - global $XML_RPC_Types; - $this->me = array(); - $this->mytype = 0; - if ($val != -1 || $type != '') { - if ($type == '') { - $type = 'string'; - } - if (!array_key_exists($type, $XML_RPC_Types)) { - // XXX - // need some way to report this error - } elseif ($XML_RPC_Types[$type] == 1) { - $this->addScalar($val, $type); - } elseif ($XML_RPC_Types[$type] == 2) { - $this->addArray($val); - } elseif ($XML_RPC_Types[$type] == 3) { - $this->addStruct($val); - } - } - } - - /** - * @return int returns 1 if successful or 0 if there are problems - */ - function addScalar($val, $type = 'string') - { - global $XML_RPC_Types, $XML_RPC_Boolean; - - if ($this->mytype == 1) { - $this->raiseError('Scalar can have only one value', - XML_RPC_ERROR_INVALID_TYPE); - return 0; - } - $typeof = $XML_RPC_Types[$type]; - if ($typeof != 1) { - $this->raiseError("Not a scalar type (${typeof})", - XML_RPC_ERROR_INVALID_TYPE); - return 0; - } - - if ($type == $XML_RPC_Boolean) { - if (strcasecmp($val, 'true') == 0 - || $val == 1 - || ($val == true && strcasecmp($val, 'false'))) - { - $val = 1; - } else { - $val = 0; - } - } - - if ($this->mytype == 2) { - // we're adding to an array here - $ar = $this->me['array']; - $ar[] = new XML_RPC_Value($val, $type); - $this->me['array'] = $ar; - } else { - // a scalar, so set the value and remember we're scalar - $this->me[$type] = $val; - $this->mytype = $typeof; - } - return 1; - } - - /** - * @return int returns 1 if successful or 0 if there are problems - */ - function addArray($vals) - { - global $XML_RPC_Types; - if ($this->mytype != 0) { - $this->raiseError( - 'Already initialized as a [' . $this->kindOf() . ']', - XML_RPC_ERROR_ALREADY_INITIALIZED); - return 0; - } - $this->mytype = $XML_RPC_Types['array']; - $this->me['array'] = $vals; - return 1; - } - - /** - * @return int returns 1 if successful or 0 if there are problems - */ - function addStruct($vals) - { - global $XML_RPC_Types; - if ($this->mytype != 0) { - $this->raiseError( - 'Already initialized as a [' . $this->kindOf() . ']', - XML_RPC_ERROR_ALREADY_INITIALIZED); - return 0; - } - $this->mytype = $XML_RPC_Types['struct']; - $this->me['struct'] = $vals; - return 1; - } - - /** - * @return void - */ - function dump($ar) - { - reset($ar); - foreach ($ar as $key => $val) { - echo "$key => $val
    "; - if ($key == 'array') { - foreach ($val as $key2 => $val2) { - echo "-- $key2 => $val2
    "; - } - } - } - } - - /** - * @return string the data type of the current value - */ - function kindOf() - { - switch ($this->mytype) { - case 3: - return 'struct'; - - case 2: - return 'array'; - - case 1: - return 'scalar'; - - default: - return 'undef'; - } - } - - /** - * @return string the data in XML format - */ - function serializedata($typ, $val) - { - $rs = ''; - global $XML_RPC_Types, $XML_RPC_Base64, $XML_RPC_String, $XML_RPC_Boolean; - if (!array_key_exists($typ, $XML_RPC_Types)) { - // XXX - // need some way to report this error - return; - } - switch ($XML_RPC_Types[$typ]) { - case 3: - // struct - $rs .= "\n"; - reset($val); - foreach ($val as $key2 => $val2) { - $rs .= "${key2}\n"; - $rs .= $this->serializeval($val2); - $rs .= "\n"; - } - $rs .= ''; - break; - - case 2: - // array - $rs .= "\n\n"; - for ($i = 0; $i < sizeof($val); $i++) { - $rs .= $this->serializeval($val[$i]); - } - $rs .= "\n"; - break; - - case 1: - switch ($typ) { - case $XML_RPC_Base64: - $rs .= "<${typ}>" . base64_encode($val) . ""; - break; - case $XML_RPC_Boolean: - $rs .= "<${typ}>" . ($val ? '1' : '0') . ""; - break; - case $XML_RPC_String: - $rs .= "<${typ}>" . htmlspecialchars($val). ""; - break; - default: - $rs .= "<${typ}>${val}"; - } - } - return $rs; - } - - /** - * @return string the data in XML format - */ - function serialize() - { - return $this->serializeval($this); - } - - /** - * @return string the data in XML format - */ - function serializeval($o) - { - if (!is_object($o) || empty($o->me) || !is_array($o->me)) { - return ''; - } - $ar = $o->me; - reset($ar); - list($typ, $val) = each($ar); - return '' . $this->serializedata($typ, $val) . "\n"; - } - - /** - * @return mixed the contents of the element requested - */ - function structmem($m) - { - return $this->me['struct'][$m]; - } - - /** - * @return void - */ - function structreset() - { - reset($this->me['struct']); - } - - /** - * @return the key/value pair of the struct's current element - */ - function structeach() - { - return each($this->me['struct']); - } - - /** - * @return mixed the current value - */ - function getval() - { - // UNSTABLE - global $XML_RPC_BOOLEAN, $XML_RPC_Base64; - - reset($this->me); - $b = current($this->me); - - // contributed by I Sofer, 2001-03-24 - // add support for nested arrays to scalarval - // i've created a new method here, so as to - // preserve back compatibility - - if (is_array($b)) { - foreach ($b as $id => $cont) { - $b[$id] = $cont->scalarval(); - } - } - - // add support for structures directly encoding php objects - if (is_object($b)) { - $t = get_object_vars($b); - foreach ($t as $id => $cont) { - $t[$id] = $cont->scalarval(); - } - foreach ($t as $id => $cont) { - $b->$id = $cont; - } - } - - // end contrib - return $b; - } - - /** - * @return mixed - */ - function scalarval() - { - global $XML_RPC_Boolean, $XML_RPC_Base64; - reset($this->me); - return current($this->me); - } - - /** - * @return string - */ - function scalartyp() - { - global $XML_RPC_I4, $XML_RPC_Int; - reset($this->me); - $a = key($this->me); - if ($a == $XML_RPC_I4) { - $a = $XML_RPC_Int; - } - return $a; - } - - /** - * @return mixed the struct's current element - */ - function arraymem($m) - { - return $this->me['array'][$m]; - } - - /** - * @return int the number of elements in the array - */ - function arraysize() - { - reset($this->me); - list($a, $b) = each($this->me); - return sizeof($b); - } - - /** - * Determines if the item submitted is an XML_RPC_Value object - * - * @param mixed $val the variable to be evaluated - * - * @return bool TRUE if the item is an XML_RPC_Value object - * - * @static - * @since Method available since Release 1.3.0 - */ - function isValue($val) - { - return (strtolower(get_class($val)) == 'xml_rpc_value'); - } -} - -/** - * Return an ISO8601 encoded string - * - * While timezones ought to be supported, the XML-RPC spec says: - * - * "Don't assume a timezone. It should be specified by the server in its - * documentation what assumptions it makes about timezones." - * - * This routine always assumes localtime unless $utc is set to 1, in which - * case UTC is assumed and an adjustment for locale is made when encoding. - * - * @return string the formatted date - */ -function XML_RPC_iso8601_encode($timet, $utc = 0) -{ - if (!$utc) { - $t = strftime('%Y%m%dT%H:%M:%S', $timet); - } else { - if (function_exists('gmstrftime')) { - // gmstrftime doesn't exist in some versions - // of PHP - $t = gmstrftime('%Y%m%dT%H:%M:%S', $timet); - } else { - $t = strftime('%Y%m%dT%H:%M:%S', $timet - date('Z')); - } - } - return $t; -} - -/** - * Convert a datetime string into a Unix timestamp - * - * While timezones ought to be supported, the XML-RPC spec says: - * - * "Don't assume a timezone. It should be specified by the server in its - * documentation what assumptions it makes about timezones." - * - * This routine always assumes localtime unless $utc is set to 1, in which - * case UTC is assumed and an adjustment for locale is made when encoding. - * - * @return int the unix timestamp of the date submitted - */ -function XML_RPC_iso8601_decode($idate, $utc = 0) -{ - $t = 0; - if (ereg('([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})', $idate, $regs)) { - if ($utc) { - $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } else { - $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } - } - return $t; -} - -/** - * Converts an XML_RPC_Value object into native PHP types - * - * @param object $XML_RPC_val the XML_RPC_Value object to decode - * - * @return mixed the PHP values - */ -function XML_RPC_decode($XML_RPC_val) -{ - $kind = $XML_RPC_val->kindOf(); - - if ($kind == 'scalar') { - return $XML_RPC_val->scalarval(); - - } elseif ($kind == 'array') { - $size = $XML_RPC_val->arraysize(); - $arr = array(); - for ($i = 0; $i < $size; $i++) { - $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i)); - } - return $arr; - - } elseif ($kind == 'struct') { - $XML_RPC_val->structreset(); - $arr = array(); - while (list($key, $value) = $XML_RPC_val->structeach()) { - $arr[$key] = XML_RPC_decode($value); - } - return $arr; - } -} - -/** - * Converts native PHP types into an XML_RPC_Value object - * - * @param mixed $php_val the PHP value or variable you want encoded - * - * @return object the XML_RPC_Value object - */ -function XML_RPC_encode($php_val) -{ - global $XML_RPC_Boolean, $XML_RPC_Int, $XML_RPC_Double, $XML_RPC_String, - $XML_RPC_Array, $XML_RPC_Struct; - - $type = gettype($php_val); - $XML_RPC_val = new XML_RPC_Value; - - switch ($type) { - case 'array': - if (empty($php_val)) { - $XML_RPC_val->addArray($php_val); - break; - } - $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1)); - if (empty($tmp)) { - $arr = array(); - foreach ($php_val as $k => $v) { - $arr[$k] = XML_RPC_encode($v); - } - $XML_RPC_val->addArray($arr); - break; - } - // fall though if it's not an enumerated array - - case 'object': - $arr = array(); - foreach ($php_val as $k => $v) { - $arr[$k] = XML_RPC_encode($v); - } - $XML_RPC_val->addStruct($arr); - break; - - case 'integer': - $XML_RPC_val->addScalar($php_val, $XML_RPC_Int); - break; - - case 'double': - $XML_RPC_val->addScalar($php_val, $XML_RPC_Double); - break; - - case 'string': - case 'NULL': - $XML_RPC_val->addScalar($php_val, $XML_RPC_String); - break; - - case 'boolean': - // Add support for encoding/decoding of booleans, since they - // are supported in PHP - // by - $XML_RPC_val->addScalar($php_val, $XML_RPC_Boolean); - break; - - case 'unknown type': - default: - $XML_RPC_val = false; - } - return $XML_RPC_val; -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ - -?> diff --git a/3rdparty/XML/RPC/Server.php b/3rdparty/XML/RPC/Server.php deleted file mode 100644 index 5c5c04b1f7a..00000000000 --- a/3rdparty/XML/RPC/Server.php +++ /dev/null @@ -1,624 +0,0 @@ - - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version CVS: $Id: Server.php,v 1.29 2005/08/14 20:25:35 danielc Exp $ - * @link http://pear.php.net/package/XML_RPC - */ - - -/** - * Pull in the XML_RPC class - */ -require_once 'XML/RPC.php'; - - -/** - * signature for system.listMethods: return = array, - * parameters = a string or nothing - * @global array $GLOBALS['XML_RPC_Server_listMethods_sig'] - */ -$GLOBALS['XML_RPC_Server_listMethods_sig'] = array( - array($GLOBALS['XML_RPC_Array'], - $GLOBALS['XML_RPC_String'] - ), - array($GLOBALS['XML_RPC_Array']) -); - -/** - * docstring for system.listMethods - * @global string $GLOBALS['XML_RPC_Server_listMethods_doc'] - */ -$GLOBALS['XML_RPC_Server_listMethods_doc'] = 'This method lists all the' - . ' methods that the XML-RPC server knows how to dispatch'; - -/** - * signature for system.methodSignature: return = array, - * parameters = string - * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig'] - */ -$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array( - array($GLOBALS['XML_RPC_Array'], - $GLOBALS['XML_RPC_String'] - ) -); - -/** - * docstring for system.methodSignature - * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc'] - */ -$GLOBALS['XML_RPC_Server_methodSignature_doc'] = 'Returns an array of known' - . ' signatures (an array of arrays) for the method name passed. If' - . ' no signatures are known, returns a none-array (test for type !=' - . ' array to detect missing signature)'; - -/** - * signature for system.methodHelp: return = string, - * parameters = string - * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig'] - */ -$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array( - array($GLOBALS['XML_RPC_String'], - $GLOBALS['XML_RPC_String'] - ) -); - -/** - * docstring for methodHelp - * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc'] - */ -$GLOBALS['XML_RPC_Server_methodHelp_doc'] = 'Returns help text if defined' - . ' for the method passed, otherwise returns an empty string'; - -/** - * dispatch map for the automatically declared XML-RPC methods. - * @global array $GLOBALS['XML_RPC_Server_dmap'] - */ -$GLOBALS['XML_RPC_Server_dmap'] = array( - 'system.listMethods' => array( - 'function' => 'XML_RPC_Server_listMethods', - 'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'], - 'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc'] - ), - 'system.methodHelp' => array( - 'function' => 'XML_RPC_Server_methodHelp', - 'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'], - 'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc'] - ), - 'system.methodSignature' => array( - 'function' => 'XML_RPC_Server_methodSignature', - 'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'], - 'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc'] - ) -); - -/** - * @global string $GLOBALS['XML_RPC_Server_debuginfo'] - */ -$GLOBALS['XML_RPC_Server_debuginfo'] = ''; - - -/** - * Lists all the methods that the XML-RPC server knows how to dispatch - * - * @return object a new XML_RPC_Response object - */ -function XML_RPC_Server_listMethods($server, $m) -{ - global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap; - - $v = new XML_RPC_Value(); - $outAr = array(); - foreach ($server->dmap as $key => $val) { - $outAr[] = new XML_RPC_Value($key, 'string'); - } - foreach ($XML_RPC_Server_dmap as $key => $val) { - $outAr[] = new XML_RPC_Value($key, 'string'); - } - $v->addArray($outAr); - return new XML_RPC_Response($v); -} - -/** - * Returns an array of known signatures (an array of arrays) - * for the given method - * - * If no signatures are known, returns a none-array - * (test for type != array to detect missing signature) - * - * @return object a new XML_RPC_Response object - */ -function XML_RPC_Server_methodSignature($server, $m) -{ - global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap; - - $methName = $m->getParam(0); - $methName = $methName->scalarval(); - if (strpos($methName, 'system.') === 0) { - $dmap = $XML_RPC_Server_dmap; - $sysCall = 1; - } else { - $dmap = $server->dmap; - $sysCall = 0; - } - // print "\n"; - if (isset($dmap[$methName])) { - if ($dmap[$methName]['signature']) { - $sigs = array(); - $thesigs = $dmap[$methName]['signature']; - for ($i = 0; $i < sizeof($thesigs); $i++) { - $cursig = array(); - $inSig = $thesigs[$i]; - for ($j = 0; $j < sizeof($inSig); $j++) { - $cursig[] = new XML_RPC_Value($inSig[$j], 'string'); - } - $sigs[] = new XML_RPC_Value($cursig, 'array'); - } - $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array')); - } else { - $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string')); - } - } else { - $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'], - $XML_RPC_str['introspect_unknown']); - } - return $r; -} - -/** - * Returns help text if defined for the method passed, otherwise returns - * an empty string - * - * @return object a new XML_RPC_Response object - */ -function XML_RPC_Server_methodHelp($server, $m) -{ - global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap; - - $methName = $m->getParam(0); - $methName = $methName->scalarval(); - if (strpos($methName, 'system.') === 0) { - $dmap = $XML_RPC_Server_dmap; - $sysCall = 1; - } else { - $dmap = $server->dmap; - $sysCall = 0; - } - - if (isset($dmap[$methName])) { - if ($dmap[$methName]['docstring']) { - $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']), - 'string'); - } else { - $r = new XML_RPC_Response(new XML_RPC_Value('', 'string')); - } - } else { - $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'], - $XML_RPC_str['introspect_unknown']); - } - return $r; -} - -/** - * @return void - */ -function XML_RPC_Server_debugmsg($m) -{ - global $XML_RPC_Server_debuginfo; - $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n"; -} - - -/** - * A server for receiving and replying to XML RPC requests - * - * - * $server = new XML_RPC_Server( - * array( - * 'isan8' => - * array( - * 'function' => 'is_8', - * 'signature' => - * array( - * array('boolean', 'int'), - * array('boolean', 'int', 'boolean'), - * array('boolean', 'string'), - * array('boolean', 'string', 'boolean'), - * ), - * 'docstring' => 'Is the value an 8?' - * ), - * ), - * 1, - * 0 - * ); - * - * - * @category Web Services - * @package XML_RPC - * @author Edd Dumbill - * @author Stig Bakken - * @author Martin Jansen - * @author Daniel Convissor - * @copyright 1999-2001 Edd Dumbill, 2001-2005 The PHP Group - * @version Release: 1.4.0 - * @link http://pear.php.net/package/XML_RPC - */ -class XML_RPC_Server -{ - /** - * The dispatch map, listing the methods this server provides. - * @var array - */ - var $dmap = array(); - - /** - * The present response's encoding - * @var string - * @see XML_RPC_Message::getEncoding() - */ - var $encoding = ''; - - /** - * Debug mode (0 = off, 1 = on) - * @var integer - */ - var $debug = 0; - - /** - * The response's HTTP headers - * @var string - */ - var $server_headers = ''; - - /** - * The response's XML payload - * @var string - */ - var $server_payload = ''; - - - /** - * Constructor for the XML_RPC_Server class - * - * @param array $dispMap the dispatch map. An associative array - * explaining each function. The keys of the main - * array are the procedure names used by the - * clients. The value is another associative array - * that contains up to three elements: - * + The 'function' element's value is the name - * of the function or method that gets called. - * To define a class' method: 'class::method'. - * + The 'signature' element (optional) is an - * array describing the return values and - * parameters - * + The 'docstring' element (optional) is a - * string describing what the method does - * @param int $serviceNow should the HTTP response be sent now? - * (1 = yes, 0 = no) - * @param int $debug should debug output be displayed? - * (1 = yes, 0 = no) - * - * @return void - */ - function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0) - { - global $HTTP_RAW_POST_DATA; - - if ($debug) { - $this->debug = 1; - } else { - $this->debug = 0; - } - - $this->dmap = $dispMap; - - if ($serviceNow) { - $this->service(); - } else { - $this->createServerPayload(); - $this->createServerHeaders(); - } - } - - /** - * @return string the debug information if debug debug mode is on - */ - function serializeDebug() - { - global $XML_RPC_Server_debuginfo, $HTTP_RAW_POST_DATA; - - if ($this->debug) { - XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n" - . $HTTP_RAW_POST_DATA - . "\n" . '^^^ END POST DATA ^^^'); - } - - if ($XML_RPC_Server_debuginfo != '') { - return "\n"; - } else { - return ''; - } - } - - /** - * Sends the response - * - * The encoding and content-type are determined by - * XML_RPC_Message::getEncoding() - * - * @return void - * - * @uses XML_RPC_Server::createServerPayload(), - * XML_RPC_Server::createServerHeaders() - */ - function service() - { - if (!$this->server_payload) { - $this->createServerPayload(); - } - if (!$this->server_headers) { - $this->createServerHeaders(); - } - header($this->server_headers); - print $this->server_payload; - } - - /** - * Generates the payload and puts it in the $server_payload property - * - * @return void - * - * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding, - * XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug() - */ - function createServerPayload() - { - $r = $this->parseRequest(); - $this->server_payload = 'encoding . '"?>' . "\n" - . $this->serializeDebug() - . $r->serialize(); - } - - /** - * Determines the HTTP headers and puts them in the $server_headers - * property - * - * @return boolean TRUE if okay, FALSE if $server_payload isn't set. - * - * @uses XML_RPC_Server::createServerPayload(), - * XML_RPC_Server::$server_headers - */ - function createServerHeaders() - { - if (!$this->server_payload) { - return false; - } - $this->server_headers = 'Content-Length: ' - . strlen($this->server_payload) . "\r\n" - . 'Content-Type: text/xml;' - . ' charset=' . $this->encoding; - return true; - } - - /** - * @return array - */ - function verifySignature($in, $sig) - { - for ($i = 0; $i < sizeof($sig); $i++) { - // check each possible signature in turn - $cursig = $sig[$i]; - if (sizeof($cursig) == $in->getNumParams() + 1) { - $itsOK = 1; - for ($n = 0; $n < $in->getNumParams(); $n++) { - $p = $in->getParam($n); - // print "\n"; - if ($p->kindOf() == 'scalar') { - $pt = $p->scalartyp(); - } else { - $pt = $p->kindOf(); - } - // $n+1 as first type of sig is return type - if ($pt != $cursig[$n+1]) { - $itsOK = 0; - $pno = $n+1; - $wanted = $cursig[$n+1]; - $got = $pt; - break; - } - } - if ($itsOK) { - return array(1); - } - } - } - if (isset($wanted)) { - return array(0, "Wanted ${wanted}, got ${got} at param ${pno}"); - } else { - $allowed = array(); - foreach ($sig as $val) { - end($val); - $allowed[] = key($val); - } - $allowed = array_unique($allowed); - $last = count($allowed) - 1; - if ($last > 0) { - $allowed[$last] = 'or ' . $allowed[$last]; - } - return array(0, - 'Signature permits ' . implode(', ', $allowed) - . ' parameters but the request had ' - . $in->getNumParams()); - } - } - - /** - * @return object a new XML_RPC_Response object - * - * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding - */ - function parseRequest($data = '') - { - global $XML_RPC_xh, $HTTP_RAW_POST_DATA, - $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml, - $XML_RPC_defencoding, $XML_RPC_Server_dmap; - - if ($data == '') { - $data = $HTTP_RAW_POST_DATA; - } - - $this->encoding = XML_RPC_Message::getEncoding($data); - $parser_resource = xml_parser_create($this->encoding); - $parser = (int) $parser_resource; - - $XML_RPC_xh[$parser] = array(); - $XML_RPC_xh[$parser]['cm'] = 0; - $XML_RPC_xh[$parser]['isf'] = 0; - $XML_RPC_xh[$parser]['params'] = array(); - $XML_RPC_xh[$parser]['method'] = ''; - $XML_RPC_xh[$parser]['stack'] = array(); - $XML_RPC_xh[$parser]['valuestack'] = array(); - - $plist = ''; - - // decompose incoming XML into request structure - - xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true); - xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee'); - xml_set_character_data_handler($parser_resource, 'XML_RPC_cd'); - if (!xml_parse($parser_resource, $data, 1)) { - // return XML error as a faultCode - $r = new XML_RPC_Response(0, - $XML_RPC_errxml+xml_get_error_code($parser_resource), - sprintf('XML error: %s at line %d', - xml_error_string(xml_get_error_code($parser_resource)), - xml_get_current_line_number($parser_resource))); - xml_parser_free($parser_resource); - } elseif ($XML_RPC_xh[$parser]['isf']>1) { - $r = new XML_RPC_Response(0, - $XML_RPC_err['invalid_request'], - $XML_RPC_str['invalid_request'] - . ': ' - . $XML_RPC_xh[$parser]['isf_reason']); - xml_parser_free($parser_resource); - } else { - xml_parser_free($parser_resource); - $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']); - // now add parameters in - for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) { - // print '\n"; - $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n"; - $m->addParam($XML_RPC_xh[$parser]['params'][$i]); - } - XML_RPC_Server_debugmsg($plist); - - // now to deal with the method - $methName = $XML_RPC_xh[$parser]['method']; - if (strpos($methName, 'system.') === 0) { - $dmap = $XML_RPC_Server_dmap; - $sysCall = 1; - } else { - $dmap = $this->dmap; - $sysCall = 0; - } - - if (isset($dmap[$methName]['function']) - && is_string($dmap[$methName]['function']) - && strpos($dmap[$methName]['function'], '::') !== false) - { - $dmap[$methName]['function'] = - explode('::', $dmap[$methName]['function']); - } - - if (isset($dmap[$methName]['function']) - && is_callable($dmap[$methName]['function'])) - { - // dispatch if exists - if (isset($dmap[$methName]['signature'])) { - $sr = $this->verifySignature($m, - $dmap[$methName]['signature'] ); - } - if (!isset($dmap[$methName]['signature']) || $sr[0]) { - // if no signature or correct signature - if ($sysCall) { - $r = call_user_func($dmap[$methName]['function'], $this, $m); - } else { - $r = call_user_func($dmap[$methName]['function'], $m); - } - if (!is_a($r, 'XML_RPC_Response')) { - $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'], - $XML_RPC_str['not_response_object']); - } - } else { - $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'], - $XML_RPC_str['incorrect_params'] - . ': ' . $sr[1]); - } - } else { - // else prepare error response - $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'], - $XML_RPC_str['unknown_method']); - } - } - return $r; - } - - /** - * Echos back the input packet as a string value - * - * @return void - * - * Useful for debugging. - */ - function echoInput() - { - global $HTTP_RAW_POST_DATA; - - $r = new XML_RPC_Response(0); - $r->xv = new XML_RPC_Value("'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string'); - print $r->serialize(); - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ - -?> diff --git a/3rdparty/css/chosen-sprite.png b/3rdparty/css/chosen-sprite.png deleted file mode 100644 index f20db4439ea5c1038126bf326c8fd048b03a8226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742 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 diff --git a/3rdparty/css/chosen/chosen.css b/3rdparty/css/chosen/chosen.css deleted file mode 100644 index b9c6d88028f..00000000000 --- a/3rdparty/css/chosen/chosen.css +++ /dev/null @@ -1,368 +0,0 @@ -/* @group Base */ -.chzn-container { - font-size: 13px; - position: relative; - display: inline-block; - zoom: 1; - *display: inline; -} -.chzn-container .chzn-drop { - background: #fff; - border: 1px solid #aaa; - border-top: 0; - position: absolute; - top: 29px; - left: 0; - -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15); - -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15); - -o-box-shadow : 0 4px 5px rgba(0,0,0,.15); - box-shadow : 0 4px 5px rgba(0,0,0,.15); - z-index: 999; -} -/* @end */ - -/* @group Single Chosen */ -.chzn-container-single .chzn-single { - background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); - background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); - background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%); - -webkit-border-radius: 4px; - -moz-border-radius : 4px; - border-radius : 4px; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; - border: 1px solid #aaa; - display: block; - overflow: hidden; - white-space: nowrap; - position: relative; - height: 26px; - line-height: 26px; - padding: 0 0 0 8px; - color: #444; - text-decoration: none; -} -.chzn-container-single .chzn-single span { - margin-right: 26px; - display: block; - overflow: hidden; - white-space: nowrap; - -o-text-overflow: ellipsis; - -ms-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.chzn-container-single .chzn-single abbr { - display: block; - position: absolute; - right: 26px; - top: 8px; - width: 12px; - height: 13px; - font-size: 1px; - background: url(chosen-sprite.png) right top no-repeat; -} -.chzn-container-single .chzn-single abbr:hover { - background-position: right -11px; -} -.chzn-container-single .chzn-single div { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius : 0 4px 4px 0; - border-radius : 0 4px 4px 0; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; - background: #ccc; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); - background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); - background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%); - border-left: 1px solid #aaa; - position: absolute; - right: 0; - top: 0; - display: block; - height: 100%; - width: 18px; -} -.chzn-container-single .chzn-single div b { - background: url('chosen-sprite.png') no-repeat 0 1px; - display: block; - width: 100%; - height: 100%; -} -.chzn-container-single .chzn-search { - padding: 3px 4px; - position: relative; - margin: 0; - white-space: nowrap; -} -.chzn-container-single .chzn-search input { - background: #fff url('chosen-sprite.png') no-repeat 100% -22px; - background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); - margin: 1px 0; - padding: 4px 20px 4px 5px; - outline: 0; - border: 1px solid #aaa; - font-family: sans-serif; - font-size: 1em; -} -.chzn-container-single .chzn-drop { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius : 0 0 4px 4px; - border-radius : 0 0 4px 4px; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; -} -/* @end */ - -.chzn-container-single-nosearch .chzn-search input { - position: absolute; - left: -9000px; -} - -/* @group Multi Chosen */ -.chzn-container-multi .chzn-choices { - background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%); - border: 1px solid #aaa; - margin: 0; - padding: 0; - cursor: text; - overflow: hidden; - height: auto !important; - height: 1%; - position: relative; -} -.chzn-container-multi .chzn-choices li { - float: left; - list-style: none; -} -.chzn-container-multi .chzn-choices .search-field { - white-space: nowrap; - margin: 0; - padding: 0; -} -.chzn-container-multi .chzn-choices .search-field input { - color: #666; - background: transparent !important; - border: 0 !important; - padding: 5px; - margin: 1px 0; - outline: 0; - -webkit-box-shadow: none; - -moz-box-shadow : none; - -o-box-shadow : none; - box-shadow : none; -} -.chzn-container-multi .chzn-choices .search-field .default { - color: #999; -} -.chzn-container-multi .chzn-choices .search-choice { - -webkit-border-radius: 3px; - -moz-border-radius : 3px; - border-radius : 3px; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; - background-color: #e4e4e4; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); - color: #333; - border: 1px solid #b4b4b4; - line-height: 13px; - padding: 3px 19px 3px 6px; - margin: 3px 0 3px 5px; - position: relative; -} -.chzn-container-multi .chzn-choices .search-choice span { - cursor: default; -} -.chzn-container-multi .chzn-choices .search-choice-focus { - background: #d4d4d4; -} -.chzn-container-multi .chzn-choices .search-choice .search-choice-close { - display: block; - position: absolute; - right: 3px; - top: 4px; - width: 12px; - height: 13px; - font-size: 1px; - background: url(chosen-sprite.png) right top no-repeat; -} -.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { - background-position: right -11px; -} -.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { - background-position: right -11px; -} -/* @end */ - -/* @group Results */ -.chzn-container .chzn-results { - margin: 0 4px 4px 0; - max-height: 190px; - padding: 0 0 0 4px; - position: relative; - overflow-x: hidden; - overflow-y: auto; -} -.chzn-container-multi .chzn-results { - margin: -1px 0 0; - padding: 0; -} -.chzn-container .chzn-results li { - display: none; - line-height: 80%; - padding: 7px 7px 8px; - margin: 0; - list-style: none; -} -.chzn-container .chzn-results .active-result { - cursor: pointer; - display: list-item; -} -.chzn-container .chzn-results .highlighted { - background: #3875d7; - color: #fff; -} -.chzn-container .chzn-results li em { - background: #feffde; - font-style: normal; -} -.chzn-container .chzn-results .highlighted em { - background: transparent; -} -.chzn-container .chzn-results .no-results { - background: #f4f4f4; - display: list-item; -} -.chzn-container .chzn-results .group-result { - cursor: default; - color: #999; - font-weight: bold; -} -.chzn-container .chzn-results .group-option { - padding-left: 20px; -} -.chzn-container-multi .chzn-drop .result-selected { - display: none; -} -/* @end */ - -/* @group Active */ -.chzn-container-active .chzn-single { - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); - -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); - -o-box-shadow : 0 0 5px rgba(0,0,0,.3); - box-shadow : 0 0 5px rgba(0,0,0,.3); - border: 1px solid #5897fb; -} -.chzn-container-active .chzn-single-with-drop { - border: 1px solid #aaa; - -webkit-box-shadow: 0 1px 0 #fff inset; - -moz-box-shadow : 0 1px 0 #fff inset; - -o-box-shadow : 0 1px 0 #fff inset; - box-shadow : 0 1px 0 #fff inset; - background-color: #eee; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); - background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); - -webkit-border-bottom-left-radius : 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomleft : 0; - -moz-border-radius-bottomright: 0; - border-bottom-left-radius : 0; - border-bottom-right-radius: 0; -} -.chzn-container-active .chzn-single-with-drop div { - background: transparent; - border-left: none; -} -.chzn-container-active .chzn-single-with-drop div b { - background-position: -18px 1px; -} -.chzn-container-active .chzn-choices { - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); - -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); - -o-box-shadow : 0 0 5px rgba(0,0,0,.3); - box-shadow : 0 0 5px rgba(0,0,0,.3); - border: 1px solid #5897fb; -} -.chzn-container-active .chzn-choices .search-field input { - color: #111 !important; -} -/* @end */ - -/* @group Disabled Support */ -.chzn-disabled { - cursor: default; - opacity:0.5 !important; -} -.chzn-disabled .chzn-single { - cursor: default; -} -.chzn-disabled .chzn-choices .search-choice .search-choice-close { - cursor: default; -} - -/* @group Right to Left */ -.chzn-rtl { direction:rtl;text-align: right; } -.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; } -.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; } -.chzn-rtl .chzn-single div { - left: 0; right: auto; - border-left: none; border-right: 1px solid #aaaaaa; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius : 4px 0 0 4px; - border-radius : 4px 0 0 4px; -} -.chzn-rtl .chzn-choices li { float: right; } -.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; } -.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;} -.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; } -.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; } -.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; } -.chzn-rtl .chzn-search input { - background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff; - background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); - padding: 4px 5px 4px 20px; -} -/* @end */ \ No newline at end of file diff --git a/3rdparty/fullcalendar/GPL-LICENSE.txt b/3rdparty/fullcalendar/GPL-LICENSE.txt deleted file mode 100644 index 11dddd00ef0..00000000000 --- a/3rdparty/fullcalendar/GPL-LICENSE.txt +++ /dev/null @@ -1,278 +0,0 @@ - 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. diff --git a/3rdparty/fullcalendar/MIT-LICENSE.txt b/3rdparty/fullcalendar/MIT-LICENSE.txt deleted file mode 100644 index 46d47544964..00000000000 --- a/3rdparty/fullcalendar/MIT-LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009 Adam Shaw - -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. diff --git a/3rdparty/fullcalendar/changelog.txt b/3rdparty/fullcalendar/changelog.txt deleted file mode 100644 index 50d0880fd7a..00000000000 --- a/3rdparty/fullcalendar/changelog.txt +++ /dev/null @@ -1,313 +0,0 @@ - -version 1.5.2 (8/21/11) - - correctly process UTC "Z" ISO8601 date strings (issue 750) - -version 1.5.1 (4/9/11) - - more flexible ISO8601 date parsing (issue 814) - - more flexible parsing of UNIX timestamps (issue 826) - - FullCalendar now buildable from source on a Mac (issue 795) - - FullCalendar QA'd in FF4 (issue 883) - - upgraded to jQuery 1.5.2 (which supports IE9) and jQuery UI 1.8.11 - -version 1.5 (3/19/11) - - slicker default styling for buttons - - reworked a lot of the calendar's HTML and accompanying CSS - (solves issues 327 and 395) - - more printer-friendly (fullcalendar-print.css) - - fullcalendar now inherits styles from jquery-ui themes differently. - styles for buttons are distinct from styles for calendar cells. - (solves issue 299) - - can now color events through FullCalendar options and Event-Object properties (issue 117) - THIS IS NOW THE PREFERRED METHOD OF COLORING EVENTS (as opposed to using className and CSS) - - FullCalendar options: - - eventColor (changes both background and border) - - eventBackgroundColor - - eventBorderColor - - eventTextColor - - Event-Object options: - - color (changes both background and border) - - backgroundColor - - borderColor - - textColor - - can now specify an event source as an *object* with a `url` property (json feed) or - an `events` property (function or array) with additional properties that will - be applied to the entire event source: - - color (changes both background and border) - - backgroudColor - - borderColor - - textColor - - className - - editable - - allDayDefault - - ignoreTimezone - - startParam (for a feed) - - endParam (for a feed) - - ANY OF THE JQUERY $.ajax OPTIONS - allows for easily changing from GET to POST and sending additional parameters (issue 386) - allows for easily attaching ajax handlers such as `error` (issue 754) - allows for turning caching on (issue 355) - - Google Calendar feeds are now specified differently: - - specify a simple string of your feed's URL - - specify an *object* with a `url` property of your feed's URL. - you can include any of the new Event-Source options in this object. - - the old `$.fullCalendar.gcalFeed` method still works - - no more IE7 SSL popup (issue 504) - - remove `cacheParam` - use json event source `cache` option instead - - latest jquery/jquery-ui - -version 1.4.11 (2/22/11) - - fixed rerenderEvents bug (issue 790) - - fixed bug with faulty dragging of events from all-day slot in agenda views - - bundled with jquery 1.5 and jquery-ui 1.8.9 - -version 1.4.10 (1/2/11) - - fixed bug with resizing event to different week in 5-day month view (issue 740) - - fixed bug with events not sticking after a removeEvents call (issue 757) - - fixed bug with underlying parseTime method, and other uses of parseInt (issue 688) - -version 1.4.9 (11/16/10) - - new algorithm for vertically stacking events (issue 111) - - resizing an event to a different week (issue 306) - - bug: some events not rendered with consecutive calls to addEventSource (issue 679) - -version 1.4.8 (10/16/10) - - ignoreTimezone option (set to `false` to process UTC offsets in ISO8601 dates) - - bugfixes - - event refetching not being called under certain conditions (issues 417, 554) - - event refetching being called multiple times under certain conditions (issues 586, 616) - - selection cannot be triggered by right mouse button (issue 558) - - agenda view left axis sized incorrectly (issue 465) - - IE js error when calendar is too narrow (issue 517) - - agenda view looks strange when no scrollbars (issue 235) - - improved parsing of ISO8601 dates with UTC offsets - - $.fullCalendar.version - - an internal refactor of the code, for easier future development and modularity - -version 1.4.7 (7/5/10) - - "dropping" external objects onto the calendar - - droppable (boolean, to turn on/off) - - dropAccept (to filter which events the calendar will accept) - - drop (trigger) - - selectable options can now be specified with a View Option Hash - - bugfixes - - dragged & reverted events having wrong time text (issue 406) - - bug rendering events that have an endtime with seconds, but no hours/minutes (issue 477) - - gotoDate date overflow bug (issue 429) - - wrong date reported when clicking on edge of last column in agenda views (412) - - support newlines in event titles - - select/unselect callbacks now passes native js event - -version 1.4.6 (5/31/10) - - "selecting" days or timeslots - - options: selectable, selectHelper, unselectAuto, unselectCancel - - callbacks: select, unselect - - methods: select, unselect - - when dragging an event, the highlighting reflects the duration of the event - - code compressing by Google Closure Compiler - - bundled with jQuery 1.4.2 and jQuery UI 1.8.1 - -version 1.4.5 (2/21/10) - - lazyFetching option, which can force the calendar to fetch events on every view/date change - - scroll state of agenda views are preserved when switching back to view - - bugfixes - - calling methods on an uninitialized fullcalendar throws error - - IE6/7 bug where an entire view becomes invisible (issue 320) - - error when rendering a hidden calendar (in jquery ui tabs for example) in IE (issue 340) - - interconnected bugs related to calendar resizing and scrollbars - - when switching views or clicking prev/next, calendar would "blink" (issue 333) - - liquid-width calendar's events shifted (depending on initial height of browser) (issue 341) - - more robust underlying algorithm for calendar resizing - -version 1.4.4 (2/3/10) - - optimized event rendering in all views (events render in 1/10 the time) - - gotoDate() does not force the calendar to unnecessarily rerender - - render() method now correctly readjusts height - -version 1.4.3 (12/22/09) - - added destroy method - - Google Calendar event pages respect currentTimezone - - caching now handled by jQuery's ajax - - protection from setting aspectRatio to zero - - bugfixes - - parseISO8601 and DST caused certain events to display day before - - button positioning problem in IE6 - - ajax event source removed after recently being added, events still displayed - - event not displayed when end is an empty string - - dynamically setting calendar height when no events have been fetched, throws error - -version 1.4.2 (12/02/09) - - eventAfterRender trigger - - getDate & getView methods - - height & contentHeight options (explicitly sets the pixel height) - - minTime & maxTime options (restricts shown hours in agenda view) - - getters [for all options] and setters [for height, contentHeight, and aspectRatio ONLY! stay tuned..] - - render method now readjusts calendar's size - - bugfixes - - lightbox scripts that use iframes (like fancybox) - - day-of-week classNames were off when firstDay=1 - - guaranteed space on right side of agenda events (even when stacked) - - accepts ISO8601 dates with a space (instead of 'T') - -version 1.4.1 (10/31/09) - - can exclude weekends with new 'weekends' option - - gcal feed 'currentTimezone' option - - bugfixes - - year/month/date option sometimes wouldn't set correctly (depending on current date) - - daylight savings issue caused agenda views to start at 1am (for BST users) - - cleanup of gcal.js code - -version 1.4 (10/19/09) - - agendaWeek and agendaDay views - - added some options for agenda views: - - allDaySlot - - allDayText - - firstHour - - slotMinutes - - defaultEventMinutes - - axisFormat - - modified some existing options/triggers to work with agenda views: - - dragOpacity and timeFormat can now accept a "View Hash" (a new concept) - - dayClick now has an allDay parameter - - eventDrop now has an an allDay parameter - (this will affect those who use revertFunc, adjust parameter list) - - added 'prevYear' and 'nextYear' for buttons in header - - minor change for theme users, ui-state-hover not applied to active/inactive buttons - - added event-color-changing example in docs - - better defaults for right-to-left themed button icons - -version 1.3.2 (10/13/09) - - Bugfixes (please upgrade from 1.3.1!) - - squashed potential infinite loop when addMonths and addDays - is called with an invalid date - - $.fullCalendar.parseDate() now correctly parses IETF format - - when switching views, the 'today' button sticks inactive, fixed - - gotoDate now can accept a single Date argument - - documentation for changes in 1.3.1 and 1.3.2 now on website - -version 1.3.1 (9/30/09) - - Important Bugfixes (please upgrade from 1.3!) - - When current date was late in the month, for long months, and prev/next buttons - were clicked in month-view, some months would be skipped/repeated - - In certain time zones, daylight savings time would cause certain days - to be misnumbered in month-view - - Subtle change in way week interval is chosen when switching from month to basicWeek/basicDay view - - Added 'allDayDefault' option - - Added 'changeView' and 'render' methods - -version 1.3 (9/21/09) - - different 'views': month/basicWeek/basicDay - - more flexible 'header' system for buttons - - themable by jQuery UI themes - - resizable events (require jQuery UI resizable plugin) - - rescoped & rewritten CSS, enhanced default look - - cleaner css & rendering techniques for right-to-left - - reworked options & API to support multiple views / be consistent with jQuery UI - - refactoring of entire codebase - - broken into different JS & CSS files, assembled w/ build scripts - - new test suite for new features, uses firebug-lite - - refactored docs - - Options - + date - + defaultView - + aspectRatio - + disableResizing - + monthNames (use instead of $.fullCalendar.monthNames) - + monthNamesShort (use instead of $.fullCalendar.monthAbbrevs) - + dayNames (use instead of $.fullCalendar.dayNames) - + dayNamesShort (use instead of $.fullCalendar.dayAbbrevs) - + theme - + buttonText - + buttonIcons - x draggable -> editable/disableDragging - x fixedWeeks -> weekMode - x abbrevDayHeadings -> columnFormat - x buttons/title -> header - x eventDragOpacity -> dragOpacity - x eventRevertDuration -> dragRevertDuration - x weekStart -> firstDay - x rightToLeft -> isRTL - x showTime (use 'allDay' CalEvent property instead) - - Triggered Actions - + eventResizeStart - + eventResizeStop - + eventResize - x monthDisplay -> viewDisplay - x resize -> windowResize - 'eventDrop' params changed, can revert if ajax cuts out - - CalEvent Properties - x showTime -> allDay - x draggable -> editable - 'end' is now INCLUSIVE when allDay=true - 'url' now produces a real tag, more native clicking/tab behavior - - Methods: - + renderEvent - x prevMonth -> prev - x nextMonth -> next - x prevYear/nextYear -> moveDate - x refresh -> rerenderEvents/refetchEvents - x removeEvent -> removeEvents - x getEventsByID -> clientEvents - - Utilities: - 'formatDate' format string completely changed (inspired by jQuery UI datepicker + datejs) - 'formatDates' added to support date-ranges - - Google Calendar Options: - x draggable -> editable - - Bugfixes - - gcal extension fetched 25 results max, now fetches all - -version 1.2.1 (6/29/09) - - bugfixes - - allows and corrects invalid end dates for events - - doesn't throw an error in IE while rendering when display:none - - fixed 'loading' callback when used w/ multiple addEventSource calls - - gcal className can now be an array - -version 1.2 (5/31/09) - - expanded API - - 'className' CalEvent attribute - - 'source' CalEvent attribute - - dynamically get/add/remove/update events of current month - - locale improvements: change month/day name text - - better date formatting ($.fullCalendar.formatDate) - - multiple 'event sources' allowed - - dynamically add/remove event sources - - options for prevYear and nextYear buttons - - docs have been reworked (include addition of Google Calendar docs) - - changed behavior of parseDate for number strings - (now interpets as unix timestamp, not MS times) - - bugfixes - - rightToLeft month start bug - - off-by-one errors with month formatting commands - - events from previous months sticking when clicking prev/next quickly - - Google Calendar API changed to work w/ multiple event sources - - can also provide 'className' and 'draggable' options - - date utilties moved from $ to $.fullCalendar - - more documentation in source code - - minified version of fullcalendar.js - - test suit (available from svn) - - top buttons now use
    ' . - ''; - $page = $this->whenVisiting('http://host', $raw); - $this->assertNull($page->getFormBySubmit(new SimpleByLabel('b'))); - $this->assertNull($page->getFormBySubmit(new SimpleByLabel('B'))); - $this->assertIsA( - $page->getFormBySubmit(new SimpleByName('b')), - 'SimpleForm'); - $this->assertIsA( - $page->getFormBySubmit(new SimpleByLabel('BBB')), - 'SimpleForm'); - } - - function testCanFindFormById() { - $raw = '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertNull($page->getFormById(54)); - $this->assertIsA($page->getFormById(55), 'SimpleForm'); - } - - function testFormCanBeSubmitted() { - $raw = '
    ' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $form = $page->getFormBySubmit(new SimpleByLabel('Submit')); - $this->assertEqual( - $form->submitButton(new SimpleByLabel('Submit')), - new SimpleGetEncoding(array('s' => 'Submit'))); - } - - function testUnparsedTagDoesNotCrash() { - $raw = '
    '; - $this->whenVisiting('http://host', $raw); - } - - function testReadingTextField() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertNull($page->getField(new SimpleByName('missing'))); - $this->assertIdentical($page->getField(new SimpleByName('a')), ''); - $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); - } - - function testEntitiesAreDecodedInDefaultTextFieldValue() { - $raw = '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>'); - } - - function testReadingTextFieldIsCaseInsensitive() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertNull($page->getField(new SimpleByName('missing'))); - $this->assertIdentical($page->getField(new SimpleByName('a')), ''); - $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); - } - - function testSettingTextField() { - $raw = '
    ' . - '' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); - $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); - $this->assertTrue($page->setField(new SimpleById(3), 'bbb')); - $this->assertEqual($page->getField(new SimpleBYId(3)), 'bbb'); - $this->assertFalse($page->setField(new SimpleByName('z'), 'zzz')); - $this->assertNull($page->getField(new SimpleByName('z'))); - } - - function testSettingTextFieldByEnclosingLabel() { - $raw = '
    ' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); - $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); - } - - function testLabelsWithoutForDoNotAttachToInputsWithNoId() { - $raw = '
    - - -
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), 'one'); - $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), 'two'); - $this->assertTrue($page->setField(new SimpleByLabelOrName('Text A'), '1')); - $this->assertTrue($page->setField(new SimpleByLabelOrName('Text B'), '2')); - $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), '1'); - $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), '2'); - } - - function testGettingTextFieldByEnclosingLabelWithConflictingOtherFields() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); - $this->assertEqual($page->getField(new SimpleByName('b')), 'B'); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); - } - - function testSettingTextFieldByExternalLabel() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); - $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); - } - - function testReadingTextArea() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); - } - - function testEntitiesAreDecodedInTextareaValue() { - $raw = '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>'); - } - - function testNewlinesPreservedInTextArea() { - $raw = "
    "; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), "hello\r\nworld"); - } - - function testWhitespacePreservedInTextArea() { - $raw = '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), ' '); - } - - function testComplexWhitespaceInTextArea() { - $raw = "\n" . - " \n" . - " \n" . - "
    \n". - " \n" . - "
    \n" . - " \n" . - ""; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('c')), " "); - } - - function testSettingTextArea() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA')); - $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA'); - } - - function testDontIncludeTextAreaContentInLabel() { - $raw = '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabel('Text area C')), 'mouse'); - } - - function testSettingSelectionField() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb'); - $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc')); - $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); - $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); - } - - function testSelectionOptionsAreNormalised() { - $raw = '
    ' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('a')), 'Big bold'); - $this->assertTrue($page->setField(new SimpleByName('a'), 'small italic')); - $this->assertEqual($page->getField(new SimpleByName('a')), 'small italic'); - } - - function testCanParseBlankOptions() { - $raw = '
    - -
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByName('d'), '')); - } - - function testTwoSelectionFieldsAreIndependent() { - $raw = '
    - - -
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByName('d'), 'd2')); - $this->assertTrue($page->setField(new SimpleByName('h'), 'h1')); - $this->assertEqual($page->getField(new SimpleByName('d')), 'd2'); - } - - function testEmptyOptionDoesNotScrewUpTwoSelectionFields() { - $raw = '
    - - -
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByName('d'), 'd2')); - $this->assertTrue($page->setField(new SimpleByName('h'), 'h1')); - $this->assertEqual($page->getField(new SimpleByName('d')), 'd2'); - } - - function testSettingSelectionFieldByEnclosingLabel() { - $raw = '
    ' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); - $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B')); - $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'B'); - } - - function testTwoSelectionFieldsWithLabelsAreIndependent() { - $raw = '
    - - -
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertTrue($page->setField(new SimpleByLabel('Labelled D'), 'd2')); - $this->assertTrue($page->setField(new SimpleByLabel('Labelled H'), 'h1')); - $this->assertEqual($page->getField(new SimpleByLabel('Labelled D')), 'd2'); - } - - function testSettingRadioButtonByEnclosingLabel() { - $raw = '
    ' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a'); - $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b')); - $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b'); - } - - function testCanParseInputsWithAllKindsOfAttributeQuoting() { - $raw = '
    ' . - '' . - '' . - '' . - '
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByName('first')), 'one'); - $this->assertEqual($page->getField(new SimpleByName('second')), false); - $this->assertEqual($page->getField(new SimpleByName('third')), 'three'); - } - - function urlToString($url) { - return $url->asString(); - } - - function assertSameFrameset($actual, $expected) { - $this->assertIdentical(array_map(array($this, 'urlToString'), $actual), - array_map(array($this, 'urlToString'), $expected)); - } -} - -class TestOfParsingUsingPhpParser extends TestOfParsing { - - function whenVisiting($url, $content) { - $response = new MockSimpleHttpResponse(); - $response->setReturnValue('getContent', $content); - $response->setReturnValue('getUrl', new SimpleUrl($url)); - $builder = new SimplePhpPageBuilder(); - return $builder->parse($response); - } - - function testNastyTitle() { - $page = $this->whenVisiting('http://host', - ' <b>Me&Me
    '); - $this->assertEqual($page->getTitle(), "Me&Me"); - } - - function testLabelShouldStopAtClosingLabelTag() { - $raw = '
    stuff
    '; - $page = $this->whenVisiting('http://host', $raw); - $this->assertEqual($page->getField(new SimpleByLabel('startend')), 'stuff'); - } -} - -class TestOfParsingUsingTidyParser extends TestOfParsing { - - function skip() { - $this->skipUnless(extension_loaded('tidy'), 'Install \'tidy\' php extension to enable html tidy based parser'); - } - - function whenVisiting($url, $content) { - $response = new MockSimpleHttpResponse(); - $response->setReturnValue('getContent', $content); - $response->setReturnValue('getUrl', new SimpleUrl($url)); - $builder = new SimpleTidyPageBuilder(); - return $builder->parse($response); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/php_parser_test.php b/3rdparty/simpletest/test/php_parser_test.php deleted file mode 100755 index d95c7d06a60..00000000000 --- a/3rdparty/simpletest/test/php_parser_test.php +++ /dev/null @@ -1,489 +0,0 @@ -assertFalse($regex->match("Hello", $match)); - $this->assertEqual($match, ""); - } - - function testNoSubject() { - $regex = new ParallelRegex(false); - $regex->addPattern(".*"); - $this->assertTrue($regex->match("", $match)); - $this->assertEqual($match, ""); - } - - function testMatchAll() { - $regex = new ParallelRegex(false); - $regex->addPattern(".*"); - $this->assertTrue($regex->match("Hello", $match)); - $this->assertEqual($match, "Hello"); - } - - function testCaseSensitive() { - $regex = new ParallelRegex(true); - $regex->addPattern("abc"); - $this->assertTrue($regex->match("abcdef", $match)); - $this->assertEqual($match, "abc"); - $this->assertTrue($regex->match("AAABCabcdef", $match)); - $this->assertEqual($match, "abc"); - } - - function testCaseInsensitive() { - $regex = new ParallelRegex(false); - $regex->addPattern("abc"); - $this->assertTrue($regex->match("abcdef", $match)); - $this->assertEqual($match, "abc"); - $this->assertTrue($regex->match("AAABCabcdef", $match)); - $this->assertEqual($match, "ABC"); - } - - function testMatchMultiple() { - $regex = new ParallelRegex(true); - $regex->addPattern("abc"); - $regex->addPattern("ABC"); - $this->assertTrue($regex->match("abcdef", $match)); - $this->assertEqual($match, "abc"); - $this->assertTrue($regex->match("AAABCabcdef", $match)); - $this->assertEqual($match, "ABC"); - $this->assertFalse($regex->match("Hello", $match)); - } - - function testPatternLabels() { - $regex = new ParallelRegex(false); - $regex->addPattern("abc", "letter"); - $regex->addPattern("123", "number"); - $this->assertIdentical($regex->match("abcdef", $match), "letter"); - $this->assertEqual($match, "abc"); - $this->assertIdentical($regex->match("0123456789", $match), "number"); - $this->assertEqual($match, "123"); - } -} - -class TestOfStateStack extends UnitTestCase { - - function testStartState() { - $stack = new SimpleStateStack("one"); - $this->assertEqual($stack->getCurrent(), "one"); - } - - function testExhaustion() { - $stack = new SimpleStateStack("one"); - $this->assertFalse($stack->leave()); - } - - function testStateMoves() { - $stack = new SimpleStateStack("one"); - $stack->enter("two"); - $this->assertEqual($stack->getCurrent(), "two"); - $stack->enter("three"); - $this->assertEqual($stack->getCurrent(), "three"); - $this->assertTrue($stack->leave()); - $this->assertEqual($stack->getCurrent(), "two"); - $stack->enter("third"); - $this->assertEqual($stack->getCurrent(), "third"); - $this->assertTrue($stack->leave()); - $this->assertTrue($stack->leave()); - $this->assertEqual($stack->getCurrent(), "one"); - } -} - -class TestParser { - - function accept() { - } - - function a() { - } - - function b() { - } -} -Mock::generate('TestParser'); - -class TestOfLexer extends UnitTestCase { - - function testEmptyPage() { - $handler = new MockTestParser(); - $handler->expectNever("accept"); - $handler->setReturnValue("accept", true); - $handler->expectNever("accept"); - $handler->setReturnValue("accept", true); - $lexer = new SimpleLexer($handler); - $lexer->addPattern("a+"); - $this->assertTrue($lexer->parse("")); - } - - function testSinglePattern() { - $handler = new MockTestParser(); - $handler->expectAt(0, "accept", array("aaa", LEXER_MATCHED)); - $handler->expectAt(1, "accept", array("x", LEXER_UNMATCHED)); - $handler->expectAt(2, "accept", array("a", LEXER_MATCHED)); - $handler->expectAt(3, "accept", array("yyy", LEXER_UNMATCHED)); - $handler->expectAt(4, "accept", array("a", LEXER_MATCHED)); - $handler->expectAt(5, "accept", array("x", LEXER_UNMATCHED)); - $handler->expectAt(6, "accept", array("aaa", LEXER_MATCHED)); - $handler->expectAt(7, "accept", array("z", LEXER_UNMATCHED)); - $handler->expectCallCount("accept", 8); - $handler->setReturnValue("accept", true); - $lexer = new SimpleLexer($handler); - $lexer->addPattern("a+"); - $this->assertTrue($lexer->parse("aaaxayyyaxaaaz")); - } - - function testMultiplePattern() { - $handler = new MockTestParser(); - $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x"); - for ($i = 0; $i < count($target); $i++) { - $handler->expectAt($i, "accept", array($target[$i], '*')); - } - $handler->expectCallCount("accept", count($target)); - $handler->setReturnValue("accept", true); - $lexer = new SimpleLexer($handler); - $lexer->addPattern("a+"); - $lexer->addPattern("b+"); - $this->assertTrue($lexer->parse("ababbxbaxxxxxxax")); - } -} - -class TestOfLexerModes extends UnitTestCase { - - function testIsolatedPattern() { - $handler = new MockTestParser(); - $handler->expectAt(0, "a", array("a", LEXER_MATCHED)); - $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); - $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(3, "a", array("bxb", LEXER_UNMATCHED)); - $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED)); - $handler->expectAt(5, "a", array("x", LEXER_UNMATCHED)); - $handler->expectAt(6, "a", array("aaaa", LEXER_MATCHED)); - $handler->expectAt(7, "a", array("x", LEXER_UNMATCHED)); - $handler->expectCallCount("a", 8); - $handler->setReturnValue("a", true); - $lexer = new SimpleLexer($handler, "a"); - $lexer->addPattern("a+", "a"); - $lexer->addPattern("b+", "b"); - $this->assertTrue($lexer->parse("abaabxbaaaxaaaax")); - } - - function testModeChange() { - $handler = new MockTestParser(); - $handler->expectAt(0, "a", array("a", LEXER_MATCHED)); - $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); - $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED)); - $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED)); - $handler->expectAt(0, "b", array(":", LEXER_ENTER)); - $handler->expectAt(1, "b", array("a", LEXER_UNMATCHED)); - $handler->expectAt(2, "b", array("b", LEXER_MATCHED)); - $handler->expectAt(3, "b", array("a", LEXER_UNMATCHED)); - $handler->expectAt(4, "b", array("bb", LEXER_MATCHED)); - $handler->expectAt(5, "b", array("a", LEXER_UNMATCHED)); - $handler->expectAt(6, "b", array("bbb", LEXER_MATCHED)); - $handler->expectAt(7, "b", array("a", LEXER_UNMATCHED)); - $handler->expectCallCount("a", 5); - $handler->expectCallCount("b", 8); - $handler->setReturnValue("a", true); - $handler->setReturnValue("b", true); - $lexer = new SimpleLexer($handler, "a"); - $lexer->addPattern("a+", "a"); - $lexer->addEntryPattern(":", "a", "b"); - $lexer->addPattern("b+", "b"); - $this->assertTrue($lexer->parse("abaabaaa:ababbabbba")); - } - - function testNesting() { - $handler = new MockTestParser(); - $handler->setReturnValue("a", true); - $handler->setReturnValue("b", true); - $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); - $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED)); - $handler->expectAt(0, "b", array("(", LEXER_ENTER)); - $handler->expectAt(1, "b", array("bb", LEXER_MATCHED)); - $handler->expectAt(2, "b", array("a", LEXER_UNMATCHED)); - $handler->expectAt(3, "b", array("bb", LEXER_MATCHED)); - $handler->expectAt(4, "b", array(")", LEXER_EXIT)); - $handler->expectAt(4, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(5, "a", array("b", LEXER_UNMATCHED)); - $handler->expectCallCount("a", 6); - $handler->expectCallCount("b", 5); - $lexer = new SimpleLexer($handler, "a"); - $lexer->addPattern("a+", "a"); - $lexer->addEntryPattern("(", "a", "b"); - $lexer->addPattern("b+", "b"); - $lexer->addExitPattern(")", "b"); - $this->assertTrue($lexer->parse("aabaab(bbabb)aab")); - } - - function testSingular() { - $handler = new MockTestParser(); - $handler->setReturnValue("a", true); - $handler->setReturnValue("b", true); - $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(1, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(2, "a", array("xx", LEXER_UNMATCHED)); - $handler->expectAt(3, "a", array("xx", LEXER_UNMATCHED)); - $handler->expectAt(0, "b", array("b", LEXER_SPECIAL)); - $handler->expectAt(1, "b", array("bbb", LEXER_SPECIAL)); - $handler->expectCallCount("a", 4); - $handler->expectCallCount("b", 2); - $lexer = new SimpleLexer($handler, "a"); - $lexer->addPattern("a+", "a"); - $lexer->addSpecialPattern("b+", "a", "b"); - $this->assertTrue($lexer->parse("aabaaxxbbbxx")); - } - - function testUnwindTooFar() { - $handler = new MockTestParser(); - $handler->setReturnValue("a", true); - $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(1, "a", array(")", LEXER_EXIT)); - $handler->expectCallCount("a", 2); - $lexer = new SimpleLexer($handler, "a"); - $lexer->addPattern("a+", "a"); - $lexer->addExitPattern(")", "a"); - $this->assertFalse($lexer->parse("aa)aa")); - } -} - -class TestOfLexerHandlers extends UnitTestCase { - - function testModeMapping() { - $handler = new MockTestParser(); - $handler->setReturnValue("a", true); - $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); - $handler->expectAt(1, "a", array("(", LEXER_ENTER)); - $handler->expectAt(2, "a", array("bb", LEXER_MATCHED)); - $handler->expectAt(3, "a", array("a", LEXER_UNMATCHED)); - $handler->expectAt(4, "a", array("bb", LEXER_MATCHED)); - $handler->expectAt(5, "a", array(")", LEXER_EXIT)); - $handler->expectAt(6, "a", array("b", LEXER_UNMATCHED)); - $handler->expectCallCount("a", 7); - $lexer = new SimpleLexer($handler, "mode_a"); - $lexer->addPattern("a+", "mode_a"); - $lexer->addEntryPattern("(", "mode_a", "mode_b"); - $lexer->addPattern("b+", "mode_b"); - $lexer->addExitPattern(")", "mode_b"); - $lexer->mapHandler("mode_a", "a"); - $lexer->mapHandler("mode_b", "a"); - $this->assertTrue($lexer->parse("aa(bbabb)b")); - } -} - -class TestOfSimpleHtmlLexer extends UnitTestCase { - - function &createParser() { - $parser = new MockSimpleHtmlSaxParser(); - $parser->setReturnValue('acceptStartToken', true); - $parser->setReturnValue('acceptEndToken', true); - $parser->setReturnValue('acceptAttributeToken', true); - $parser->setReturnValue('acceptEntityToken', true); - $parser->setReturnValue('acceptTextToken', true); - $parser->setReturnValue('ignore', true); - return $parser; - } - - function testNoContent() { - $parser = $this->createParser(); - $parser->expectNever('acceptStartToken'); - $parser->expectNever('acceptEndToken'); - $parser->expectNever('acceptAttributeToken'); - $parser->expectNever('acceptEntityToken'); - $parser->expectNever('acceptTextToken'); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse('')); - } - - function testUninteresting() { - $parser = $this->createParser(); - $parser->expectOnce('acceptTextToken', array('', '*')); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse('')); - } - - function testSkipCss() { - $parser = $this->createParser(); - $parser->expectNever('acceptTextToken'); - $parser->expectAtLeastOnce('ignore'); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse("")); - } - - function testSkipJavaScript() { - $parser = $this->createParser(); - $parser->expectNever('acceptTextToken'); - $parser->expectAtLeastOnce('ignore'); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse("")); - } - - function testSkipHtmlComments() { - $parser = $this->createParser(); - $parser->expectNever('acceptTextToken'); - $parser->expectAtLeastOnce('ignore'); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse("")); - } - - function testTagWithNoAttributes() { - $parser = $this->createParser(); - $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('>', '*')); - $parser->expectCallCount('acceptStartToken', 2); - $parser->expectOnce('acceptTextToken', array('Hello', '*')); - $parser->expectOnce('acceptEndToken', array('', '*')); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse('Hello')); - } - - function testTagWithAttributes() { - $parser = $this->createParser(); - $parser->expectOnce('acceptTextToken', array('label', '*')); - $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('href', '*')); - $parser->expectAt(2, 'acceptStartToken', array('>', '*')); - $parser->expectCallCount('acceptStartToken', 3); - $parser->expectAt(0, 'acceptAttributeToken', array('= "', '*')); - $parser->expectAt(1, 'acceptAttributeToken', array('here.html', '*')); - $parser->expectAt(2, 'acceptAttributeToken', array('"', '*')); - $parser->expectCallCount('acceptAttributeToken', 3); - $parser->expectOnce('acceptEndToken', array('
    ', '*')); - $lexer = new SimpleHtmlLexer($parser); - $this->assertTrue($lexer->parse('label')); - } -} - -class TestOfHtmlSaxParser extends UnitTestCase { - - function createListener() { - $listener = new MockSimplePhpPageBuilder(); - $listener->setReturnValue('startElement', true); - $listener->setReturnValue('addContent', true); - $listener->setReturnValue('endElement', true); - return $listener; - } - - function testFramesetTag() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('frameset', array())); - $listener->expectOnce('addContent', array('Frames')); - $listener->expectOnce('endElement', array('frameset')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('Frames')); - } - - function testTagWithUnquotedAttributes() { - $listener = $this->createListener(); - $listener->expectOnce( - 'startElement', - array('input', array('name' => 'a.b.c', 'value' => 'd'))); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('')); - } - - function testTagInsideContent() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('a', array())); - $listener->expectAt(0, 'addContent', array('')); - $listener->expectAt(1, 'addContent', array('')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('')); - } - - function testTagWithInternalContent() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('a', array())); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('a')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('label')); - } - - function testLinkAddress() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('a', array('href' => 'here.html'))); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('a')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse("label")); - } - - function testEncodedAttribute() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('a', array('href' => 'here&there.html'))); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('a')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse("label")); - } - - function testTagWithId() { - $listener = $this->createListener(); - $listener->expectOnce('startElement', array('a', array('id' => '0'))); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('a')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('label')); - } - - function testTagWithEmptyAttributes() { - $listener = $this->createListener(); - $listener->expectOnce( - 'startElement', - array('option', array('value' => '', 'selected' => ''))); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('option')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('')); - } - - function testComplexTagWithLotsOfCaseVariations() { - $listener = $this->createListener(); - $listener->expectOnce( - 'startElement', - array('a', array('href' => 'here.html', 'style' => "'cool'"))); - $listener->expectOnce('addContent', array('label')); - $listener->expectOnce('endElement', array('a')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('label')); - } - - function testXhtmlSelfClosingTag() { - $listener = $this->createListener(); - $listener->expectOnce( - 'startElement', - array('input', array('type' => 'submit', 'name' => 'N', 'value' => 'V'))); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse('')); - } - - function testNestedFrameInFrameset() { - $listener = $this->createListener(); - $listener->expectAt(0, 'startElement', array('frameset', array())); - $listener->expectAt(1, 'startElement', array('frame', array('src' => 'frame.html'))); - $listener->expectCallCount('startElement', 2); - $listener->expectOnce('addContent', array('Hello')); - $listener->expectOnce('endElement', array('frameset')); - $parser = new SimpleHtmlSaxParser($listener); - $this->assertTrue($parser->parse( - 'Hello')); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/recorder_test.php b/3rdparty/simpletest/test/recorder_test.php deleted file mode 100755 index fdae4c1cccc..00000000000 --- a/3rdparty/simpletest/test/recorder_test.php +++ /dev/null @@ -1,23 +0,0 @@ -addFile(dirname(__FILE__) . '/support/recorder_sample.php'); - $recorder = new Recorder(new SimpleReporter()); - $test->run($recorder); - $this->assertEqual(count($recorder->results), 2); - $this->assertIsA($recorder->results[0], 'SimpleResultOfPass'); - $this->assertEqual('testTrueIsTrue', array_pop($recorder->results[0]->breadcrumb)); - $this->assertPattern('/ at \[.*\Wrecorder_sample\.php line 7\]/', $recorder->results[0]->message); - $this->assertIsA($recorder->results[1], 'SimpleResultOfFail'); - $this->assertEqual('testFalseIsTrue', array_pop($recorder->results[1]->breadcrumb)); - $this->assertPattern("/Expected false, got \[Boolean: true\] at \[.*\Wrecorder_sample\.php line 11\]/", - $recorder->results[1]->message); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/reflection_php5_test.php b/3rdparty/simpletest/test/reflection_php5_test.php deleted file mode 100755 index d9f46e6db78..00000000000 --- a/3rdparty/simpletest/test/reflection_php5_test.php +++ /dev/null @@ -1,263 +0,0 @@ -assertTrue($reflection->classOrInterfaceExists()); - $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); - $this->assertFalse($reflection->isAbstract()); - $this->assertFalse($reflection->isInterface()); - } - - function testClassNonExistence() { - $reflection = new SimpleReflection('UnknownThing'); - $this->assertFalse($reflection->classOrInterfaceExists()); - $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload()); - } - - function testDetectionOfAbstractClass() { - $reflection = new SimpleReflection('AnyOldClass'); - $this->assertTrue($reflection->isAbstract()); - } - - function testDetectionOfFinalMethods() { - $reflection = new SimpleReflection('AnyOldClass'); - $this->assertFalse($reflection->hasFinal()); - $reflection = new SimpleReflection('AnyOldLeafClassWithAFinal'); - $this->assertTrue($reflection->hasFinal()); - } - - function testFindingParentClass() { - $reflection = new SimpleReflection('AnyOldSubclass'); - $this->assertEqual($reflection->getParent(), 'AnyOldImplementation'); - } - - function testInterfaceExistence() { - $reflection = new SimpleReflection('AnyOldInterface'); - $this->assertTrue($reflection->classOrInterfaceExists()); - $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); - $this->assertTrue($reflection->isInterface()); - } - - function testMethodsListFromClass() { - $reflection = new SimpleReflection('AnyOldClass'); - $this->assertIdentical($reflection->getMethods(), array('aMethod')); - } - - function testMethodsListFromInterface() { - $reflection = new SimpleReflection('AnyOldInterface'); - $this->assertIdentical($reflection->getMethods(), array('aMethod')); - $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); - } - - function testMethodsComeFromDescendentInterfacesASWell() { - $reflection = new SimpleReflection('AnyDescendentInterface'); - $this->assertIdentical($reflection->getMethods(), array('aMethod')); - } - - function testCanSeparateInterfaceMethodsFromOthers() { - $reflection = new SimpleReflection('AnyOldImplementation'); - $this->assertIdentical($reflection->getMethods(), array('aMethod', 'extraMethod')); - $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); - } - - function testMethodsComeFromDescendentInterfacesInAbstractClass() { - $reflection = new SimpleReflection('AnyAbstractImplementation'); - $this->assertIdentical($reflection->getMethods(), array('aMethod')); - } - - function testInterfaceHasOnlyItselfToImplement() { - $reflection = new SimpleReflection('AnyOldInterface'); - $this->assertEqual( - $reflection->getInterfaces(), - array('AnyOldInterface')); - } - - function testInterfacesListedForClass() { - $reflection = new SimpleReflection('AnyOldImplementation'); - $this->assertEqual( - $reflection->getInterfaces(), - array('AnyOldInterface')); - } - - function testInterfacesListedForSubclass() { - $reflection = new SimpleReflection('AnyOldSubclass'); - $this->assertEqual( - $reflection->getInterfaces(), - array('AnyOldInterface')); - } - - function testNoParameterCreationWhenNoInterface() { - $reflection = new SimpleReflection('AnyOldArgumentClass'); - $function = $reflection->getSignature('aMethod'); - if (version_compare(phpversion(), '5.0.2', '<=')) { - $this->assertEqual('function amethod($argument)', strtolower($function)); - } else { - $this->assertEqual('function aMethod($argument)', $function); - } - } - - function testParameterCreationWithoutTypeHinting() { - $reflection = new SimpleReflection('AnyOldArgumentImplementation'); - $function = $reflection->getSignature('aMethod'); - if (version_compare(phpversion(), '5.0.2', '<=')) { - $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); - } else { - $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); - } - } - - function testParameterCreationForTypeHinting() { - $reflection = new SimpleReflection('AnyOldTypeHintedClass'); - $function = $reflection->getSignature('aMethod'); - if (version_compare(phpversion(), '5.0.2', '<=')) { - $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); - } else { - $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); - } - } - - function testIssetFunctionSignature() { - $reflection = new SimpleReflection('AnyOldOverloadedClass'); - $function = $reflection->getSignature('__isset'); - $this->assertEqual('function __isset($key)', $function); - } - - function testUnsetFunctionSignature() { - $reflection = new SimpleReflection('AnyOldOverloadedClass'); - $function = $reflection->getSignature('__unset'); - $this->assertEqual('function __unset($key)', $function); - } - - function testProperlyReflectsTheFinalInterfaceWhenObjectImplementsAnExtendedInterface() { - $reflection = new SimpleReflection('AnyDescendentImplementation'); - $interfaces = $reflection->getInterfaces(); - $this->assertEqual(1, count($interfaces)); - $this->assertEqual('AnyDescendentInterface', array_shift($interfaces)); - } - - function testCreatingSignatureForAbstractMethod() { - $reflection = new SimpleReflection('AnotherOldAbstractClass'); - $this->assertEqual($reflection->getSignature('aMethod'), 'function aMethod(AnyOldInterface $argument)'); - } - - function testCanProperlyGenerateStaticMethodSignatures() { - $reflection = new SimpleReflection('AnyOldClassWithStaticMethods'); - $this->assertEqual('static function aStatic()', $reflection->getSignature('aStatic')); - $this->assertEqual( - 'static function aStaticWithParameters($arg1, $arg2)', - $reflection->getSignature('aStaticWithParameters') - ); - } -} - -class TestOfReflectionWithTypeHints extends UnitTestCase { - function skip() { - $this->skipIf(version_compare(phpversion(), '5.1.0', '<'), 'Reflection with type hints only tested for PHP 5.1.0 and above'); - } - - function testParameterCreationForTypeHintingWithArray() { - eval('interface AnyOldArrayTypeHintedInterface { - function amethod(array $argument); - } - class AnyOldArrayTypeHintedClass implements AnyOldArrayTypeHintedInterface { - function amethod(array $argument) {} - }'); - $reflection = new SimpleReflection('AnyOldArrayTypeHintedClass'); - $function = $reflection->getSignature('amethod'); - $this->assertEqual('function amethod(array $argument)', $function); - } -} - -class TestOfAbstractsWithAbstractMethods extends UnitTestCase { - function testCanProperlyGenerateAbstractMethods() { - $reflection = new SimpleReflection('AnyOldAbstractClassWithAbstractMethods'); - $this->assertEqual( - 'function anAbstract()', - $reflection->getSignature('anAbstract') - ); - $this->assertEqual( - 'function anAbstractWithParameter($foo)', - $reflection->getSignature('anAbstractWithParameter') - ); - $this->assertEqual( - 'function anAbstractWithMultipleParameters($foo, $bar)', - $reflection->getSignature('anAbstractWithMultipleParameters') - ); - } -} - -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/remote_test.php b/3rdparty/simpletest/test/remote_test.php deleted file mode 100755 index 5f3f96a4de9..00000000000 --- a/3rdparty/simpletest/test/remote_test.php +++ /dev/null @@ -1,19 +0,0 @@ -add(new RemoteTestCase($test_url . '?xml=yes', $test_url . '?xml=yes&dry=yes')); -if (SimpleReporter::inCli()) { - exit ($test->run(new TextReporter()) ? 0 : 1); -} -$test->run(new HtmlReporter()); diff --git a/3rdparty/simpletest/test/shell_test.php b/3rdparty/simpletest/test/shell_test.php deleted file mode 100755 index d1d769a6795..00000000000 --- a/3rdparty/simpletest/test/shell_test.php +++ /dev/null @@ -1,38 +0,0 @@ -assertIdentical($shell->execute('echo Hello'), 0); - $this->assertPattern('/Hello/', $shell->getOutput()); - } - - function testBadCommand() { - $shell = new SimpleShell(); - $this->assertNotEqual($ret = $shell->execute('blurgh! 2>&1'), 0); - } -} - -class TestOfShellTesterAndShell extends ShellTestCase { - - function testEcho() { - $this->assertTrue($this->execute('echo Hello')); - $this->assertExitCode(0); - $this->assertoutput('Hello'); - } - - function testFileExistence() { - $this->assertFileExists(dirname(__FILE__) . '/all_tests.php'); - $this->assertFileNotExists('wibble'); - } - - function testFilePatterns() { - $this->assertFilePattern('/all[_ ]tests/i', dirname(__FILE__) . '/all_tests.php'); - $this->assertNoFilePattern('/sputnik/i', dirname(__FILE__) . '/all_tests.php'); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/shell_tester_test.php b/3rdparty/simpletest/test/shell_tester_test.php deleted file mode 100755 index b12c602a39f..00000000000 --- a/3rdparty/simpletest/test/shell_tester_test.php +++ /dev/null @@ -1,42 +0,0 @@ -mock_shell; - } - - function testGenericEquality() { - $this->assertEqual('a', 'a'); - $this->assertNotEqual('a', 'A'); - } - - function testExitCode() { - $this->mock_shell = new MockSimpleShell(); - $this->mock_shell->setReturnValue('execute', 0); - $this->mock_shell->expectOnce('execute', array('ls')); - $this->assertTrue($this->execute('ls')); - $this->assertExitCode(0); - } - - function testOutput() { - $this->mock_shell = new MockSimpleShell(); - $this->mock_shell->setReturnValue('execute', 0); - $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); - $this->assertOutput("Line 1\nLine 2\n"); - } - - function testOutputPatterns() { - $this->mock_shell = new MockSimpleShell(); - $this->mock_shell->setReturnValue('execute', 0); - $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); - $this->assertOutputPattern('/line/i'); - $this->assertNoOutputPattern('/line 2/'); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/simpletest_test.php b/3rdparty/simpletest/test/simpletest_test.php deleted file mode 100755 index daa65c6f472..00000000000 --- a/3rdparty/simpletest/test/simpletest_test.php +++ /dev/null @@ -1,58 +0,0 @@ -fail('Should be ignored'); - } -} - -class ShouldNeverBeRunEither extends ShouldNeverBeRun { } - -class TestOfStackTrace extends UnitTestCase { - - function testCanFindAssertInTrace() { - $trace = new SimpleStackTrace(array('assert')); - $this->assertEqual( - $trace->traceMethod(array(array( - 'file' => '/my_test.php', - 'line' => 24, - 'function' => 'assertSomething'))), - ' at [/my_test.php line 24]'); - } -} - -class DummyResource { } - -class TestOfContext extends UnitTestCase { - - function testCurrentContextIsUnique() { - $this->assertSame( - SimpleTest::getContext(), - SimpleTest::getContext()); - } - - function testContextHoldsCurrentTestCase() { - $context = SimpleTest::getContext(); - $this->assertSame($this, $context->getTest()); - } - - function testResourceIsSingleInstanceWithContext() { - $context = new SimpleTestContext(); - $this->assertSame( - $context->get('DummyResource'), - $context->get('DummyResource')); - } - - function testClearingContextResetsResources() { - $context = new SimpleTestContext(); - $resource = $context->get('DummyResource'); - $context->clear(); - $this->assertClone($resource, $context->get('DummyResource')); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/site/file.html b/3rdparty/simpletest/test/site/file.html deleted file mode 100755 index cc41aee1b8b..00000000000 --- a/3rdparty/simpletest/test/site/file.html +++ /dev/null @@ -1,6 +0,0 @@ - - Link to SimpleTest - - Link to SimpleTest - - \ No newline at end of file diff --git a/3rdparty/simpletest/test/socket_test.php b/3rdparty/simpletest/test/socket_test.php deleted file mode 100755 index 729adda4960..00000000000 --- a/3rdparty/simpletest/test/socket_test.php +++ /dev/null @@ -1,25 +0,0 @@ -assertFalse($error->isError()); - $error->setError('Ouch'); - $this->assertTrue($error->isError()); - $this->assertEqual($error->getError(), 'Ouch'); - } - - function testClearingError() { - $error = new SimpleStickyError(); - $error->setError('Ouch'); - $this->assertTrue($error->isError()); - $error->clearError(); - $this->assertFalse($error->isError()); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/collector/collectable.1 b/3rdparty/simpletest/test/support/collector/collectable.1 deleted file mode 100755 index e69de29bb2d..00000000000 diff --git a/3rdparty/simpletest/test/support/collector/collectable.2 b/3rdparty/simpletest/test/support/collector/collectable.2 deleted file mode 100755 index e69de29bb2d..00000000000 diff --git a/3rdparty/simpletest/test/support/empty_test_file.php b/3rdparty/simpletest/test/support/empty_test_file.php deleted file mode 100755 index 31e3f7bed62..00000000000 --- a/3rdparty/simpletest/test/support/empty_test_file.php +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/failing_test.php b/3rdparty/simpletest/test/support/failing_test.php deleted file mode 100755 index 30f0d7507d9..00000000000 --- a/3rdparty/simpletest/test/support/failing_test.php +++ /dev/null @@ -1,9 +0,0 @@ -assertEqual(1,2); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/latin1_sample b/3rdparty/simpletest/test/support/latin1_sample deleted file mode 100755 index 19035257766..00000000000 --- a/3rdparty/simpletest/test/support/latin1_sample +++ /dev/null @@ -1 +0,0 @@ -£¹²³¼½¾@¶øþðßæ«»¢µ \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/passing_test.php b/3rdparty/simpletest/test/support/passing_test.php deleted file mode 100755 index b7863216353..00000000000 --- a/3rdparty/simpletest/test/support/passing_test.php +++ /dev/null @@ -1,9 +0,0 @@ -assertEqual(2,2); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/recorder_sample.php b/3rdparty/simpletest/test/support/recorder_sample.php deleted file mode 100755 index 4f157f6b601..00000000000 --- a/3rdparty/simpletest/test/support/recorder_sample.php +++ /dev/null @@ -1,14 +0,0 @@ -assertTrue(true); - } - - function testFalseIsTrue() { - $this->assertFalse(true); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/spl_examples.php b/3rdparty/simpletest/test/support/spl_examples.php deleted file mode 100755 index 45add356c44..00000000000 --- a/3rdparty/simpletest/test/support/spl_examples.php +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/supplementary_upload_sample.txt b/3rdparty/simpletest/test/support/supplementary_upload_sample.txt deleted file mode 100755 index d8aa9e81013..00000000000 --- a/3rdparty/simpletest/test/support/supplementary_upload_sample.txt +++ /dev/null @@ -1 +0,0 @@ -Some more text content \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/test1.php b/3rdparty/simpletest/test/support/test1.php deleted file mode 100755 index b414586d642..00000000000 --- a/3rdparty/simpletest/test/support/test1.php +++ /dev/null @@ -1,7 +0,0 @@ -assertEqual(3,1+2, "pass1"); - } -} -?> diff --git a/3rdparty/simpletest/test/support/upload_sample.txt b/3rdparty/simpletest/test/support/upload_sample.txt deleted file mode 100755 index ec98d7c5e3f..00000000000 --- a/3rdparty/simpletest/test/support/upload_sample.txt +++ /dev/null @@ -1 +0,0 @@ -Sample for testing file upload \ No newline at end of file diff --git a/3rdparty/simpletest/test/tag_test.php b/3rdparty/simpletest/test/tag_test.php deleted file mode 100755 index 5e8a377f089..00000000000 --- a/3rdparty/simpletest/test/tag_test.php +++ /dev/null @@ -1,554 +0,0 @@ - '1', 'b' => '')); - $this->assertEqual($tag->getTagName(), 'title'); - $this->assertIdentical($tag->getAttribute('a'), '1'); - $this->assertIdentical($tag->getAttribute('b'), ''); - $this->assertIdentical($tag->getAttribute('c'), false); - $this->assertIdentical($tag->getContent(), ''); - } - - function testTitleContent() { - $tag = new SimpleTitleTag(array()); - $this->assertTrue($tag->expectEndTag()); - $tag->addContent('Hello'); - $tag->addContent('World'); - $this->assertEqual($tag->getText(), 'HelloWorld'); - } - - function testMessyTitleContent() { - $tag = new SimpleTitleTag(array()); - $this->assertTrue($tag->expectEndTag()); - $tag->addContent('Hello'); - $tag->addContent('World'); - $this->assertEqual($tag->getText(), 'HelloWorld'); - } - - function testTagWithNoEnd() { - $tag = new SimpleTextTag(array()); - $this->assertFalse($tag->expectEndTag()); - } - - function testAnchorHref() { - $tag = new SimpleAnchorTag(array('href' => 'http://here/')); - $this->assertEqual($tag->getHref(), 'http://here/'); - - $tag = new SimpleAnchorTag(array('href' => '')); - $this->assertIdentical($tag->getAttribute('href'), ''); - $this->assertIdentical($tag->getHref(), ''); - - $tag = new SimpleAnchorTag(array()); - $this->assertIdentical($tag->getAttribute('href'), false); - $this->assertIdentical($tag->getHref(), ''); - } - - function testIsIdMatchesIdAttribute() { - $tag = new SimpleAnchorTag(array('href' => 'http://here/', 'id' => 7)); - $this->assertIdentical($tag->getAttribute('id'), '7'); - $this->assertTrue($tag->isId(7)); - } -} - -class TestOfWidget extends UnitTestCase { - - function testTextEmptyDefault() { - $tag = new SimpleTextTag(array('type' => 'text')); - $this->assertIdentical($tag->getDefault(), ''); - $this->assertIdentical($tag->getValue(), ''); - } - - function testSettingOfExternalLabel() { - $tag = new SimpleTextTag(array('type' => 'text')); - $tag->setLabel('it'); - $this->assertTrue($tag->isLabel('it')); - } - - function testTextDefault() { - $tag = new SimpleTextTag(array('value' => 'aaa')); - $this->assertEqual($tag->getDefault(), 'aaa'); - $this->assertEqual($tag->getValue(), 'aaa'); - } - - function testSettingTextValue() { - $tag = new SimpleTextTag(array('value' => 'aaa')); - $tag->setValue('bbb'); - $this->assertEqual($tag->getValue(), 'bbb'); - $tag->resetValue(); - $this->assertEqual($tag->getValue(), 'aaa'); - } - - function testFailToSetHiddenValue() { - $tag = new SimpleTextTag(array('value' => 'aaa', 'type' => 'hidden')); - $this->assertFalse($tag->setValue('bbb')); - $this->assertEqual($tag->getValue(), 'aaa'); - } - - function testSubmitDefaults() { - $tag = new SimpleSubmitTag(array('type' => 'submit')); - $this->assertIdentical($tag->getName(), false); - $this->assertEqual($tag->getValue(), 'Submit'); - $this->assertFalse($tag->setValue('Cannot set this')); - $this->assertEqual($tag->getValue(), 'Submit'); - $this->assertEqual($tag->getLabel(), 'Submit'); - - $encoding = new MockSimpleMultipartEncoding(); - $encoding->expectNever('add'); - $tag->write($encoding); - } - - function testPopulatedSubmit() { - $tag = new SimpleSubmitTag( - array('type' => 'submit', 'name' => 's', 'value' => 'Ok!')); - $this->assertEqual($tag->getName(), 's'); - $this->assertEqual($tag->getValue(), 'Ok!'); - $this->assertEqual($tag->getLabel(), 'Ok!'); - - $encoding = new MockSimpleMultipartEncoding(); - $encoding->expectOnce('add', array('s', 'Ok!')); - $tag->write($encoding); - } - - function testImageSubmit() { - $tag = new SimpleImageSubmitTag( - array('type' => 'image', 'name' => 's', 'alt' => 'Label')); - $this->assertEqual($tag->getName(), 's'); - $this->assertEqual($tag->getLabel(), 'Label'); - - $encoding = new MockSimpleMultipartEncoding(); - $encoding->expectAt(0, 'add', array('s.x', 20)); - $encoding->expectAt(1, 'add', array('s.y', 30)); - $tag->write($encoding, 20, 30); - } - - function testImageSubmitTitlePreferredOverAltForLabel() { - $tag = new SimpleImageSubmitTag( - array('type' => 'image', 'name' => 's', 'alt' => 'Label', 'title' => 'Title')); - $this->assertEqual($tag->getLabel(), 'Title'); - } - - function testButton() { - $tag = new SimpleButtonTag( - array('type' => 'submit', 'name' => 's', 'value' => 'do')); - $tag->addContent('I am a button'); - $this->assertEqual($tag->getName(), 's'); - $this->assertEqual($tag->getValue(), 'do'); - $this->assertEqual($tag->getLabel(), 'I am a button'); - - $encoding = new MockSimpleMultipartEncoding(); - $encoding->expectOnce('add', array('s', 'do')); - $tag->write($encoding); - } -} - -class TestOfTextArea extends UnitTestCase { - - function testDefault() { - $tag = new SimpleTextAreaTag(array('name' => 'a')); - $tag->addContent('Some text'); - $this->assertEqual($tag->getName(), 'a'); - $this->assertEqual($tag->getDefault(), 'Some text'); - } - - function testWrapping() { - $tag = new SimpleTextAreaTag(array('cols' => '10', 'wrap' => 'physical')); - $tag->addContent("Lot's of text that should be wrapped"); - $this->assertEqual( - $tag->getDefault(), - "Lot's of\r\ntext that\r\nshould be\r\nwrapped"); - $tag->setValue("New long text\r\nwith two lines"); - $this->assertEqual( - $tag->getValue(), - "New long\r\ntext\r\nwith two\r\nlines"); - } - - function testWrappingRemovesLeadingcariageReturn() { - $tag = new SimpleTextAreaTag(array('cols' => '20', 'wrap' => 'physical')); - $tag->addContent("\rStuff"); - $this->assertEqual($tag->getDefault(), 'Stuff'); - $tag->setValue("\nNew stuff\n"); - $this->assertEqual($tag->getValue(), "New stuff\r\n"); - } - - function testBreaksAreNewlineAndCarriageReturn() { - $tag = new SimpleTextAreaTag(array('cols' => '10')); - $tag->addContent("Some\nText\rwith\r\nbreaks"); - $this->assertEqual($tag->getValue(), "Some\r\nText\r\nwith\r\nbreaks"); - } -} - -class TestOfCheckbox extends UnitTestCase { - - function testCanSetCheckboxToNamedValueWithBooleanTrue() { - $tag = new SimpleCheckboxTag(array('name' => 'a', 'value' => 'A')); - $this->assertEqual($tag->getValue(), false); - $tag->setValue(true); - $this->assertIdentical($tag->getValue(), 'A'); - } -} - -class TestOfSelection extends UnitTestCase { - - function testEmpty() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $this->assertIdentical($tag->getValue(), ''); - } - - function testSingle() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $option = new SimpleOptionTag(array()); - $option->addContent('AAA'); - $tag->addTag($option); - $this->assertEqual($tag->getValue(), 'AAA'); - } - - function testSingleDefault() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $option = new SimpleOptionTag(array('selected' => '')); - $option->addContent('AAA'); - $tag->addTag($option); - $this->assertEqual($tag->getValue(), 'AAA'); - } - - function testSingleMappedDefault() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $option = new SimpleOptionTag(array('selected' => '', 'value' => 'aaa')); - $option->addContent('AAA'); - $tag->addTag($option); - $this->assertEqual($tag->getValue(), 'aaa'); - } - - function testStartsWithDefault() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array()); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('selected' => '')); - $b->addContent('BBB'); - $tag->addTag($b); - $c = new SimpleOptionTag(array()); - $c->addContent('CCC'); - $tag->addTag($c); - $this->assertEqual($tag->getValue(), 'BBB'); - } - - function testSettingOption() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array()); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('selected' => '')); - $b->addContent('BBB'); - $tag->addTag($b); - $c = new SimpleOptionTag(array()); - $c->addContent('CCC'); - $tag->setValue('AAA'); - $this->assertEqual($tag->getValue(), 'AAA'); - } - - function testSettingMappedOption() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array('value' => 'aaa')); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('value' => 'bbb', 'selected' => '')); - $b->addContent('BBB'); - $tag->addTag($b); - $c = new SimpleOptionTag(array('value' => 'ccc')); - $c->addContent('CCC'); - $tag->addTag($c); - $tag->setValue('AAA'); - $this->assertEqual($tag->getValue(), 'aaa'); - $tag->setValue('ccc'); - $this->assertEqual($tag->getValue(), 'ccc'); - } - - function testSelectionDespiteSpuriousWhitespace() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array()); - $a->addContent(' AAA '); - $tag->addTag($a); - $b = new SimpleOptionTag(array('selected' => '')); - $b->addContent(' BBB '); - $tag->addTag($b); - $c = new SimpleOptionTag(array()); - $c->addContent(' CCC '); - $tag->addTag($c); - $this->assertEqual($tag->getValue(), ' BBB '); - $tag->setValue('AAA'); - $this->assertEqual($tag->getValue(), ' AAA '); - } - - function testFailToSetIllegalOption() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array()); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('selected' => '')); - $b->addContent('BBB'); - $tag->addTag($b); - $c = new SimpleOptionTag(array()); - $c->addContent('CCC'); - $tag->addTag($c); - $this->assertFalse($tag->setValue('Not present')); - $this->assertEqual($tag->getValue(), 'BBB'); - } - - function testNastyOptionValuesThatLookLikeFalse() { - $tag = new SimpleSelectionTag(array('name' => 'a')); - $a = new SimpleOptionTag(array('value' => '1')); - $a->addContent('One'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('value' => '0')); - $b->addContent('Zero'); - $tag->addTag($b); - $this->assertIdentical($tag->getValue(), '1'); - $tag->setValue('Zero'); - $this->assertIdentical($tag->getValue(), '0'); - } - - function testBlankOption() { - $tag = new SimpleSelectionTag(array('name' => 'A')); - $a = new SimpleOptionTag(array()); - $tag->addTag($a); - $b = new SimpleOptionTag(array()); - $b->addContent('b'); - $tag->addTag($b); - $this->assertIdentical($tag->getValue(), ''); - $tag->setValue('b'); - $this->assertIdentical($tag->getValue(), 'b'); - $tag->setValue(''); - $this->assertIdentical($tag->getValue(), ''); - } - - function testMultipleDefaultWithNoSelections() { - $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); - $a = new SimpleOptionTag(array()); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array()); - $b->addContent('BBB'); - $tag->addTag($b); - $this->assertIdentical($tag->getDefault(), array()); - $this->assertIdentical($tag->getValue(), array()); - } - - function testMultipleDefaultWithSelections() { - $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); - $a = new SimpleOptionTag(array('selected' => '')); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array('selected' => '')); - $b->addContent('BBB'); - $tag->addTag($b); - $this->assertIdentical($tag->getDefault(), array('AAA', 'BBB')); - $this->assertIdentical($tag->getValue(), array('AAA', 'BBB')); - } - - function testSettingMultiple() { - $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); - $a = new SimpleOptionTag(array('selected' => '')); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array()); - $b->addContent('BBB'); - $tag->addTag($b); - $c = new SimpleOptionTag(array('selected' => '', 'value' => 'ccc')); - $c->addContent('CCC'); - $tag->addTag($c); - $this->assertIdentical($tag->getDefault(), array('AAA', 'ccc')); - $this->assertTrue($tag->setValue(array('BBB', 'ccc'))); - $this->assertIdentical($tag->getValue(), array('BBB', 'ccc')); - $this->assertTrue($tag->setValue(array())); - $this->assertIdentical($tag->getValue(), array()); - } - - function testFailToSetIllegalOptionsInMultiple() { - $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); - $a = new SimpleOptionTag(array('selected' => '')); - $a->addContent('AAA'); - $tag->addTag($a); - $b = new SimpleOptionTag(array()); - $b->addContent('BBB'); - $tag->addTag($b); - $this->assertFalse($tag->setValue(array('CCC'))); - $this->assertTrue($tag->setValue(array('AAA', 'BBB'))); - $this->assertFalse($tag->setValue(array('AAA', 'CCC'))); - } -} - -class TestOfRadioGroup extends UnitTestCase { - - function testEmptyGroup() { - $group = new SimpleRadioGroup(); - $this->assertIdentical($group->getDefault(), false); - $this->assertIdentical($group->getValue(), false); - $this->assertFalse($group->setValue('a')); - } - - function testReadingSingleButtonGroup() { - $group = new SimpleRadioGroup(); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'A', 'checked' => ''))); - $this->assertIdentical($group->getDefault(), 'A'); - $this->assertIdentical($group->getValue(), 'A'); - } - - function testReadingMultipleButtonGroup() { - $group = new SimpleRadioGroup(); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'A'))); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'B', 'checked' => ''))); - $this->assertIdentical($group->getDefault(), 'B'); - $this->assertIdentical($group->getValue(), 'B'); - } - - function testFailToSetUnlistedValue() { - $group = new SimpleRadioGroup(); - $group->addWidget(new SimpleRadioButtonTag(array('value' => 'z'))); - $this->assertFalse($group->setValue('a')); - $this->assertIdentical($group->getValue(), false); - } - - function testSettingNewValueClearsTheOldOne() { - $group = new SimpleRadioGroup(); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'A'))); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'B', 'checked' => ''))); - $this->assertTrue($group->setValue('A')); - $this->assertIdentical($group->getValue(), 'A'); - } - - function testIsIdMatchesAnyWidgetInSet() { - $group = new SimpleRadioGroup(); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'A', 'id' => 'i1'))); - $group->addWidget(new SimpleRadioButtonTag( - array('value' => 'B', 'id' => 'i2'))); - $this->assertFalse($group->isId('i0')); - $this->assertTrue($group->isId('i1')); - $this->assertTrue($group->isId('i2')); - } - - function testIsLabelMatchesAnyWidgetInSet() { - $group = new SimpleRadioGroup(); - $button1 = new SimpleRadioButtonTag(array('value' => 'A')); - $button1->setLabel('one'); - $group->addWidget($button1); - $button2 = new SimpleRadioButtonTag(array('value' => 'B')); - $button2->setLabel('two'); - $group->addWidget($button2); - $this->assertFalse($group->isLabel('three')); - $this->assertTrue($group->isLabel('one')); - $this->assertTrue($group->isLabel('two')); - } -} - -class TestOfTagGroup extends UnitTestCase { - - function testReadingMultipleCheckboxGroup() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag( - array('value' => 'B', 'checked' => ''))); - $this->assertIdentical($group->getDefault(), 'B'); - $this->assertIdentical($group->getValue(), 'B'); - } - - function testReadingMultipleUncheckedItems() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); - $this->assertIdentical($group->getDefault(), false); - $this->assertIdentical($group->getValue(), false); - } - - function testReadingMultipleCheckedItems() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag( - array('value' => 'A', 'checked' => ''))); - $group->addWidget(new SimpleCheckboxTag( - array('value' => 'B', 'checked' => ''))); - $this->assertIdentical($group->getDefault(), array('A', 'B')); - $this->assertIdentical($group->getValue(), array('A', 'B')); - } - - function testSettingSingleValue() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); - $this->assertTrue($group->setValue('A')); - $this->assertIdentical($group->getValue(), 'A'); - $this->assertTrue($group->setValue('B')); - $this->assertIdentical($group->getValue(), 'B'); - } - - function testSettingMultipleValues() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); - $this->assertTrue($group->setValue(array('A', 'B'))); - $this->assertIdentical($group->getValue(), array('A', 'B')); - } - - function testSettingNoValue() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); - $this->assertTrue($group->setValue(false)); - $this->assertIdentical($group->getValue(), false); - } - - function testIsIdMatchesAnyIdInSet() { - $group = new SimpleCheckboxGroup(); - $group->addWidget(new SimpleCheckboxTag(array('id' => 1, 'value' => 'A'))); - $group->addWidget(new SimpleCheckboxTag(array('id' => 2, 'value' => 'B'))); - $this->assertFalse($group->isId(0)); - $this->assertTrue($group->isId(1)); - $this->assertTrue($group->isId(2)); - } -} - -class TestOfUploadWidget extends UnitTestCase { - - function testValueIsFilePath() { - $upload = new SimpleUploadTag(array('name' => 'a')); - $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); - $this->assertEqual($upload->getValue(), dirname(__FILE__) . '/support/upload_sample.txt'); - } - - function testSubmitsFileContents() { - $encoding = new MockSimpleMultipartEncoding(); - $encoding->expectOnce('attach', array( - 'a', - 'Sample for testing file upload', - 'upload_sample.txt')); - $upload = new SimpleUploadTag(array('name' => 'a')); - $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); - $upload->write($encoding); - } -} - -class TestOfLabelTag extends UnitTestCase { - - function testLabelShouldHaveAnEndTag() { - $label = new SimpleLabelTag(array()); - $this->assertTrue($label->expectEndTag()); - } - - function testContentIsTextOnly() { - $label = new SimpleLabelTag(array()); - $label->addContent('Here are words'); - $this->assertEqual($label->getText(), 'Here are words'); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/test_with_parse_error.php b/3rdparty/simpletest/test/test_with_parse_error.php deleted file mode 100755 index 41a5832a5cb..00000000000 --- a/3rdparty/simpletest/test/test_with_parse_error.php +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/3rdparty/simpletest/test/unit_tester_test.php b/3rdparty/simpletest/test/unit_tester_test.php deleted file mode 100755 index ce9850f09ab..00000000000 --- a/3rdparty/simpletest/test/unit_tester_test.php +++ /dev/null @@ -1,61 +0,0 @@ -assertTrue($this->assertTrue(true)); - } - - function testAssertFalseReturnsAssertionAsBoolean() { - $this->assertTrue($this->assertFalse(false)); - } - - function testAssertEqualReturnsAssertionAsBoolean() { - $this->assertTrue($this->assertEqual(5, 5)); - } - - function testAssertIdenticalReturnsAssertionAsBoolean() { - $this->assertTrue($this->assertIdentical(5, 5)); - } - - function testCoreAssertionsDoNotThrowErrors() { - $this->assertIsA($this, 'UnitTestCase'); - $this->assertNotA($this, 'WebTestCase'); - } - - function testReferenceAssertionOnObjects() { - $a = new ReferenceForTesting(); - $b = $a; - $this->assertSame($a, $b); - } - - function testReferenceAssertionOnScalars() { - $a = 25; - $b = &$a; - $this->assertReference($a, $b); - } - - function testCloneOnObjects() { - $a = new ReferenceForTesting(); - $b = new ReferenceForTesting(); - $this->assertClone($a, $b); - } - - function TODO_testCloneOnScalars() { - $a = 25; - $b = 25; - $this->assertClone($a, $b); - } - - function testCopyOnScalars() { - $a = 25; - $b = 25; - $this->assertCopy($a, $b); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/unit_tests.php b/3rdparty/simpletest/test/unit_tests.php deleted file mode 100755 index 9e621293f9e..00000000000 --- a/3rdparty/simpletest/test/unit_tests.php +++ /dev/null @@ -1,49 +0,0 @@ -TestSuite('Unit tests'); - $path = dirname(__FILE__); - $this->addFile($path . '/errors_test.php'); - $this->addFile($path . '/exceptions_test.php'); - $this->addFile($path . '/arguments_test.php'); - $this->addFile($path . '/autorun_test.php'); - $this->addFile($path . '/compatibility_test.php'); - $this->addFile($path . '/simpletest_test.php'); - $this->addFile($path . '/dumper_test.php'); - $this->addFile($path . '/expectation_test.php'); - $this->addFile($path . '/unit_tester_test.php'); - $this->addFile($path . '/reflection_php5_test.php'); - $this->addFile($path . '/mock_objects_test.php'); - $this->addFile($path . '/interfaces_test.php'); - $this->addFile($path . '/collector_test.php'); - $this->addFile($path . '/recorder_test.php'); - $this->addFile($path . '/adapter_test.php'); - $this->addFile($path . '/socket_test.php'); - $this->addFile($path . '/encoding_test.php'); - $this->addFile($path . '/url_test.php'); - $this->addFile($path . '/cookies_test.php'); - $this->addFile($path . '/http_test.php'); - $this->addFile($path . '/authentication_test.php'); - $this->addFile($path . '/user_agent_test.php'); - $this->addFile($path . '/php_parser_test.php'); - $this->addFile($path . '/parsing_test.php'); - $this->addFile($path . '/tag_test.php'); - $this->addFile($path . '/form_test.php'); - $this->addFile($path . '/page_test.php'); - $this->addFile($path . '/frames_test.php'); - $this->addFile($path . '/browser_test.php'); - $this->addFile($path . '/web_tester_test.php'); - $this->addFile($path . '/shell_tester_test.php'); - $this->addFile($path . '/xml_test.php'); - $this->addFile($path . '/../extensions/testdox/test.php'); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/url_test.php b/3rdparty/simpletest/test/url_test.php deleted file mode 100755 index 80119afbdde..00000000000 --- a/3rdparty/simpletest/test/url_test.php +++ /dev/null @@ -1,515 +0,0 @@ -assertEqual($url->getScheme(), ''); - $this->assertEqual($url->getHost(), ''); - $this->assertEqual($url->getScheme('http'), 'http'); - $this->assertEqual($url->getHost('localhost'), 'localhost'); - $this->assertEqual($url->getPath(), ''); - } - - function testBasicParsing() { - $url = new SimpleUrl('https://www.lastcraft.com/test/'); - $this->assertEqual($url->getScheme(), 'https'); - $this->assertEqual($url->getHost(), 'www.lastcraft.com'); - $this->assertEqual($url->getPath(), '/test/'); - } - - function testRelativeUrls() { - $url = new SimpleUrl('../somewhere.php'); - $this->assertEqual($url->getScheme(), false); - $this->assertEqual($url->getHost(), false); - $this->assertEqual($url->getPath(), '../somewhere.php'); - } - - function testParseBareParameter() { - $url = new SimpleUrl('?a'); - $this->assertEqual($url->getPath(), ''); - $this->assertEqual($url->getEncodedRequest(), '?a'); - $url->addRequestParameter('x', 'X'); - $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); - } - - function testParseEmptyParameter() { - $url = new SimpleUrl('?a='); - $this->assertEqual($url->getPath(), ''); - $this->assertEqual($url->getEncodedRequest(), '?a='); - $url->addRequestParameter('x', 'X'); - $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); - } - - function testParseParameterPair() { - $url = new SimpleUrl('?a=A'); - $this->assertEqual($url->getPath(), ''); - $this->assertEqual($url->getEncodedRequest(), '?a=A'); - $url->addRequestParameter('x', 'X'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X'); - } - - function testParseMultipleParameters() { - $url = new SimpleUrl('?a=A&b=B'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); - $url->addRequestParameter('x', 'X'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X'); - } - - function testParsingParameterMixture() { - $url = new SimpleUrl('?a=A&b=&c'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); - $url->addRequestParameter('x', 'X'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X'); - } - - function testAddParametersFromScratch() { - $url = new SimpleUrl(''); - $url->addRequestParameter('a', 'A'); - $this->assertEqual($url->getEncodedRequest(), '?a=A'); - $url->addRequestParameter('b', 'B'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); - $url->addRequestParameter('a', 'aaa'); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa'); - } - - function testClearingParameters() { - $url = new SimpleUrl(''); - $url->addRequestParameter('a', 'A'); - $url->clearRequest(); - $this->assertIdentical($url->getEncodedRequest(), ''); - } - - function testEncodingParameters() { - $url = new SimpleUrl(''); - $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|$%^&*()_+-='); - $this->assertIdentical( - $request = $url->getEncodedRequest(), - '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D'); - } - - function testDecodingParameters() { - $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D'); - $this->assertEqual( - $url->getEncodedRequest(), - '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|$%^&*()_+-=')); - } - - function testUrlInQueryDoesNotConfuseParsing() { - $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/'); - $this->assertFalse($url->getScheme()); - $this->assertFalse($url->getHost()); - $this->assertEqual($url->getPath(), 'wibble/login.php'); - $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/'); - } - - function testSettingCordinates() { - $url = new SimpleUrl(''); - $url->setCoordinates('32', '45'); - $this->assertIdentical($url->getX(), 32); - $this->assertIdentical($url->getY(), 45); - $this->assertEqual($url->getEncodedRequest(), ''); - } - - function testParseCordinates() { - $url = new SimpleUrl('?32,45'); - $this->assertIdentical($url->getX(), 32); - $this->assertIdentical($url->getY(), 45); - } - - function testClearingCordinates() { - $url = new SimpleUrl('?32,45'); - $url->setCoordinates(); - $this->assertIdentical($url->getX(), false); - $this->assertIdentical($url->getY(), false); - } - - function testParsingParameterCordinateMixture() { - $url = new SimpleUrl('?a=A&b=&c?32,45'); - $this->assertIdentical($url->getX(), 32); - $this->assertIdentical($url->getY(), 45); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); - } - - function testParsingParameterWithBadCordinates() { - $url = new SimpleUrl('?a=A&b=&c?32'); - $this->assertIdentical($url->getX(), false); - $this->assertIdentical($url->getY(), false); - $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32'); - } - - function testPageSplitting() { - $url = new SimpleUrl('./here/../there/somewhere.php'); - $this->assertEqual($url->getPath(), './here/../there/somewhere.php'); - $this->assertEqual($url->getPage(), 'somewhere.php'); - $this->assertEqual($url->getBasePath(), './here/../there/'); - } - - function testAbsolutePathPageSplitting() { - $url = new SimpleUrl("http://host.com/here/there/somewhere.php"); - $this->assertEqual($url->getPath(), "/here/there/somewhere.php"); - $this->assertEqual($url->getPage(), "somewhere.php"); - $this->assertEqual($url->getBasePath(), "/here/there/"); - } - - function testSplittingUrlWithNoPageGivesEmptyPage() { - $url = new SimpleUrl('/here/there/'); - $this->assertEqual($url->getPath(), '/here/there/'); - $this->assertEqual($url->getPage(), ''); - $this->assertEqual($url->getBasePath(), '/here/there/'); - } - - function testPathNormalisation() { - $url = new SimpleUrl(); - $this->assertEqual( - $url->normalisePath('https://host.com/I/am/here/../there/somewhere.php'), - 'https://host.com/I/am/there/somewhere.php'); - } - - // regression test for #1535407 - function testPathNormalisationWithSinglePeriod() { - $url = new SimpleUrl(); - $this->assertEqual( - $url->normalisePath('https://host.com/I/am/here/./../there/somewhere.php'), - 'https://host.com/I/am/there/somewhere.php'); - } - - // regression test for #1852413 - function testHostnameExtractedFromUContainingAtSign() { - $url = new SimpleUrl("http://localhost/name@example.com"); - $this->assertEqual($url->getScheme(), "http"); - $this->assertEqual($url->getUsername(), ""); - $this->assertEqual($url->getPassword(), ""); - $this->assertEqual($url->getHost(), "localhost"); - $this->assertEqual($url->getPath(), "/name@example.com"); - } - - function testHostnameInLocalhost() { - $url = new SimpleUrl("http://localhost/name/example.com"); - $this->assertEqual($url->getScheme(), "http"); - $this->assertEqual($url->getUsername(), ""); - $this->assertEqual($url->getPassword(), ""); - $this->assertEqual($url->getHost(), "localhost"); - $this->assertEqual($url->getPath(), "/name/example.com"); - } - - function testUsernameAndPasswordAreUrlDecoded() { - $url = new SimpleUrl('http://' . urlencode('test@test') . - ':' . urlencode('$!�@*&%') . '@www.lastcraft.com'); - $this->assertEqual($url->getUsername(), 'test@test'); - $this->assertEqual($url->getPassword(), '$!�@*&%'); - } - - function testBlitz() { - $this->assertUrl( - "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor", - array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"), - array("a" => "1", "b" => "2")); - $this->assertUrl( - "username:password@www.somewhere.com/this/that/here.php?a=1", - array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false), - array("a" => "1")); - $this->assertUrl( - "username:password@somewhere.com:243?1,2", - array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false), - array(), - array(1, 2)); - $this->assertUrl( - "https://www.somewhere.com", - array("https", false, false, "www.somewhere.com", false, "/", "com", "", false)); - $this->assertUrl( - "username@www.somewhere.com:243#anchor", - array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor")); - $this->assertUrl( - "/this/that/here.php?a=1&b=2?3,4", - array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false), - array("a" => "1", "b" => "2"), - array(3, 4)); - $this->assertUrl( - "username@/here.php?a=1&b=2", - array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false), - array("a" => "1", "b" => "2")); - } - - function testAmbiguousHosts() { - $this->assertUrl( - "tigger", - array(false, false, false, false, false, "tigger", false, "", false)); - $this->assertUrl( - "/tigger", - array(false, false, false, false, false, "/tigger", false, "", false)); - $this->assertUrl( - "//tigger", - array(false, false, false, "tigger", false, "/", false, "", false)); - $this->assertUrl( - "//tigger/", - array(false, false, false, "tigger", false, "/", false, "", false)); - $this->assertUrl( - "tigger.com", - array(false, false, false, "tigger.com", false, "/", "com", "", false)); - $this->assertUrl( - "me.net/tigger", - array(false, false, false, "me.net", false, "/tigger", "net", "", false)); - } - - function testAsString() { - $this->assertPreserved('https://www.here.com'); - $this->assertPreserved('http://me:secret@www.here.com'); - $this->assertPreserved('http://here/there'); - $this->assertPreserved('http://here/there?a=A&b=B'); - $this->assertPreserved('http://here/there?a=1&a=2'); - $this->assertPreserved('http://here/there?a=1&a=2?9,8'); - $this->assertPreserved('http://host?a=1&a=2'); - $this->assertPreserved('http://host#stuff'); - $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6'); - $this->assertPreserved('http://www.here.com/?a=A__b=B'); - $this->assertPreserved('http://www.example.com:8080/'); - } - - function testUrlWithTwoSlashesInPath() { - $url = new SimpleUrl('/article/categoryedit/insert//'); - $this->assertEqual($url->getPath(), '/article/categoryedit/insert//'); - } - - function testUrlWithRequestKeyEncoded() { - $url = new SimpleUrl('/?foo%5B1%5D=bar'); - $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar'); - $url->addRequestParameter('a[1]', 'b[]'); - $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar&a%5B1%5D=b%5B%5D'); - - $url = new SimpleUrl('/'); - $url->addRequestParameter('a[1]', 'b[]'); - $this->assertEqual($url->getEncodedRequest(), '?a%5B1%5D=b%5B%5D'); - } - - function testUrlWithRequestKeyEncodedAndParamNamLookingLikePair() { - $url = new SimpleUrl('/'); - $url->addRequestParameter('foo[]=bar', ''); - $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar='); - $url = new SimpleUrl('/?foo%5B%5D%3Dbar='); - $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar='); - } - - function assertUrl($raw, $parts, $params = false, $coords = false) { - if (! is_array($params)) { - $params = array(); - } - $url = new SimpleUrl($raw); - $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s"); - $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s"); - $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s"); - $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s"); - $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s"); - $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s"); - $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s"); - $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s"); - $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s"); - if ($coords) { - $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s"); - $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s"); - } - } - - function assertPreserved($string) { - $url = new SimpleUrl($string); - $this->assertEqual($url->asString(), $string); - } -} - -class TestOfAbsoluteUrls extends UnitTestCase { - - function testDirectoriesAfterFilename() { - $string = '../../index.php/foo/bar'; - $url = new SimpleUrl($string); - $this->assertEqual($url->asString(), $string); - - $absolute = $url->makeAbsolute('http://www.domain.com/some/path/'); - $this->assertEqual($absolute->asString(), 'http://www.domain.com/index.php/foo/bar'); - } - - function testMakingAbsolute() { - $url = new SimpleUrl('../there/somewhere.php'); - $this->assertEqual($url->getPath(), '../there/somewhere.php'); - $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/'); - $this->assertEqual($absolute->getScheme(), 'https'); - $this->assertEqual($absolute->getHost(), 'host.com'); - $this->assertEqual($absolute->getPort(), 1234); - $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php'); - } - - function testMakingAnEmptyUrlAbsolute() { - $url = new SimpleUrl(''); - $this->assertEqual($url->getPath(), ''); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); - $this->assertEqual($absolute->getScheme(), 'http'); - $this->assertEqual($absolute->getHost(), 'host.com'); - $this->assertEqual($absolute->getPath(), '/I/am/here/page.html'); - } - - function testMakingAnEmptyUrlAbsoluteWithMissingPageName() { - $url = new SimpleUrl(''); - $this->assertEqual($url->getPath(), ''); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); - $this->assertEqual($absolute->getScheme(), 'http'); - $this->assertEqual($absolute->getHost(), 'host.com'); - $this->assertEqual($absolute->getPath(), '/I/am/here/'); - } - - function testMakingAShortQueryUrlAbsolute() { - $url = new SimpleUrl('?a#b'); - $this->assertEqual($url->getPath(), ''); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); - $this->assertEqual($absolute->getScheme(), 'http'); - $this->assertEqual($absolute->getHost(), 'host.com'); - $this->assertEqual($absolute->getPath(), '/I/am/here/'); - $this->assertEqual($absolute->getEncodedRequest(), '?a'); - $this->assertEqual($absolute->getFragment(), 'b'); - } - - function testMakingADirectoryUrlAbsolute() { - $url = new SimpleUrl('hello/'); - $this->assertEqual($url->getPath(), 'hello/'); - $this->assertEqual($url->getBasePath(), 'hello/'); - $this->assertEqual($url->getPage(), ''); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); - $this->assertEqual($absolute->getPath(), '/I/am/here/hello/'); - } - - function testMakingARootUrlAbsolute() { - $url = new SimpleUrl('/'); - $this->assertEqual($url->getPath(), '/'); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); - $this->assertEqual($absolute->getPath(), '/'); - } - - function testMakingARootPageUrlAbsolute() { - $url = new SimpleUrl('/here.html'); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); - $this->assertEqual($absolute->getPath(), '/here.html'); - } - - function testCarryAuthenticationFromRootPage() { - $url = new SimpleUrl('here.html'); - $absolute = $url->makeAbsolute('http://test:secret@host.com/'); - $this->assertEqual($absolute->getPath(), '/here.html'); - $this->assertEqual($absolute->getUsername(), 'test'); - $this->assertEqual($absolute->getPassword(), 'secret'); - } - - function testMakingCoordinateUrlAbsolute() { - $url = new SimpleUrl('?1,2'); - $this->assertEqual($url->getPath(), ''); - $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); - $this->assertEqual($absolute->getScheme(), 'http'); - $this->assertEqual($absolute->getHost(), 'host.com'); - $this->assertEqual($absolute->getPath(), '/I/am/here/'); - $this->assertEqual($absolute->getX(), 1); - $this->assertEqual($absolute->getY(), 2); - } - - function testMakingAbsoluteAppendedPath() { - $url = new SimpleUrl('./there/somewhere.php'); - $absolute = $url->makeAbsolute('https://host.com/here/'); - $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); - } - - function testMakingAbsoluteBadlyFormedAppendedPath() { - $url = new SimpleUrl('there/somewhere.php'); - $absolute = $url->makeAbsolute('https://host.com/here/'); - $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); - } - - function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() { - $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f'); - $absolute = $url->makeAbsolute('http://host.com/here/'); - $this->assertEqual($absolute->getScheme(), 'https'); - $this->assertEqual($absolute->getUsername(), 'test'); - $this->assertEqual($absolute->getPassword(), 'secret'); - $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); - $this->assertEqual($absolute->getPort(), 321); - $this->assertEqual($absolute->getPath(), '/stuff/'); - $this->assertEqual($absolute->getEncodedRequest(), '?a=1'); - $this->assertEqual($absolute->getFragment(), 'f'); - } - - function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() { - $url = new SimpleUrl('https://www.lastcraft.com'); - $absolute = $url->makeAbsolute('http://test:secret@host.com/here/'); - $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); - $this->assertEqual($absolute->getUsername(), 'test'); - $this->assertEqual($absolute->getPassword(), 'secret'); - } - - function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() { - $url = new SimpleUrl('http://www.lastcraft.com'); - $absolute = $url->makeAbsolute('https://host.com:81/here/'); - $this->assertEqual($absolute->getScheme(), 'http'); - $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); - $this->assertIdentical($absolute->getPort(), false); - $this->assertEqual($absolute->getPath(), '/'); - } -} - -class TestOfFrameUrl extends UnitTestCase { - - function testTargetAttachment() { - $url = new SimpleUrl('http://www.site.com/home.html'); - $this->assertIdentical($url->getTarget(), false); - $url->setTarget('A frame'); - $this->assertIdentical($url->getTarget(), 'A frame'); - } -} - -/** - * @note Based off of http://www.mozilla.org/quality/networking/testing/filetests.html - */ -class TestOfFileUrl extends UnitTestCase { - - function testMinimalUrl() { - $url = new SimpleUrl('file:///'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/'); - } - - function testUnixUrl() { - $url = new SimpleUrl('file:///fileInRoot'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/fileInRoot'); - } - - function testDOSVolumeUrl() { - $url = new SimpleUrl('file:///C:/config.sys'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/C:/config.sys'); - } - - function testDOSVolumePromotion() { - $url = new SimpleUrl('file://C:/config.sys'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/C:/config.sys'); - } - - function testDOSBackslashes() { - $url = new SimpleUrl('file:///C:\config.sys'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/C:/config.sys'); - } - - function testDOSDirnameAfterFile() { - $url = new SimpleUrl('file://C:\config.sys'); - $this->assertEqual($url->getScheme(), 'file'); - $this->assertIdentical($url->getHost(), false); - $this->assertEqual($url->getPath(), '/C:/config.sys'); - } - -} - -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/user_agent_test.php b/3rdparty/simpletest/test/user_agent_test.php deleted file mode 100755 index 030abeb257d..00000000000 --- a/3rdparty/simpletest/test/user_agent_test.php +++ /dev/null @@ -1,348 +0,0 @@ -headers = new MockSimpleHttpHeaders(); - $this->response = new MockSimpleHttpResponse(); - $this->response->setReturnValue('isError', false); - $this->response->returns('getHeaders', new MockSimpleHttpHeaders()); - $this->request = new MockSimpleHttpRequest(); - $this->request->returns('fetch', $this->response); - } - - function testGetRequestWithoutIncidentGivesNoErrors() { - $url = new SimpleUrl('http://test:secret@this.com/page.html'); - $url->addRequestParameters(array('a' => 'A', 'b' => 'B')); - - $agent = new MockRequestUserAgent(); - $agent->returns('createHttpRequest', $this->request); - $agent->__construct(); - - $response = $agent->fetchResponse( - new SimpleUrl('http://test:secret@this.com/page.html'), - new SimpleGetEncoding(array('a' => 'A', 'b' => 'B'))); - $this->assertFalse($response->isError()); - } -} - -class TestOfAdditionalHeaders extends UnitTestCase { - - function testAdditionalHeaderAddedToRequest() { - $response = new MockSimpleHttpResponse(); - $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); - - $request = new MockSimpleHttpRequest(); - $request->setReturnReference('fetch', $response); - $request->expectOnce( - 'addHeaderLine', - array('User-Agent: SimpleTest')); - - $agent = new MockRequestUserAgent(); - $agent->setReturnReference('createHttpRequest', $request); - $agent->__construct(); - $agent->addHeader('User-Agent: SimpleTest'); - $response = $agent->fetchResponse(new SimpleUrl('http://this.host/'), new SimpleGetEncoding()); - } -} - -class TestOfBrowserCookies extends UnitTestCase { - - private function createStandardResponse() { - $response = new MockSimpleHttpResponse(); - $response->setReturnValue("isError", false); - $response->setReturnValue("getContent", "stuff"); - $response->setReturnReference("getHeaders", new MockSimpleHttpHeaders()); - return $response; - } - - private function createCookieSite($header_lines) { - $headers = new SimpleHttpHeaders($header_lines); - $response = new MockSimpleHttpResponse(); - $response->setReturnValue("isError", false); - $response->setReturnReference("getHeaders", $headers); - $response->setReturnValue("getContent", "stuff"); - $request = new MockSimpleHttpRequest(); - $request->setReturnReference("fetch", $response); - return $request; - } - - private function createMockedRequestUserAgent(&$request) { - $agent = new MockRequestUserAgent(); - $agent->setReturnReference('createHttpRequest', $request); - $agent->__construct(); - return $agent; - } - - function testCookieJarIsSentToRequest() { - $jar = new SimpleCookieJar(); - $jar->setCookie('a', 'A'); - - $request = new MockSimpleHttpRequest(); - $request->returns('fetch', $this->createStandardResponse()); - $request->expectOnce('readCookiesFromJar', array($jar, '*')); - - $agent = $this->createMockedRequestUserAgent($request); - $agent->setCookie('a', 'A'); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - } - - function testNoCookieJarIsSentToRequestWhenCookiesAreDisabled() { - $request = new MockSimpleHttpRequest(); - $request->returns('fetch', $this->createStandardResponse()); - $request->expectNever('readCookiesFromJar'); - - $agent = $this->createMockedRequestUserAgent($request); - $agent->setCookie('a', 'A'); - $agent->ignoreCookies(); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - } - - function testReadingNewCookie() { - $request = $this->createCookieSite('Set-cookie: a=AAAA'); - $agent = $this->createMockedRequestUserAgent($request); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); - } - - function testIgnoringNewCookieWhenCookiesDisabled() { - $request = $this->createCookieSite('Set-cookie: a=AAAA'); - $agent = $this->createMockedRequestUserAgent($request); - $agent->ignoreCookies(); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $this->assertIdentical($agent->getCookieValue("this.com", "this/path/", "a"), false); - } - - function testOverwriteCookieThatAlreadyExists() { - $request = $this->createCookieSite('Set-cookie: a=AAAA'); - $agent = $this->createMockedRequestUserAgent($request); - $agent->setCookie('a', 'A'); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); - } - - function testClearCookieBySettingExpiry() { - $request = $this->createCookieSite('Set-cookie: a=b'); - $agent = $this->createMockedRequestUserAgent($request); - - $agent->setCookie("a", "A", "this/path/", "Wed, 25-Dec-02 04:24:21 GMT"); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $this->assertIdentical( - $agent->getCookieValue("this.com", "this/path/", "a"), - "b"); - $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); - $this->assertIdentical( - $agent->getCookieValue("this.com", "this/path/", "a"), - false); - } - - function testAgeingAndClearing() { - $request = $this->createCookieSite('Set-cookie: a=A; expires=Wed, 25-Dec-02 04:24:21 GMT; path=/this/path'); - $agent = $this->createMockedRequestUserAgent($request); - - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); - $this->assertIdentical( - $agent->getCookieValue("this.com", "this/path/", "a"), - "A"); - $agent->ageCookies(2); - $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); - $this->assertIdentical( - $agent->getCookieValue("this.com", "this/path/", "a"), - false); - } - - function testReadingIncomingAndSettingNewCookies() { - $request = $this->createCookieSite('Set-cookie: a=AAA'); - $agent = $this->createMockedRequestUserAgent($request); - - $this->assertNull($agent->getBaseCookieValue("a", false)); - $agent->fetchResponse( - new SimpleUrl('http://this.com/this/path/page.html'), - new SimpleGetEncoding()); - $agent->setCookie("b", "BBB", "this.com", "this/path/"); - $this->assertEqual( - $agent->getBaseCookieValue("a", new SimpleUrl('http://this.com/this/path/page.html')), - "AAA"); - $this->assertEqual( - $agent->getBaseCookieValue("b", new SimpleUrl('http://this.com/this/path/page.html')), - "BBB"); - } -} - -class TestOfHttpRedirects extends UnitTestCase { - - function createRedirect($content, $redirect) { - $headers = new MockSimpleHttpHeaders(); - $headers->setReturnValue('isRedirect', (boolean)$redirect); - $headers->setReturnValue('getLocation', $redirect); - $response = new MockSimpleHttpResponse(); - $response->setReturnValue('getContent', $content); - $response->setReturnReference('getHeaders', $headers); - $request = new MockSimpleHttpRequest(); - $request->setReturnReference('fetch', $response); - return $request; - } - - function testDisabledRedirects() { - $agent = new MockRequestUserAgent(); - $agent->returns( - 'createHttpRequest', - $this->createRedirect('stuff', 'there.html')); - $agent->expectOnce('createHttpRequest'); - $agent->__construct(); - $agent->setMaximumRedirects(0); - $response = $agent->fetchResponse(new SimpleUrl('here.html'), new SimpleGetEncoding()); - $this->assertEqual($response->getContent(), 'stuff'); - } - - function testSingleRedirect() { - $agent = new MockRequestUserAgent(); - $agent->returnsAt( - 0, - 'createHttpRequest', - $this->createRedirect('first', 'two.html')); - $agent->returnsAt( - 1, - 'createHttpRequest', - $this->createRedirect('second', 'three.html')); - $agent->expectCallCount('createHttpRequest', 2); - $agent->__construct(); - - $agent->setMaximumRedirects(1); - $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); - $this->assertEqual($response->getContent(), 'second'); - } - - function testDoubleRedirect() { - $agent = new MockRequestUserAgent(); - $agent->returnsAt( - 0, - 'createHttpRequest', - $this->createRedirect('first', 'two.html')); - $agent->returnsAt( - 1, - 'createHttpRequest', - $this->createRedirect('second', 'three.html')); - $agent->returnsAt( - 2, - 'createHttpRequest', - $this->createRedirect('third', 'four.html')); - $agent->expectCallCount('createHttpRequest', 3); - $agent->__construct(); - - $agent->setMaximumRedirects(2); - $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); - $this->assertEqual($response->getContent(), 'third'); - } - - function testSuccessAfterRedirect() { - $agent = new MockRequestUserAgent(); - $agent->returnsAt( - 0, - 'createHttpRequest', - $this->createRedirect('first', 'two.html')); - $agent->returnsAt( - 1, - 'createHttpRequest', - $this->createRedirect('second', false)); - $agent->returnsAt( - 2, - 'createHttpRequest', - $this->createRedirect('third', 'four.html')); - $agent->expectCallCount('createHttpRequest', 2); - $agent->__construct(); - - $agent->setMaximumRedirects(2); - $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); - $this->assertEqual($response->getContent(), 'second'); - } - - function testRedirectChangesPostToGet() { - $agent = new MockRequestUserAgent(); - $agent->returnsAt( - 0, - 'createHttpRequest', - $this->createRedirect('first', 'two.html')); - $agent->expectAt(0, 'createHttpRequest', array('*', new IsAExpectation('SimplePostEncoding'))); - $agent->returnsAt( - 1, - 'createHttpRequest', - $this->createRedirect('second', 'three.html')); - $agent->expectAt(1, 'createHttpRequest', array('*', new IsAExpectation('SimpleGetEncoding'))); - $agent->expectCallCount('createHttpRequest', 2); - $agent->__construct(); - $agent->setMaximumRedirects(1); - $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimplePostEncoding()); - } -} - -class TestOfBadHosts extends UnitTestCase { - - private function createSimulatedBadHost() { - $response = new MockSimpleHttpResponse(); - $response->setReturnValue('isError', true); - $response->setReturnValue('getError', 'Bad socket'); - $response->setReturnValue('getContent', false); - $request = new MockSimpleHttpRequest(); - $request->setReturnReference('fetch', $response); - return $request; - } - - function testUntestedHost() { - $request = $this->createSimulatedBadHost(); - $agent = new MockRequestUserAgent(); - $agent->setReturnReference('createHttpRequest', $request); - $agent->__construct(); - $response = $agent->fetchResponse( - new SimpleUrl('http://this.host/this/path/page.html'), - new SimpleGetEncoding()); - $this->assertTrue($response->isError()); - } -} - -class TestOfAuthorisation extends UnitTestCase { - - function testAuthenticateHeaderAdded() { - $response = new MockSimpleHttpResponse(); - $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); - - $request = new MockSimpleHttpRequest(); - $request->returns('fetch', $response); - $request->expectOnce( - 'addHeaderLine', - array('Authorization: Basic ' . base64_encode('test:secret'))); - - $agent = new MockRequestUserAgent(); - $agent->returns('createHttpRequest', $request); - $agent->__construct(); - $response = $agent->fetchResponse( - new SimpleUrl('http://test:secret@this.host'), - new SimpleGetEncoding()); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/visual_test.php b/3rdparty/simpletest/test/visual_test.php deleted file mode 100755 index 6b9d085d67f..00000000000 --- a/3rdparty/simpletest/test/visual_test.php +++ /dev/null @@ -1,495 +0,0 @@ -a = $a; - } -} - -class PassingUnitTestCaseOutput extends UnitTestCase { - - function testOfResults() { - $this->pass('Pass'); - } - - function testTrue() { - $this->assertTrue(true); - } - - function testFalse() { - $this->assertFalse(false); - } - - function testExpectation() { - $expectation = &new EqualExpectation(25, 'My expectation message: %s'); - $this->assert($expectation, 25, 'My assert message : %s'); - } - - function testNull() { - $this->assertNull(null, "%s -> Pass"); - $this->assertNotNull(false, "%s -> Pass"); - } - - function testType() { - $this->assertIsA("hello", "string", "%s -> Pass"); - $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass"); - $this->assertIsA($this, "UnitTestCase", "%s -> Pass"); - } - - function testTypeEquality() { - $this->assertEqual("0", 0, "%s -> Pass"); - } - - function testNullEquality() { - $this->assertNotEqual(null, 1, "%s -> Pass"); - $this->assertNotEqual(1, null, "%s -> Pass"); - } - - function testIntegerEquality() { - $this->assertNotEqual(1, 2, "%s -> Pass"); - } - - function testStringEquality() { - $this->assertEqual("a", "a", "%s -> Pass"); - $this->assertNotEqual("aa", "ab", "%s -> Pass"); - } - - function testHashEquality() { - $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass"); - } - - function testWithin() { - $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass"); - } - - function testOutside() { - $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass"); - } - - function testStringIdentity() { - $a = "fred"; - $b = $a; - $this->assertIdentical($a, $b, "%s -> Pass"); - } - - function testTypeIdentity() { - $a = "0"; - $b = 0; - $this->assertNotIdentical($a, $b, "%s -> Pass"); - } - - function testNullIdentity() { - $this->assertNotIdentical(null, 1, "%s -> Pass"); - $this->assertNotIdentical(1, null, "%s -> Pass"); - } - - function testHashIdentity() { - } - - function testObjectEquality() { - $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass"); - $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass"); - } - - function testObjectIndentity() { - $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass"); - $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass"); - } - - function testReference() { - $a = "fred"; - $b = &$a; - $this->assertReference($a, $b, "%s -> Pass"); - } - - function testCloneOnDifferentObjects() { - $a = "fred"; - $b = $a; - $c = "Hello"; - $this->assertClone($a, $b, "%s -> Pass"); - } - - function testPatterns() { - $this->assertPattern('/hello/i', "Hello there", "%s -> Pass"); - $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass"); - } - - function testLongStrings() { - $text = ""; - for ($i = 0; $i < 10; $i++) { - $text .= "0123456789"; - } - $this->assertEqual($text, $text); - } -} - -class FailingUnitTestCaseOutput extends UnitTestCase { - - function testOfResults() { - $this->fail('Fail'); // Fail. - } - - function testTrue() { - $this->assertTrue(false); // Fail. - } - - function testFalse() { - $this->assertFalse(true); // Fail. - } - - function testExpectation() { - $expectation = &new EqualExpectation(25, 'My expectation message: %s'); - $this->assert($expectation, 24, 'My assert message : %s'); // Fail. - } - - function testNull() { - $this->assertNull(false, "%s -> Fail"); // Fail. - $this->assertNotNull(null, "%s -> Fail"); // Fail. - } - - function testType() { - $this->assertIsA(14, "string", "%s -> Fail"); // Fail. - $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail"); // Fail. - $this->assertIsA($this, "TestReporter", "%s -> Fail"); // Fail. - } - - function testTypeEquality() { - $this->assertNotEqual("0", 0, "%s -> Fail"); // Fail. - } - - function testNullEquality() { - $this->assertEqual(null, 1, "%s -> Fail"); // Fail. - $this->assertEqual(1, null, "%s -> Fail"); // Fail. - } - - function testIntegerEquality() { - $this->assertEqual(1, 2, "%s -> Fail"); // Fail. - } - - function testStringEquality() { - $this->assertNotEqual("a", "a", "%s -> Fail"); // Fail. - $this->assertEqual("aa", "ab", "%s -> Fail"); // Fail. - } - - function testHashEquality() { - $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail"); - } - - function testWithin() { - $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail"); // Fail. - } - - function testOutside() { - $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail"); // Fail. - } - - function testStringIdentity() { - $a = "fred"; - $b = $a; - $this->assertNotIdentical($a, $b, "%s -> Fail"); // Fail. - } - - function testTypeIdentity() { - $a = "0"; - $b = 0; - $this->assertIdentical($a, $b, "%s -> Fail"); // Fail. - } - - function testNullIdentity() { - $this->assertIdentical(null, 1, "%s -> Fail"); // Fail. - $this->assertIdentical(1, null, "%s -> Fail"); // Fail. - } - - function testHashIdentity() { - $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail"); // Fail. - } - - function testObjectEquality() { - $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail"); // Fail. - $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail"); // Fail. - } - - function testObjectIndentity() { - $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail"); // Fail. - $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail"); // Fail. - } - - function testReference() { - $a = "fred"; - $b = &$a; - $this->assertClone($a, $b, "%s -> Fail"); // Fail. - } - - function testCloneOnDifferentObjects() { - $a = "fred"; - $b = $a; - $c = "Hello"; - $this->assertClone($a, $c, "%s -> Fail"); // Fail. - } - - function testPatterns() { - $this->assertPattern('/hello/', "Hello there", "%s -> Fail"); // Fail. - $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail"); // Fail. - } - - function testLongStrings() { - $text = ""; - for ($i = 0; $i < 10; $i++) { - $text .= "0123456789"; - } - $this->assertEqual($text . $text, $text . "a" . $text); // Fail. - } -} - -class Dummy { - function Dummy() { - } - - function a() { - } -} -Mock::generate('Dummy'); - -class TestOfMockObjectsOutput extends UnitTestCase { - - function testCallCounts() { - $dummy = &new MockDummy(); - $dummy->expectCallCount('a', 1, 'My message: %s'); - $dummy->a(); - $dummy->a(); - } - - function testMinimumCallCounts() { - $dummy = &new MockDummy(); - $dummy->expectMinimumCallCount('a', 2, 'My message: %s'); - $dummy->a(); - $dummy->a(); - } - - function testEmptyMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array()); - $dummy->a(); - $dummy->a(null); // Fail. - } - - function testEmptyMatchingWithCustomMessage() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(), 'My expectation message: %s'); - $dummy->a(); - $dummy->a(null); // Fail. - } - - function testNullMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(null)); - $dummy->a(null); - $dummy->a(); // Fail. - } - - function testBooleanMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(true, false)); - $dummy->a(true, false); - $dummy->a(true, true); // Fail. - } - - function testIntegerMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(32, 33)); - $dummy->a(32, 33); - $dummy->a(32, 34); // Fail. - } - - function testFloatMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(3.2, 3.3)); - $dummy->a(3.2, 3.3); - $dummy->a(3.2, 3.4); // Fail. - } - - function testStringMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array('32', '33')); - $dummy->a('32', '33'); - $dummy->a('32', '34'); // Fail. - } - - function testEmptyMatchingWithCustomExpectationMessage() { - $dummy = &new MockDummy(); - $dummy->expect( - 'a', - array(new EqualExpectation('A', 'My part expectation message: %s')), - 'My expectation message: %s'); - $dummy->a('A'); - $dummy->a('B'); // Fail. - } - - function testArrayMatching() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(array(32), array(33))); - $dummy->a(array(32), array(33)); - $dummy->a(array(32), array('33')); // Fail. - } - - function testObjectMatching() { - $a = new Dummy(); - $a->a = 'a'; - $b = new Dummy(); - $b->b = 'b'; - $dummy = &new MockDummy(); - $dummy->expect('a', array($a, $b)); - $dummy->a($a, $b); - $dummy->a($a, $a); // Fail. - } - - function testBigList() { - $dummy = &new MockDummy(); - $dummy->expect('a', array(false, 0, 1, 1.0)); - $dummy->a(false, 0, 1, 1.0); - $dummy->a(true, false, 2, 2.0); // Fail. - } -} - -class TestOfPastBugs extends UnitTestCase { - - function testMixedTypes() { - $this->assertEqual(array(), null, "%s -> Pass"); - $this->assertIdentical(array(), null, "%s -> Fail"); // Fail. - } - - function testMockWildcards() { - $dummy = &new MockDummy(); - $dummy->expect('a', array('*', array(33))); - $dummy->a(array(32), array(33)); - $dummy->a(array(32), array('33')); // Fail. - } -} - -class TestOfVisualShell extends ShellTestCase { - - function testDump() { - $this->execute('ls'); - $this->dumpOutput(); - $this->execute('dir'); - $this->dumpOutput(); - } - - function testDumpOfList() { - $this->execute('ls'); - $this->dump($this->getOutputAsList()); - } -} - -class PassesAsWellReporter extends HtmlReporter { - - protected function getCss() { - return parent::getCss() . ' .pass { color: darkgreen; }'; - } - - function paintPass($message) { - parent::paintPass($message); - print "Pass: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - print " -> " . htmlentities($message) . "
    \n"; - } - - function paintSignal($type, &$payload) { - print "$type: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - print " -> " . htmlentities(serialize($payload)) . "
    \n"; - } -} - -class TestOfSkippingNoMatterWhat extends UnitTestCase { - function skip() { - $this->skipIf(true, 'Always skipped -> %s'); - } - - function testFail() { - $this->fail('This really shouldn\'t have happened'); - } -} - -class TestOfSkippingOrElse extends UnitTestCase { - function skip() { - $this->skipUnless(false, 'Always skipped -> %s'); - } - - function testFail() { - $this->fail('This really shouldn\'t have happened'); - } -} - -class TestOfSkippingTwiceOver extends UnitTestCase { - function skip() { - $this->skipIf(true, 'First reason -> %s'); - $this->skipIf(true, 'Second reason -> %s'); - } - - function testFail() { - $this->fail('This really shouldn\'t have happened'); - } -} - -class TestThatShouldNotBeSkipped extends UnitTestCase { - function skip() { - $this->skipIf(false); - $this->skipUnless(true); - } - - function testFail() { - $this->fail('We should see this message'); - } - - function testPass() { - $this->pass('We should see this message'); - } -} - -$test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions'); -$test->add(new PassingUnitTestCaseOutput()); -$test->add(new FailingUnitTestCaseOutput()); -$test->add(new TestOfMockObjectsOutput()); -$test->add(new TestOfPastBugs()); -$test->add(new TestOfVisualShell()); -$test->add(new TestOfSkippingNoMatterWhat()); -$test->add(new TestOfSkippingOrElse()); -$test->add(new TestOfSkippingTwiceOver()); -$test->add(new TestThatShouldNotBeSkipped()); - -if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) { - $reporter = new XmlReporter(); -} elseif (TextReporter::inCli()) { - $reporter = new TextReporter(); -} else { - $reporter = new PassesAsWellReporter(); -} -if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) { - $reporter->makeDry(); -} -exit ($test->run($reporter) ? 0 : 1); -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/web_tester_test.php b/3rdparty/simpletest/test/web_tester_test.php deleted file mode 100755 index 8c3bf1adf63..00000000000 --- a/3rdparty/simpletest/test/web_tester_test.php +++ /dev/null @@ -1,155 +0,0 @@ -assertTrue($expectation->test('a')); - $this->assertTrue($expectation->test(array('a'))); - $this->assertFalse($expectation->test('A')); - } - - function testMatchesInteger() { - $expectation = new FieldExpectation('1'); - $this->assertTrue($expectation->test('1')); - $this->assertTrue($expectation->test(1)); - $this->assertTrue($expectation->test(array('1'))); - $this->assertTrue($expectation->test(array(1))); - } - - function testNonStringFailsExpectation() { - $expectation = new FieldExpectation('a'); - $this->assertFalse($expectation->test(null)); - } - - function testUnsetFieldCanBeTestedFor() { - $expectation = new FieldExpectation(false); - $this->assertTrue($expectation->test(false)); - } - - function testMultipleValuesCanBeInAnyOrder() { - $expectation = new FieldExpectation(array('a', 'b')); - $this->assertTrue($expectation->test(array('a', 'b'))); - $this->assertTrue($expectation->test(array('b', 'a'))); - $this->assertFalse($expectation->test(array('a', 'a'))); - $this->assertFalse($expectation->test('a')); - } - - function testSingleItemCanBeArrayOrString() { - $expectation = new FieldExpectation(array('a')); - $this->assertTrue($expectation->test(array('a'))); - $this->assertTrue($expectation->test('a')); - } -} - -class TestOfHeaderExpectations extends UnitTestCase { - - function testExpectingOnlyTheHeaderName() { - $expectation = new HttpHeaderExpectation('a'); - $this->assertIdentical($expectation->test(false), false); - $this->assertIdentical($expectation->test('a: A'), true); - $this->assertIdentical($expectation->test('A: A'), true); - $this->assertIdentical($expectation->test('a: B'), true); - $this->assertIdentical($expectation->test(' a : A '), true); - } - - function testHeaderValueAsWell() { - $expectation = new HttpHeaderExpectation('a', 'A'); - $this->assertIdentical($expectation->test(false), false); - $this->assertIdentical($expectation->test('a: A'), true); - $this->assertIdentical($expectation->test('A: A'), true); - $this->assertIdentical($expectation->test('A: a'), false); - $this->assertIdentical($expectation->test('a: B'), false); - $this->assertIdentical($expectation->test(' a : A '), true); - $this->assertIdentical($expectation->test(' a : AB '), false); - } - - function testHeaderValueWithColons() { - $expectation = new HttpHeaderExpectation('a', 'A:B:C'); - $this->assertIdentical($expectation->test('a: A'), false); - $this->assertIdentical($expectation->test('a: A:B'), false); - $this->assertIdentical($expectation->test('a: A:B:C'), true); - $this->assertIdentical($expectation->test('a: A:B:C:D'), false); - } - - function testMultilineSearch() { - $expectation = new HttpHeaderExpectation('a', 'A'); - $this->assertIdentical($expectation->test("aa: A\r\nb: B\r\nc: C"), false); - $this->assertIdentical($expectation->test("aa: A\r\na: A\r\nb: B"), true); - } - - function testMultilineSearchWithPadding() { - $expectation = new HttpHeaderExpectation('a', ' A '); - $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), false); - $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), true); - } - - function testPatternMatching() { - $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/')); - $this->assertIdentical($expectation->test('a: A'), true); - $this->assertIdentical($expectation->test('A: A'), true); - $this->assertIdentical($expectation->test('A: a'), false); - $this->assertIdentical($expectation->test('a: B'), false); - $this->assertIdentical($expectation->test(' a : A '), true); - $this->assertIdentical($expectation->test(' a : AB '), true); - } - - function testCaseInsensitivePatternMatching() { - $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/i')); - $this->assertIdentical($expectation->test('a: a'), true); - $this->assertIdentical($expectation->test('a: B'), false); - $this->assertIdentical($expectation->test(' a : A '), true); - $this->assertIdentical($expectation->test(' a : BAB '), true); - $this->assertIdentical($expectation->test(' a : bab '), true); - } - - function testUnwantedHeader() { - $expectation = new NoHttpHeaderExpectation('a'); - $this->assertIdentical($expectation->test(''), true); - $this->assertIdentical($expectation->test('stuff'), true); - $this->assertIdentical($expectation->test('b: B'), true); - $this->assertIdentical($expectation->test('a: A'), false); - $this->assertIdentical($expectation->test('A: A'), false); - } - - function testMultilineUnwantedSearch() { - $expectation = new NoHttpHeaderExpectation('a'); - $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), true); - $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), false); - } - - function testLocationHeaderSplitsCorrectly() { - $expectation = new HttpHeaderExpectation('Location', 'http://here/'); - $this->assertIdentical($expectation->test('Location: http://here/'), true); - } -} - -class TestOfTextExpectations extends UnitTestCase { - - function testMatchingSubString() { - $expectation = new TextExpectation('wanted'); - $this->assertIdentical($expectation->test(''), false); - $this->assertIdentical($expectation->test('Wanted'), false); - $this->assertIdentical($expectation->test('wanted'), true); - $this->assertIdentical($expectation->test('the wanted text is here'), true); - } - - function testNotMatchingSubString() { - $expectation = new NoTextExpectation('wanted'); - $this->assertIdentical($expectation->test(''), true); - $this->assertIdentical($expectation->test('Wanted'), true); - $this->assertIdentical($expectation->test('wanted'), false); - $this->assertIdentical($expectation->test('the wanted text is here'), false); - } -} - -class TestOfGenericAssertionsInWebTester extends WebTestCase { - function testEquality() { - $this->assertEqual('a', 'a'); - $this->assertNotEqual('a', 'A'); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/xml_test.php b/3rdparty/simpletest/test/xml_test.php deleted file mode 100755 index f99e0dcd98b..00000000000 --- a/3rdparty/simpletest/test/xml_test.php +++ /dev/null @@ -1,187 +0,0 @@ - 2)); - $this->assertEqual($nesting->getSize(), 2); - } -} - -class TestOfXmlStructureParsing extends UnitTestCase { - function testValidXml() { - $listener = new MockSimpleScorer(); - $listener->expectNever('paintGroupStart'); - $listener->expectNever('paintGroupEnd'); - $listener->expectNever('paintCaseStart'); - $listener->expectNever('paintCaseEnd'); - $parser = new SimpleTestXmlParser($listener); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("\n")); - } - - function testEmptyGroup() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintGroupStart', array('a_group', 7)); - $listener->expectOnce('paintGroupEnd', array('a_group')); - $parser = new SimpleTestXmlParser($listener); - $parser->parse("\n"); - $parser->parse("\n"); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("a_group\n")); - $this->assertTrue($parser->parse("\n")); - $parser->parse("\n"); - } - - function testEmptyCase() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintCaseStart', array('a_case')); - $listener->expectOnce('paintCaseEnd', array('a_case')); - $parser = new SimpleTestXmlParser($listener); - $parser->parse("\n"); - $parser->parse("\n"); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("a_case\n")); - $this->assertTrue($parser->parse("\n")); - $parser->parse("\n"); - } - - function testEmptyMethod() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintCaseStart', array('a_case')); - $listener->expectOnce('paintCaseEnd', array('a_case')); - $listener->expectOnce('paintMethodStart', array('a_method')); - $listener->expectOnce('paintMethodEnd', array('a_method')); - $parser = new SimpleTestXmlParser($listener); - $parser->parse("\n"); - $parser->parse("\n"); - $parser->parse("\n"); - $parser->parse("a_case\n"); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("a_method\n")); - $this->assertTrue($parser->parse("\n")); - $parser->parse("\n"); - $parser->parse("\n"); - } - - function testNestedGroup() { - $listener = new MockSimpleScorer(); - $listener->expectAt(0, 'paintGroupStart', array('a_group', 7)); - $listener->expectAt(1, 'paintGroupStart', array('b_group', 3)); - $listener->expectCallCount('paintGroupStart', 2); - $listener->expectAt(0, 'paintGroupEnd', array('b_group')); - $listener->expectAt(1, 'paintGroupEnd', array('a_group')); - $listener->expectCallCount('paintGroupEnd', 2); - - $parser = new SimpleTestXmlParser($listener); - $parser->parse("\n"); - $parser->parse("\n"); - - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("a_group\n")); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("b_group\n")); - $this->assertTrue($parser->parse("\n")); - $this->assertTrue($parser->parse("\n")); - $parser->parse("\n"); - } -} - -class AnyOldSignal { - public $stuff = true; -} - -class TestOfXmlResultsParsing extends UnitTestCase { - - function sendValidStart(&$parser) { - $parser->parse("\n"); - $parser->parse("\n"); - $parser->parse("\n"); - $parser->parse("a_case\n"); - $parser->parse("\n"); - $parser->parse("a_method\n"); - } - - function sendValidEnd(&$parser) { - $parser->parse("\n"); - $parser->parse("\n"); - $parser->parse("\n"); - } - - function testPass() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintPass', array('a_message')); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("a_message\n")); - $this->sendValidEnd($parser); - } - - function testFail() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintFail', array('a_message')); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("a_message\n")); - $this->sendValidEnd($parser); - } - - function testException() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintError', array('a_message')); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("a_message\n")); - $this->sendValidEnd($parser); - } - - function testSkip() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintSkip', array('a_message')); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("a_message\n")); - $this->sendValidEnd($parser); - } - - function testSignal() { - $signal = new AnyOldSignal(); - $signal->stuff = "Hello"; - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintSignal', array('a_signal', $signal)); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse( - "\n")); - $this->sendValidEnd($parser); - } - - function testMessage() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintMessage', array('a_message')); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("a_message\n")); - $this->sendValidEnd($parser); - } - - function testFormattedMessage() { - $listener = new MockSimpleScorer(); - $listener->expectOnce('paintFormattedMessage', array("\na\tmessage\n")); - $parser = new SimpleTestXmlParser($listener); - $this->sendValidStart($parser); - $this->assertTrue($parser->parse("\n")); - $this->sendValidEnd($parser); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test_case.php b/3rdparty/simpletest/test_case.php deleted file mode 100644 index ba023c3b2ea..00000000000 --- a/3rdparty/simpletest/test_case.php +++ /dev/null @@ -1,658 +0,0 @@ -label = $label; - } - } - - /** - * Accessor for the test name for subclasses. - * @return string Name of the test. - * @access public - */ - function getLabel() { - return $this->label ? $this->label : get_class($this); - } - - /** - * This is a placeholder for skipping tests. In this - * method you place skipIf() and skipUnless() calls to - * set the skipping state. - * @access public - */ - function skip() { - } - - /** - * Will issue a message to the reporter and tell the test - * case to skip if the incoming flag is true. - * @param string $should_skip Condition causing the tests to be skipped. - * @param string $message Text of skip condition. - * @access public - */ - function skipIf($should_skip, $message = '%s') { - if ($should_skip && ! $this->should_skip) { - $this->should_skip = true; - $message = sprintf($message, 'Skipping [' . get_class($this) . ']'); - $this->reporter->paintSkip($message . $this->getAssertionLine()); - } - } - - /** - * Accessor for the private variable $_shoud_skip - * @access public - */ - function shouldSkip() { - return $this->should_skip; - } - - /** - * Will issue a message to the reporter and tell the test - * case to skip if the incoming flag is false. - * @param string $shouldnt_skip Condition causing the tests to be run. - * @param string $message Text of skip condition. - * @access public - */ - function skipUnless($shouldnt_skip, $message = false) { - $this->skipIf(! $shouldnt_skip, $message); - } - - /** - * Used to invoke the single tests. - * @return SimpleInvoker Individual test runner. - * @access public - */ - function createInvoker() { - return new SimpleErrorTrappingInvoker( - new SimpleExceptionTrappingInvoker(new SimpleInvoker($this))); - } - - /** - * Uses reflection to run every method within itself - * starting with the string "test" unless a method - * is specified. - * @param SimpleReporter $reporter Current test reporter. - * @return boolean True if all tests passed. - * @access public - */ - function run($reporter) { - $context = SimpleTest::getContext(); - $context->setTest($this); - $context->setReporter($reporter); - $this->reporter = $reporter; - $started = false; - foreach ($this->getTests() as $method) { - if ($reporter->shouldInvoke($this->getLabel(), $method)) { - $this->skip(); - if ($this->should_skip) { - break; - } - if (! $started) { - $reporter->paintCaseStart($this->getLabel()); - $started = true; - } - $invoker = $this->reporter->createInvoker($this->createInvoker()); - $invoker->before($method); - $invoker->invoke($method); - $invoker->after($method); - } - } - if ($started) { - $reporter->paintCaseEnd($this->getLabel()); - } - unset($this->reporter); - $context->setTest(null); - return $reporter->getStatus(); - } - - /** - * Gets a list of test names. Normally that will - * be all internal methods that start with the - * name "test". This method should be overridden - * if you want a different rule. - * @return array List of test names. - * @access public - */ - function getTests() { - $methods = array(); - foreach (get_class_methods(get_class($this)) as $method) { - if ($this->isTest($method)) { - $methods[] = $method; - } - } - return $methods; - } - - /** - * Tests to see if the method is a test that should - * be run. Currently any method that starts with 'test' - * is a candidate unless it is the constructor. - * @param string $method Method name to try. - * @return boolean True if test method. - * @access protected - */ - protected function isTest($method) { - if (strtolower(substr($method, 0, 4)) == 'test') { - return ! SimpleTestCompatibility::isA($this, strtolower($method)); - } - return false; - } - - /** - * Announces the start of the test. - * @param string $method Test method just started. - * @access public - */ - function before($method) { - $this->reporter->paintMethodStart($method); - $this->observers = array(); - } - - /** - * Sets up unit test wide variables at the start - * of each test method. To be overridden in - * actual user test cases. - * @access public - */ - function setUp() { - } - - /** - * Clears the data set in the setUp() method call. - * To be overridden by the user in actual user test cases. - * @access public - */ - function tearDown() { - } - - /** - * Announces the end of the test. Includes private clean up. - * @param string $method Test method just finished. - * @access public - */ - function after($method) { - for ($i = 0; $i < count($this->observers); $i++) { - $this->observers[$i]->atTestEnd($method, $this); - } - $this->reporter->paintMethodEnd($method); - } - - /** - * Sets up an observer for the test end. - * @param object $observer Must have atTestEnd() - * method. - * @access public - */ - function tell($observer) { - $this->observers[] = &$observer; - } - - /** - * @deprecated - */ - function pass($message = "Pass") { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintPass( - $message . $this->getAssertionLine()); - return true; - } - - /** - * Sends a fail event with a message. - * @param string $message Message to send. - * @access public - */ - function fail($message = "Fail") { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintFail( - $message . $this->getAssertionLine()); - return false; - } - - /** - * Formats a PHP error and dispatches it to the - * reporter. - * @param integer $severity PHP error code. - * @param string $message Text of error. - * @param string $file File error occoured in. - * @param integer $line Line number of error. - * @access public - */ - function error($severity, $message, $file, $line) { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintError( - "Unexpected PHP error [$message] severity [$severity] in [$file line $line]"); - } - - /** - * Formats an exception and dispatches it to the - * reporter. - * @param Exception $exception Object thrown. - * @access public - */ - function exception($exception) { - $this->reporter->paintException($exception); - } - - /** - * For user defined expansion of the available messages. - * @param string $type Tag for sorting the signals. - * @param mixed $payload Extra user specific information. - */ - function signal($type, $payload) { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintSignal($type, $payload); - } - - /** - * Runs an expectation directly, for extending the - * tests with new expectation classes. - * @param SimpleExpectation $expectation Expectation subclass. - * @param mixed $compare Value to compare. - * @param string $message Message to display. - * @return boolean True on pass - * @access public - */ - function assert($expectation, $compare, $message = '%s') { - if ($expectation->test($compare)) { - return $this->pass(sprintf( - $message, - $expectation->overlayMessage($compare, $this->reporter->getDumper()))); - } else { - return $this->fail(sprintf( - $message, - $expectation->overlayMessage($compare, $this->reporter->getDumper()))); - } - } - - /** - * Uses a stack trace to find the line of an assertion. - * @return string Line number of first assert* - * method embedded in format string. - * @access public - */ - function getAssertionLine() { - $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip')); - return $trace->traceMethod(); - } - - /** - * Sends a formatted dump of a variable to the - * test suite for those emergency debugging - * situations. - * @param mixed $variable Variable to display. - * @param string $message Message to display. - * @return mixed The original variable. - * @access public - */ - function dump($variable, $message = false) { - $dumper = $this->reporter->getDumper(); - $formatted = $dumper->dump($variable); - if ($message) { - $formatted = $message . "\n" . $formatted; - } - $this->reporter->paintFormattedMessage($formatted); - return $variable; - } - - /** - * Accessor for the number of subtests including myelf. - * @return integer Number of test cases. - * @access public - */ - function getSize() { - return 1; - } -} - -/** - * Helps to extract test cases automatically from a file. - * @package SimpleTest - * @subpackage UnitTester - */ -class SimpleFileLoader { - - /** - * Builds a test suite from a library of test cases. - * The new suite is composed into this one. - * @param string $test_file File name of library with - * test case classes. - * @return TestSuite The new test suite. - * @access public - */ - function load($test_file) { - $existing_classes = get_declared_classes(); - $existing_globals = get_defined_vars(); - include_once($test_file); - $new_globals = get_defined_vars(); - $this->makeFileVariablesGlobal($existing_globals, $new_globals); - $new_classes = array_diff(get_declared_classes(), $existing_classes); - if (empty($new_classes)) { - $new_classes = $this->scrapeClassesFromFile($test_file); - } - $classes = $this->selectRunnableTests($new_classes); - return $this->createSuiteFromClasses($test_file, $classes); - } - - /** - * Imports new variables into the global namespace. - * @param hash $existing Variables before the file was loaded. - * @param hash $new Variables after the file was loaded. - * @access private - */ - protected function makeFileVariablesGlobal($existing, $new) { - $globals = array_diff(array_keys($new), array_keys($existing)); - foreach ($globals as $global) { - $GLOBALS[$global] = $new[$global]; - } - } - - /** - * Lookup classnames from file contents, in case the - * file may have been included before. - * Note: This is probably too clever by half. Figuring this - * out after a failed test case is going to be tricky for us, - * never mind the user. A test case should not be included - * twice anyway. - * @param string $test_file File name with classes. - * @access private - */ - protected function scrapeClassesFromFile($test_file) { - preg_match_all('~^\s*class\s+(\w+)(\s+(extends|implements)\s+\w+)*\s*\{~mi', - file_get_contents($test_file), - $matches ); - return $matches[1]; - } - - /** - * Calculates the incoming test cases. Skips abstract - * and ignored classes. - * @param array $candidates Candidate classes. - * @return array New classes which are test - * cases that shouldn't be ignored. - * @access public - */ - function selectRunnableTests($candidates) { - $classes = array(); - foreach ($candidates as $class) { - if (TestSuite::getBaseTestCase($class)) { - $reflection = new SimpleReflection($class); - if ($reflection->isAbstract()) { - SimpleTest::ignore($class); - } else { - $classes[] = $class; - } - } - } - return $classes; - } - - /** - * Builds a test suite from a class list. - * @param string $title Title of new group. - * @param array $classes Test classes. - * @return TestSuite Group loaded with the new - * test cases. - * @access public - */ - function createSuiteFromClasses($title, $classes) { - if (count($classes) == 0) { - $suite = new BadTestSuite($title, "No runnable test cases in [$title]"); - return $suite; - } - SimpleTest::ignoreParentsIfIgnored($classes); - $suite = new TestSuite($title); - foreach ($classes as $class) { - if (! SimpleTest::isIgnored($class)) { - $suite->add($class); - } - } - return $suite; - } -} - -/** - * This is a composite test class for combining - * test cases and other RunnableTest classes into - * a group test. - * @package SimpleTest - * @subpackage UnitTester - */ -class TestSuite { - private $label; - private $test_cases; - - /** - * Sets the name of the test suite. - * @param string $label Name sent at the start and end - * of the test. - * @access public - */ - function TestSuite($label = false) { - $this->label = $label; - $this->test_cases = array(); - } - - /** - * Accessor for the test name for subclasses. If the suite - * wraps a single test case the label defaults to the name of that test. - * @return string Name of the test. - * @access public - */ - function getLabel() { - if (! $this->label) { - return ($this->getSize() == 1) ? - get_class($this->test_cases[0]) : get_class($this); - } else { - return $this->label; - } - } - - /** - * Adds a test into the suite by instance or class. The class will - * be instantiated if it's a test suite. - * @param SimpleTestCase $test_case Suite or individual test - * case implementing the - * runnable test interface. - * @access public - */ - function add($test_case) { - if (! is_string($test_case)) { - $this->test_cases[] = $test_case; - } elseif (TestSuite::getBaseTestCase($test_case) == 'testsuite') { - $this->test_cases[] = new $test_case(); - } else { - $this->test_cases[] = $test_case; - } - } - - /** - * Builds a test suite from a library of test cases. - * The new suite is composed into this one. - * @param string $test_file File name of library with - * test case classes. - * @access public - */ - function addFile($test_file) { - $extractor = new SimpleFileLoader(); - $this->add($extractor->load($test_file)); - } - - /** - * Delegates to a visiting collector to add test - * files. - * @param string $path Path to scan from. - * @param SimpleCollector $collector Directory scanner. - * @access public - */ - function collect($path, $collector) { - $collector->collect($this, $path); - } - - /** - * Invokes run() on all of the held test cases, instantiating - * them if necessary. - * @param SimpleReporter $reporter Current test reporter. - * @access public - */ - function run($reporter) { - $reporter->paintGroupStart($this->getLabel(), $this->getSize()); - for ($i = 0, $count = count($this->test_cases); $i < $count; $i++) { - if (is_string($this->test_cases[$i])) { - $class = $this->test_cases[$i]; - $test = new $class(); - $test->run($reporter); - unset($test); - } else { - $this->test_cases[$i]->run($reporter); - } - } - $reporter->paintGroupEnd($this->getLabel()); - return $reporter->getStatus(); - } - - /** - * Number of contained test cases. - * @return integer Total count of cases in the group. - * @access public - */ - function getSize() { - $count = 0; - foreach ($this->test_cases as $case) { - if (is_string($case)) { - if (! SimpleTest::isIgnored($case)) { - $count++; - } - } else { - $count += $case->getSize(); - } - } - return $count; - } - - /** - * Test to see if a class is derived from the - * SimpleTestCase class. - * @param string $class Class name. - * @access public - */ - static function getBaseTestCase($class) { - while ($class = get_parent_class($class)) { - $class = strtolower($class); - if ($class == 'simpletestcase' || $class == 'testsuite') { - return $class; - } - } - return false; - } -} - -/** - * This is a failing group test for when a test suite hasn't - * loaded properly. - * @package SimpleTest - * @subpackage UnitTester - */ -class BadTestSuite { - private $label; - private $error; - - /** - * Sets the name of the test suite and error message. - * @param string $label Name sent at the start and end - * of the test. - * @access public - */ - function BadTestSuite($label, $error) { - $this->label = $label; - $this->error = $error; - } - - /** - * Accessor for the test name for subclasses. - * @return string Name of the test. - * @access public - */ - function getLabel() { - return $this->label; - } - - /** - * Sends a single error to the reporter. - * @param SimpleReporter $reporter Current test reporter. - * @access public - */ - function run($reporter) { - $reporter->paintGroupStart($this->getLabel(), $this->getSize()); - $reporter->paintFail('Bad TestSuite [' . $this->getLabel() . - '] with error [' . $this->error . ']'); - $reporter->paintGroupEnd($this->getLabel()); - return $reporter->getStatus(); - } - - /** - * Number of contained test cases. Always zero. - * @return integer Total count of cases in the group. - * @access public - */ - function getSize() { - return 0; - } -} -?> diff --git a/3rdparty/simpletest/tidy_parser.php b/3rdparty/simpletest/tidy_parser.php deleted file mode 100755 index 3d8b4b2ac7d..00000000000 --- a/3rdparty/simpletest/tidy_parser.php +++ /dev/null @@ -1,382 +0,0 @@ -free(); - } - - /** - * Frees up any references so as to allow the PHP garbage - * collection from unset() to work. - */ - private function free() { - unset($this->page); - $this->forms = array(); - $this->labels = array(); - } - - /** - * This builder is only available if the 'tidy' extension is loaded. - * @return boolean True if available. - */ - function can() { - return extension_loaded('tidy'); - } - - /** - * Reads the raw content the page using HTML Tidy. - * @param $response SimpleHttpResponse Fetched response. - * @return SimplePage Newly parsed page. - */ - function parse($response) { - $this->page = new SimplePage($response); - $tidied = tidy_parse_string($input = $this->insertGuards($response->getContent()), - array('output-xml' => false, 'wrap' => '0', 'indent' => 'no'), - 'latin1'); - $this->walkTree($tidied->html()); - $this->attachLabels($this->widgets_by_id, $this->labels); - $this->page->setForms($this->forms); - $page = $this->page; - $this->free(); - return $page; - } - - /** - * Stops HTMLTidy stripping content that we wish to preserve. - * @param string The raw html. - * @return string The html with guard tags inserted. - */ - private function insertGuards($html) { - return $this->insertEmptyTagGuards($this->insertTextareaSimpleWhitespaceGuards($html)); - } - - /** - * Removes the extra content added during the parse stage - * in order to preserve content we don't want stripped - * out by HTMLTidy. - * @param string The raw html. - * @return string The html with guard tags removed. - */ - private function stripGuards($html) { - return $this->stripTextareaWhitespaceGuards($this->stripEmptyTagGuards($html)); - } - - /** - * HTML tidy strips out empty tags such as
    ' . + ''; + $page = $this->whenVisiting('http://host', $raw); + $this->assertNull($page->getFormBySubmit(new SimpleByLabel('b'))); + $this->assertNull($page->getFormBySubmit(new SimpleByLabel('B'))); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByName('b')), + 'SimpleForm'); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByLabel('BBB')), + 'SimpleForm'); + } + + function testCanFindFormById() { + $raw = '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertNull($page->getFormById(54)); + $this->assertIsA($page->getFormById(55), 'SimpleForm'); + } + + function testFormCanBeSubmitted() { + $raw = '
    ' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $form = $page->getFormBySubmit(new SimpleByLabel('Submit')); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Submit')), + new SimpleGetEncoding(array('s' => 'Submit'))); + } + + function testUnparsedTagDoesNotCrash() { + $raw = '
    '; + $this->whenVisiting('http://host', $raw); + } + + function testReadingTextField() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertNull($page->getField(new SimpleByName('missing'))); + $this->assertIdentical($page->getField(new SimpleByName('a')), ''); + $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); + } + + function testEntitiesAreDecodedInDefaultTextFieldValue() { + $raw = '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>'); + } + + function testReadingTextFieldIsCaseInsensitive() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertNull($page->getField(new SimpleByName('missing'))); + $this->assertIdentical($page->getField(new SimpleByName('a')), ''); + $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); + } + + function testSettingTextField() { + $raw = '
    ' . + '' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + $this->assertTrue($page->setField(new SimpleById(3), 'bbb')); + $this->assertEqual($page->getField(new SimpleBYId(3)), 'bbb'); + $this->assertFalse($page->setField(new SimpleByName('z'), 'zzz')); + $this->assertNull($page->getField(new SimpleByName('z'))); + } + + function testSettingTextFieldByEnclosingLabel() { + $raw = '
    ' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); + } + + function testLabelsWithoutForDoNotAttachToInputsWithNoId() { + $raw = '
    + + +
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), 'one'); + $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), 'two'); + $this->assertTrue($page->setField(new SimpleByLabelOrName('Text A'), '1')); + $this->assertTrue($page->setField(new SimpleByLabelOrName('Text B'), '2')); + $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), '1'); + $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), '2'); + } + + function testGettingTextFieldByEnclosingLabelWithConflictingOtherFields() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); + $this->assertEqual($page->getField(new SimpleByName('b')), 'B'); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + } + + function testSettingTextFieldByExternalLabel() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); + } + + function testReadingTextArea() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + } + + function testEntitiesAreDecodedInTextareaValue() { + $raw = '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>'); + } + + function testNewlinesPreservedInTextArea() { + $raw = "
    "; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), "hello\r\nworld"); + } + + function testWhitespacePreservedInTextArea() { + $raw = '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), ' '); + } + + function testComplexWhitespaceInTextArea() { + $raw = "\n" . + " \n" . + " \n" . + "
    \n". + " \n" . + "
    \n" . + " \n" . + ""; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('c')), " "); + } + + function testSettingTextArea() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA'); + } + + function testDontIncludeTextAreaContentInLabel() { + $raw = '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabel('Text area C')), 'mouse'); + } + + function testSettingSelectionField() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb'); + $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc')); + $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + } + + function testSelectionOptionsAreNormalised() { + $raw = '
    ' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('a')), 'Big bold'); + $this->assertTrue($page->setField(new SimpleByName('a'), 'small italic')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'small italic'); + } + + function testCanParseBlankOptions() { + $raw = '
    + +
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByName('d'), '')); + } + + function testTwoSelectionFieldsAreIndependent() { + $raw = '
    + + +
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByName('d'), 'd2')); + $this->assertTrue($page->setField(new SimpleByName('h'), 'h1')); + $this->assertEqual($page->getField(new SimpleByName('d')), 'd2'); + } + + function testEmptyOptionDoesNotScrewUpTwoSelectionFields() { + $raw = '
    + + +
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByName('d'), 'd2')); + $this->assertTrue($page->setField(new SimpleByName('h'), 'h1')); + $this->assertEqual($page->getField(new SimpleByName('d')), 'd2'); + } + + function testSettingSelectionFieldByEnclosingLabel() { + $raw = '
    ' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'B'); + } + + function testTwoSelectionFieldsWithLabelsAreIndependent() { + $raw = '
    + + +
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertTrue($page->setField(new SimpleByLabel('Labelled D'), 'd2')); + $this->assertTrue($page->setField(new SimpleByLabel('Labelled H'), 'h1')); + $this->assertEqual($page->getField(new SimpleByLabel('Labelled D')), 'd2'); + } + + function testSettingRadioButtonByEnclosingLabel() { + $raw = '
    ' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a'); + $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b')); + $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b'); + } + + function testCanParseInputsWithAllKindsOfAttributeQuoting() { + $raw = '
    ' . + '' . + '' . + '' . + '
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('first')), 'one'); + $this->assertEqual($page->getField(new SimpleByName('second')), false); + $this->assertEqual($page->getField(new SimpleByName('third')), 'three'); + } + + function urlToString($url) { + return $url->asString(); + } + + function assertSameFrameset($actual, $expected) { + $this->assertIdentical(array_map(array($this, 'urlToString'), $actual), + array_map(array($this, 'urlToString'), $expected)); + } +} + +class TestOfParsingUsingPhpParser extends TestOfParsing { + + function whenVisiting($url, $content) { + $response = new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', $content); + $response->setReturnValue('getUrl', new SimpleUrl($url)); + $builder = new SimplePhpPageBuilder(); + return $builder->parse($response); + } + + function testNastyTitle() { + $page = $this->whenVisiting('http://host', + ' <b>Me&Me '); + $this->assertEqual($page->getTitle(), "Me&Me"); + } + + function testLabelShouldStopAtClosingLabelTag() { + $raw = '
    stuff
    '; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByLabel('startend')), 'stuff'); + } +} + +class TestOfParsingUsingTidyParser extends TestOfParsing { + + function skip() { + $this->skipUnless(extension_loaded('tidy'), 'Install \'tidy\' php extension to enable html tidy based parser'); + } + + function whenVisiting($url, $content) { + $response = new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', $content); + $response->setReturnValue('getUrl', new SimpleUrl($url)); + $builder = new SimpleTidyPageBuilder(); + return $builder->parse($response); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/php_parser_test.php b/3rdparty/simpletest/test/php_parser_test.php new file mode 100755 index 00000000000..d95c7d06a60 --- /dev/null +++ b/3rdparty/simpletest/test/php_parser_test.php @@ -0,0 +1,489 @@ +assertFalse($regex->match("Hello", $match)); + $this->assertEqual($match, ""); + } + + function testNoSubject() { + $regex = new ParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("", $match)); + $this->assertEqual($match, ""); + } + + function testMatchAll() { + $regex = new ParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("Hello", $match)); + $this->assertEqual($match, "Hello"); + } + + function testCaseSensitive() { + $regex = new ParallelRegex(true); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "abc"); + } + + function testCaseInsensitive() { + $regex = new ParallelRegex(false); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + } + + function testMatchMultiple() { + $regex = new ParallelRegex(true); + $regex->addPattern("abc"); + $regex->addPattern("ABC"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + $this->assertFalse($regex->match("Hello", $match)); + } + + function testPatternLabels() { + $regex = new ParallelRegex(false); + $regex->addPattern("abc", "letter"); + $regex->addPattern("123", "number"); + $this->assertIdentical($regex->match("abcdef", $match), "letter"); + $this->assertEqual($match, "abc"); + $this->assertIdentical($regex->match("0123456789", $match), "number"); + $this->assertEqual($match, "123"); + } +} + +class TestOfStateStack extends UnitTestCase { + + function testStartState() { + $stack = new SimpleStateStack("one"); + $this->assertEqual($stack->getCurrent(), "one"); + } + + function testExhaustion() { + $stack = new SimpleStateStack("one"); + $this->assertFalse($stack->leave()); + } + + function testStateMoves() { + $stack = new SimpleStateStack("one"); + $stack->enter("two"); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("three"); + $this->assertEqual($stack->getCurrent(), "three"); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("third"); + $this->assertEqual($stack->getCurrent(), "third"); + $this->assertTrue($stack->leave()); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "one"); + } +} + +class TestParser { + + function accept() { + } + + function a() { + } + + function b() { + } +} +Mock::generate('TestParser'); + +class TestOfLexer extends UnitTestCase { + + function testEmptyPage() { + $handler = new MockTestParser(); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $lexer = new SimpleLexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("")); + } + + function testSinglePattern() { + $handler = new MockTestParser(); + $handler->expectAt(0, "accept", array("aaa", LEXER_MATCHED)); + $handler->expectAt(1, "accept", array("x", LEXER_UNMATCHED)); + $handler->expectAt(2, "accept", array("a", LEXER_MATCHED)); + $handler->expectAt(3, "accept", array("yyy", LEXER_UNMATCHED)); + $handler->expectAt(4, "accept", array("a", LEXER_MATCHED)); + $handler->expectAt(5, "accept", array("x", LEXER_UNMATCHED)); + $handler->expectAt(6, "accept", array("aaa", LEXER_MATCHED)); + $handler->expectAt(7, "accept", array("z", LEXER_UNMATCHED)); + $handler->expectCallCount("accept", 8); + $handler->setReturnValue("accept", true); + $lexer = new SimpleLexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("aaaxayyyaxaaaz")); + } + + function testMultiplePattern() { + $handler = new MockTestParser(); + $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x"); + for ($i = 0; $i < count($target); $i++) { + $handler->expectAt($i, "accept", array($target[$i], '*')); + } + $handler->expectCallCount("accept", count($target)); + $handler->setReturnValue("accept", true); + $lexer = new SimpleLexer($handler); + $lexer->addPattern("a+"); + $lexer->addPattern("b+"); + $this->assertTrue($lexer->parse("ababbxbaxxxxxxax")); + } +} + +class TestOfLexerModes extends UnitTestCase { + + function testIsolatedPattern() { + $handler = new MockTestParser(); + $handler->expectAt(0, "a", array("a", LEXER_MATCHED)); + $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(3, "a", array("bxb", LEXER_UNMATCHED)); + $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED)); + $handler->expectAt(5, "a", array("x", LEXER_UNMATCHED)); + $handler->expectAt(6, "a", array("aaaa", LEXER_MATCHED)); + $handler->expectAt(7, "a", array("x", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 8); + $handler->setReturnValue("a", true); + $lexer = new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabxbaaaxaaaax")); + } + + function testModeChange() { + $handler = new MockTestParser(); + $handler->expectAt(0, "a", array("a", LEXER_MATCHED)); + $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED)); + $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED)); + $handler->expectAt(0, "b", array(":", LEXER_ENTER)); + $handler->expectAt(1, "b", array("a", LEXER_UNMATCHED)); + $handler->expectAt(2, "b", array("b", LEXER_MATCHED)); + $handler->expectAt(3, "b", array("a", LEXER_UNMATCHED)); + $handler->expectAt(4, "b", array("bb", LEXER_MATCHED)); + $handler->expectAt(5, "b", array("a", LEXER_UNMATCHED)); + $handler->expectAt(6, "b", array("bbb", LEXER_MATCHED)); + $handler->expectAt(7, "b", array("a", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 5); + $handler->expectCallCount("b", 8); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $lexer = new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern(":", "a", "b"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabaaa:ababbabbba")); + } + + function testNesting() { + $handler = new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED)); + $handler->expectAt(0, "b", array("(", LEXER_ENTER)); + $handler->expectAt(1, "b", array("bb", LEXER_MATCHED)); + $handler->expectAt(2, "b", array("a", LEXER_UNMATCHED)); + $handler->expectAt(3, "b", array("bb", LEXER_MATCHED)); + $handler->expectAt(4, "b", array(")", LEXER_EXIT)); + $handler->expectAt(4, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(5, "a", array("b", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 6); + $handler->expectCallCount("b", 5); + $lexer = new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern("(", "a", "b"); + $lexer->addPattern("b+", "b"); + $lexer->addExitPattern(")", "b"); + $this->assertTrue($lexer->parse("aabaab(bbabb)aab")); + } + + function testSingular() { + $handler = new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(1, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(2, "a", array("xx", LEXER_UNMATCHED)); + $handler->expectAt(3, "a", array("xx", LEXER_UNMATCHED)); + $handler->expectAt(0, "b", array("b", LEXER_SPECIAL)); + $handler->expectAt(1, "b", array("bbb", LEXER_SPECIAL)); + $handler->expectCallCount("a", 4); + $handler->expectCallCount("b", 2); + $lexer = new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addSpecialPattern("b+", "a", "b"); + $this->assertTrue($lexer->parse("aabaaxxbbbxx")); + } + + function testUnwindTooFar() { + $handler = new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(1, "a", array(")", LEXER_EXIT)); + $handler->expectCallCount("a", 2); + $lexer = new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addExitPattern(")", "a"); + $this->assertFalse($lexer->parse("aa)aa")); + } +} + +class TestOfLexerHandlers extends UnitTestCase { + + function testModeMapping() { + $handler = new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->expectAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectAt(1, "a", array("(", LEXER_ENTER)); + $handler->expectAt(2, "a", array("bb", LEXER_MATCHED)); + $handler->expectAt(3, "a", array("a", LEXER_UNMATCHED)); + $handler->expectAt(4, "a", array("bb", LEXER_MATCHED)); + $handler->expectAt(5, "a", array(")", LEXER_EXIT)); + $handler->expectAt(6, "a", array("b", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 7); + $lexer = new SimpleLexer($handler, "mode_a"); + $lexer->addPattern("a+", "mode_a"); + $lexer->addEntryPattern("(", "mode_a", "mode_b"); + $lexer->addPattern("b+", "mode_b"); + $lexer->addExitPattern(")", "mode_b"); + $lexer->mapHandler("mode_a", "a"); + $lexer->mapHandler("mode_b", "a"); + $this->assertTrue($lexer->parse("aa(bbabb)b")); + } +} + +class TestOfSimpleHtmlLexer extends UnitTestCase { + + function &createParser() { + $parser = new MockSimpleHtmlSaxParser(); + $parser->setReturnValue('acceptStartToken', true); + $parser->setReturnValue('acceptEndToken', true); + $parser->setReturnValue('acceptAttributeToken', true); + $parser->setReturnValue('acceptEntityToken', true); + $parser->setReturnValue('acceptTextToken', true); + $parser->setReturnValue('ignore', true); + return $parser; + } + + function testNoContent() { + $parser = $this->createParser(); + $parser->expectNever('acceptStartToken'); + $parser->expectNever('acceptEndToken'); + $parser->expectNever('acceptAttributeToken'); + $parser->expectNever('acceptEntityToken'); + $parser->expectNever('acceptTextToken'); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('')); + } + + function testUninteresting() { + $parser = $this->createParser(); + $parser->expectOnce('acceptTextToken', array('', '*')); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('')); + } + + function testSkipCss() { + $parser = $this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testSkipJavaScript() { + $parser = $this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testSkipHtmlComments() { + $parser = $this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testTagWithNoAttributes() { + $parser = $this->createParser(); + $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('>', '*')); + $parser->expectCallCount('acceptStartToken', 2); + $parser->expectOnce('acceptTextToken', array('Hello', '*')); + $parser->expectOnce('acceptEndToken', array('', '*')); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('Hello')); + } + + function testTagWithAttributes() { + $parser = $this->createParser(); + $parser->expectOnce('acceptTextToken', array('label', '*')); + $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('href', '*')); + $parser->expectAt(2, 'acceptStartToken', array('>', '*')); + $parser->expectCallCount('acceptStartToken', 3); + $parser->expectAt(0, 'acceptAttributeToken', array('= "', '*')); + $parser->expectAt(1, 'acceptAttributeToken', array('here.html', '*')); + $parser->expectAt(2, 'acceptAttributeToken', array('"', '*')); + $parser->expectCallCount('acceptAttributeToken', 3); + $parser->expectOnce('acceptEndToken', array('
    ', '*')); + $lexer = new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('label')); + } +} + +class TestOfHtmlSaxParser extends UnitTestCase { + + function createListener() { + $listener = new MockSimplePhpPageBuilder(); + $listener->setReturnValue('startElement', true); + $listener->setReturnValue('addContent', true); + $listener->setReturnValue('endElement', true); + return $listener; + } + + function testFramesetTag() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('frameset', array())); + $listener->expectOnce('addContent', array('Frames')); + $listener->expectOnce('endElement', array('frameset')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('Frames')); + } + + function testTagWithUnquotedAttributes() { + $listener = $this->createListener(); + $listener->expectOnce( + 'startElement', + array('input', array('name' => 'a.b.c', 'value' => 'd'))); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testTagInsideContent() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('a', array())); + $listener->expectAt(0, 'addContent', array('')); + $listener->expectAt(1, 'addContent', array('')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testTagWithInternalContent() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('a', array())); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testLinkAddress() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('a', array('href' => 'here.html'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse("label")); + } + + function testEncodedAttribute() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('a', array('href' => 'here&there.html'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse("label")); + } + + function testTagWithId() { + $listener = $this->createListener(); + $listener->expectOnce('startElement', array('a', array('id' => '0'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testTagWithEmptyAttributes() { + $listener = $this->createListener(); + $listener->expectOnce( + 'startElement', + array('option', array('value' => '', 'selected' => ''))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('option')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testComplexTagWithLotsOfCaseVariations() { + $listener = $this->createListener(); + $listener->expectOnce( + 'startElement', + array('a', array('href' => 'here.html', 'style' => "'cool'"))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testXhtmlSelfClosingTag() { + $listener = $this->createListener(); + $listener->expectOnce( + 'startElement', + array('input', array('type' => 'submit', 'name' => 'N', 'value' => 'V'))); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testNestedFrameInFrameset() { + $listener = $this->createListener(); + $listener->expectAt(0, 'startElement', array('frameset', array())); + $listener->expectAt(1, 'startElement', array('frame', array('src' => 'frame.html'))); + $listener->expectCallCount('startElement', 2); + $listener->expectOnce('addContent', array('Hello')); + $listener->expectOnce('endElement', array('frameset')); + $parser = new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse( + 'Hello')); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/recorder_test.php b/3rdparty/simpletest/test/recorder_test.php new file mode 100755 index 00000000000..fdae4c1cccc --- /dev/null +++ b/3rdparty/simpletest/test/recorder_test.php @@ -0,0 +1,23 @@ +addFile(dirname(__FILE__) . '/support/recorder_sample.php'); + $recorder = new Recorder(new SimpleReporter()); + $test->run($recorder); + $this->assertEqual(count($recorder->results), 2); + $this->assertIsA($recorder->results[0], 'SimpleResultOfPass'); + $this->assertEqual('testTrueIsTrue', array_pop($recorder->results[0]->breadcrumb)); + $this->assertPattern('/ at \[.*\Wrecorder_sample\.php line 7\]/', $recorder->results[0]->message); + $this->assertIsA($recorder->results[1], 'SimpleResultOfFail'); + $this->assertEqual('testFalseIsTrue', array_pop($recorder->results[1]->breadcrumb)); + $this->assertPattern("/Expected false, got \[Boolean: true\] at \[.*\Wrecorder_sample\.php line 11\]/", + $recorder->results[1]->message); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/reflection_php5_test.php b/3rdparty/simpletest/test/reflection_php5_test.php new file mode 100755 index 00000000000..d9f46e6db78 --- /dev/null +++ b/3rdparty/simpletest/test/reflection_php5_test.php @@ -0,0 +1,263 @@ +assertTrue($reflection->classOrInterfaceExists()); + $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); + $this->assertFalse($reflection->isAbstract()); + $this->assertFalse($reflection->isInterface()); + } + + function testClassNonExistence() { + $reflection = new SimpleReflection('UnknownThing'); + $this->assertFalse($reflection->classOrInterfaceExists()); + $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload()); + } + + function testDetectionOfAbstractClass() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertTrue($reflection->isAbstract()); + } + + function testDetectionOfFinalMethods() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertFalse($reflection->hasFinal()); + $reflection = new SimpleReflection('AnyOldLeafClassWithAFinal'); + $this->assertTrue($reflection->hasFinal()); + } + + function testFindingParentClass() { + $reflection = new SimpleReflection('AnyOldSubclass'); + $this->assertEqual($reflection->getParent(), 'AnyOldImplementation'); + } + + function testInterfaceExistence() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertTrue($reflection->classOrInterfaceExists()); + $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); + $this->assertTrue($reflection->isInterface()); + } + + function testMethodsListFromClass() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testMethodsListFromInterface() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); + } + + function testMethodsComeFromDescendentInterfacesASWell() { + $reflection = new SimpleReflection('AnyDescendentInterface'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testCanSeparateInterfaceMethodsFromOthers() { + $reflection = new SimpleReflection('AnyOldImplementation'); + $this->assertIdentical($reflection->getMethods(), array('aMethod', 'extraMethod')); + $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); + } + + function testMethodsComeFromDescendentInterfacesInAbstractClass() { + $reflection = new SimpleReflection('AnyAbstractImplementation'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testInterfaceHasOnlyItselfToImplement() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testInterfacesListedForClass() { + $reflection = new SimpleReflection('AnyOldImplementation'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testInterfacesListedForSubclass() { + $reflection = new SimpleReflection('AnyOldSubclass'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testNoParameterCreationWhenNoInterface() { + $reflection = new SimpleReflection('AnyOldArgumentClass'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod($argument)', strtolower($function)); + } else { + $this->assertEqual('function aMethod($argument)', $function); + } + } + + function testParameterCreationWithoutTypeHinting() { + $reflection = new SimpleReflection('AnyOldArgumentImplementation'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); + } else { + $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); + } + } + + function testParameterCreationForTypeHinting() { + $reflection = new SimpleReflection('AnyOldTypeHintedClass'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); + } else { + $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); + } + } + + function testIssetFunctionSignature() { + $reflection = new SimpleReflection('AnyOldOverloadedClass'); + $function = $reflection->getSignature('__isset'); + $this->assertEqual('function __isset($key)', $function); + } + + function testUnsetFunctionSignature() { + $reflection = new SimpleReflection('AnyOldOverloadedClass'); + $function = $reflection->getSignature('__unset'); + $this->assertEqual('function __unset($key)', $function); + } + + function testProperlyReflectsTheFinalInterfaceWhenObjectImplementsAnExtendedInterface() { + $reflection = new SimpleReflection('AnyDescendentImplementation'); + $interfaces = $reflection->getInterfaces(); + $this->assertEqual(1, count($interfaces)); + $this->assertEqual('AnyDescendentInterface', array_shift($interfaces)); + } + + function testCreatingSignatureForAbstractMethod() { + $reflection = new SimpleReflection('AnotherOldAbstractClass'); + $this->assertEqual($reflection->getSignature('aMethod'), 'function aMethod(AnyOldInterface $argument)'); + } + + function testCanProperlyGenerateStaticMethodSignatures() { + $reflection = new SimpleReflection('AnyOldClassWithStaticMethods'); + $this->assertEqual('static function aStatic()', $reflection->getSignature('aStatic')); + $this->assertEqual( + 'static function aStaticWithParameters($arg1, $arg2)', + $reflection->getSignature('aStaticWithParameters') + ); + } +} + +class TestOfReflectionWithTypeHints extends UnitTestCase { + function skip() { + $this->skipIf(version_compare(phpversion(), '5.1.0', '<'), 'Reflection with type hints only tested for PHP 5.1.0 and above'); + } + + function testParameterCreationForTypeHintingWithArray() { + eval('interface AnyOldArrayTypeHintedInterface { + function amethod(array $argument); + } + class AnyOldArrayTypeHintedClass implements AnyOldArrayTypeHintedInterface { + function amethod(array $argument) {} + }'); + $reflection = new SimpleReflection('AnyOldArrayTypeHintedClass'); + $function = $reflection->getSignature('amethod'); + $this->assertEqual('function amethod(array $argument)', $function); + } +} + +class TestOfAbstractsWithAbstractMethods extends UnitTestCase { + function testCanProperlyGenerateAbstractMethods() { + $reflection = new SimpleReflection('AnyOldAbstractClassWithAbstractMethods'); + $this->assertEqual( + 'function anAbstract()', + $reflection->getSignature('anAbstract') + ); + $this->assertEqual( + 'function anAbstractWithParameter($foo)', + $reflection->getSignature('anAbstractWithParameter') + ); + $this->assertEqual( + 'function anAbstractWithMultipleParameters($foo, $bar)', + $reflection->getSignature('anAbstractWithMultipleParameters') + ); + } +} + +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/remote_test.php b/3rdparty/simpletest/test/remote_test.php new file mode 100755 index 00000000000..5f3f96a4de9 --- /dev/null +++ b/3rdparty/simpletest/test/remote_test.php @@ -0,0 +1,19 @@ +add(new RemoteTestCase($test_url . '?xml=yes', $test_url . '?xml=yes&dry=yes')); +if (SimpleReporter::inCli()) { + exit ($test->run(new TextReporter()) ? 0 : 1); +} +$test->run(new HtmlReporter()); diff --git a/3rdparty/simpletest/test/shell_test.php b/3rdparty/simpletest/test/shell_test.php new file mode 100755 index 00000000000..d1d769a6795 --- /dev/null +++ b/3rdparty/simpletest/test/shell_test.php @@ -0,0 +1,38 @@ +assertIdentical($shell->execute('echo Hello'), 0); + $this->assertPattern('/Hello/', $shell->getOutput()); + } + + function testBadCommand() { + $shell = new SimpleShell(); + $this->assertNotEqual($ret = $shell->execute('blurgh! 2>&1'), 0); + } +} + +class TestOfShellTesterAndShell extends ShellTestCase { + + function testEcho() { + $this->assertTrue($this->execute('echo Hello')); + $this->assertExitCode(0); + $this->assertoutput('Hello'); + } + + function testFileExistence() { + $this->assertFileExists(dirname(__FILE__) . '/all_tests.php'); + $this->assertFileNotExists('wibble'); + } + + function testFilePatterns() { + $this->assertFilePattern('/all[_ ]tests/i', dirname(__FILE__) . '/all_tests.php'); + $this->assertNoFilePattern('/sputnik/i', dirname(__FILE__) . '/all_tests.php'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/shell_tester_test.php b/3rdparty/simpletest/test/shell_tester_test.php new file mode 100755 index 00000000000..b12c602a39f --- /dev/null +++ b/3rdparty/simpletest/test/shell_tester_test.php @@ -0,0 +1,42 @@ +mock_shell; + } + + function testGenericEquality() { + $this->assertEqual('a', 'a'); + $this->assertNotEqual('a', 'A'); + } + + function testExitCode() { + $this->mock_shell = new MockSimpleShell(); + $this->mock_shell->setReturnValue('execute', 0); + $this->mock_shell->expectOnce('execute', array('ls')); + $this->assertTrue($this->execute('ls')); + $this->assertExitCode(0); + } + + function testOutput() { + $this->mock_shell = new MockSimpleShell(); + $this->mock_shell->setReturnValue('execute', 0); + $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); + $this->assertOutput("Line 1\nLine 2\n"); + } + + function testOutputPatterns() { + $this->mock_shell = new MockSimpleShell(); + $this->mock_shell->setReturnValue('execute', 0); + $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); + $this->assertOutputPattern('/line/i'); + $this->assertNoOutputPattern('/line 2/'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/simpletest_test.php b/3rdparty/simpletest/test/simpletest_test.php new file mode 100755 index 00000000000..daa65c6f472 --- /dev/null +++ b/3rdparty/simpletest/test/simpletest_test.php @@ -0,0 +1,58 @@ +fail('Should be ignored'); + } +} + +class ShouldNeverBeRunEither extends ShouldNeverBeRun { } + +class TestOfStackTrace extends UnitTestCase { + + function testCanFindAssertInTrace() { + $trace = new SimpleStackTrace(array('assert')); + $this->assertEqual( + $trace->traceMethod(array(array( + 'file' => '/my_test.php', + 'line' => 24, + 'function' => 'assertSomething'))), + ' at [/my_test.php line 24]'); + } +} + +class DummyResource { } + +class TestOfContext extends UnitTestCase { + + function testCurrentContextIsUnique() { + $this->assertSame( + SimpleTest::getContext(), + SimpleTest::getContext()); + } + + function testContextHoldsCurrentTestCase() { + $context = SimpleTest::getContext(); + $this->assertSame($this, $context->getTest()); + } + + function testResourceIsSingleInstanceWithContext() { + $context = new SimpleTestContext(); + $this->assertSame( + $context->get('DummyResource'), + $context->get('DummyResource')); + } + + function testClearingContextResetsResources() { + $context = new SimpleTestContext(); + $resource = $context->get('DummyResource'); + $context->clear(); + $this->assertClone($resource, $context->get('DummyResource')); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/site/file.html b/3rdparty/simpletest/test/site/file.html new file mode 100755 index 00000000000..cc41aee1b8b --- /dev/null +++ b/3rdparty/simpletest/test/site/file.html @@ -0,0 +1,6 @@ + + Link to SimpleTest + + Link to SimpleTest + + \ No newline at end of file diff --git a/3rdparty/simpletest/test/socket_test.php b/3rdparty/simpletest/test/socket_test.php new file mode 100755 index 00000000000..729adda4960 --- /dev/null +++ b/3rdparty/simpletest/test/socket_test.php @@ -0,0 +1,25 @@ +assertFalse($error->isError()); + $error->setError('Ouch'); + $this->assertTrue($error->isError()); + $this->assertEqual($error->getError(), 'Ouch'); + } + + function testClearingError() { + $error = new SimpleStickyError(); + $error->setError('Ouch'); + $this->assertTrue($error->isError()); + $error->clearError(); + $this->assertFalse($error->isError()); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/collector/collectable.1 b/3rdparty/simpletest/test/support/collector/collectable.1 new file mode 100755 index 00000000000..e69de29bb2d diff --git a/3rdparty/simpletest/test/support/collector/collectable.2 b/3rdparty/simpletest/test/support/collector/collectable.2 new file mode 100755 index 00000000000..e69de29bb2d diff --git a/3rdparty/simpletest/test/support/empty_test_file.php b/3rdparty/simpletest/test/support/empty_test_file.php new file mode 100755 index 00000000000..31e3f7bed62 --- /dev/null +++ b/3rdparty/simpletest/test/support/empty_test_file.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/failing_test.php b/3rdparty/simpletest/test/support/failing_test.php new file mode 100755 index 00000000000..30f0d7507d9 --- /dev/null +++ b/3rdparty/simpletest/test/support/failing_test.php @@ -0,0 +1,9 @@ +assertEqual(1,2); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/latin1_sample b/3rdparty/simpletest/test/support/latin1_sample new file mode 100755 index 00000000000..19035257766 --- /dev/null +++ b/3rdparty/simpletest/test/support/latin1_sample @@ -0,0 +1 @@ +£¹²³¼½¾@¶øþðßæ«»¢µ \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/passing_test.php b/3rdparty/simpletest/test/support/passing_test.php new file mode 100755 index 00000000000..b7863216353 --- /dev/null +++ b/3rdparty/simpletest/test/support/passing_test.php @@ -0,0 +1,9 @@ +assertEqual(2,2); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/recorder_sample.php b/3rdparty/simpletest/test/support/recorder_sample.php new file mode 100755 index 00000000000..4f157f6b601 --- /dev/null +++ b/3rdparty/simpletest/test/support/recorder_sample.php @@ -0,0 +1,14 @@ +assertTrue(true); + } + + function testFalseIsTrue() { + $this->assertFalse(true); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/spl_examples.php b/3rdparty/simpletest/test/support/spl_examples.php new file mode 100755 index 00000000000..45add356c44 --- /dev/null +++ b/3rdparty/simpletest/test/support/spl_examples.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/supplementary_upload_sample.txt b/3rdparty/simpletest/test/support/supplementary_upload_sample.txt new file mode 100755 index 00000000000..d8aa9e81013 --- /dev/null +++ b/3rdparty/simpletest/test/support/supplementary_upload_sample.txt @@ -0,0 +1 @@ +Some more text content \ No newline at end of file diff --git a/3rdparty/simpletest/test/support/test1.php b/3rdparty/simpletest/test/support/test1.php new file mode 100755 index 00000000000..b414586d642 --- /dev/null +++ b/3rdparty/simpletest/test/support/test1.php @@ -0,0 +1,7 @@ +assertEqual(3,1+2, "pass1"); + } +} +?> diff --git a/3rdparty/simpletest/test/support/upload_sample.txt b/3rdparty/simpletest/test/support/upload_sample.txt new file mode 100755 index 00000000000..ec98d7c5e3f --- /dev/null +++ b/3rdparty/simpletest/test/support/upload_sample.txt @@ -0,0 +1 @@ +Sample for testing file upload \ No newline at end of file diff --git a/3rdparty/simpletest/test/tag_test.php b/3rdparty/simpletest/test/tag_test.php new file mode 100755 index 00000000000..5e8a377f089 --- /dev/null +++ b/3rdparty/simpletest/test/tag_test.php @@ -0,0 +1,554 @@ + '1', 'b' => '')); + $this->assertEqual($tag->getTagName(), 'title'); + $this->assertIdentical($tag->getAttribute('a'), '1'); + $this->assertIdentical($tag->getAttribute('b'), ''); + $this->assertIdentical($tag->getAttribute('c'), false); + $this->assertIdentical($tag->getContent(), ''); + } + + function testTitleContent() { + $tag = new SimpleTitleTag(array()); + $this->assertTrue($tag->expectEndTag()); + $tag->addContent('Hello'); + $tag->addContent('World'); + $this->assertEqual($tag->getText(), 'HelloWorld'); + } + + function testMessyTitleContent() { + $tag = new SimpleTitleTag(array()); + $this->assertTrue($tag->expectEndTag()); + $tag->addContent('Hello'); + $tag->addContent('World'); + $this->assertEqual($tag->getText(), 'HelloWorld'); + } + + function testTagWithNoEnd() { + $tag = new SimpleTextTag(array()); + $this->assertFalse($tag->expectEndTag()); + } + + function testAnchorHref() { + $tag = new SimpleAnchorTag(array('href' => 'http://here/')); + $this->assertEqual($tag->getHref(), 'http://here/'); + + $tag = new SimpleAnchorTag(array('href' => '')); + $this->assertIdentical($tag->getAttribute('href'), ''); + $this->assertIdentical($tag->getHref(), ''); + + $tag = new SimpleAnchorTag(array()); + $this->assertIdentical($tag->getAttribute('href'), false); + $this->assertIdentical($tag->getHref(), ''); + } + + function testIsIdMatchesIdAttribute() { + $tag = new SimpleAnchorTag(array('href' => 'http://here/', 'id' => 7)); + $this->assertIdentical($tag->getAttribute('id'), '7'); + $this->assertTrue($tag->isId(7)); + } +} + +class TestOfWidget extends UnitTestCase { + + function testTextEmptyDefault() { + $tag = new SimpleTextTag(array('type' => 'text')); + $this->assertIdentical($tag->getDefault(), ''); + $this->assertIdentical($tag->getValue(), ''); + } + + function testSettingOfExternalLabel() { + $tag = new SimpleTextTag(array('type' => 'text')); + $tag->setLabel('it'); + $this->assertTrue($tag->isLabel('it')); + } + + function testTextDefault() { + $tag = new SimpleTextTag(array('value' => 'aaa')); + $this->assertEqual($tag->getDefault(), 'aaa'); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testSettingTextValue() { + $tag = new SimpleTextTag(array('value' => 'aaa')); + $tag->setValue('bbb'); + $this->assertEqual($tag->getValue(), 'bbb'); + $tag->resetValue(); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testFailToSetHiddenValue() { + $tag = new SimpleTextTag(array('value' => 'aaa', 'type' => 'hidden')); + $this->assertFalse($tag->setValue('bbb')); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testSubmitDefaults() { + $tag = new SimpleSubmitTag(array('type' => 'submit')); + $this->assertIdentical($tag->getName(), false); + $this->assertEqual($tag->getValue(), 'Submit'); + $this->assertFalse($tag->setValue('Cannot set this')); + $this->assertEqual($tag->getValue(), 'Submit'); + $this->assertEqual($tag->getLabel(), 'Submit'); + + $encoding = new MockSimpleMultipartEncoding(); + $encoding->expectNever('add'); + $tag->write($encoding); + } + + function testPopulatedSubmit() { + $tag = new SimpleSubmitTag( + array('type' => 'submit', 'name' => 's', 'value' => 'Ok!')); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getValue(), 'Ok!'); + $this->assertEqual($tag->getLabel(), 'Ok!'); + + $encoding = new MockSimpleMultipartEncoding(); + $encoding->expectOnce('add', array('s', 'Ok!')); + $tag->write($encoding); + } + + function testImageSubmit() { + $tag = new SimpleImageSubmitTag( + array('type' => 'image', 'name' => 's', 'alt' => 'Label')); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getLabel(), 'Label'); + + $encoding = new MockSimpleMultipartEncoding(); + $encoding->expectAt(0, 'add', array('s.x', 20)); + $encoding->expectAt(1, 'add', array('s.y', 30)); + $tag->write($encoding, 20, 30); + } + + function testImageSubmitTitlePreferredOverAltForLabel() { + $tag = new SimpleImageSubmitTag( + array('type' => 'image', 'name' => 's', 'alt' => 'Label', 'title' => 'Title')); + $this->assertEqual($tag->getLabel(), 'Title'); + } + + function testButton() { + $tag = new SimpleButtonTag( + array('type' => 'submit', 'name' => 's', 'value' => 'do')); + $tag->addContent('I am a button'); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getValue(), 'do'); + $this->assertEqual($tag->getLabel(), 'I am a button'); + + $encoding = new MockSimpleMultipartEncoding(); + $encoding->expectOnce('add', array('s', 'do')); + $tag->write($encoding); + } +} + +class TestOfTextArea extends UnitTestCase { + + function testDefault() { + $tag = new SimpleTextAreaTag(array('name' => 'a')); + $tag->addContent('Some text'); + $this->assertEqual($tag->getName(), 'a'); + $this->assertEqual($tag->getDefault(), 'Some text'); + } + + function testWrapping() { + $tag = new SimpleTextAreaTag(array('cols' => '10', 'wrap' => 'physical')); + $tag->addContent("Lot's of text that should be wrapped"); + $this->assertEqual( + $tag->getDefault(), + "Lot's of\r\ntext that\r\nshould be\r\nwrapped"); + $tag->setValue("New long text\r\nwith two lines"); + $this->assertEqual( + $tag->getValue(), + "New long\r\ntext\r\nwith two\r\nlines"); + } + + function testWrappingRemovesLeadingcariageReturn() { + $tag = new SimpleTextAreaTag(array('cols' => '20', 'wrap' => 'physical')); + $tag->addContent("\rStuff"); + $this->assertEqual($tag->getDefault(), 'Stuff'); + $tag->setValue("\nNew stuff\n"); + $this->assertEqual($tag->getValue(), "New stuff\r\n"); + } + + function testBreaksAreNewlineAndCarriageReturn() { + $tag = new SimpleTextAreaTag(array('cols' => '10')); + $tag->addContent("Some\nText\rwith\r\nbreaks"); + $this->assertEqual($tag->getValue(), "Some\r\nText\r\nwith\r\nbreaks"); + } +} + +class TestOfCheckbox extends UnitTestCase { + + function testCanSetCheckboxToNamedValueWithBooleanTrue() { + $tag = new SimpleCheckboxTag(array('name' => 'a', 'value' => 'A')); + $this->assertEqual($tag->getValue(), false); + $tag->setValue(true); + $this->assertIdentical($tag->getValue(), 'A'); + } +} + +class TestOfSelection extends UnitTestCase { + + function testEmpty() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $this->assertIdentical($tag->getValue(), ''); + } + + function testSingle() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $option = new SimpleOptionTag(array()); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSingleDefault() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $option = new SimpleOptionTag(array('selected' => '')); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSingleMappedDefault() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $option = new SimpleOptionTag(array('selected' => '', 'value' => 'aaa')); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testStartsWithDefault() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertEqual($tag->getValue(), 'BBB'); + } + + function testSettingOption() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSettingMappedOption() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array('value' => 'aaa')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('value' => 'bbb', 'selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = new SimpleOptionTag(array('value' => 'ccc')); + $c->addContent('CCC'); + $tag->addTag($c); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), 'aaa'); + $tag->setValue('ccc'); + $this->assertEqual($tag->getValue(), 'ccc'); + } + + function testSelectionDespiteSpuriousWhitespace() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array()); + $a->addContent(' AAA '); + $tag->addTag($a); + $b = new SimpleOptionTag(array('selected' => '')); + $b->addContent(' BBB '); + $tag->addTag($b); + $c = new SimpleOptionTag(array()); + $c->addContent(' CCC '); + $tag->addTag($c); + $this->assertEqual($tag->getValue(), ' BBB '); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), ' AAA '); + } + + function testFailToSetIllegalOption() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertFalse($tag->setValue('Not present')); + $this->assertEqual($tag->getValue(), 'BBB'); + } + + function testNastyOptionValuesThatLookLikeFalse() { + $tag = new SimpleSelectionTag(array('name' => 'a')); + $a = new SimpleOptionTag(array('value' => '1')); + $a->addContent('One'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('value' => '0')); + $b->addContent('Zero'); + $tag->addTag($b); + $this->assertIdentical($tag->getValue(), '1'); + $tag->setValue('Zero'); + $this->assertIdentical($tag->getValue(), '0'); + } + + function testBlankOption() { + $tag = new SimpleSelectionTag(array('name' => 'A')); + $a = new SimpleOptionTag(array()); + $tag->addTag($a); + $b = new SimpleOptionTag(array()); + $b->addContent('b'); + $tag->addTag($b); + $this->assertIdentical($tag->getValue(), ''); + $tag->setValue('b'); + $this->assertIdentical($tag->getValue(), 'b'); + $tag->setValue(''); + $this->assertIdentical($tag->getValue(), ''); + } + + function testMultipleDefaultWithNoSelections() { + $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertIdentical($tag->getDefault(), array()); + $this->assertIdentical($tag->getValue(), array()); + } + + function testMultipleDefaultWithSelections() { + $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertIdentical($tag->getDefault(), array('AAA', 'BBB')); + $this->assertIdentical($tag->getValue(), array('AAA', 'BBB')); + } + + function testSettingMultiple() { + $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $c = new SimpleOptionTag(array('selected' => '', 'value' => 'ccc')); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertIdentical($tag->getDefault(), array('AAA', 'ccc')); + $this->assertTrue($tag->setValue(array('BBB', 'ccc'))); + $this->assertIdentical($tag->getValue(), array('BBB', 'ccc')); + $this->assertTrue($tag->setValue(array())); + $this->assertIdentical($tag->getValue(), array()); + } + + function testFailToSetIllegalOptionsInMultiple() { + $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertFalse($tag->setValue(array('CCC'))); + $this->assertTrue($tag->setValue(array('AAA', 'BBB'))); + $this->assertFalse($tag->setValue(array('AAA', 'CCC'))); + } +} + +class TestOfRadioGroup extends UnitTestCase { + + function testEmptyGroup() { + $group = new SimpleRadioGroup(); + $this->assertIdentical($group->getDefault(), false); + $this->assertIdentical($group->getValue(), false); + $this->assertFalse($group->setValue('a')); + } + + function testReadingSingleButtonGroup() { + $group = new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'A'); + $this->assertIdentical($group->getValue(), 'A'); + } + + function testReadingMultipleButtonGroup() { + $group = new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'B'); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testFailToSetUnlistedValue() { + $group = new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag(array('value' => 'z'))); + $this->assertFalse($group->setValue('a')); + $this->assertIdentical($group->getValue(), false); + } + + function testSettingNewValueClearsTheOldOne() { + $group = new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'checked' => ''))); + $this->assertTrue($group->setValue('A')); + $this->assertIdentical($group->getValue(), 'A'); + } + + function testIsIdMatchesAnyWidgetInSet() { + $group = new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A', 'id' => 'i1'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'id' => 'i2'))); + $this->assertFalse($group->isId('i0')); + $this->assertTrue($group->isId('i1')); + $this->assertTrue($group->isId('i2')); + } + + function testIsLabelMatchesAnyWidgetInSet() { + $group = new SimpleRadioGroup(); + $button1 = new SimpleRadioButtonTag(array('value' => 'A')); + $button1->setLabel('one'); + $group->addWidget($button1); + $button2 = new SimpleRadioButtonTag(array('value' => 'B')); + $button2->setLabel('two'); + $group->addWidget($button2); + $this->assertFalse($group->isLabel('three')); + $this->assertTrue($group->isLabel('one')); + $this->assertTrue($group->isLabel('two')); + } +} + +class TestOfTagGroup extends UnitTestCase { + + function testReadingMultipleCheckboxGroup() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'B'); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testReadingMultipleUncheckedItems() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertIdentical($group->getDefault(), false); + $this->assertIdentical($group->getValue(), false); + } + + function testReadingMultipleCheckedItems() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'A', 'checked' => ''))); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), array('A', 'B')); + $this->assertIdentical($group->getValue(), array('A', 'B')); + } + + function testSettingSingleValue() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue('A')); + $this->assertIdentical($group->getValue(), 'A'); + $this->assertTrue($group->setValue('B')); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testSettingMultipleValues() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue(array('A', 'B'))); + $this->assertIdentical($group->getValue(), array('A', 'B')); + } + + function testSettingNoValue() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue(false)); + $this->assertIdentical($group->getValue(), false); + } + + function testIsIdMatchesAnyIdInSet() { + $group = new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('id' => 1, 'value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('id' => 2, 'value' => 'B'))); + $this->assertFalse($group->isId(0)); + $this->assertTrue($group->isId(1)); + $this->assertTrue($group->isId(2)); + } +} + +class TestOfUploadWidget extends UnitTestCase { + + function testValueIsFilePath() { + $upload = new SimpleUploadTag(array('name' => 'a')); + $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); + $this->assertEqual($upload->getValue(), dirname(__FILE__) . '/support/upload_sample.txt'); + } + + function testSubmitsFileContents() { + $encoding = new MockSimpleMultipartEncoding(); + $encoding->expectOnce('attach', array( + 'a', + 'Sample for testing file upload', + 'upload_sample.txt')); + $upload = new SimpleUploadTag(array('name' => 'a')); + $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); + $upload->write($encoding); + } +} + +class TestOfLabelTag extends UnitTestCase { + + function testLabelShouldHaveAnEndTag() { + $label = new SimpleLabelTag(array()); + $this->assertTrue($label->expectEndTag()); + } + + function testContentIsTextOnly() { + $label = new SimpleLabelTag(array()); + $label->addContent('Here are words'); + $this->assertEqual($label->getText(), 'Here are words'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/test_with_parse_error.php b/3rdparty/simpletest/test/test_with_parse_error.php new file mode 100755 index 00000000000..41a5832a5cb --- /dev/null +++ b/3rdparty/simpletest/test/test_with_parse_error.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/test/unit_tester_test.php b/3rdparty/simpletest/test/unit_tester_test.php new file mode 100755 index 00000000000..ce9850f09ab --- /dev/null +++ b/3rdparty/simpletest/test/unit_tester_test.php @@ -0,0 +1,61 @@ +assertTrue($this->assertTrue(true)); + } + + function testAssertFalseReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertFalse(false)); + } + + function testAssertEqualReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertEqual(5, 5)); + } + + function testAssertIdenticalReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertIdentical(5, 5)); + } + + function testCoreAssertionsDoNotThrowErrors() { + $this->assertIsA($this, 'UnitTestCase'); + $this->assertNotA($this, 'WebTestCase'); + } + + function testReferenceAssertionOnObjects() { + $a = new ReferenceForTesting(); + $b = $a; + $this->assertSame($a, $b); + } + + function testReferenceAssertionOnScalars() { + $a = 25; + $b = &$a; + $this->assertReference($a, $b); + } + + function testCloneOnObjects() { + $a = new ReferenceForTesting(); + $b = new ReferenceForTesting(); + $this->assertClone($a, $b); + } + + function TODO_testCloneOnScalars() { + $a = 25; + $b = 25; + $this->assertClone($a, $b); + } + + function testCopyOnScalars() { + $a = 25; + $b = 25; + $this->assertCopy($a, $b); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/unit_tests.php b/3rdparty/simpletest/test/unit_tests.php new file mode 100755 index 00000000000..9e621293f9e --- /dev/null +++ b/3rdparty/simpletest/test/unit_tests.php @@ -0,0 +1,49 @@ +TestSuite('Unit tests'); + $path = dirname(__FILE__); + $this->addFile($path . '/errors_test.php'); + $this->addFile($path . '/exceptions_test.php'); + $this->addFile($path . '/arguments_test.php'); + $this->addFile($path . '/autorun_test.php'); + $this->addFile($path . '/compatibility_test.php'); + $this->addFile($path . '/simpletest_test.php'); + $this->addFile($path . '/dumper_test.php'); + $this->addFile($path . '/expectation_test.php'); + $this->addFile($path . '/unit_tester_test.php'); + $this->addFile($path . '/reflection_php5_test.php'); + $this->addFile($path . '/mock_objects_test.php'); + $this->addFile($path . '/interfaces_test.php'); + $this->addFile($path . '/collector_test.php'); + $this->addFile($path . '/recorder_test.php'); + $this->addFile($path . '/adapter_test.php'); + $this->addFile($path . '/socket_test.php'); + $this->addFile($path . '/encoding_test.php'); + $this->addFile($path . '/url_test.php'); + $this->addFile($path . '/cookies_test.php'); + $this->addFile($path . '/http_test.php'); + $this->addFile($path . '/authentication_test.php'); + $this->addFile($path . '/user_agent_test.php'); + $this->addFile($path . '/php_parser_test.php'); + $this->addFile($path . '/parsing_test.php'); + $this->addFile($path . '/tag_test.php'); + $this->addFile($path . '/form_test.php'); + $this->addFile($path . '/page_test.php'); + $this->addFile($path . '/frames_test.php'); + $this->addFile($path . '/browser_test.php'); + $this->addFile($path . '/web_tester_test.php'); + $this->addFile($path . '/shell_tester_test.php'); + $this->addFile($path . '/xml_test.php'); + $this->addFile($path . '/../extensions/testdox/test.php'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/url_test.php b/3rdparty/simpletest/test/url_test.php new file mode 100755 index 00000000000..80119afbdde --- /dev/null +++ b/3rdparty/simpletest/test/url_test.php @@ -0,0 +1,515 @@ +assertEqual($url->getScheme(), ''); + $this->assertEqual($url->getHost(), ''); + $this->assertEqual($url->getScheme('http'), 'http'); + $this->assertEqual($url->getHost('localhost'), 'localhost'); + $this->assertEqual($url->getPath(), ''); + } + + function testBasicParsing() { + $url = new SimpleUrl('https://www.lastcraft.com/test/'); + $this->assertEqual($url->getScheme(), 'https'); + $this->assertEqual($url->getHost(), 'www.lastcraft.com'); + $this->assertEqual($url->getPath(), '/test/'); + } + + function testRelativeUrls() { + $url = new SimpleUrl('../somewhere.php'); + $this->assertEqual($url->getScheme(), false); + $this->assertEqual($url->getHost(), false); + $this->assertEqual($url->getPath(), '../somewhere.php'); + } + + function testParseBareParameter() { + $url = new SimpleUrl('?a'); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); + } + + function testParseEmptyParameter() { + $url = new SimpleUrl('?a='); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a='); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); + } + + function testParseParameterPair() { + $url = new SimpleUrl('?a=A'); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a=A'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X'); + } + + function testParseMultipleParameters() { + $url = new SimpleUrl('?a=A&b=B'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X'); + } + + function testParsingParameterMixture() { + $url = new SimpleUrl('?a=A&b=&c'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X'); + } + + function testAddParametersFromScratch() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', 'A'); + $this->assertEqual($url->getEncodedRequest(), '?a=A'); + $url->addRequestParameter('b', 'B'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); + $url->addRequestParameter('a', 'aaa'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa'); + } + + function testClearingParameters() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', 'A'); + $url->clearRequest(); + $this->assertIdentical($url->getEncodedRequest(), ''); + } + + function testEncodingParameters() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|$%^&*()_+-='); + $this->assertIdentical( + $request = $url->getEncodedRequest(), + '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D'); + } + + function testDecodingParameters() { + $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D'); + $this->assertEqual( + $url->getEncodedRequest(), + '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|$%^&*()_+-=')); + } + + function testUrlInQueryDoesNotConfuseParsing() { + $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/'); + $this->assertFalse($url->getScheme()); + $this->assertFalse($url->getHost()); + $this->assertEqual($url->getPath(), 'wibble/login.php'); + $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/'); + } + + function testSettingCordinates() { + $url = new SimpleUrl(''); + $url->setCoordinates('32', '45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + $this->assertEqual($url->getEncodedRequest(), ''); + } + + function testParseCordinates() { + $url = new SimpleUrl('?32,45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + } + + function testClearingCordinates() { + $url = new SimpleUrl('?32,45'); + $url->setCoordinates(); + $this->assertIdentical($url->getX(), false); + $this->assertIdentical($url->getY(), false); + } + + function testParsingParameterCordinateMixture() { + $url = new SimpleUrl('?a=A&b=&c?32,45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); + } + + function testParsingParameterWithBadCordinates() { + $url = new SimpleUrl('?a=A&b=&c?32'); + $this->assertIdentical($url->getX(), false); + $this->assertIdentical($url->getY(), false); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32'); + } + + function testPageSplitting() { + $url = new SimpleUrl('./here/../there/somewhere.php'); + $this->assertEqual($url->getPath(), './here/../there/somewhere.php'); + $this->assertEqual($url->getPage(), 'somewhere.php'); + $this->assertEqual($url->getBasePath(), './here/../there/'); + } + + function testAbsolutePathPageSplitting() { + $url = new SimpleUrl("http://host.com/here/there/somewhere.php"); + $this->assertEqual($url->getPath(), "/here/there/somewhere.php"); + $this->assertEqual($url->getPage(), "somewhere.php"); + $this->assertEqual($url->getBasePath(), "/here/there/"); + } + + function testSplittingUrlWithNoPageGivesEmptyPage() { + $url = new SimpleUrl('/here/there/'); + $this->assertEqual($url->getPath(), '/here/there/'); + $this->assertEqual($url->getPage(), ''); + $this->assertEqual($url->getBasePath(), '/here/there/'); + } + + function testPathNormalisation() { + $url = new SimpleUrl(); + $this->assertEqual( + $url->normalisePath('https://host.com/I/am/here/../there/somewhere.php'), + 'https://host.com/I/am/there/somewhere.php'); + } + + // regression test for #1535407 + function testPathNormalisationWithSinglePeriod() { + $url = new SimpleUrl(); + $this->assertEqual( + $url->normalisePath('https://host.com/I/am/here/./../there/somewhere.php'), + 'https://host.com/I/am/there/somewhere.php'); + } + + // regression test for #1852413 + function testHostnameExtractedFromUContainingAtSign() { + $url = new SimpleUrl("http://localhost/name@example.com"); + $this->assertEqual($url->getScheme(), "http"); + $this->assertEqual($url->getUsername(), ""); + $this->assertEqual($url->getPassword(), ""); + $this->assertEqual($url->getHost(), "localhost"); + $this->assertEqual($url->getPath(), "/name@example.com"); + } + + function testHostnameInLocalhost() { + $url = new SimpleUrl("http://localhost/name/example.com"); + $this->assertEqual($url->getScheme(), "http"); + $this->assertEqual($url->getUsername(), ""); + $this->assertEqual($url->getPassword(), ""); + $this->assertEqual($url->getHost(), "localhost"); + $this->assertEqual($url->getPath(), "/name/example.com"); + } + + function testUsernameAndPasswordAreUrlDecoded() { + $url = new SimpleUrl('http://' . urlencode('test@test') . + ':' . urlencode('$!�@*&%') . '@www.lastcraft.com'); + $this->assertEqual($url->getUsername(), 'test@test'); + $this->assertEqual($url->getPassword(), '$!�@*&%'); + } + + function testBlitz() { + $this->assertUrl( + "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor", + array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"), + array("a" => "1", "b" => "2")); + $this->assertUrl( + "username:password@www.somewhere.com/this/that/here.php?a=1", + array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false), + array("a" => "1")); + $this->assertUrl( + "username:password@somewhere.com:243?1,2", + array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false), + array(), + array(1, 2)); + $this->assertUrl( + "https://www.somewhere.com", + array("https", false, false, "www.somewhere.com", false, "/", "com", "", false)); + $this->assertUrl( + "username@www.somewhere.com:243#anchor", + array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor")); + $this->assertUrl( + "/this/that/here.php?a=1&b=2?3,4", + array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false), + array("a" => "1", "b" => "2"), + array(3, 4)); + $this->assertUrl( + "username@/here.php?a=1&b=2", + array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false), + array("a" => "1", "b" => "2")); + } + + function testAmbiguousHosts() { + $this->assertUrl( + "tigger", + array(false, false, false, false, false, "tigger", false, "", false)); + $this->assertUrl( + "/tigger", + array(false, false, false, false, false, "/tigger", false, "", false)); + $this->assertUrl( + "//tigger", + array(false, false, false, "tigger", false, "/", false, "", false)); + $this->assertUrl( + "//tigger/", + array(false, false, false, "tigger", false, "/", false, "", false)); + $this->assertUrl( + "tigger.com", + array(false, false, false, "tigger.com", false, "/", "com", "", false)); + $this->assertUrl( + "me.net/tigger", + array(false, false, false, "me.net", false, "/tigger", "net", "", false)); + } + + function testAsString() { + $this->assertPreserved('https://www.here.com'); + $this->assertPreserved('http://me:secret@www.here.com'); + $this->assertPreserved('http://here/there'); + $this->assertPreserved('http://here/there?a=A&b=B'); + $this->assertPreserved('http://here/there?a=1&a=2'); + $this->assertPreserved('http://here/there?a=1&a=2?9,8'); + $this->assertPreserved('http://host?a=1&a=2'); + $this->assertPreserved('http://host#stuff'); + $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6'); + $this->assertPreserved('http://www.here.com/?a=A__b=B'); + $this->assertPreserved('http://www.example.com:8080/'); + } + + function testUrlWithTwoSlashesInPath() { + $url = new SimpleUrl('/article/categoryedit/insert//'); + $this->assertEqual($url->getPath(), '/article/categoryedit/insert//'); + } + + function testUrlWithRequestKeyEncoded() { + $url = new SimpleUrl('/?foo%5B1%5D=bar'); + $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar'); + $url->addRequestParameter('a[1]', 'b[]'); + $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar&a%5B1%5D=b%5B%5D'); + + $url = new SimpleUrl('/'); + $url->addRequestParameter('a[1]', 'b[]'); + $this->assertEqual($url->getEncodedRequest(), '?a%5B1%5D=b%5B%5D'); + } + + function testUrlWithRequestKeyEncodedAndParamNamLookingLikePair() { + $url = new SimpleUrl('/'); + $url->addRequestParameter('foo[]=bar', ''); + $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar='); + $url = new SimpleUrl('/?foo%5B%5D%3Dbar='); + $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar='); + } + + function assertUrl($raw, $parts, $params = false, $coords = false) { + if (! is_array($params)) { + $params = array(); + } + $url = new SimpleUrl($raw); + $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s"); + $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s"); + $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s"); + $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s"); + $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s"); + $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s"); + $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s"); + $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s"); + $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s"); + if ($coords) { + $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s"); + $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s"); + } + } + + function assertPreserved($string) { + $url = new SimpleUrl($string); + $this->assertEqual($url->asString(), $string); + } +} + +class TestOfAbsoluteUrls extends UnitTestCase { + + function testDirectoriesAfterFilename() { + $string = '../../index.php/foo/bar'; + $url = new SimpleUrl($string); + $this->assertEqual($url->asString(), $string); + + $absolute = $url->makeAbsolute('http://www.domain.com/some/path/'); + $this->assertEqual($absolute->asString(), 'http://www.domain.com/index.php/foo/bar'); + } + + function testMakingAbsolute() { + $url = new SimpleUrl('../there/somewhere.php'); + $this->assertEqual($url->getPath(), '../there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'https'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPort(), 1234); + $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php'); + } + + function testMakingAnEmptyUrlAbsolute() { + $url = new SimpleUrl(''); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/page.html'); + } + + function testMakingAnEmptyUrlAbsoluteWithMissingPageName() { + $url = new SimpleUrl(''); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + } + + function testMakingAShortQueryUrlAbsolute() { + $url = new SimpleUrl('?a#b'); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + $this->assertEqual($absolute->getEncodedRequest(), '?a'); + $this->assertEqual($absolute->getFragment(), 'b'); + } + + function testMakingADirectoryUrlAbsolute() { + $url = new SimpleUrl('hello/'); + $this->assertEqual($url->getPath(), 'hello/'); + $this->assertEqual($url->getBasePath(), 'hello/'); + $this->assertEqual($url->getPage(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/I/am/here/hello/'); + } + + function testMakingARootUrlAbsolute() { + $url = new SimpleUrl('/'); + $this->assertEqual($url->getPath(), '/'); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/'); + } + + function testMakingARootPageUrlAbsolute() { + $url = new SimpleUrl('/here.html'); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/here.html'); + } + + function testCarryAuthenticationFromRootPage() { + $url = new SimpleUrl('here.html'); + $absolute = $url->makeAbsolute('http://test:secret@host.com/'); + $this->assertEqual($absolute->getPath(), '/here.html'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + } + + function testMakingCoordinateUrlAbsolute() { + $url = new SimpleUrl('?1,2'); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + $this->assertEqual($absolute->getX(), 1); + $this->assertEqual($absolute->getY(), 2); + } + + function testMakingAbsoluteAppendedPath() { + $url = new SimpleUrl('./there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com/here/'); + $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); + } + + function testMakingAbsoluteBadlyFormedAppendedPath() { + $url = new SimpleUrl('there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com/here/'); + $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); + } + + function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() { + $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f'); + $absolute = $url->makeAbsolute('http://host.com/here/'); + $this->assertEqual($absolute->getScheme(), 'https'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertEqual($absolute->getPort(), 321); + $this->assertEqual($absolute->getPath(), '/stuff/'); + $this->assertEqual($absolute->getEncodedRequest(), '?a=1'); + $this->assertEqual($absolute->getFragment(), 'f'); + } + + function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() { + $url = new SimpleUrl('https://www.lastcraft.com'); + $absolute = $url->makeAbsolute('http://test:secret@host.com/here/'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + } + + function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() { + $url = new SimpleUrl('http://www.lastcraft.com'); + $absolute = $url->makeAbsolute('https://host.com:81/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertIdentical($absolute->getPort(), false); + $this->assertEqual($absolute->getPath(), '/'); + } +} + +class TestOfFrameUrl extends UnitTestCase { + + function testTargetAttachment() { + $url = new SimpleUrl('http://www.site.com/home.html'); + $this->assertIdentical($url->getTarget(), false); + $url->setTarget('A frame'); + $this->assertIdentical($url->getTarget(), 'A frame'); + } +} + +/** + * @note Based off of http://www.mozilla.org/quality/networking/testing/filetests.html + */ +class TestOfFileUrl extends UnitTestCase { + + function testMinimalUrl() { + $url = new SimpleUrl('file:///'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/'); + } + + function testUnixUrl() { + $url = new SimpleUrl('file:///fileInRoot'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/fileInRoot'); + } + + function testDOSVolumeUrl() { + $url = new SimpleUrl('file:///C:/config.sys'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/C:/config.sys'); + } + + function testDOSVolumePromotion() { + $url = new SimpleUrl('file://C:/config.sys'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/C:/config.sys'); + } + + function testDOSBackslashes() { + $url = new SimpleUrl('file:///C:\config.sys'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/C:/config.sys'); + } + + function testDOSDirnameAfterFile() { + $url = new SimpleUrl('file://C:\config.sys'); + $this->assertEqual($url->getScheme(), 'file'); + $this->assertIdentical($url->getHost(), false); + $this->assertEqual($url->getPath(), '/C:/config.sys'); + } + +} + +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/user_agent_test.php b/3rdparty/simpletest/test/user_agent_test.php new file mode 100755 index 00000000000..030abeb257d --- /dev/null +++ b/3rdparty/simpletest/test/user_agent_test.php @@ -0,0 +1,348 @@ +headers = new MockSimpleHttpHeaders(); + $this->response = new MockSimpleHttpResponse(); + $this->response->setReturnValue('isError', false); + $this->response->returns('getHeaders', new MockSimpleHttpHeaders()); + $this->request = new MockSimpleHttpRequest(); + $this->request->returns('fetch', $this->response); + } + + function testGetRequestWithoutIncidentGivesNoErrors() { + $url = new SimpleUrl('http://test:secret@this.com/page.html'); + $url->addRequestParameters(array('a' => 'A', 'b' => 'B')); + + $agent = new MockRequestUserAgent(); + $agent->returns('createHttpRequest', $this->request); + $agent->__construct(); + + $response = $agent->fetchResponse( + new SimpleUrl('http://test:secret@this.com/page.html'), + new SimpleGetEncoding(array('a' => 'A', 'b' => 'B'))); + $this->assertFalse($response->isError()); + } +} + +class TestOfAdditionalHeaders extends UnitTestCase { + + function testAdditionalHeaderAddedToRequest() { + $response = new MockSimpleHttpResponse(); + $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); + + $request = new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + $request->expectOnce( + 'addHeaderLine', + array('User-Agent: SimpleTest')); + + $agent = new MockRequestUserAgent(); + $agent->setReturnReference('createHttpRequest', $request); + $agent->__construct(); + $agent->addHeader('User-Agent: SimpleTest'); + $response = $agent->fetchResponse(new SimpleUrl('http://this.host/'), new SimpleGetEncoding()); + } +} + +class TestOfBrowserCookies extends UnitTestCase { + + private function createStandardResponse() { + $response = new MockSimpleHttpResponse(); + $response->setReturnValue("isError", false); + $response->setReturnValue("getContent", "stuff"); + $response->setReturnReference("getHeaders", new MockSimpleHttpHeaders()); + return $response; + } + + private function createCookieSite($header_lines) { + $headers = new SimpleHttpHeaders($header_lines); + $response = new MockSimpleHttpResponse(); + $response->setReturnValue("isError", false); + $response->setReturnReference("getHeaders", $headers); + $response->setReturnValue("getContent", "stuff"); + $request = new MockSimpleHttpRequest(); + $request->setReturnReference("fetch", $response); + return $request; + } + + private function createMockedRequestUserAgent(&$request) { + $agent = new MockRequestUserAgent(); + $agent->setReturnReference('createHttpRequest', $request); + $agent->__construct(); + return $agent; + } + + function testCookieJarIsSentToRequest() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A'); + + $request = new MockSimpleHttpRequest(); + $request->returns('fetch', $this->createStandardResponse()); + $request->expectOnce('readCookiesFromJar', array($jar, '*')); + + $agent = $this->createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + } + + function testNoCookieJarIsSentToRequestWhenCookiesAreDisabled() { + $request = new MockSimpleHttpRequest(); + $request->returns('fetch', $this->createStandardResponse()); + $request->expectNever('readCookiesFromJar'); + + $agent = $this->createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->ignoreCookies(); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + } + + function testReadingNewCookie() { + $request = $this->createCookieSite('Set-cookie: a=AAAA'); + $agent = $this->createMockedRequestUserAgent($request); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); + } + + function testIgnoringNewCookieWhenCookiesDisabled() { + $request = $this->createCookieSite('Set-cookie: a=AAAA'); + $agent = $this->createMockedRequestUserAgent($request); + $agent->ignoreCookies(); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertIdentical($agent->getCookieValue("this.com", "this/path/", "a"), false); + } + + function testOverwriteCookieThatAlreadyExists() { + $request = $this->createCookieSite('Set-cookie: a=AAAA'); + $agent = $this->createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); + } + + function testClearCookieBySettingExpiry() { + $request = $this->createCookieSite('Set-cookie: a=b'); + $agent = $this->createMockedRequestUserAgent($request); + + $agent->setCookie("a", "A", "this/path/", "Wed, 25-Dec-02 04:24:21 GMT"); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + "b"); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + false); + } + + function testAgeingAndClearing() { + $request = $this->createCookieSite('Set-cookie: a=A; expires=Wed, 25-Dec-02 04:24:21 GMT; path=/this/path'); + $agent = $this->createMockedRequestUserAgent($request); + + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + "A"); + $agent->ageCookies(2); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + false); + } + + function testReadingIncomingAndSettingNewCookies() { + $request = $this->createCookieSite('Set-cookie: a=AAA'); + $agent = $this->createMockedRequestUserAgent($request); + + $this->assertNull($agent->getBaseCookieValue("a", false)); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $agent->setCookie("b", "BBB", "this.com", "this/path/"); + $this->assertEqual( + $agent->getBaseCookieValue("a", new SimpleUrl('http://this.com/this/path/page.html')), + "AAA"); + $this->assertEqual( + $agent->getBaseCookieValue("b", new SimpleUrl('http://this.com/this/path/page.html')), + "BBB"); + } +} + +class TestOfHttpRedirects extends UnitTestCase { + + function createRedirect($content, $redirect) { + $headers = new MockSimpleHttpHeaders(); + $headers->setReturnValue('isRedirect', (boolean)$redirect); + $headers->setReturnValue('getLocation', $redirect); + $response = new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', $content); + $response->setReturnReference('getHeaders', $headers); + $request = new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + return $request; + } + + function testDisabledRedirects() { + $agent = new MockRequestUserAgent(); + $agent->returns( + 'createHttpRequest', + $this->createRedirect('stuff', 'there.html')); + $agent->expectOnce('createHttpRequest'); + $agent->__construct(); + $agent->setMaximumRedirects(0); + $response = $agent->fetchResponse(new SimpleUrl('here.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'stuff'); + } + + function testSingleRedirect() { + $agent = new MockRequestUserAgent(); + $agent->returnsAt( + 0, + 'createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->returnsAt( + 1, + 'createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->expectCallCount('createHttpRequest', 2); + $agent->__construct(); + + $agent->setMaximumRedirects(1); + $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'second'); + } + + function testDoubleRedirect() { + $agent = new MockRequestUserAgent(); + $agent->returnsAt( + 0, + 'createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->returnsAt( + 1, + 'createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->returnsAt( + 2, + 'createHttpRequest', + $this->createRedirect('third', 'four.html')); + $agent->expectCallCount('createHttpRequest', 3); + $agent->__construct(); + + $agent->setMaximumRedirects(2); + $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'third'); + } + + function testSuccessAfterRedirect() { + $agent = new MockRequestUserAgent(); + $agent->returnsAt( + 0, + 'createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->returnsAt( + 1, + 'createHttpRequest', + $this->createRedirect('second', false)); + $agent->returnsAt( + 2, + 'createHttpRequest', + $this->createRedirect('third', 'four.html')); + $agent->expectCallCount('createHttpRequest', 2); + $agent->__construct(); + + $agent->setMaximumRedirects(2); + $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'second'); + } + + function testRedirectChangesPostToGet() { + $agent = new MockRequestUserAgent(); + $agent->returnsAt( + 0, + 'createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->expectAt(0, 'createHttpRequest', array('*', new IsAExpectation('SimplePostEncoding'))); + $agent->returnsAt( + 1, + 'createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->expectAt(1, 'createHttpRequest', array('*', new IsAExpectation('SimpleGetEncoding'))); + $agent->expectCallCount('createHttpRequest', 2); + $agent->__construct(); + $agent->setMaximumRedirects(1); + $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimplePostEncoding()); + } +} + +class TestOfBadHosts extends UnitTestCase { + + private function createSimulatedBadHost() { + $response = new MockSimpleHttpResponse(); + $response->setReturnValue('isError', true); + $response->setReturnValue('getError', 'Bad socket'); + $response->setReturnValue('getContent', false); + $request = new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + return $request; + } + + function testUntestedHost() { + $request = $this->createSimulatedBadHost(); + $agent = new MockRequestUserAgent(); + $agent->setReturnReference('createHttpRequest', $request); + $agent->__construct(); + $response = $agent->fetchResponse( + new SimpleUrl('http://this.host/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertTrue($response->isError()); + } +} + +class TestOfAuthorisation extends UnitTestCase { + + function testAuthenticateHeaderAdded() { + $response = new MockSimpleHttpResponse(); + $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); + + $request = new MockSimpleHttpRequest(); + $request->returns('fetch', $response); + $request->expectOnce( + 'addHeaderLine', + array('Authorization: Basic ' . base64_encode('test:secret'))); + + $agent = new MockRequestUserAgent(); + $agent->returns('createHttpRequest', $request); + $agent->__construct(); + $response = $agent->fetchResponse( + new SimpleUrl('http://test:secret@this.host'), + new SimpleGetEncoding()); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/visual_test.php b/3rdparty/simpletest/test/visual_test.php new file mode 100755 index 00000000000..6b9d085d67f --- /dev/null +++ b/3rdparty/simpletest/test/visual_test.php @@ -0,0 +1,495 @@ +a = $a; + } +} + +class PassingUnitTestCaseOutput extends UnitTestCase { + + function testOfResults() { + $this->pass('Pass'); + } + + function testTrue() { + $this->assertTrue(true); + } + + function testFalse() { + $this->assertFalse(false); + } + + function testExpectation() { + $expectation = &new EqualExpectation(25, 'My expectation message: %s'); + $this->assert($expectation, 25, 'My assert message : %s'); + } + + function testNull() { + $this->assertNull(null, "%s -> Pass"); + $this->assertNotNull(false, "%s -> Pass"); + } + + function testType() { + $this->assertIsA("hello", "string", "%s -> Pass"); + $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass"); + $this->assertIsA($this, "UnitTestCase", "%s -> Pass"); + } + + function testTypeEquality() { + $this->assertEqual("0", 0, "%s -> Pass"); + } + + function testNullEquality() { + $this->assertNotEqual(null, 1, "%s -> Pass"); + $this->assertNotEqual(1, null, "%s -> Pass"); + } + + function testIntegerEquality() { + $this->assertNotEqual(1, 2, "%s -> Pass"); + } + + function testStringEquality() { + $this->assertEqual("a", "a", "%s -> Pass"); + $this->assertNotEqual("aa", "ab", "%s -> Pass"); + } + + function testHashEquality() { + $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass"); + } + + function testWithin() { + $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass"); + } + + function testOutside() { + $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass"); + } + + function testStringIdentity() { + $a = "fred"; + $b = $a; + $this->assertIdentical($a, $b, "%s -> Pass"); + } + + function testTypeIdentity() { + $a = "0"; + $b = 0; + $this->assertNotIdentical($a, $b, "%s -> Pass"); + } + + function testNullIdentity() { + $this->assertNotIdentical(null, 1, "%s -> Pass"); + $this->assertNotIdentical(1, null, "%s -> Pass"); + } + + function testHashIdentity() { + } + + function testObjectEquality() { + $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass"); + $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass"); + } + + function testObjectIndentity() { + $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass"); + $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass"); + } + + function testReference() { + $a = "fred"; + $b = &$a; + $this->assertReference($a, $b, "%s -> Pass"); + } + + function testCloneOnDifferentObjects() { + $a = "fred"; + $b = $a; + $c = "Hello"; + $this->assertClone($a, $b, "%s -> Pass"); + } + + function testPatterns() { + $this->assertPattern('/hello/i', "Hello there", "%s -> Pass"); + $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass"); + } + + function testLongStrings() { + $text = ""; + for ($i = 0; $i < 10; $i++) { + $text .= "0123456789"; + } + $this->assertEqual($text, $text); + } +} + +class FailingUnitTestCaseOutput extends UnitTestCase { + + function testOfResults() { + $this->fail('Fail'); // Fail. + } + + function testTrue() { + $this->assertTrue(false); // Fail. + } + + function testFalse() { + $this->assertFalse(true); // Fail. + } + + function testExpectation() { + $expectation = &new EqualExpectation(25, 'My expectation message: %s'); + $this->assert($expectation, 24, 'My assert message : %s'); // Fail. + } + + function testNull() { + $this->assertNull(false, "%s -> Fail"); // Fail. + $this->assertNotNull(null, "%s -> Fail"); // Fail. + } + + function testType() { + $this->assertIsA(14, "string", "%s -> Fail"); // Fail. + $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail"); // Fail. + $this->assertIsA($this, "TestReporter", "%s -> Fail"); // Fail. + } + + function testTypeEquality() { + $this->assertNotEqual("0", 0, "%s -> Fail"); // Fail. + } + + function testNullEquality() { + $this->assertEqual(null, 1, "%s -> Fail"); // Fail. + $this->assertEqual(1, null, "%s -> Fail"); // Fail. + } + + function testIntegerEquality() { + $this->assertEqual(1, 2, "%s -> Fail"); // Fail. + } + + function testStringEquality() { + $this->assertNotEqual("a", "a", "%s -> Fail"); // Fail. + $this->assertEqual("aa", "ab", "%s -> Fail"); // Fail. + } + + function testHashEquality() { + $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail"); + } + + function testWithin() { + $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail"); // Fail. + } + + function testOutside() { + $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail"); // Fail. + } + + function testStringIdentity() { + $a = "fred"; + $b = $a; + $this->assertNotIdentical($a, $b, "%s -> Fail"); // Fail. + } + + function testTypeIdentity() { + $a = "0"; + $b = 0; + $this->assertIdentical($a, $b, "%s -> Fail"); // Fail. + } + + function testNullIdentity() { + $this->assertIdentical(null, 1, "%s -> Fail"); // Fail. + $this->assertIdentical(1, null, "%s -> Fail"); // Fail. + } + + function testHashIdentity() { + $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail"); // Fail. + } + + function testObjectEquality() { + $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail"); // Fail. + $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail"); // Fail. + } + + function testObjectIndentity() { + $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail"); // Fail. + $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail"); // Fail. + } + + function testReference() { + $a = "fred"; + $b = &$a; + $this->assertClone($a, $b, "%s -> Fail"); // Fail. + } + + function testCloneOnDifferentObjects() { + $a = "fred"; + $b = $a; + $c = "Hello"; + $this->assertClone($a, $c, "%s -> Fail"); // Fail. + } + + function testPatterns() { + $this->assertPattern('/hello/', "Hello there", "%s -> Fail"); // Fail. + $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail"); // Fail. + } + + function testLongStrings() { + $text = ""; + for ($i = 0; $i < 10; $i++) { + $text .= "0123456789"; + } + $this->assertEqual($text . $text, $text . "a" . $text); // Fail. + } +} + +class Dummy { + function Dummy() { + } + + function a() { + } +} +Mock::generate('Dummy'); + +class TestOfMockObjectsOutput extends UnitTestCase { + + function testCallCounts() { + $dummy = &new MockDummy(); + $dummy->expectCallCount('a', 1, 'My message: %s'); + $dummy->a(); + $dummy->a(); + } + + function testMinimumCallCounts() { + $dummy = &new MockDummy(); + $dummy->expectMinimumCallCount('a', 2, 'My message: %s'); + $dummy->a(); + $dummy->a(); + } + + function testEmptyMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array()); + $dummy->a(); + $dummy->a(null); // Fail. + } + + function testEmptyMatchingWithCustomMessage() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(), 'My expectation message: %s'); + $dummy->a(); + $dummy->a(null); // Fail. + } + + function testNullMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(null)); + $dummy->a(null); + $dummy->a(); // Fail. + } + + function testBooleanMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(true, false)); + $dummy->a(true, false); + $dummy->a(true, true); // Fail. + } + + function testIntegerMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(32, 33)); + $dummy->a(32, 33); + $dummy->a(32, 34); // Fail. + } + + function testFloatMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(3.2, 3.3)); + $dummy->a(3.2, 3.3); + $dummy->a(3.2, 3.4); // Fail. + } + + function testStringMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array('32', '33')); + $dummy->a('32', '33'); + $dummy->a('32', '34'); // Fail. + } + + function testEmptyMatchingWithCustomExpectationMessage() { + $dummy = &new MockDummy(); + $dummy->expect( + 'a', + array(new EqualExpectation('A', 'My part expectation message: %s')), + 'My expectation message: %s'); + $dummy->a('A'); + $dummy->a('B'); // Fail. + } + + function testArrayMatching() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(array(32), array(33))); + $dummy->a(array(32), array(33)); + $dummy->a(array(32), array('33')); // Fail. + } + + function testObjectMatching() { + $a = new Dummy(); + $a->a = 'a'; + $b = new Dummy(); + $b->b = 'b'; + $dummy = &new MockDummy(); + $dummy->expect('a', array($a, $b)); + $dummy->a($a, $b); + $dummy->a($a, $a); // Fail. + } + + function testBigList() { + $dummy = &new MockDummy(); + $dummy->expect('a', array(false, 0, 1, 1.0)); + $dummy->a(false, 0, 1, 1.0); + $dummy->a(true, false, 2, 2.0); // Fail. + } +} + +class TestOfPastBugs extends UnitTestCase { + + function testMixedTypes() { + $this->assertEqual(array(), null, "%s -> Pass"); + $this->assertIdentical(array(), null, "%s -> Fail"); // Fail. + } + + function testMockWildcards() { + $dummy = &new MockDummy(); + $dummy->expect('a', array('*', array(33))); + $dummy->a(array(32), array(33)); + $dummy->a(array(32), array('33')); // Fail. + } +} + +class TestOfVisualShell extends ShellTestCase { + + function testDump() { + $this->execute('ls'); + $this->dumpOutput(); + $this->execute('dir'); + $this->dumpOutput(); + } + + function testDumpOfList() { + $this->execute('ls'); + $this->dump($this->getOutputAsList()); + } +} + +class PassesAsWellReporter extends HtmlReporter { + + protected function getCss() { + return parent::getCss() . ' .pass { color: darkgreen; }'; + } + + function paintPass($message) { + parent::paintPass($message); + print "Pass: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . htmlentities($message) . "
    \n"; + } + + function paintSignal($type, &$payload) { + print "$type: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . htmlentities(serialize($payload)) . "
    \n"; + } +} + +class TestOfSkippingNoMatterWhat extends UnitTestCase { + function skip() { + $this->skipIf(true, 'Always skipped -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } +} + +class TestOfSkippingOrElse extends UnitTestCase { + function skip() { + $this->skipUnless(false, 'Always skipped -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } +} + +class TestOfSkippingTwiceOver extends UnitTestCase { + function skip() { + $this->skipIf(true, 'First reason -> %s'); + $this->skipIf(true, 'Second reason -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } +} + +class TestThatShouldNotBeSkipped extends UnitTestCase { + function skip() { + $this->skipIf(false); + $this->skipUnless(true); + } + + function testFail() { + $this->fail('We should see this message'); + } + + function testPass() { + $this->pass('We should see this message'); + } +} + +$test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions'); +$test->add(new PassingUnitTestCaseOutput()); +$test->add(new FailingUnitTestCaseOutput()); +$test->add(new TestOfMockObjectsOutput()); +$test->add(new TestOfPastBugs()); +$test->add(new TestOfVisualShell()); +$test->add(new TestOfSkippingNoMatterWhat()); +$test->add(new TestOfSkippingOrElse()); +$test->add(new TestOfSkippingTwiceOver()); +$test->add(new TestThatShouldNotBeSkipped()); + +if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) { + $reporter = new XmlReporter(); +} elseif (TextReporter::inCli()) { + $reporter = new TextReporter(); +} else { + $reporter = new PassesAsWellReporter(); +} +if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) { + $reporter->makeDry(); +} +exit ($test->run($reporter) ? 0 : 1); +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/web_tester_test.php b/3rdparty/simpletest/test/web_tester_test.php new file mode 100755 index 00000000000..8c3bf1adf63 --- /dev/null +++ b/3rdparty/simpletest/test/web_tester_test.php @@ -0,0 +1,155 @@ +assertTrue($expectation->test('a')); + $this->assertTrue($expectation->test(array('a'))); + $this->assertFalse($expectation->test('A')); + } + + function testMatchesInteger() { + $expectation = new FieldExpectation('1'); + $this->assertTrue($expectation->test('1')); + $this->assertTrue($expectation->test(1)); + $this->assertTrue($expectation->test(array('1'))); + $this->assertTrue($expectation->test(array(1))); + } + + function testNonStringFailsExpectation() { + $expectation = new FieldExpectation('a'); + $this->assertFalse($expectation->test(null)); + } + + function testUnsetFieldCanBeTestedFor() { + $expectation = new FieldExpectation(false); + $this->assertTrue($expectation->test(false)); + } + + function testMultipleValuesCanBeInAnyOrder() { + $expectation = new FieldExpectation(array('a', 'b')); + $this->assertTrue($expectation->test(array('a', 'b'))); + $this->assertTrue($expectation->test(array('b', 'a'))); + $this->assertFalse($expectation->test(array('a', 'a'))); + $this->assertFalse($expectation->test('a')); + } + + function testSingleItemCanBeArrayOrString() { + $expectation = new FieldExpectation(array('a')); + $this->assertTrue($expectation->test(array('a'))); + $this->assertTrue($expectation->test('a')); + } +} + +class TestOfHeaderExpectations extends UnitTestCase { + + function testExpectingOnlyTheHeaderName() { + $expectation = new HttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test(false), false); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('a: B'), true); + $this->assertIdentical($expectation->test(' a : A '), true); + } + + function testHeaderValueAsWell() { + $expectation = new HttpHeaderExpectation('a', 'A'); + $this->assertIdentical($expectation->test(false), false); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('A: a'), false); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : AB '), false); + } + + function testHeaderValueWithColons() { + $expectation = new HttpHeaderExpectation('a', 'A:B:C'); + $this->assertIdentical($expectation->test('a: A'), false); + $this->assertIdentical($expectation->test('a: A:B'), false); + $this->assertIdentical($expectation->test('a: A:B:C'), true); + $this->assertIdentical($expectation->test('a: A:B:C:D'), false); + } + + function testMultilineSearch() { + $expectation = new HttpHeaderExpectation('a', 'A'); + $this->assertIdentical($expectation->test("aa: A\r\nb: B\r\nc: C"), false); + $this->assertIdentical($expectation->test("aa: A\r\na: A\r\nb: B"), true); + } + + function testMultilineSearchWithPadding() { + $expectation = new HttpHeaderExpectation('a', ' A '); + $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), false); + $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), true); + } + + function testPatternMatching() { + $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/')); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('A: a'), false); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : AB '), true); + } + + function testCaseInsensitivePatternMatching() { + $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/i')); + $this->assertIdentical($expectation->test('a: a'), true); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : BAB '), true); + $this->assertIdentical($expectation->test(' a : bab '), true); + } + + function testUnwantedHeader() { + $expectation = new NoHttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test(''), true); + $this->assertIdentical($expectation->test('stuff'), true); + $this->assertIdentical($expectation->test('b: B'), true); + $this->assertIdentical($expectation->test('a: A'), false); + $this->assertIdentical($expectation->test('A: A'), false); + } + + function testMultilineUnwantedSearch() { + $expectation = new NoHttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), true); + $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), false); + } + + function testLocationHeaderSplitsCorrectly() { + $expectation = new HttpHeaderExpectation('Location', 'http://here/'); + $this->assertIdentical($expectation->test('Location: http://here/'), true); + } +} + +class TestOfTextExpectations extends UnitTestCase { + + function testMatchingSubString() { + $expectation = new TextExpectation('wanted'); + $this->assertIdentical($expectation->test(''), false); + $this->assertIdentical($expectation->test('Wanted'), false); + $this->assertIdentical($expectation->test('wanted'), true); + $this->assertIdentical($expectation->test('the wanted text is here'), true); + } + + function testNotMatchingSubString() { + $expectation = new NoTextExpectation('wanted'); + $this->assertIdentical($expectation->test(''), true); + $this->assertIdentical($expectation->test('Wanted'), true); + $this->assertIdentical($expectation->test('wanted'), false); + $this->assertIdentical($expectation->test('the wanted text is here'), false); + } +} + +class TestOfGenericAssertionsInWebTester extends WebTestCase { + function testEquality() { + $this->assertEqual('a', 'a'); + $this->assertNotEqual('a', 'A'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test/xml_test.php b/3rdparty/simpletest/test/xml_test.php new file mode 100755 index 00000000000..f99e0dcd98b --- /dev/null +++ b/3rdparty/simpletest/test/xml_test.php @@ -0,0 +1,187 @@ + 2)); + $this->assertEqual($nesting->getSize(), 2); + } +} + +class TestOfXmlStructureParsing extends UnitTestCase { + function testValidXml() { + $listener = new MockSimpleScorer(); + $listener->expectNever('paintGroupStart'); + $listener->expectNever('paintGroupEnd'); + $listener->expectNever('paintCaseStart'); + $listener->expectNever('paintCaseEnd'); + $parser = new SimpleTestXmlParser($listener); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + } + + function testEmptyGroup() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintGroupStart', array('a_group', 7)); + $listener->expectOnce('paintGroupEnd', array('a_group')); + $parser = new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_group\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } + + function testEmptyCase() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintCaseStart', array('a_case')); + $listener->expectOnce('paintCaseEnd', array('a_case')); + $parser = new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_case\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } + + function testEmptyMethod() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintCaseStart', array('a_case')); + $listener->expectOnce('paintCaseEnd', array('a_case')); + $listener->expectOnce('paintMethodStart', array('a_method')); + $listener->expectOnce('paintMethodEnd', array('a_method')); + $parser = new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("a_case\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_method\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + $parser->parse("\n"); + } + + function testNestedGroup() { + $listener = new MockSimpleScorer(); + $listener->expectAt(0, 'paintGroupStart', array('a_group', 7)); + $listener->expectAt(1, 'paintGroupStart', array('b_group', 3)); + $listener->expectCallCount('paintGroupStart', 2); + $listener->expectAt(0, 'paintGroupEnd', array('b_group')); + $listener->expectAt(1, 'paintGroupEnd', array('a_group')); + $listener->expectCallCount('paintGroupEnd', 2); + + $parser = new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_group\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("b_group\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } +} + +class AnyOldSignal { + public $stuff = true; +} + +class TestOfXmlResultsParsing extends UnitTestCase { + + function sendValidStart(&$parser) { + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("a_case\n"); + $parser->parse("\n"); + $parser->parse("a_method\n"); + } + + function sendValidEnd(&$parser) { + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + } + + function testPass() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintPass', array('a_message')); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testFail() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintFail', array('a_message')); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testException() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintError', array('a_message')); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testSkip() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintSkip', array('a_message')); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testSignal() { + $signal = new AnyOldSignal(); + $signal->stuff = "Hello"; + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintSignal', array('a_signal', $signal)); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse( + "\n")); + $this->sendValidEnd($parser); + } + + function testMessage() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintMessage', array('a_message')); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testFormattedMessage() { + $listener = new MockSimpleScorer(); + $listener->expectOnce('paintFormattedMessage', array("\na\tmessage\n")); + $parser = new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("\n")); + $this->sendValidEnd($parser); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/test_case.php b/3rdparty/simpletest/test_case.php new file mode 100644 index 00000000000..ba023c3b2ea --- /dev/null +++ b/3rdparty/simpletest/test_case.php @@ -0,0 +1,658 @@ +label = $label; + } + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->label ? $this->label : get_class($this); + } + + /** + * This is a placeholder for skipping tests. In this + * method you place skipIf() and skipUnless() calls to + * set the skipping state. + * @access public + */ + function skip() { + } + + /** + * Will issue a message to the reporter and tell the test + * case to skip if the incoming flag is true. + * @param string $should_skip Condition causing the tests to be skipped. + * @param string $message Text of skip condition. + * @access public + */ + function skipIf($should_skip, $message = '%s') { + if ($should_skip && ! $this->should_skip) { + $this->should_skip = true; + $message = sprintf($message, 'Skipping [' . get_class($this) . ']'); + $this->reporter->paintSkip($message . $this->getAssertionLine()); + } + } + + /** + * Accessor for the private variable $_shoud_skip + * @access public + */ + function shouldSkip() { + return $this->should_skip; + } + + /** + * Will issue a message to the reporter and tell the test + * case to skip if the incoming flag is false. + * @param string $shouldnt_skip Condition causing the tests to be run. + * @param string $message Text of skip condition. + * @access public + */ + function skipUnless($shouldnt_skip, $message = false) { + $this->skipIf(! $shouldnt_skip, $message); + } + + /** + * Used to invoke the single tests. + * @return SimpleInvoker Individual test runner. + * @access public + */ + function createInvoker() { + return new SimpleErrorTrappingInvoker( + new SimpleExceptionTrappingInvoker(new SimpleInvoker($this))); + } + + /** + * Uses reflection to run every method within itself + * starting with the string "test" unless a method + * is specified. + * @param SimpleReporter $reporter Current test reporter. + * @return boolean True if all tests passed. + * @access public + */ + function run($reporter) { + $context = SimpleTest::getContext(); + $context->setTest($this); + $context->setReporter($reporter); + $this->reporter = $reporter; + $started = false; + foreach ($this->getTests() as $method) { + if ($reporter->shouldInvoke($this->getLabel(), $method)) { + $this->skip(); + if ($this->should_skip) { + break; + } + if (! $started) { + $reporter->paintCaseStart($this->getLabel()); + $started = true; + } + $invoker = $this->reporter->createInvoker($this->createInvoker()); + $invoker->before($method); + $invoker->invoke($method); + $invoker->after($method); + } + } + if ($started) { + $reporter->paintCaseEnd($this->getLabel()); + } + unset($this->reporter); + $context->setTest(null); + return $reporter->getStatus(); + } + + /** + * Gets a list of test names. Normally that will + * be all internal methods that start with the + * name "test". This method should be overridden + * if you want a different rule. + * @return array List of test names. + * @access public + */ + function getTests() { + $methods = array(); + foreach (get_class_methods(get_class($this)) as $method) { + if ($this->isTest($method)) { + $methods[] = $method; + } + } + return $methods; + } + + /** + * Tests to see if the method is a test that should + * be run. Currently any method that starts with 'test' + * is a candidate unless it is the constructor. + * @param string $method Method name to try. + * @return boolean True if test method. + * @access protected + */ + protected function isTest($method) { + if (strtolower(substr($method, 0, 4)) == 'test') { + return ! SimpleTestCompatibility::isA($this, strtolower($method)); + } + return false; + } + + /** + * Announces the start of the test. + * @param string $method Test method just started. + * @access public + */ + function before($method) { + $this->reporter->paintMethodStart($method); + $this->observers = array(); + } + + /** + * Sets up unit test wide variables at the start + * of each test method. To be overridden in + * actual user test cases. + * @access public + */ + function setUp() { + } + + /** + * Clears the data set in the setUp() method call. + * To be overridden by the user in actual user test cases. + * @access public + */ + function tearDown() { + } + + /** + * Announces the end of the test. Includes private clean up. + * @param string $method Test method just finished. + * @access public + */ + function after($method) { + for ($i = 0; $i < count($this->observers); $i++) { + $this->observers[$i]->atTestEnd($method, $this); + } + $this->reporter->paintMethodEnd($method); + } + + /** + * Sets up an observer for the test end. + * @param object $observer Must have atTestEnd() + * method. + * @access public + */ + function tell($observer) { + $this->observers[] = &$observer; + } + + /** + * @deprecated + */ + function pass($message = "Pass") { + if (! isset($this->reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->reporter->paintPass( + $message . $this->getAssertionLine()); + return true; + } + + /** + * Sends a fail event with a message. + * @param string $message Message to send. + * @access public + */ + function fail($message = "Fail") { + if (! isset($this->reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->reporter->paintFail( + $message . $this->getAssertionLine()); + return false; + } + + /** + * Formats a PHP error and dispatches it to the + * reporter. + * @param integer $severity PHP error code. + * @param string $message Text of error. + * @param string $file File error occoured in. + * @param integer $line Line number of error. + * @access public + */ + function error($severity, $message, $file, $line) { + if (! isset($this->reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->reporter->paintError( + "Unexpected PHP error [$message] severity [$severity] in [$file line $line]"); + } + + /** + * Formats an exception and dispatches it to the + * reporter. + * @param Exception $exception Object thrown. + * @access public + */ + function exception($exception) { + $this->reporter->paintException($exception); + } + + /** + * For user defined expansion of the available messages. + * @param string $type Tag for sorting the signals. + * @param mixed $payload Extra user specific information. + */ + function signal($type, $payload) { + if (! isset($this->reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->reporter->paintSignal($type, $payload); + } + + /** + * Runs an expectation directly, for extending the + * tests with new expectation classes. + * @param SimpleExpectation $expectation Expectation subclass. + * @param mixed $compare Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assert($expectation, $compare, $message = '%s') { + if ($expectation->test($compare)) { + return $this->pass(sprintf( + $message, + $expectation->overlayMessage($compare, $this->reporter->getDumper()))); + } else { + return $this->fail(sprintf( + $message, + $expectation->overlayMessage($compare, $this->reporter->getDumper()))); + } + } + + /** + * Uses a stack trace to find the line of an assertion. + * @return string Line number of first assert* + * method embedded in format string. + * @access public + */ + function getAssertionLine() { + $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip')); + return $trace->traceMethod(); + } + + /** + * Sends a formatted dump of a variable to the + * test suite for those emergency debugging + * situations. + * @param mixed $variable Variable to display. + * @param string $message Message to display. + * @return mixed The original variable. + * @access public + */ + function dump($variable, $message = false) { + $dumper = $this->reporter->getDumper(); + $formatted = $dumper->dump($variable); + if ($message) { + $formatted = $message . "\n" . $formatted; + } + $this->reporter->paintFormattedMessage($formatted); + return $variable; + } + + /** + * Accessor for the number of subtests including myelf. + * @return integer Number of test cases. + * @access public + */ + function getSize() { + return 1; + } +} + +/** + * Helps to extract test cases automatically from a file. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleFileLoader { + + /** + * Builds a test suite from a library of test cases. + * The new suite is composed into this one. + * @param string $test_file File name of library with + * test case classes. + * @return TestSuite The new test suite. + * @access public + */ + function load($test_file) { + $existing_classes = get_declared_classes(); + $existing_globals = get_defined_vars(); + include_once($test_file); + $new_globals = get_defined_vars(); + $this->makeFileVariablesGlobal($existing_globals, $new_globals); + $new_classes = array_diff(get_declared_classes(), $existing_classes); + if (empty($new_classes)) { + $new_classes = $this->scrapeClassesFromFile($test_file); + } + $classes = $this->selectRunnableTests($new_classes); + return $this->createSuiteFromClasses($test_file, $classes); + } + + /** + * Imports new variables into the global namespace. + * @param hash $existing Variables before the file was loaded. + * @param hash $new Variables after the file was loaded. + * @access private + */ + protected function makeFileVariablesGlobal($existing, $new) { + $globals = array_diff(array_keys($new), array_keys($existing)); + foreach ($globals as $global) { + $GLOBALS[$global] = $new[$global]; + } + } + + /** + * Lookup classnames from file contents, in case the + * file may have been included before. + * Note: This is probably too clever by half. Figuring this + * out after a failed test case is going to be tricky for us, + * never mind the user. A test case should not be included + * twice anyway. + * @param string $test_file File name with classes. + * @access private + */ + protected function scrapeClassesFromFile($test_file) { + preg_match_all('~^\s*class\s+(\w+)(\s+(extends|implements)\s+\w+)*\s*\{~mi', + file_get_contents($test_file), + $matches ); + return $matches[1]; + } + + /** + * Calculates the incoming test cases. Skips abstract + * and ignored classes. + * @param array $candidates Candidate classes. + * @return array New classes which are test + * cases that shouldn't be ignored. + * @access public + */ + function selectRunnableTests($candidates) { + $classes = array(); + foreach ($candidates as $class) { + if (TestSuite::getBaseTestCase($class)) { + $reflection = new SimpleReflection($class); + if ($reflection->isAbstract()) { + SimpleTest::ignore($class); + } else { + $classes[] = $class; + } + } + } + return $classes; + } + + /** + * Builds a test suite from a class list. + * @param string $title Title of new group. + * @param array $classes Test classes. + * @return TestSuite Group loaded with the new + * test cases. + * @access public + */ + function createSuiteFromClasses($title, $classes) { + if (count($classes) == 0) { + $suite = new BadTestSuite($title, "No runnable test cases in [$title]"); + return $suite; + } + SimpleTest::ignoreParentsIfIgnored($classes); + $suite = new TestSuite($title); + foreach ($classes as $class) { + if (! SimpleTest::isIgnored($class)) { + $suite->add($class); + } + } + return $suite; + } +} + +/** + * This is a composite test class for combining + * test cases and other RunnableTest classes into + * a group test. + * @package SimpleTest + * @subpackage UnitTester + */ +class TestSuite { + private $label; + private $test_cases; + + /** + * Sets the name of the test suite. + * @param string $label Name sent at the start and end + * of the test. + * @access public + */ + function TestSuite($label = false) { + $this->label = $label; + $this->test_cases = array(); + } + + /** + * Accessor for the test name for subclasses. If the suite + * wraps a single test case the label defaults to the name of that test. + * @return string Name of the test. + * @access public + */ + function getLabel() { + if (! $this->label) { + return ($this->getSize() == 1) ? + get_class($this->test_cases[0]) : get_class($this); + } else { + return $this->label; + } + } + + /** + * Adds a test into the suite by instance or class. The class will + * be instantiated if it's a test suite. + * @param SimpleTestCase $test_case Suite or individual test + * case implementing the + * runnable test interface. + * @access public + */ + function add($test_case) { + if (! is_string($test_case)) { + $this->test_cases[] = $test_case; + } elseif (TestSuite::getBaseTestCase($test_case) == 'testsuite') { + $this->test_cases[] = new $test_case(); + } else { + $this->test_cases[] = $test_case; + } + } + + /** + * Builds a test suite from a library of test cases. + * The new suite is composed into this one. + * @param string $test_file File name of library with + * test case classes. + * @access public + */ + function addFile($test_file) { + $extractor = new SimpleFileLoader(); + $this->add($extractor->load($test_file)); + } + + /** + * Delegates to a visiting collector to add test + * files. + * @param string $path Path to scan from. + * @param SimpleCollector $collector Directory scanner. + * @access public + */ + function collect($path, $collector) { + $collector->collect($this, $path); + } + + /** + * Invokes run() on all of the held test cases, instantiating + * them if necessary. + * @param SimpleReporter $reporter Current test reporter. + * @access public + */ + function run($reporter) { + $reporter->paintGroupStart($this->getLabel(), $this->getSize()); + for ($i = 0, $count = count($this->test_cases); $i < $count; $i++) { + if (is_string($this->test_cases[$i])) { + $class = $this->test_cases[$i]; + $test = new $class(); + $test->run($reporter); + unset($test); + } else { + $this->test_cases[$i]->run($reporter); + } + } + $reporter->paintGroupEnd($this->getLabel()); + return $reporter->getStatus(); + } + + /** + * Number of contained test cases. + * @return integer Total count of cases in the group. + * @access public + */ + function getSize() { + $count = 0; + foreach ($this->test_cases as $case) { + if (is_string($case)) { + if (! SimpleTest::isIgnored($case)) { + $count++; + } + } else { + $count += $case->getSize(); + } + } + return $count; + } + + /** + * Test to see if a class is derived from the + * SimpleTestCase class. + * @param string $class Class name. + * @access public + */ + static function getBaseTestCase($class) { + while ($class = get_parent_class($class)) { + $class = strtolower($class); + if ($class == 'simpletestcase' || $class == 'testsuite') { + return $class; + } + } + return false; + } +} + +/** + * This is a failing group test for when a test suite hasn't + * loaded properly. + * @package SimpleTest + * @subpackage UnitTester + */ +class BadTestSuite { + private $label; + private $error; + + /** + * Sets the name of the test suite and error message. + * @param string $label Name sent at the start and end + * of the test. + * @access public + */ + function BadTestSuite($label, $error) { + $this->label = $label; + $this->error = $error; + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->label; + } + + /** + * Sends a single error to the reporter. + * @param SimpleReporter $reporter Current test reporter. + * @access public + */ + function run($reporter) { + $reporter->paintGroupStart($this->getLabel(), $this->getSize()); + $reporter->paintFail('Bad TestSuite [' . $this->getLabel() . + '] with error [' . $this->error . ']'); + $reporter->paintGroupEnd($this->getLabel()); + return $reporter->getStatus(); + } + + /** + * Number of contained test cases. Always zero. + * @return integer Total count of cases in the group. + * @access public + */ + function getSize() { + return 0; + } +} +?> diff --git a/3rdparty/simpletest/tidy_parser.php b/3rdparty/simpletest/tidy_parser.php new file mode 100755 index 00000000000..3d8b4b2ac7d --- /dev/null +++ b/3rdparty/simpletest/tidy_parser.php @@ -0,0 +1,382 @@ +free(); + } + + /** + * Frees up any references so as to allow the PHP garbage + * collection from unset() to work. + */ + private function free() { + unset($this->page); + $this->forms = array(); + $this->labels = array(); + } + + /** + * This builder is only available if the 'tidy' extension is loaded. + * @return boolean True if available. + */ + function can() { + return extension_loaded('tidy'); + } + + /** + * Reads the raw content the page using HTML Tidy. + * @param $response SimpleHttpResponse Fetched response. + * @return SimplePage Newly parsed page. + */ + function parse($response) { + $this->page = new SimplePage($response); + $tidied = tidy_parse_string($input = $this->insertGuards($response->getContent()), + array('output-xml' => false, 'wrap' => '0', 'indent' => 'no'), + 'latin1'); + $this->walkTree($tidied->html()); + $this->attachLabels($this->widgets_by_id, $this->labels); + $this->page->setForms($this->forms); + $page = $this->page; + $this->free(); + return $page; + } + + /** + * Stops HTMLTidy stripping content that we wish to preserve. + * @param string The raw html. + * @return string The html with guard tags inserted. + */ + private function insertGuards($html) { + return $this->insertEmptyTagGuards($this->insertTextareaSimpleWhitespaceGuards($html)); + } + + /** + * Removes the extra content added during the parse stage + * in order to preserve content we don't want stripped + * out by HTMLTidy. + * @param string The raw html. + * @return string The html with guard tags removed. + */ + private function stripGuards($html) { + return $this->stripTextareaWhitespaceGuards($this->stripEmptyTagGuards($html)); + } + + /** + * HTML tidy strips out empty tags such as
    -- GitLab From bcbebe390b2689de34f60d124d19c9154d531f5e Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:33:39 +0100 Subject: [PATCH 511/546] Document OC_Response --- lib/response.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/lib/response.php b/lib/response.php index 2fa0a5adcd3..3765f509c18 100644 --- a/lib/response.php +++ b/lib/response.php @@ -12,6 +12,13 @@ class OC_Response { const STATUS_TEMPORARY_REDIRECT = 307; const STATUS_NOT_FOUND = 404; + /** + * @brief Enable response caching by sending correct HTTP headers + * @param $cache_time time to cache the response + * >0 cache time in seconds + * 0 and <0 enable default browser caching + * null cache indefinitly + */ static public function enableCaching($cache_time = null) { if (is_numeric($cache_time)) { header('Pragma: public');// enable caching in IE @@ -30,10 +37,19 @@ class OC_Response { } } + + /** + * @brief disable browser caching + * @see enableCaching with cache_time = 0 + */ static public function disableCaching() { self::enableCaching(0); } + /** + * @brief Set response status + * @param $status a HTTP status code, see also the STATUS constants + */ static public function setStatus($status) { $protocol = $_SERVER['SERVER_PROTOCOL']; switch($status) { @@ -58,11 +74,21 @@ class OC_Response { header($protocol.' '.$status); } + /** + * @brief Send redirect response + * @param $location to redirect to + */ static public function redirect($location) { self::setStatus(self::STATUS_TEMPORARY_REDIRECT); header('Location: '.$location); } + /** + * @brief Set reponse expire time + * @param $expires date-time when the response expires + * string for DateInterval from now + * DateTime object when to expire response + */ static public function setExpiresHeader($expires) { if (is_string($expires) && $expires[0] == 'P') { $interval = $expires; @@ -76,6 +102,11 @@ class OC_Response { header('Expires: '.$expires); } + /** + * Checks and set ETag header, when the request matches sends a + * 'not modified' response + * @param $etag token to use for modification check + */ static public function setETagHeader($etag) { if (empty($etag)) { return; @@ -88,6 +119,11 @@ class OC_Response { header('ETag: '.$etag); } + /** + * Checks and set Last-Modified header, when the request matches sends a + * 'not modified' response + * @param $lastModified time when the reponse was last modified + */ static public function setLastModifiedHeader($lastModified) { if (empty($lastModified)) { return; @@ -106,6 +142,10 @@ class OC_Response { header('Last-Modified: '.$lastModified); } + /** + * @brief Send file as response, checking and setting caching headers + * @param $filepath of file to send + */ static public function sendFile($filepath=null) { $fp = fopen($filepath, 'rb'); if ($fp) { -- GitLab From f54c767d72b8380c181c218f378b25e5fbf75ce7 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:35:31 +0100 Subject: [PATCH 512/546] Fix parameter of OC_Response::sendFile --- lib/response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/response.php b/lib/response.php index 3765f509c18..9edae3603b2 100644 --- a/lib/response.php +++ b/lib/response.php @@ -146,7 +146,7 @@ class OC_Response { * @brief Send file as response, checking and setting caching headers * @param $filepath of file to send */ - static public function sendFile($filepath=null) { + static public function sendFile($filepath) { $fp = fopen($filepath, 'rb'); if ($fp) { self::setLastModifiedHeader(filemtime($filepath)); -- GitLab From 5f3c54922773068091dfe8b40e3b407512ef4cfe Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 16 Feb 2012 19:16:31 +0100 Subject: [PATCH 513/546] Contacts: Add removed app enabled check --- apps/contacts/index.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/contacts/index.php b/apps/contacts/index.php index c5115d16074..0a21ddd04b6 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -10,6 +10,8 @@ require_once('../../lib/base.php'); // Check if we are a user OC_Util::checkLoggedIn(); +OC_Util::checkAppEnabled('contacts'); + // Get active address books. This creates a default one if none exists. $ids = OC_Contacts_Addressbook::activeIds(OC_User::getUser()); $contacts = OC_Contacts_VCard::all($ids); -- GitLab From f47444e1f776912cbf141ec9cc3763110f4e3552 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 16 Feb 2012 19:45:00 +0100 Subject: [PATCH 514/546] Use separate function to make absolute urls --- apps/bookmarks/templates/settings.php | 2 +- apps/calendar/templates/calendar.php | 2 +- apps/calendar/templates/settings.php | 2 +- apps/contacts/templates/index.php | 2 +- apps/contacts/templates/part.contactphoto.php | 2 +- apps/contacts/templates/part.cropphoto.php | 4 ++-- apps/contacts/templates/settings.php | 2 +- apps/media/lib_ampache.php | 2 +- apps/media/templates/settings.php | 2 +- apps/user_openid/appinfo/app.php | 4 ++-- apps/user_openid/user.php | 2 +- core/lostpassword/index.php | 2 +- index.php | 2 +- lib/helper.php | 23 ++++++++++++++----- lib/util.php | 6 ++--- settings/templates/personal.php | 2 +- 16 files changed, 36 insertions(+), 25 deletions(-) diff --git a/apps/bookmarks/templates/settings.php b/apps/bookmarks/templates/settings.php index 97b6b256c09..a985ee9d61b 100644 --- a/apps/bookmarks/templates/settings.php +++ b/apps/bookmarks/templates/settings.php @@ -8,7 +8,7 @@ ?>
    - t('Bookmarklet:');?> t('Add page to ownCloud'); ?> + t('Bookmarklet:');?> t('Add page to ownCloud'); ?>
    t('Drag this to your browser bookmarks and click it, when you want to bookmark a webpage.'); ?>
    diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 2d5cdea4d74..eb82d0d02ad 100755 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -18,7 +18,7 @@ var missing_field_totime = 't('To Time')) ?>'; var missing_field_startsbeforeends = 't('The event ends before it starts')) ?>'; var missing_field_dberror = 't('There was a database fail')) ?>'; - var totalurl = '/calendars'; + var totalurl = '/calendars'; $(document).ready(function() { t('Calendar CalDAV syncing address:');?> -
    +
    diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php index 4c0dfad6177..e81597f23d6 100644 --- a/apps/contacts/templates/index.php +++ b/apps/contacts/templates/index.php @@ -1,5 +1,5 @@
    diff --git a/apps/contacts/templates/part.contactphoto.php b/apps/contacts/templates/part.contactphoto.php index 7d7ab237561..9e3f5876cd1 100644 --- a/apps/contacts/templates/part.contactphoto.php +++ b/apps/contacts/templates/part.contactphoto.php @@ -3,7 +3,7 @@ $id = $_['id']; $wattr = isset($_['width'])?'width="'.$_['width'].'"':''; $hattr = isset($_['height'])?'height="'.$_['height'].'"':''; ?> - src="?id=&refresh=" /> + src="?id=&refresh=" /> diff --git a/apps/contacts/templates/part.cropphoto.php b/apps/contacts/templates/part.cropphoto.php index cb416f0e415..5faa4aa6ac6 100644 --- a/apps/contacts/templates/part.cropphoto.php +++ b/apps/contacts/templates/part.cropphoto.php @@ -38,13 +38,13 @@ OC_Log::write('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_path.', return true; });*/ - + + action=""> diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php index c647e44c25b..8673e4521d9 100644 --- a/apps/contacts/templates/settings.php +++ b/apps/contacts/templates/settings.php @@ -2,6 +2,6 @@
    t('Contacts'); ?>
    t('CardDAV syncing address:'); ?> -
    +
    diff --git a/apps/media/lib_ampache.php b/apps/media/lib_ampache.php index 138b65d1fd7..97c09308607 100644 --- a/apps/media/lib_ampache.php +++ b/apps/media/lib_ampache.php @@ -207,7 +207,7 @@ class OC_MEDIA_AMPACHE{ echo("\t\t$name\n"); echo("\t\t$artistName\n"); echo("\t\t$albumName\n"); - $url=OC_Helper::linkTo('media', 'server/xml.server.php', null, true)."?action=play&song=$id&auth={$_GET['auth']}"; + $url=OC_Helper::linkToAbsolute('media', 'server/xml.server.php')."?action=play&song=$id&auth={$_GET['auth']}"; $url=self::fixXmlString($url); echo("\t\t$url\n"); echo("\t\t\n"); diff --git a/apps/media/templates/settings.php b/apps/media/templates/settings.php index ac813c20850..2907c616cf6 100644 --- a/apps/media/templates/settings.php +++ b/apps/media/templates/settings.php @@ -2,6 +2,6 @@
    Media
    Ampache address: -
    +
    diff --git a/apps/user_openid/appinfo/app.php b/apps/user_openid/appinfo/app.php index 912019a9700..cbcbe544221 100644 --- a/apps/user_openid/appinfo/app.php +++ b/apps/user_openid/appinfo/app.php @@ -14,8 +14,8 @@ if(strpos($_SERVER["REQUEST_URI"],'?') and !strpos($_SERVER["REQUEST_URI"],'=')) } } -OC_Util::addHeader('link',array('rel'=>'openid.server', 'href'=>OC_Helper::linkTo( "user_openid", "user.php", null, true ).'/'.$userName)); -OC_Util::addHeader('link',array('rel'=>'openid.delegate', 'href'=>OC_Helper::linkTo( "user_openid", "user.php", null, true ).'/'.$userName)); +OC_Util::addHeader('link',array('rel'=>'openid.server', 'href'=>OC_Helper::linkToAbsolute( "user_openid", "user.php" ).'/'.$userName)); +OC_Util::addHeader('link',array('rel'=>'openid.delegate', 'href'=>OC_Helper::linkToAbsolute( "user_openid", "user.php" ).'/'.$userName)); OC_APP::registerPersonal('user_openid','settings'); diff --git a/apps/user_openid/user.php b/apps/user_openid/user.php index a267e020507..8fec713aa71 100644 --- a/apps/user_openid/user.php +++ b/apps/user_openid/user.php @@ -43,7 +43,7 @@ if(!OC_User::userExists($USERNAME)){ OC_Log::write('user_openid',$USERNAME.' doesn\'t exist',OC_Log::WARN); $USERNAME=''; } -$IDENTITY=OC_Helper::linkTo( "user_openid", "user.php", null, true ).'/'.$USERNAME; +$IDENTITY=OC_Helper::linkToAbsolute( "user_openid", "user.php" ).'/'.$USERNAME; require_once 'phpmyid.php'; diff --git a/core/lostpassword/index.php b/core/lostpassword/index.php index ede94dab2d7..30caa2d23da 100644 --- a/core/lostpassword/index.php +++ b/core/lostpassword/index.php @@ -16,7 +16,7 @@ if (isset($_POST['user'])) { OC_Preferences::setValue($_POST['user'], 'owncloud', 'lostpassword', $token); $email = OC_Preferences::getValue($_POST['user'], 'settings', 'email', ''); if (!empty($email)) { - $link = OC_Helper::linkTo('core/lostpassword', 'resetpassword.php', null, true).'?user='.$_POST['user'].'&token='.$token; + $link = OC_Helper::linkToAbsolute('core/lostpassword', 'resetpassword.php').'?user='.$_POST['user'].'&token='.$token; $tmpl = new OC_Template('core/lostpassword', 'email'); $tmpl->assign('link', $link); $msg = $tmpl->fetchPage(); diff --git a/index.php b/index.php index 9bd460be353..18ea3022bc5 100644 --- a/index.php +++ b/index.php @@ -44,7 +44,7 @@ if($not_installed) { // Handle WebDAV if($_SERVER['REQUEST_METHOD']=='PROPFIND'){ - header('location: '.OC_Helper::linkTo('files','webdav.php')); + header('location: '.OC_Helper::linkToAbsolute('files','webdav.php')); exit(); } diff --git a/lib/helper.php b/lib/helper.php index 6d3df6d97e7..b1e6d053a19 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -54,12 +54,6 @@ class OC_Helper { } } - if($absolute){ - // Checking if the request was made through HTTPS. The last in line is for IIS - $protocol = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off'); - $urlLinkTo = ($protocol?'https':'http') . '://' . $_SERVER['HTTP_HOST'] . $urlLinkTo; - } - if($redirect_url) return $urlLinkTo.'?redirect_url='.urlencode($_SERVER["REQUEST_URI"]); else @@ -67,6 +61,23 @@ class OC_Helper { } + /** + * @brief Creates an absolute url + * @param $app app + * @param $file file + * @param $redirect_url redirect_url variable is appended to the URL + * @returns the url + * + * Returns a absolute url to the given app and file. + */ + public static function linkToAbsolute( $app, $file, $redirect_url=NULL ) { + $urlLinkTo = self::linkTo( $app, $file, $redirect_url ); + // Checking if the request was made through HTTPS. The last in line is for IIS + $protocol = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off'); + $urlLinkTo = ($protocol?'https':'http') . '://' . $_SERVER['HTTP_HOST'] . $urlLinkTo; + return $urlLinkTo; + } + /** * @brief Creates path to an image * @param $app app diff --git a/lib/util.php b/lib/util.php index 43fb4413f04..4ba04fff3e8 100644 --- a/lib/util.php +++ b/lib/util.php @@ -248,7 +248,7 @@ class OC_Util { */ public static function checkAppEnabled($app){ if( !OC_App::isEnabled($app)){ - header( 'Location: '.OC_Helper::linkTo( '', 'index.php' , true)); + header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php' )); exit(); } } @@ -259,7 +259,7 @@ class OC_Util { public static function checkLoggedIn(){ // Check if we are a user if( !OC_User::isLoggedIn()){ - header( 'Location: '.OC_Helper::linkTo( '', 'index.php' , true)); + header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php' )); exit(); } } @@ -271,7 +271,7 @@ class OC_Util { // Check if we are a user self::checkLoggedIn(); if( !OC_Group::inGroup( OC_User::getUser(), 'admin' )){ - header( 'Location: '.OC_Helper::linkTo( '', 'index.php' , true)); + header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php' )); exit(); } } diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 80d2cb0a86f..57731d979d9 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -41,7 +41,7 @@

    WebDAV -
    +
    t('use this address to connect to your ownCloud in your file manager');?>

    -- GitLab From e8b69d45a3afd9633b997eb178e159f9f97f4766 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 16 Feb 2012 19:48:20 +0100 Subject: [PATCH 515/546] Fixup use of OC_Helper::linkTo function --- apps/calendar/lib/search.php | 2 +- apps/contacts/lib/search.php | 2 +- apps/gallery/appinfo/app.php | 2 +- apps/media/lib_media.php | 6 +++--- files/index.php | 6 +++--- lib/app.php | 2 +- lib/search/provider/file.php | 10 +++++----- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php index 425c93c7338..0016751a66a 100644 --- a/apps/calendar/lib/search.php +++ b/apps/calendar/lib/search.php @@ -36,7 +36,7 @@ class OC_Search_Provider_Calendar extends OC_Search_Provider{ }else{ $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); } - $link = OC_Helper::linkTo('apps/calendar', 'index.php?showevent='.urlencode($object['id'])); + $link = OC_Helper::linkTo('calendar', 'index.php').'?showevent='.urlencode($object['id']); $results[]=new OC_Search_Result($object['summary'],$info, $link,$l->t('Cal.'));//$name,$text,$link,$type } } diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php index 97638821007..5aad6a25f09 100644 --- a/apps/contacts/lib/search.php +++ b/apps/contacts/lib/search.php @@ -18,7 +18,7 @@ class OC_Search_Provider_Contacts extends OC_Search_Provider{ $vcards = OC_Contacts_VCard::all($addressbook['id']); foreach($vcards as $vcard){ if(substr_count(strtolower($vcard['fullname']), strtolower($query)) > 0){ - $link = OC_Helper::linkTo('apps/contacts', 'index.php?id='.urlencode($vcard['id'])); + $link = OC_Helper::linkTo('contacts', 'index.php').'?id='.urlencode($vcard['id']); $results[]=new OC_Search_Result($vcard['fullname'],'', $link,$l->t('Contact'));//$name,$text,$link,$type } } diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php index da872274497..b8de32ea587 100644 --- a/apps/gallery/appinfo/app.php +++ b/apps/gallery/appinfo/app.php @@ -46,7 +46,7 @@ OC_App::addNavigationEntry( array( $result = $stmt->execute(array(OC_User::getUser(),'%'.$query.'%')); $results=array(); while($row=$result->fetchRow()){ - $results[]=new OC_Search_Result($row['album_name'],'',OC_Helper::linkTo('apps/gallery', 'index.php?view='.$row['album_name']),'Galleries'); + $results[]=new OC_Search_Result($row['album_name'],'',OC_Helper::linkTo('gallery', 'index.php').'?view='.$row['album_name'],'Galleries'); } return $results; } diff --git a/apps/media/lib_media.php b/apps/media/lib_media.php index 0ade0e593dc..1bcd0f08c80 100644 --- a/apps/media/lib_media.php +++ b/apps/media/lib_media.php @@ -89,18 +89,18 @@ class OC_MediaSearchProvider extends OC_Search_Provider{ $songs=OC_MEDIA_COLLECTION::getSongs(0,0,$query); $results=array(); foreach($artists as $artist){ - $results[]=new OC_Search_Result($artist['artist_name'],'',OC_Helper::linkTo( 'apps/media', 'index.php#artist='.urlencode($artist['artist_name']) ),'Music'); + $results[]=new OC_Search_Result($artist['artist_name'],'',OC_Helper::linkTo( 'media', 'index.php').'#artist='.urlencode($artist['artist_name']),'Music'); } foreach($albums as $album){ $artist=OC_MEDIA_COLLECTION::getArtistName($album['album_artist']); - $results[]=new OC_Search_Result($album['album_name'],'by '.$artist,OC_Helper::linkTo( 'apps/media', 'index.php#artist='.urlencode($artist).'&album='.urlencode($album['album_name']) ),'Music'); + $results[]=new OC_Search_Result($album['album_name'],'by '.$artist,OC_Helper::linkTo( 'media', 'index.php').'#artist='.urlencode($artist).'&album='.urlencode($album['album_name']),'Music'); } foreach($songs as $song){ $minutes=floor($song['song_length']/60); $secconds=$song['song_length']%60; $artist=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']); $album=OC_MEDIA_COLLECTION::getalbumName($song['song_album']); - $results[]=new OC_Search_Result($song['song_name'],"by $artist, in $album $minutes:$secconds",OC_Helper::linkTo( 'apps/media', 'index.php#artist='.urlencode($artist).'&album='.urlencode($album).'&song='.urlencode($song['song_name']) ),'Music'); + $results[]=new OC_Search_Result($song['song_name'],"by $artist, in $album $minutes:$secconds",OC_Helper::linkTo( 'media', 'index.php').'#artist='.urlencode($artist).'&album='.urlencode($album).'&song='.urlencode($song['song_name']),'Music'); } return $results; } diff --git a/files/index.php b/files/index.php index f166790ba9c..a29d3fb7e1e 100644 --- a/files/index.php +++ b/files/index.php @@ -76,11 +76,11 @@ foreach( explode( "/", $dir ) as $i ){ // make breadcrumb und filelist markup $list = new OC_Template( "files", "part.list", "" ); $list->assign( "files", $files ); -$list->assign( "baseURL", OC_Helper::linkTo("files", "index.php?dir=")); -$list->assign( "downloadURL", OC_Helper::linkTo("files", "download.php?file=")); +$list->assign( "baseURL", OC_Helper::linkTo("files", "index.php")."?dir="); +$list->assign( "downloadURL", OC_Helper::linkTo("files", "download.php")."?file="); $breadcrumbNav = new OC_Template( "files", "part.breadcrumb", "" ); $breadcrumbNav->assign( "breadcrumb", $breadcrumb ); -$breadcrumbNav->assign( "baseURL", OC_Helper::linkTo("files", "index.php?dir=")); +$breadcrumbNav->assign( "baseURL", OC_Helper::linkTo("files", "index.php")."?dir="); $upload_max_filesize = OC_Helper::computerFileSize(ini_get('upload_max_filesize')); $post_max_size = OC_Helper::computerFileSize(ini_get('post_max_size')); diff --git a/lib/app.php b/lib/app.php index 22d18b17eec..1879a89cee3 100644 --- a/lib/app.php +++ b/lib/app.php @@ -230,7 +230,7 @@ class OC_App{ // admin users menu $settings[] = array( "id" => "core_users", "order" => 2, "href" => OC_Helper::linkTo( "settings", "users.php" ), "name" => $l->t("Users"), "icon" => OC_Helper::imagePath( "settings", "users.svg" )); // admin apps menu - $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php?installed" ), "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); + $settings[] = array( "id" => "core_apps", "order" => 3, "href" => OC_Helper::linkTo( "settings", "apps.php" ).'?installed', "name" => $l->t("Apps"), "icon" => OC_Helper::imagePath( "settings", "apps.svg" )); // admin log menu $settings[] = array( "id" => "core_log", "order" => 4, "href" => OC_Helper::linkTo( "settings", "log.php" ), "name" => $l->t("Log"), "icon" => OC_Helper::imagePath( "settings", "log.svg" )); diff --git a/lib/search/provider/file.php b/lib/search/provider/file.php index c3dc2942aef..34803c75aeb 100644 --- a/lib/search/provider/file.php +++ b/lib/search/provider/file.php @@ -7,7 +7,7 @@ class OC_Search_Provider_File extends OC_Search_Provider{ foreach($files as $fileData){ $file=$fileData['path']; if($fileData['mime']=='httpd/unix-directory'){ - $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'index.php?dir='.$file ),'Files'); + $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'index.php' ).'?dir='.$file,'Files'); }else{ $mime=$fileData['mime']; $mimeBase=$fileData['mimepart']; @@ -15,16 +15,16 @@ class OC_Search_Provider_File extends OC_Search_Provider{ case 'audio': break; case 'text': - $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php?file='.$file ),'Text'); + $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php' ).'?file='.$file,'Text'); break; case 'image': - $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php?file='.$file ),'Images'); + $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php' ).'?file='.$file,'Images'); break; default: if($mime=='application/xml'){ - $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php?file='.$file ),'Text'); + $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php' ).'?file='.$file,'Text'); }else{ - $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php?file='.$file ),'Files'); + $results[]=new OC_Search_Result(basename($file),'',OC_Helper::linkTo( 'files', 'download.php' ).'?file='.$file,'Files'); } } } -- GitLab From dab553147470a78dfbe0f220908e35f639d956f6 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Thu, 16 Feb 2012 21:01:13 +0100 Subject: [PATCH 516/546] Bookmarks: Fix image urls in bookmarks.js --- apps/bookmarks/js/bookmarks.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js index 77f767cdb81..fadbbd5513a 100644 --- a/apps/bookmarks/js/bookmarks.js +++ b/apps/bookmarks/js/bookmarks.js @@ -85,7 +85,14 @@ function addOrEditBookmark(event) { $('.bookmarks_add').children('p').children('.bookmarks_input').val(''); $('.bookmarks_list').prepend( '
    ' + - '

     

    ' + + '

    ' + + '' + + '' + + ' ' + + '' + + '' + + '' + + '

    ' + '

    ' + title + '

    ' + '

    ' + tagshtml + '

    ' + '

    ' + url + '

    ' + @@ -154,8 +161,17 @@ function updateBookmarksList(bookmark) { } $('.bookmarks_list').append( '
    ' + - '

     

    ' + - '

    ' + encodeEntities(bookmark.title) + '

    ' + + '

    ' + + '' + + '' + + ' ' + + '' + + '' + + '' + + '

    ' + + '

    '+ + '' + encodeEntities(bookmark.title) + '' + + '

    ' + '

    ' + encodeEntities(bookmark.url) + '

    ' + '
    ' ); -- GitLab From a33b757b192384e612f278feeb30d998b3816a4d Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:36:55 +0100 Subject: [PATCH 517/546] Calendar: Add default repeat values when editing a non-repeating event --- apps/calendar/ajax/editeventform.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/calendar/ajax/editeventform.php b/apps/calendar/ajax/editeventform.php index 9ae3ffa8d94..19f6a80a167 100644 --- a/apps/calendar/ajax/editeventform.php +++ b/apps/calendar/ajax/editeventform.php @@ -243,6 +243,16 @@ if($repeat['repeat'] != 'doesnotrepeat'){ $tmpl->assign('repeat_bymonth', $repeat['bymonth']); $tmpl->assign('repeat_byweekno', $repeat['byweekno']); } +else { + $tmpl->assign('repeat_month', 'monthday'); + $tmpl->assign('repeat_weekdays', array()); + $tmpl->assign('repeat_interval', 1); + $tmpl->assign('repeat_end', 'never'); + $tmpl->assign('repeat_count', '10'); + $tmpl->assign('repeat_weekofmonth', 'auto'); + $tmpl->assign('repeat_date', ''); + $tmpl->assign('repeat_year', 'bydate'); +} $tmpl->printpage(); -?> \ No newline at end of file +?> -- GitLab From 539fd7240c463d71ea885ca1c2a1eb292a7cceac Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:39:54 +0100 Subject: [PATCH 518/546] Calendar: optimize sending calendar events, also enabled caching of result --- apps/calendar/ajax/events.php | 30 +++++++++++++++++++----------- apps/calendar/lib/calendar.php | 1 + 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php index dd593ddec99..7734129bd95 100755 --- a/apps/calendar/ajax/events.php +++ b/apps/calendar/ajax/events.php @@ -9,7 +9,8 @@ require_once ('../../../lib/base.php'); require_once('../../../3rdparty/when/When.php'); -function addoutput($event, $vevent, $return_event){ +function create_return_event($event, $vevent){ + $return_event = array(); $return_event['id'] = (int)$event['id']; $return_event['title'] = htmlspecialchars($event['summary']); $return_event['description'] = isset($vevent->DESCRIPTION)?htmlspecialchars($vevent->DESCRIPTION->value):''; @@ -29,15 +30,21 @@ OC_JSON::checkAppEnabled('calendar'); $start = DateTime::createFromFormat('U', $_GET['start']); $end = DateTime::createFromFormat('U', $_GET['end']); +$calendar = OC_Calendar_App::getCalendar($_GET['calendar_id']); +OC_Response::enableCaching(0); +OC_Response::setETagHeader($calendar['ctag']); + $events = OC_Calendar_Object::allInPeriod($_GET['calendar_id'], $start, $end); $user_timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', date_default_timezone_get()); $return = array(); foreach($events as $event){ $object = OC_VObject::parse($event['calendardata']); $vevent = $object->VEVENT; + + $return_event = create_return_event($event, $vevent); + $dtstart = $vevent->DTSTART; $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); - $return_event = array(); $start_dt = $dtstart->getDateTime(); $end_dt = $dtend->getDateTime(); if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){ @@ -47,13 +54,17 @@ foreach($events as $event){ $start_dt->setTimezone(new DateTimeZone($user_timezone)); $end_dt->setTimezone(new DateTimeZone($user_timezone)); } + //Repeating Events if($event['repeating'] == 1){ $duration = (double) $end_dt->format('U') - (double) $start_dt->format('U'); $r = new When(); - $r->recur((string) $start_dt->format('Ymd\THis'))->rrule((string) $vevent->RRULE); + $r->recur($start_dt)->rrule((string) $vevent->RRULE); while($result = $r->next()){ - if($result->format('U') > $_GET['end']){ + if($result < $start){ + continue; + } + if($result > $end){ break; } if($return_event['allDay'] == true){ @@ -63,22 +74,19 @@ foreach($events as $event){ $return_event['start'] = $result->format('Y-m-d H:i:s'); $return_event['end'] = date('Y-m-d H:i:s', $result->format('U') + $duration); } - $return[] = addoutput($event, $vevent, $return_event); + $return[] = $return_event; } }else{ - $return_event = array(); - if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){ - $return_event['allDay'] = true; + if($return_event['allDay'] == true){ $return_event['start'] = $start_dt->format('Y-m-d'); $end_dt->modify('-1 sec'); $return_event['end'] = $end_dt->format('Y-m-d'); }else{ $return_event['start'] = $start_dt->format('Y-m-d H:i:s'); $return_event['end'] = $end_dt->format('Y-m-d H:i:s'); - $return_event['allDay'] = false; } - $return[] = addoutput($event, $vevent, $return_event); + $return[] = $return_event; } } OC_JSON::encodedPrint($return); -?> \ No newline at end of file +?> diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php index 5e272991f20..679649582d8 100644 --- a/apps/calendar/lib/calendar.php +++ b/apps/calendar/lib/calendar.php @@ -246,6 +246,7 @@ class OC_Calendar_Calendar{ 'backgroundColor' => '#'.$calendar['calendarcolor'], 'borderColor' => '#888', 'textColor' => 'black', + 'cache' => true, ); } } -- GitLab From 6bbd67c3c693ab3cc440be7342b3cc8b88806a18 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:40:57 +0100 Subject: [PATCH 519/546] Calendar: only update default view when it really changed --- apps/calendar/js/calendar.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index 6f1f52eafa1..517d2ce128b 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -689,7 +689,10 @@ $(document).ready(function(){ allDayText: allDayText, viewDisplay: function(view) { $('#datecontrol_date').html(view.title); - $.get(OC.filePath('calendar', 'ajax', 'changeview.php') + "?v="+view.name); + if (view.name != defaultView) { + $.get(OC.filePath('calendar', 'ajax', 'changeview.php') + "?v="+view.name); + defaultView = view.name; + } Calendar.UI.setViewActive(view.name); if (view.name == 'agendaWeek') { $('#calendar_holder').fullCalendar('option', 'aspectRatio', 0.1); -- GitLab From bd7227bb934c6d618c46eb818c8ce0f6ecb64e29 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:42:56 +0100 Subject: [PATCH 520/546] Spelling fix hint text --- lib/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config.php b/lib/config.php index 8d03271b3ea..ad1cd18fa15 100644 --- a/lib/config.php +++ b/lib/config.php @@ -174,7 +174,7 @@ class OC_Config{ $result=@file_put_contents( OC::$SERVERROOT."/config/config.php", $content ); if(!$result) { $tmpl = new OC_Template( '', 'error', 'guest' ); - $tmpl->assign('errors',array(1=>array('error'=>"Can't write into config directory 'config'",'hint'=>"You can usually fix this by giving the webserver use write access to the config directory in owncloud"))); + $tmpl->assign('errors',array(1=>array('error'=>"Can't write into config directory 'config'",'hint'=>"You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); $tmpl->printPage(); exit; } -- GitLab From 45cff7b7378ff351158d9d93b879dcfc156171aa Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 21:59:43 +0100 Subject: [PATCH 521/546] Move storing "last updated at" time to the app config This way the config.php file is not changed every time you go to the personal page. Step to make it possible to have a read-only config.php most of the time --- lib/setup.php | 5 +++-- lib/updater.php | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/setup.php b/lib/setup.php index eb32e84713f..3e46a3dcc9a 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -77,8 +77,6 @@ class OC_Setup { OC_Config::setValue('datadirectory', $datadir); OC_Config::setValue('dbtype', $dbtype); OC_Config::setValue('version',implode('.',OC_Util::getVersion())); - OC_Config::setValue('installedat',microtime(true)); - OC_Config::setValue('lastupdatedat',microtime(true)); if($dbtype == 'mysql') { $dbuser = $options['dbuser']; $dbpass = $options['dbpass']; @@ -224,6 +222,9 @@ class OC_Setup { } if(count($error) == 0) { + OC_Appconfig::setValue('core', 'installedat',microtime(true)); + OC_Appconfig::setValue('core', 'lastupdatedat',microtime(true)); + //create the user and group OC_User::createUser($username, $password); OC_Group::createGroup('admin'); diff --git a/lib/updater.php b/lib/updater.php index cc4a4602539..57623797ae5 100644 --- a/lib/updater.php +++ b/lib/updater.php @@ -29,12 +29,12 @@ class OC_Updater{ * Check if a new version is available */ public static function check(){ - OC_Config::setValue('lastupdatedat',microtime(true)); + OC_Appconfig::setValue('core', 'lastupdatedat',microtime(true)); $updaterurl='http://apps.owncloud.com/updater.php'; $version=OC_Util::getVersion(); - $version['installed']=OC_Config::getValue( "installedat"); - $version['updated']=OC_Config::getValue( "lastupdatedat"); + $version['installed']=OC_Config::getValue('installedat'); + $version['updated']=OC_Appconfig::getValue('core', 'lastupdatedat', OC_Config::getValue( 'lastupdatedat')); $version['updatechannel']='stable'; $versionstring=implode('x',$version); -- GitLab From 1fa05894d51235a46cf67812227d5e8363f87d54 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 17 Feb 2012 22:01:53 +0100 Subject: [PATCH 522/546] Move config.php writable test to update path This should make it possible to use owncloud with a read-only config.php --- lib/base.php | 7 +++++++ lib/util.php | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/base.php b/lib/base.php index 8f169a5732f..880645ff79d 100644 --- a/lib/base.php +++ b/lib/base.php @@ -171,6 +171,13 @@ class OC{ echo 'Error while upgrading the database'; die(); } + if(file_exists(OC::$SERVERROOT."/config/config.php") and !is_writable(OC::$SERVERROOT."/config/config.php")) { + $tmpl = new OC_Template( '', 'error', 'guest' ); + $tmpl->assign('errors',array(1=>array('error'=>"Can't write into config directory 'config'",'hint'=>"You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); + $tmpl->printPage(); + exit; + } + OC_Config::setValue('version',implode('.',OC_Util::getVersion())); } diff --git a/lib/util.php b/lib/util.php index 4ba04fff3e8..ee32d31bfd0 100644 --- a/lib/util.php +++ b/lib/util.php @@ -226,10 +226,6 @@ class OC_Util { $errors[]=array('error'=>'PHP module ctype is not installed.
    ','hint'=>'Please ask your server administrator to install the module.'); } - if(file_exists(OC::$SERVERROOT."/config/config.php") and !is_writable(OC::$SERVERROOT."/config/config.php")){ - $errors[]=array('error'=>"Can't write into config directory 'config'",'hint'=>"You can usually fix this by giving the webserver use write access to the config directory in owncloud"); - } - return $errors; } -- GitLab From 6f1ed85f0b6a7e675951a587f1308211b698a6d5 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 17 Feb 2012 21:56:20 -0500 Subject: [PATCH 523/546] Temporary fix for sharing files --- apps/files_sharing/lib_share.php | 15 +++++---- lib/filestorage/google.php | 55 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 lib/filestorage/google.php diff --git a/apps/files_sharing/lib_share.php b/apps/files_sharing/lib_share.php index 049a74278b3..42739bdfba9 100644 --- a/apps/files_sharing/lib_share.php +++ b/apps/files_sharing/lib_share.php @@ -88,12 +88,15 @@ class OC_Share { $uid = $uid."@".$gid; } $query->execute(array($uid_owner, $uid, $source, $target, $permissions)); - // Clear the folder size cache for the 'Shared' folder -// $clearFolderSize = OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); -// $clearFolderSize->execute(array($sharedFolder)); - // Emit post_create and post_write hooks to notify of a new file in the user's filesystem - OC_Hook::emit("OC_Filesystem", "post_create", array('path' => $target)); - OC_Hook::emit("OC_Filesystem", "post_write", array('path' => $target)); + // Add file to filesystem cache + $userDirectory = "/".OC_User::getUser()."/files"; + $data = OC_Filecache::get(substr($source, strlen($userDirectory))); + $parentQuery = OC_DB::prepare('SELECT id FROM *PREFIX*fscache WHERE path=?'); + $parentResult = $parentQuery->execute(array($sharedFolder))->fetchRow(); + $parent = $parentResult['id']; + $is_writeable = $permissions & OC_Share::WRITE; + $cacheQuery = OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, size, mtime, ctime, mimetype, mimepart, user, writable) VALUES(?,?,?,?,?,?,?,?,?,?)'); + $cacheQuery->execute(array($parent, basename($target), $target, $data['size'], $data['mtime'], $data['ctime'], $data['mimetype'], dirname($data['mimetype']), $uid, $is_writeable)); } } } diff --git a/lib/filestorage/google.php b/lib/filestorage/google.php new file mode 100644 index 00000000000..fc271f4e4ba --- /dev/null +++ b/lib/filestorage/google.php @@ -0,0 +1,55 @@ +. +*/ + +class OC_Filestorage_Google extends OC_Filestorage_Common { + + private $auth; + + public function __construct($parameters) { + + } + + private function connect() { + + } + public function mkdir($path){} + public function rmdir($path){} + public function opendir($path){} + public function is_dir($path){} + public function is_file($path){} + public function stat($path){} + public function filetype($path){} + public function is_readable($path){} + public function is_writable($path){} + public function file_exists($path){} + public function unlink($path){} + public function rename($path1,$path2){} + public function fopen($path,$mode){} + public function toTmpFile($path){} + public function fromTmpFile($tmpPath,$path){} + public function fromUploadedFile($tmpPath,$path){} + public function getMimeType($path){} + public function hash($type,$path,$raw){} + public function free_space($path){} + public function search($query){} + public function getLocalFile($path){} +} \ No newline at end of file -- GitLab From 71aa36c3f16942cd35f550253b892f5be4116784 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 16 Feb 2012 23:24:23 +0100 Subject: [PATCH 524/546] ETags must be quoted. --- lib/response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/response.php b/lib/response.php index 9edae3603b2..a75135c0176 100644 --- a/lib/response.php +++ b/lib/response.php @@ -116,7 +116,7 @@ class OC_Response { self::setStatus(self::STATUS_NOT_MODIFIED); exit; } - header('ETag: '.$etag); + header('ETag: "'.$etag.'"'); } /** -- GitLab From 96612c506e08ce6b2fb39425c73f0a8d81a4cad8 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 17 Feb 2012 09:35:18 +0100 Subject: [PATCH 525/546] Removed obsolete commented code and made minor speed improvements. Added stub function for loading categories. --- apps/contacts/js/contacts.js | 63 +++++++----------------- apps/contacts/templates/part.contact.php | 53 -------------------- 2 files changed, 17 insertions(+), 99 deletions(-) diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index 30793625746..c9d1dc30f03 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -117,7 +117,7 @@ Contacts={ $('#carddav_url_close').show(); }, messageBox:function(title, msg) { - if(msg.toLowerCase().indexOf('auth') > 0) { + if(msg.toLowerCase().indexOf('auth') != -1) { // fugly hack, I know alert(msg); } @@ -335,17 +335,6 @@ Contacts={ // Load first in list. if($('#contacts li').length > 0) { Contacts.UI.Card.update(); - /* - var firstid = $('#contacts li:first-child').data('id'); - console.log('trying to load: ' + firstid); - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':firstid},function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data); - } - else{ - Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); - } - });*/ } else { // load intro page $.getJSON('ajax/loadintro.php',{},function(jsondata){ @@ -374,6 +363,7 @@ Contacts={ $('#rightcontent').data('id',this.id); //console.log('loaded: ' + this.data.FN[0]['value']); this.populateNameFields(); + this.loadCategories(); this.loadPhoto(); this.loadMails(); this.loadPhones(); @@ -455,9 +445,6 @@ Contacts={ this.fullname += ', ' + this.honsuf; } $('#n').html(this.fullname); - //$('.jecEditableOption').attr('title', 'Custom'); - //$('.jecEditableOption').text(this.fn); - //$('.jecEditableOption').attr('value', 0); $('#fn_select option').remove(); $('#fn_select').combobox('value', this.fn); var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; @@ -466,17 +453,16 @@ Contacts={ .append($('') .text(value)); }); - /*$('#full').text(this.fullname); - $('#short').text(this.givname + ' ' + this.famname); - $('#reverse').text(this.famname + ' ' + this.givname); - $('#reverse_comma').text(this.famname + ', ' + this.givname);*/ $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']); $('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']); $('#contact_identity').show(); }, + loadCategories:function(){ + if(this.data.CATEGORIES) { + // + } + }, editNew:function(){ // add a new contact - //Contacts.UI.notImplemented(); - //return false; this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; $.getJSON('ajax/newcontact.php',{},function(jsondata){ if(jsondata.status == 'success'){ @@ -713,12 +699,6 @@ Contacts={ .text(value)); }); - /*$('#short').text(n[1] + ' ' + n[0]); - $('#full').text(this.fullname); - $('#reverse').text(n[0] + ' ' + n[1]); - $('#reverse_comma').text(n[0] + ', ' + n[1]);*/ - //$('#n').html(full); - //$('#fn').val(0); if(this.id == '') { var aid = $(dlg).find('#aid').val(); Contacts.UI.Card.add(n.join(';'), $('#short').text(), aid); @@ -889,21 +869,22 @@ Contacts={ }, loadPhoto:function(){ if(this.data.PHOTO) { + $.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){ + if(jsondata.status == 'success'){ + //alert(jsondata.data.page); + $('#contacts_details_photo_wrapper').html(jsondata.data.page); + } + else{ + Contacts.UI.messageBox(jsondata.data.message); + } + }); $('#file_upload_form').show(); $('#contacts_propertymenu a[data-type="PHOTO"]').parent().hide(); } else { + $('#contacts_details_photo_wrapper').empty(); $('#file_upload_form').hide(); $('#contacts_propertymenu a[data-type="PHOTO"]').parent().show(); } - $.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - $('#contacts_details_photo_wrapper').html(jsondata.data.page); - } - else{ - Contacts.UI.messageBox(jsondata.data.message); - } - }); }, editPhoto:function(id, tmp_path){ //alert('editPhoto: ' + tmp_path); @@ -1143,13 +1124,6 @@ $(document).ready(function(){ return false; }); - /** - * Open blank form to add new contact. - * FIXME: Load the same page but only show name data and popup the name edit dialog. - * On save load the page again with an id and show all fields. - * NOTE: Or: Load the full page and popup name dialog modal. On success set the newly aquired ID, on - * Cancel or failure give appropriate message and show ... something else :-P - */ $('#contacts_newcontact').click(function(){ Contacts.UI.Card.editNew(); }); @@ -1175,9 +1149,6 @@ $(document).ready(function(){ return false; }); - /** - * Delete currently selected contact TODO: and clear page - */ $('#contacts_deletecard').live('click',function(){ Contacts.UI.Card.delete(); }); diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php index 408b595dc95..5be20964f4b 100644 --- a/apps/contacts/templates/part.contact.php +++ b/apps/contacts/templates/part.contact.php @@ -70,14 +70,6 @@ $id = isset($_['id']) ? $_['id'] : ''; - -
  • - /> - -
  • -
    @@ -93,17 +85,6 @@ $id = isset($_['id']) ? $_['id'] : ''; - -
  • - /> - - -
  • -
    @@ -118,40 +99,6 @@ $id = isset($_['id']) ? $_['id'] : '';
      - -
      -
      - - - - 0) { - //array_walk($address['parameters'], ) Nah, this wont work... - $translated = array(); - foreach($address['parameters'] as $type) { - $translated[] = $l->t(ucwords(strtolower($type))); - } - echo implode('/', $translated); - } - ?> -
      -
      -
        - '.$adr[0].'':''); - $tmp .= ($adr[1]?'
      • '.$adr[1].'
      • ':''); - $tmp .= ($adr[2]?'
      • '.$adr[2].'
      • ':''); - $tmp .= ($adr[3]||$adr[5]?'
      • '.$adr[5].' '.$adr[3].'
      • ':''); - $tmp .= ($adr[4]?'
      • '.$adr[4].'
      • ':''); - $tmp .= ($adr[6]?'
      • '.$adr[6].'
      • ':''); - echo $tmp; - - ?> -
      -
      -
      -
      -- GitLab From 868cf6bb836c136d2ad881bf99710404c74507c3 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Fri, 17 Feb 2012 19:04:12 +0100 Subject: [PATCH 526/546] Avoid errors from missing GD library. --- apps/contacts/photo.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php index 8dfbcb6fb10..298f1215e3c 100644 --- a/apps/contacts/photo.php +++ b/apps/contacts/photo.php @@ -13,10 +13,19 @@ require_once('../../lib/base.php'); OC_Util::checkLoggedIn(); OC_Util::checkAppEnabled('contacts'); +function getStandardImage(){ + OC_Response::setExpiresHeader('P10D'); + OC_Response::enableCaching(); + OC_Response::redirect(OC_Helper::imagePath('contacts', 'person_large.png')); +} + $id = $_GET['id']; $contact = OC_Contacts_App::getContactVCard($id); $image = new OC_Image(); +if(!$image) { + getStandardImage(); +} // invalid vcard if( is_null($contact)) { OC_Log::write('contacts','photo.php. The VCard for ID '.$id.' is not RFC compatible',OC_Log::ERROR); @@ -45,7 +54,8 @@ if( is_null($contact)) { } if (!$image->valid()) { // Not found :-( - $image->loadFromFile('img/person_large.png'); + getStandardImage(); + //$image->loadFromFile('img/person_large.png'); } header('Content-Type: '.$image->mimeType()); $image->show(); -- GitLab From 2ee2f87efee630d9f85c8fe11c783901c469addf Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sat, 18 Feb 2012 11:42:58 +0100 Subject: [PATCH 527/546] Strip tags on address on client side. --- apps/contacts/js/contacts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index c9d1dc30f03..d33f983a429 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -815,7 +815,7 @@ Contacts={ checksum = Contacts.UI.checksumFor(obj); container = Contacts.UI.propertyContainerFor(obj); } - var adr = new Array($(dlg).find('#adr_pobox').val(),$(dlg).find('#adr_extended').val(),$(dlg).find('#adr_street').val(),$(dlg).find('#adr_city').val(),$(dlg).find('#adr_region').val(),$(dlg).find('#adr_zipcode').val(),$(dlg).find('#adr_country').val()); + var adr = new Array($(dlg).find('#adr_pobox').val().strip_tags(),$(dlg).find('#adr_extended').val().strip_tags(),$(dlg).find('#adr_street').val().strip_tags(),$(dlg).find('#adr_city').val().strip_tags(),$(dlg).find('#adr_region').val().strip_tags(),$(dlg).find('#adr_zipcode').val().strip_tags(),$(dlg).find('#adr_country').val().strip_tags()); $(container).find('.adr').val(adr.join(';')); $(container).find('.adr_type').val($(dlg).find('#adr_type').val()); $(container).find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); -- GitLab From 71a2241aee6f5f372b43fe977e494fea8a98d9cd Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Sat, 18 Feb 2012 23:53:10 +0000 Subject: [PATCH 528/546] Fixed call to OC_User. Thanks Burillo on IRC --- apps/contacts/lib/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index 016bd2b791a..ff348403a9b 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -53,7 +53,7 @@ class OC_Contacts_App { OC_Log::write('contacts', 'Addressbook not found: '. $id, OC_Log::ERROR); } else { - OC_Log::write('contacts', 'Addressbook('.$id.') is not from '.$OC_User::getUser(), OC_Log::ERROR); + OC_Log::write('contacts', 'Addressbook('.$id.') is not from '.OC_User::getUser(), OC_Log::ERROR); } OC_JSON::error(array('data' => array( 'message' => self::$l10n->t('This is not your addressbook.')))); // Same here (as with the contact error). Could this error be improved? exit(); -- GitLab From 87627c7a503f10875d8fa0171624b6e586d1cc7b Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Sat, 18 Feb 2012 19:30:35 -0500 Subject: [PATCH 529/546] Fix overwriting of internal sharing for shared folders - bug oc-260 --- apps/files_sharing/ajax/getitem.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php index 51fda6aed40..ba01adffb9a 100644 --- a/apps/files_sharing/ajax/getitem.php +++ b/apps/files_sharing/ajax/getitem.php @@ -8,6 +8,7 @@ require_once('../lib_share.php'); $userDirectory = "/".OC_User::getUser()."/files"; $source = $userDirectory.$_GET['source']; $path = $source; +$users = array(); if ($users = OC_Share::getMySharedItem($source)) { for ($i = 0; $i < count($users); $i++) { if ($users[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) { @@ -19,7 +20,6 @@ $source = dirname($source); while ($source != "" && $source != "/" && $source != "." && $source != $userDirectory) { if ($values = OC_Share::getMySharedItem($source)) { $values = array_values($values); - $users = array(); $parentUsers = array(); for ($i = 0; $i < count($values); $i++) { if ($values[$i]['uid_shared_with'] == OC_Share::PUBLICLINK) { -- GitLab From 9d2379742b92b223dd2cc171e6a155533cabc889 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Sun, 19 Feb 2012 21:24:53 +0100 Subject: [PATCH 530/546] apps/calendar: update ctag after deleteFromDAVData Without this clients won't see the update because they compare ctags before fetching the actual calendar to reduce traffic. Signed-off-by: Florian Pritz --- apps/calendar/lib/object.php | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php index cbb1badf802..230c610d35a 100644 --- a/apps/calendar/lib/object.php +++ b/apps/calendar/lib/object.php @@ -194,6 +194,7 @@ class OC_Calendar_Object{ public static function deleteFromDAVData($cid,$uri){ $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri=?' ); $stmt->execute(array($cid,$uri)); + OC_Calendar_Calendar::touchCalendar($cid); return true; } -- GitLab From 490c9db15da89797eea5c3e30fc9a0790bd60b32 Mon Sep 17 00:00:00 2001 From: Alessandro Cosentino Date: Sun, 19 Feb 2012 20:18:27 -0500 Subject: [PATCH 531/546] Added bookmarklet for browser. Inspired by Google Bookmarks --- apps/bookmarks/addBm.php | 3 ++- apps/bookmarks/css/bookmarks.css | 15 ++++++++++++++- apps/bookmarks/templates/list.php | 6 +++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/apps/bookmarks/addBm.php b/apps/bookmarks/addBm.php index 62ad5821dbf..f56022c42c2 100644 --- a/apps/bookmarks/addBm.php +++ b/apps/bookmarks/addBm.php @@ -40,6 +40,7 @@ $url = isset($_GET['url']) ? urldecode($_GET['url']) : ''; $metadata = getURLMetadata($url); $tmpl->assign('URL', htmlentities($metadata['url'],ENT_COMPAT,'utf-8')); -$tmpl->assign('TITLE', htmlentities($metadata['title'],ENT_COMPAT,'utf-8')); +$title = isset($metadata['title']) ? $metadata['title'] : (isset($_GET['title']) ? $_GET['title'] : ''); +$tmpl->assign('TITLE', htmlentities($title,ENT_COMPAT,'utf-8')); $tmpl->printPage(); diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css index 48f0bede110..8dfdc8a07b9 100644 --- a/apps/bookmarks/css/bookmarks.css +++ b/apps/bookmarks/css/bookmarks.css @@ -83,4 +83,17 @@ .loading_meta { display: none; margin-left: 5px; -} \ No newline at end of file +} + +#footer { + color: #999; + font-size: medium; + text-align: center; + position: absolute; + bottom: 10px; + left: 0px; + width: 100%; + height: 20px; + visibility: visible; + display: block +} diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php index ccfe74f008f..d44a0ecbcdb 100644 --- a/apps/bookmarks/templates/list.php +++ b/apps/bookmarks/templates/list.php @@ -22,4 +22,8 @@
      t('You have no bookmarks'); ?> -
      \ No newline at end of file + + -- GitLab From 7ff4e40b20dfeb937ff6dccbc87e42a8bc4f5115 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 16 Feb 2012 17:55:39 +0100 Subject: [PATCH 532/546] Combing LDAP backend with LDAP extended backend --- apps/user_ldap/appinfo/app.php | 6 +-- apps/user_ldap/templates/settings.php | 3 ++ apps/user_ldap/user_ldap.php | 78 +++++++++++++++++++++------ 3 files changed, 67 insertions(+), 20 deletions(-) diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index 3261708f590..5c56ca8191e 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -32,13 +32,13 @@ define('OC_USER_BACKEND_LDAP_DEFAULT_PORT', 389); define('OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME', 'uid'); // register user backend -OC_User::useBackend( "LDAP" ); +OC_User::useBackend( 'LDAP' ); // add settings page to navigation $entry = array( - 'id' => "user_ldap_settings", + 'id' => 'user_ldap_settings', 'order'=>1, - 'href' => OC_Helper::linkTo( "user_ldap", "settings.php" ), + 'href' => OC_Helper::linkTo( 'user_ldap', 'settings.php' ), 'name' => 'LDAP' ); // OC_App::addNavigationSubEntry( "core_users", $entry); diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index 2abb0b47291..5bbd5d4008d 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -12,6 +12,9 @@ t('Currently the display name field needs to be the same you matched %%uid against in the filter above, because ownCloud doesn\'t distinguish between user id and user name.');?>

      >

      >

      +

      + bytes

      +

      diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 106240e74b8..670d938ea95 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -36,6 +36,12 @@ class OC_USER_LDAP extends OC_User_Backend { protected $ldap_tls; protected $ldap_nocase; protected $ldap_display_name; + protected $ldap_quota; + protected $ldap_quota_def; + protected $ldap_email; + + // will be retrieved from LDAP server + protected $ldap_dc = false; function __construct() { $this->ldap_host = OC_Appconfig::getValue('user_ldap', 'ldap_host',''); @@ -47,6 +53,9 @@ class OC_USER_LDAP extends OC_User_Backend { $this->ldap_tls = OC_Appconfig::getValue('user_ldap', 'ldap_tls', 0); $this->ldap_nocase = OC_Appconfig::getValue('user_ldap', 'ldap_nocase', 0); $this->ldap_display_name = OC_Appconfig::getValue('user_ldap', 'ldap_display_name', OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME); + $this->ldap_quota_attr = OC_Appconfig::getValue('user_ldap', 'ldap_quota_attr',''); + $this->ldap_quota_def = OC_Appconfig::getValue('user_ldap', 'ldap_quota_def',''); + $this->ldap_email_attr = OC_Appconfig::getValue('user_ldap', 'ldap_email_attr',''); if( !empty($this->ldap_host) && !empty($this->ldap_port) @@ -66,6 +75,28 @@ class OC_USER_LDAP extends OC_User_Backend { ldap_unbind($this->ds); } + private function setQuota( $uid ) { + if( !$this->ldap_dc ) + return false; + + $quota = $this->ldap_dc[$this->ldap_quota_attr][0]; + $quota = $quota != -1 ? $quota : $this->ldap_quota_def; + OC_Preferences::setValue($uid, 'files', 'quota', $quota); + } + + private function setEmail( $uid ) { + if( !$this->ldap_dc ) + return false; + + $email = OC_Preferences::getValue($uid, 'settings', 'email', ''); + if ( !empty( $email ) ) + return false; + + $email = $this->ldap_dc[$this->ldap_email_attr][0]; + OC_Preferences::setValue($uid, 'settings', 'email', $email); + } + + //Connect to LDAP and store the resource private function getDs() { if(!$this->ds) { $this->ds = ldap_connect( $this->ldap_host, $this->ldap_port ); @@ -74,18 +105,19 @@ class OC_USER_LDAP extends OC_User_Backend { if($this->ldap_tls) ldap_start_tls($this->ds); } - + //TODO: Not necessary to perform a bind each time, is it? // login if(!empty($this->ldap_dn)) { $ldap_login = @ldap_bind( $this->ds, $this->ldap_dn, $this->ldap_password ); - if(!$ldap_login) + if(!$ldap_login) { return false; + } } return $this->ds; } - private function getDn( $uid ) { + private function getDc( $uid ) { if(!$this->configured) return false; @@ -99,31 +131,43 @@ class OC_USER_LDAP extends OC_User_Backend { $sr = ldap_search( $this->getDs(), $this->ldap_base, $filter ); $entries = ldap_get_entries( $this->getDs(), $sr ); - if( $entries['count'] == 0 ) + if( $entries['count'] == 0 ) { return false; + } + + $this->ldap_dc = $entries[0]; - return $entries[0]['dn']; + return $this->ldap_dc; } public function checkPassword( $uid, $password ) { if(!$this->configured){ return false; } - $dn = $this->getDn( $uid ); - if( !$dn ) + $dc = $this->getDc( $uid ); + if( !$dc ) return false; - if (!@ldap_bind( $this->getDs(), $dn, $password )) + if (!@ldap_bind( $this->getDs(), $dc['dn'], $password )) { return false; - + } + + if(!empty($this->ldap_quota) && !empty($this->ldap_quota_def)) { + $this->setQuota($uid); + } + + if(!empty($this->ldap_email_attr)) { + $this->setEmail($uid); + } + if($this->ldap_nocase) { $filter = str_replace('%uid', $uid, $this->ldap_filter); $sr = ldap_search( $this->getDs(), $this->ldap_base, $filter ); $entries = ldap_get_entries( $this->getDs(), $sr ); if( $entries['count'] == 1 ) { foreach($entries as $row) { - $ldap_display_name = strtolower($this->ldap_display_name); - if(isset($row[$ldap_display_name])) { + $ldap_display_name = strtolower($this->ldap_display_name); + if(isset($row[$ldap_display_name])) { return $row[$ldap_display_name][0]; } } @@ -131,12 +175,12 @@ class OC_USER_LDAP extends OC_User_Backend { else { return $uid; } - + } else { return $uid; } - + } public function userExists( $uid ) { @@ -146,17 +190,17 @@ class OC_USER_LDAP extends OC_User_Backend { $dn = $this->getDn($uid); return !empty($dn); } - + public function getUsers() { if(!$this->configured) return false; - + // connect to server $ds = $this->getDs(); if( !$ds ) return false; - + // get users $filter = 'objectClass=person'; $sr = ldap_search( $this->getDs(), $this->ldap_base, $filter ); @@ -169,7 +213,7 @@ class OC_USER_LDAP extends OC_User_Backend { // TODO ldap_get_entries() seems to lower all keys => needs review $ldap_display_name = strtolower($this->ldap_display_name); if(isset($row[$ldap_display_name])) { - $users[] = $row[$ldap_display_name][0]; + $users[] = $row[$ldap_display_name][0]; } } // TODO language specific sorting of user names -- GitLab From 30d524b4260fe3e920b6be1f3818a0fbcbb5adfc Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 20 Feb 2012 11:21:46 +0100 Subject: [PATCH 533/546] load apps before logout so that logout-hook works --- index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index 18ea3022bc5..b4cac1879c6 100644 --- a/index.php +++ b/index.php @@ -51,6 +51,7 @@ if($_SERVER['REQUEST_METHOD']=='PROPFIND'){ // Someone is logged in : elseif(OC_User::isLoggedIn()) { if(isset($_GET["logout"]) and ($_GET["logout"])) { + OC_App::loadApps(); OC_User::logout(); header("Location: ".OC::$WEBROOT.'/'); exit(); @@ -80,7 +81,7 @@ else { OC_User::unsetMagicInCookie(); } } - + // Someone wants to log in : elseif(isset($_POST["user"]) && isset($_POST['password'])) { if(OC_User::login($_POST["user"], $_POST["password"])) { -- GitLab From 12bcbcdc62989bec8222888320aa22aeda06c82c Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Sun, 19 Feb 2012 23:03:10 +0100 Subject: [PATCH 534/546] Update ctag in deleteFromDAVData. --- apps/contacts/lib/vcard.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index ece203bd458..17e95adff71 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -304,7 +304,7 @@ class OC_Contacts_VCard{ * @return boolean */ public static function delete($id){ - // FIXME: Add error checking. + // FIXME: Add error checking. Touch addressbook. $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); $stmt->execute(array($id)); @@ -329,6 +329,7 @@ class OC_Contacts_VCard{ // FIXME: Add error checking. Deleting a card gives an Kontact/Akonadi error. $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri=?' ); $stmt->execute(array($aid,$uri)); + OC_Contacts_Addressbook::touch($aid); return true; } -- GitLab From 456ada01fa44a5de3146f58ea5de60baffe31521 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 20 Feb 2012 14:36:21 +0100 Subject: [PATCH 535/546] Contacts: Apply strip_tags on compound values. --- apps/contacts/ajax/addproperty.php | 1 + apps/contacts/ajax/saveproperty.php | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php index 03a45532f9b..028974e1c66 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/addproperty.php @@ -66,6 +66,7 @@ foreach($current as $item) { if(is_array($value)) { ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! + $value = array_map('strip_tags', $value); } else { $value = strip_tags($value); } diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/saveproperty.php index 6c8132c1dbf..0c9e0cc7836 100644 --- a/apps/contacts/ajax/saveproperty.php +++ b/apps/contacts/ajax/saveproperty.php @@ -52,6 +52,7 @@ $checksum = isset($_POST['checksum'])?$_POST['checksum']:null; // } if(is_array($value)){ // FIXME: How to strip_tags for compound values? + $value = array_map('strip_tags', $value); ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! $value = OC_VObject::escapeSemicolons($value); } else { -- GitLab From ffdfe8257bb89750352553e71e863843e2416925 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 20 Feb 2012 15:24:54 +0100 Subject: [PATCH 536/546] Contacts: Fix adding/updating address book with empty name. --- apps/contacts/ajax/createaddressbook.php | 8 +++++++- apps/contacts/ajax/updateaddressbook.php | 9 ++++++++- apps/contacts/js/contacts.js | 22 ++++++++++++++-------- apps/contacts/js/interface.js | 8 +++++--- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php index fbd70bae583..28944fe864c 100644 --- a/apps/contacts/ajax/createaddressbook.php +++ b/apps/contacts/ajax/createaddressbook.php @@ -13,7 +13,13 @@ OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('contacts'); $userid = OC_User::getUser(); -$bookid = OC_Contacts_Addressbook::add($userid, strip_tags($_POST['name']), null); +$name = trim(strip_tags($_POST['name'])); +if(!$name) { + OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Cannot add addressbook with an empty name.')))); + OC_Log::write('contacts','ajax/createaddressbook.php: Cannot add addressbook with an empty name: '.strip_tags($_POST['name']), OC_Log::ERROR); + exit(); +} +$bookid = OC_Contacts_Addressbook::add($userid, $name, null); if(!$bookid) { OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error adding addressbook.')))); OC_Log::write('contacts','ajax/createaddressbook.php: Error adding addressbook: '.$_POST['name'], OC_Log::ERROR); diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php index b43b5b93a32..211df84b1d1 100644 --- a/apps/contacts/ajax/updateaddressbook.php +++ b/apps/contacts/ajax/updateaddressbook.php @@ -15,7 +15,14 @@ OC_JSON::checkAppEnabled('contacts'); $bookid = $_POST['id']; OC_Contacts_App::getAddressbook($bookid); // is owner access check -if(!OC_Contacts_Addressbook::edit($bookid, $_POST['name'], null)) { +$name = trim(strip_tags($_POST['name'])); +if(!$name) { + OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.')))); + OC_Log::write('contacts','ajax/updateaddressbook.php: Cannot update addressbook with an empty name: '.strip_tags($_POST['name']), OC_Log::ERROR); + exit(); +} + +if(!OC_Contacts_Addressbook::edit($bookid, $name, null)) { OC_JSON::error(array('data' => array('message' => $l->t('Error updating addressbook.')))); OC_Log::write('contacts','ajax/updateaddressbook.php: Error adding addressbook: ', OC_Log::ERROR); //exit(); diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index d33f983a429..0e06b650a18 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -1043,13 +1043,13 @@ Contacts={ return false; }else{ $.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid}, - function(data) { - if (data.status == 'success'){ + function(jsondata) { + if (jsondata.status == 'success'){ $('#chooseaddressbook_dialog').dialog('destroy').remove(); Contacts.UI.Contacts.update(); Contacts.UI.Addressbooks.overview(); } else { - Contacts.UI.messageBox(t('contacts', 'Error'), data.message); + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); //alert('Error: ' + data.message); } }); @@ -1059,10 +1059,14 @@ Contacts={ Contacts.UI.notImplemented(); }, submit:function(button, bookid){ - var displayname = $("#displayname_"+bookid).val(); + var displayname = $("#displayname_"+bookid).val().trim(); var active = $("#edit_active_"+bookid+":checked").length; var description = $("#description_"+bookid).val(); - + + if(displayname.length == 0) { + Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Displayname cannot be empty.')); + return false; + } var url; if (bookid == 'new'){ url = OC.filePath('contacts', 'ajax', 'createaddressbook.php'); @@ -1070,12 +1074,14 @@ Contacts={ url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php'); } $.post(url, { id: bookid, name: displayname, active: active, description: description }, - function(data){ - if(data.status == 'success'){ + function(jsondata){ + if(jsondata.status == 'success'){ $(button).closest('tr').prev().html(data.page).show().next().remove(); + Contacts.UI.Contacts.update(); + } else { + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); } }); - Contacts.UI.Contacts.update(); }, cancel:function(button, bookid){ $(button).closest('tr').prev().show().next().remove(); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index fe58a46d247..5908dd767a2 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -124,12 +124,14 @@ Contacts={ url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php'); } $.post(url, { id: bookid, name: displayname, active: active, description: description }, - function(data){ - if(data.status == 'success'){ + function(jsondata){ + if(jsondata.status == 'success'){ $(button).closest('tr').prev().html(data.page).show().next().remove(); + Contacts.UI.Contacts.update(); + } else { + Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); } }); - Contacts.UI.Contacts.update(); }, cancel:function(button, bookid){ $(button).closest('tr').prev().show().next().remove(); -- GitLab From d5f7a39936616479d576b946514ef8cddf85f05b Mon Sep 17 00:00:00 2001 From: VicDeo Date: Mon, 20 Feb 2012 23:54:23 +0300 Subject: [PATCH 537/546] Contact list scroll fix --- apps/contacts/js/jquery.inview.js | 52 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js index a38ab164977..01900b0b4b4 100644 --- a/apps/contacts/js/jquery.inview.js +++ b/apps/contacts/js/jquery.inview.js @@ -5,18 +5,40 @@ */ (function ($) { var inviewObjects = {}, viewportSize, viewportOffset, - d = document, w = window, documentElement = d.documentElement, expando = $.expando; + d = document, w = window, documentElement = d.documentElement, expando = $.expando, isFiring = false, $elements = {}; $.event.special.inview = { add: function(data) { - inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; + var inviewObject = { data: data, $element: $(this) } + inviewObjects[data.guid + "-" + this[expando]] = inviewObject; + var selector = inviewObject.data.selector, + $element = inviewObject.$element; + var hash = parseInt(getHash( data.guid + this[expando])); + $elements[hash] = selector ? $element.find(selector) : $element; }, remove: function(data) { try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} + try { + var hash = parseInt(getHash(data.guid + this[expando])); + delete($elements[hash]); + } catch (e){} } }; + + function getHash(str){ + str = str+''; + var hash = 0; + if (str.length == 0) return hash; + for (i = 0; i < str.length; i++) { + char = str.charCodeAt(i); + hash = ((hash<<5)-hash)+char; + hash = hash & hash; // Convert to 32bit integer + } + return Math.abs(hash); + } + function getViewportSize() { var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; @@ -46,22 +68,15 @@ } function checkInView() { - var $elements = $(), elementsLength, i = 0; - - $.each(inviewObjects, function(i, inviewObject) { - var selector = inviewObject.data.selector, - $element = inviewObject.$element; - $elements = $elements.add(selector ? $element.find(selector) : $element); - }); - - elementsLength = $elements.length; - if (elementsLength) { + if (isFiring){ + return; + } + isFiring = true; viewportSize = viewportSize || getViewportSize(); viewportOffset = viewportOffset || getViewportOffset(); - - for (; i Date: Mon, 20 Feb 2012 22:33:38 +0100 Subject: [PATCH 538/546] some icons for filetypes have been added. for licensing information please have look at core/img/filetypes/readme-2.txt --- ...ication-vnd.oasis.opendocument.formula.png | Bin 0 -> 580 bytes ...cation-vnd.oasis.opendocument.graphics.png | Bin 0 -> 572 bytes ...on-vnd.oasis.opendocument.presentation.png | Bin 0 -> 441 bytes ...ion-vnd.oasis.opendocument.spreadsheet.png | Bin 0 -> 436 bytes ...pplication-vnd.oasis.opendocument.text.png | Bin 0 -> 420 bytes .../filetypes/application-x-7z-compressed.png | Bin 0 -> 652 bytes .../application-x-bzip-compressed-tar.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-bzip.png | Bin 0 -> 652 bytes .../application-x-compressed-tar.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-deb.png | Bin 0 -> 652 bytes .../application-x-debian-package.png | Bin 0 -> 570 bytes core/img/filetypes/application-x-gzip.png | Bin 0 -> 652 bytes .../application-x-lzma-compressed-tar.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-rar.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-rpm.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-tar.png | Bin 0 -> 652 bytes core/img/filetypes/application-x-tarz.png | Bin 0 -> 652 bytes core/img/filetypes/application-zip.png | Bin 0 -> 652 bytes core/img/filetypes/readme-2.txt | 28 ++++++++++++++++++ 19 files changed, 28 insertions(+) create mode 100644 core/img/filetypes/application-vnd.oasis.opendocument.formula.png create mode 100644 core/img/filetypes/application-vnd.oasis.opendocument.graphics.png create mode 100644 core/img/filetypes/application-vnd.oasis.opendocument.presentation.png create mode 100644 core/img/filetypes/application-vnd.oasis.opendocument.spreadsheet.png create mode 100644 core/img/filetypes/application-vnd.oasis.opendocument.text.png create mode 100644 core/img/filetypes/application-x-7z-compressed.png create mode 100644 core/img/filetypes/application-x-bzip-compressed-tar.png create mode 100644 core/img/filetypes/application-x-bzip.png create mode 100644 core/img/filetypes/application-x-compressed-tar.png create mode 100644 core/img/filetypes/application-x-deb.png create mode 100644 core/img/filetypes/application-x-debian-package.png create mode 100644 core/img/filetypes/application-x-gzip.png create mode 100644 core/img/filetypes/application-x-lzma-compressed-tar.png create mode 100644 core/img/filetypes/application-x-rar.png create mode 100644 core/img/filetypes/application-x-rpm.png create mode 100644 core/img/filetypes/application-x-tar.png create mode 100644 core/img/filetypes/application-x-tarz.png create mode 100644 core/img/filetypes/application-zip.png create mode 100644 core/img/filetypes/readme-2.txt diff --git a/core/img/filetypes/application-vnd.oasis.opendocument.formula.png b/core/img/filetypes/application-vnd.oasis.opendocument.formula.png new file mode 100644 index 0000000000000000000000000000000000000000..4cefbb690d106f7858203f619cc7766aca4b7c19 GIT binary patch literal 580 zcmV-K0=xZ*P)bm%j6^(8~rQBta#G zP$H2;*<>xERs(;_oO}1~oTsbJON)3ppU?T8htp)5CIInxoS~ti6b+=5!r^dy z86F;vWwY7!>Vb$H6%mh!c#_HFH`zn!bXw--=0rqfbaXTo3!$ ze4cF-g7vcyiA4Nb>zQCM7y#A{fHUo_tQK{{#+C!keEPbGZQB404i5U2QZpkXBLTy0 zS+o>OG!@GY0Y@-!TNdSV84${nVNpj;X?;G>1m^|wZ+fu zA3{A{^!IfGptYtskw}n8B=GrsD5a|L`unhj35R-cIt|92O;ECJu6AA|GH|QTUk9j70C3{?F?zcK0vIK&fQ&{N)=iUpPl+;5-2DWk}@P)aN*wXo^!rG_xe()6ab5hizE_> zJUyV4!teLLOD2=?&CShn>q10^L}WxnMl8!(mo6w23X;p^L_{Q$$>a^g2#N^da2P#! zeeL_-JRx|y)~g80haeh_PI#WTY8XZYDC+=Ill%Bl^?C{i`!(LYFHx`80f@z76H2Mo zbUGc;gS8ri)!+E4Zcl>&bb_@SuInNq)a!NT=H@0G$GPVV%s-T#$_`{tD0X&sTIY?8 zjcr6EEF#k)GHqGbr*1=RLMhd@QmIs42MSHcVzF2Sc=_rzkDk83b{vKV2RIWw#rW7L znx?f?%$Ylwj0m(Z zRjimwdlPdUN@J=C6n(eDIrlj)@3|2X;Xl%VF<_{VSp~cUs!%9=1L7N}&;4$D%gv4h zFFzeHGd;m;%ME=vIy}I6txk|rE#7W3+EPSXPADLOM!emoTrQt9n@u~BNO---Nam>T z6h98;dg@ZCbcu*eRVtMm`GbnZqNxE_^?JP(w)O7eiS>;wug>SPq>_^WxULH#f?*h@ zh{*O{K{AW0-iF)z$DUe5B(u0GxA%`CB4QYZiHM-od@kDyU0?AWDWy69%d&o1_e1=d_+?pE2heCV jNT<`+p_CBCVlln|C&Vf^)P;a%00000NkvXXu0mjfF{#1z literal 0 HcmV?d00001 diff --git a/core/img/filetypes/application-vnd.oasis.opendocument.spreadsheet.png b/core/img/filetypes/application-vnd.oasis.opendocument.spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..abc38d4310c9e73abb1f664a97dacb3708fcb2cc GIT binary patch literal 436 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 IM6N<$f|eWirvLx| literal 0 HcmV?d00001 diff --git a/core/img/filetypes/application-x-gzip.png b/core/img/filetypes/application-x-gzip.png new file mode 100644 index 0000000000000000000000000000000000000000..55dd0f75366f0b7998b8b4a763b8a8dcc2a91b07 GIT binary patch literal 652 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 Date: Tue, 21 Feb 2012 10:22:17 -0500 Subject: [PATCH 539/546] restore redirect after checkLoggedIn --- lib/util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index ee32d31bfd0..aa9fcdec65f 100644 --- a/lib/util.php +++ b/lib/util.php @@ -255,7 +255,7 @@ class OC_Util { public static function checkLoggedIn(){ // Check if we are a user if( !OC_User::isLoggedIn()){ - header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php' )); + header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', TRUE )); exit(); } } -- GitLab From 21f8d0992f1ae389d8c9acc870927285e9413a96 Mon Sep 17 00:00:00 2001 From: Marvin Thomas Rabe Date: Tue, 21 Feb 2012 18:28:27 +0100 Subject: [PATCH 540/546] Added missing files --- apps/bookmarks/img/delete.png | Bin 0 -> 275 bytes apps/bookmarks/img/edit.png | Bin 0 -> 310 bytes apps/media/css/music.css | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/bookmarks/img/delete.png create mode 100644 apps/bookmarks/img/edit.png diff --git a/apps/bookmarks/img/delete.png b/apps/bookmarks/img/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0c782882deaa4f9ecf1676592ddba0cc9aacbc GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4%Pm*(PLD+t=F;b z*eX3n(MkRcKXtZMbAR7WZg&GK3{-9d P-NxYQ>gTe~DWM4f<>O_1 literal 0 HcmV?d00001 diff --git a/apps/bookmarks/img/edit.png b/apps/bookmarks/img/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..9993a092df101d4b2796379ac6f1cbe62f131a3c GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4=coeX%YV7tbaA(MAa9*?eMT*!Qy-Sie zj Date: Tue, 21 Feb 2012 20:05:02 +0100 Subject: [PATCH 541/546] Move the redirect_url from linkTo function to the checkLoggedIn function --- lib/helper.php | 14 ++++---------- lib/util.php | 7 ++++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/helper.php b/lib/helper.php index b1e6d053a19..2f71bdad2dc 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -29,12 +29,11 @@ class OC_Helper { * @brief Creates an url * @param $app app * @param $file file - * @param $redirect_url redirect_url variable is appended to the URL * @returns the url * * Returns a url to the given app and file. */ - public static function linkTo( $app, $file, $redirect_url=NULL, $absolute=false ){ + public static function linkTo( $app, $file ){ if( $app != '' ){ $app .= '/'; // Check if the app is in the app folder @@ -54,24 +53,19 @@ class OC_Helper { } } - if($redirect_url) - return $urlLinkTo.'?redirect_url='.urlencode($_SERVER["REQUEST_URI"]); - else - return $urlLinkTo; - + return $urlLinkTo; } /** * @brief Creates an absolute url * @param $app app * @param $file file - * @param $redirect_url redirect_url variable is appended to the URL * @returns the url * * Returns a absolute url to the given app and file. */ - public static function linkToAbsolute( $app, $file, $redirect_url=NULL ) { - $urlLinkTo = self::linkTo( $app, $file, $redirect_url ); + public static function linkToAbsolute( $app, $file ) { + $urlLinkTo = self::linkTo( $app, $file ); // Checking if the request was made through HTTPS. The last in line is for IIS $protocol = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off'); $urlLinkTo = ($protocol?'https':'http') . '://' . $_SERVER['HTTP_HOST'] . $urlLinkTo; diff --git a/lib/util.php b/lib/util.php index aa9fcdec65f..1b1e29b6749 100644 --- a/lib/util.php +++ b/lib/util.php @@ -240,7 +240,7 @@ class OC_Util { /** - * Check if the app is enabled, send json error msg if not + * Check if the app is enabled, redirects to home if not */ public static function checkAppEnabled($app){ if( !OC_App::isEnabled($app)){ @@ -250,12 +250,13 @@ class OC_Util { } /** - * Check if the user is logged in, redirects to home if not + * Check if the user is logged in, redirects to home if not. With + * redirect URL parameter to the request URI. */ public static function checkLoggedIn(){ // Check if we are a user if( !OC_User::isLoggedIn()){ - header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', TRUE )); + header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php' ).'?redirect_url='.urlencode($_SERVER["REQUEST_URI"])); exit(); } } -- GitLab From 86d2927c02c09d6642268891e995bf9d0a11782c Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 21 Feb 2012 20:10:40 +0100 Subject: [PATCH 542/546] Calendar: Correct calendarcolor format for ical color property --- apps/calendar/ajax/updatecalendar.php | 10 +++++++++- apps/calendar/appinfo/info.xml | 2 +- apps/calendar/appinfo/update.php | 17 +++++++++++++++++ apps/calendar/js/calendar.js | 2 +- apps/calendar/lib/calendar.php | 24 ++++++++++++------------ 5 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 apps/calendar/appinfo/update.php diff --git a/apps/calendar/ajax/updatecalendar.php b/apps/calendar/ajax/updatecalendar.php index 5add6d92bfa..20c225d8a29 100644 --- a/apps/calendar/ajax/updatecalendar.php +++ b/apps/calendar/ajax/updatecalendar.php @@ -25,8 +25,16 @@ foreach($calendars as $cal){ } $calendarid = $_POST['id']; +$calendarcolor = $_POST['color']; +if (preg_match('/^#?([0-9a-f]{6})/', $calendarcolor, $matches)) { + $calendarcolor = '#'.$matches[1]; +} +else { + $calendarcolor = null; +} + $calendar = OC_Calendar_App::getCalendar($calendarid);//access check -OC_Calendar_Calendar::editCalendar($calendarid, strip_tags($_POST['name']), null, null, null, $_POST['color']); +OC_Calendar_Calendar::editCalendar($calendarid, strip_tags($_POST['name']), null, null, null, $calendarcolor); OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); $calendar = OC_Calendar_App::getCalendar($calendarid); diff --git a/apps/calendar/appinfo/info.xml b/apps/calendar/appinfo/info.xml index 46292af3db1..4ac3c5bf099 100644 --- a/apps/calendar/appinfo/info.xml +++ b/apps/calendar/appinfo/info.xml @@ -2,7 +2,7 @@ calendar Calendar - 0.2 + 0.2.1 AGPL Georg Ehrke, Bart Visscher, Jakob Sack 2 diff --git a/apps/calendar/appinfo/update.php b/apps/calendar/appinfo/update.php new file mode 100644 index 00000000000..375816a403e --- /dev/null +++ b/apps/calendar/appinfo/update.php @@ -0,0 +1,17 @@ +execute(); + while( $row = $result->fetchRow()) { + $id = $row['id']; + $color = $row['calendarcolor']; + if ($color[0] == '#' || strlen($color) < 6) { + continue; + } + $color = '#' .$color; + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET calendarcolor=? WHERE id=?' ); + $r = $stmt->execute(array($color,$id)); + } +} diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index 517d2ce128b..ba8e293819a 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -478,7 +478,7 @@ Calendar={ colors[i].label = $(elm).text(); }); for (var i in colors) { - picker.append(''); + picker.append(''); } picker.delegate(".calendar-colorpicker-color", "click", function() { $(obj).val($(this).attr('rel')); diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php index 679649582d8..277539af97d 100644 --- a/apps/calendar/lib/calendar.php +++ b/apps/calendar/lib/calendar.php @@ -96,7 +96,7 @@ class OC_Calendar_Calendar{ * @param string $components Default: "VEVENT,VTODO,VJOURNAL" * @param string $timezone Default: null * @param integer $order Default: 1 - * @param string $color Default: null + * @param string $color Default: null, format: '#RRGGBB(AA)' * @return insertid */ public static function addCalendar($userid,$name,$components='VEVENT,VTODO,VJOURNAL',$timezone=null,$order=0,$color=null){ @@ -122,7 +122,7 @@ class OC_Calendar_Calendar{ * @param string $components * @param string $timezone * @param integer $order - * @param string $color + * @param string $color format: '#RRGGBB(AA)' * @return insertid */ public static function addCalendarFromDAVData($principaluri,$uri,$name,$components,$timezone,$order,$color){ @@ -141,7 +141,7 @@ class OC_Calendar_Calendar{ * @param string $components Default: null * @param string $timezone Default: null * @param integer $order Default: null - * @param string $color Default: null + * @param string $color Default: null, format: '#RRGGBB(AA)' * @return boolean * * Values not null will be set @@ -230,20 +230,20 @@ class OC_Calendar_Calendar{ } public static function getCalendarColorOptions(){ return array( - 'ff0000', // "Red" - 'b3dc6c', // "Green" - 'ffff00', // "Yellow" - '808000', // "Olive" - 'ffa500', // "Orange" - 'ff7f50', // "Coral" - 'ee82ee', // "Violet" - '9fc6e7', // "light blue" + '#ff0000', // "Red" + '#b3dc6c', // "Green" + '#ffff00', // "Yellow" + '#808000', // "Olive" + '#ffa500', // "Orange" + '#ff7f50', // "Coral" + '#ee82ee', // "Violet" + '#9fc6e7', // "light blue" ); } public static function getEventSourceInfo($calendar){ return array( 'url' => 'ajax/events.php?calendar_id='.$calendar['id'], - 'backgroundColor' => '#'.$calendar['calendarcolor'], + 'backgroundColor' => $calendar['calendarcolor'], 'borderColor' => '#888', 'textColor' => 'black', 'cache' => true, -- GitLab From d3e6ea6ac000e6276c70c988237f7e8c548d2881 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 21 Feb 2012 20:28:24 +0100 Subject: [PATCH 543/546] Bookmarks: uses the core action icons --- apps/bookmarks/img/delete.png | Bin 275 -> 0 bytes apps/bookmarks/img/edit.png | Bin 310 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/bookmarks/img/delete.png delete mode 100644 apps/bookmarks/img/edit.png diff --git a/apps/bookmarks/img/delete.png b/apps/bookmarks/img/delete.png deleted file mode 100644 index bc0c782882deaa4f9ecf1676592ddba0cc9aacbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4%Pm*(PLD+t=F;b z*eX3n(MkRcKXtZMbAR7WZg&GK3{-9d P-NxYQ>gTe~DWM4f<>O_1 diff --git a/apps/bookmarks/img/edit.png b/apps/bookmarks/img/edit.png deleted file mode 100644 index 9993a092df101d4b2796379ac6f1cbe62f131a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4=coeX%YV7tbaA(MAa9*?eMT*!Qy-Sie zj Date: Tue, 21 Feb 2012 10:11:26 +0100 Subject: [PATCH 544/546] Remove my FIXME comments when I've fixed it :-P --- apps/contacts/ajax/saveproperty.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/saveproperty.php index 0c9e0cc7836..6f8366243fe 100644 --- a/apps/contacts/ajax/saveproperty.php +++ b/apps/contacts/ajax/saveproperty.php @@ -51,7 +51,7 @@ $checksum = isset($_POST['checksum'])?$_POST['checksum']:null; // } // } -if(is_array($value)){ // FIXME: How to strip_tags for compound values? +if(is_array($value)){ $value = array_map('strip_tags', $value); ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! $value = OC_VObject::escapeSemicolons($value); -- GitLab From e0c92662f837161fc45cc6bd60485d113b324345 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 21 Feb 2012 23:15:26 +0100 Subject: [PATCH 545/546] JS fix on address book creation. --- apps/contacts/js/contacts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index 0e06b650a18..11661320c59 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -1076,7 +1076,7 @@ Contacts={ $.post(url, { id: bookid, name: displayname, active: active, description: description }, function(jsondata){ if(jsondata.status == 'success'){ - $(button).closest('tr').prev().html(data.page).show().next().remove(); + $(button).closest('tr').prev().html(jsondata.page).show().next().remove(); Contacts.UI.Contacts.update(); } else { Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message); -- GitLab From c5c843bfefb9e678b65bf30c42082676db07bc3c Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Tue, 21 Feb 2012 23:19:13 +0100 Subject: [PATCH 546/546] Improved upgrading VCARD v. 2.1 => 3.0. Improved import of malformed cards. Remove duplicate code. --- apps/contacts/lib/vcard.php | 214 ++++++++++++++++++++++-------------- 1 file changed, 129 insertions(+), 85 deletions(-) diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index 17e95adff71..0b8d95a2d97 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -103,6 +103,118 @@ class OC_Contacts_VCard{ return $result->fetchRow(); } + /** + * @brief Format property TYPE parameters for upgrading from v. 2.1 + * @param $property Reference to a Sabre_VObject_Property. + * In version 2.1 e.g. a phone can be formatted like: TEL;HOME;CELL:123456789 + * This has to be changed to either TEL;TYPE=HOME,CELL:123456789 or TEL;TYPE=HOME;TYPE=CELL:123456789 - both are valid. + */ + public static function formatPropertyTypes(&$property) { + foreach($property->parameters as $key=>&$parameter){ + $types = OC_Contacts_App::getTypesOfProperty($property->name); + if(is_array($types) && in_array(strtoupper($parameter->name), array_keys($types)) || strtoupper($parameter->name) == 'PREF') { + $property->parameters[] = new Sabre_VObject_Parameter('TYPE', $parameter->name); + } + unset($property->parameters[$key]); + } + } + + /** + * @brief Decode properties for upgrading from v. 2.1 + * @param $property Reference to a Sabre_VObject_Property. + * The only encoding allowed in version 3.0 is 'b' for binary. All encoded strings + * must therefor be decoded and the parameters removed. + */ + public static function decodeProperty(&$property) { + // Check out for encoded string and decode them :-[ + foreach($property->parameters as $key=>&$parameter){ + if(strtoupper($parameter->name) == 'ENCODING') { + if(strtoupper($parameter->value) == 'QUOTED-PRINTABLE') { // what kind of other encodings could be used? + $property->value = quoted_printable_decode($property->value); + unset($property->parameters[$key]); + } + } elseif(strtoupper($parameter->name) == 'CHARSET') { + unset($property->parameters[$key]); + } + } + } + + /** + * @brief Tries to update imported VCards to adhere to rfc2426 (VERSION: 3.0) + * @param vcard An OC_VObject of type VCARD (passed by reference). + */ + protected static function updateValuesFromAdd(&$vcard) { // any suggestions for a better method name? ;-) + $stringprops = array('N', 'FN', 'ORG', 'NICK', 'ADR', 'NOTE'); + $typeprops = array('ADR', 'TEL', 'EMAIL'); + $upgrade = false; + $fn = $n = $uid = $email = null; + $version = $vcard->getAsString('VERSION'); + // Add version if needed + if($version && $version < '3.0') { + $upgrade = true; + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. Updating from version: '.$version,OC_Log::DEBUG); + } + foreach($vcard->children as &$property){ + // Decode string properties and remove obsolete properties. + if($upgrade && in_array($property->name, $stringprops)) { + self::decodeProperty($property); + } + // Fix format of type parameters. + if($upgrade && in_array($property->name, $typeprops)) { + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. before: '.$property->serialize(),OC_Log::DEBUG); + self::formatPropertyTypes($property); + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. after: '.$property->serialize(),OC_Log::DEBUG); + } + if($property->name == 'FN'){ + $fn = $property->value; + } + if($property->name == 'N'){ + $n = $property->value; + } + if($property->name == 'UID'){ + $uid = $property->value; + } + if($property->name == 'EMAIL' && is_null($email)){ // only use the first email as substitute for missing N or FN. + $email = $property->value; + } + } + // Check for missing 'N', 'FN' and 'UID' properties + if(!$fn) { + if($n && $n != ';;;;'){ + $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); + } elseif($email) { + $fn = $email; + } else { + $fn = 'Unknown Name'; + } + $vcard->setString('FN', $fn); + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'FN\' field: '.$fn,OC_Log::DEBUG); + } + if(!$n || $n = ';;;;'){ // Fix missing 'N' field. Ugly hack ahead ;-) + $slice = array_reverse(array_slice(explode(' ', $fn), 0, 2)); // Take 2 first name parts of 'FN' and reverse. + if(count($slice) < 2) { // If not enought, add one more... + $slice[] = ""; + } + $n = implode(';', $slice).';;;'; + $vcard->setString('N', $n); + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'N\' field: '.$n,OC_Log::DEBUG); + } + if(!$uid) { + $vcard->setUID(); + OC_Log::write('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'UID\' field: '.$uid,OC_Log::DEBUG); + } + $vcard->setString('VERSION','3.0'); + // Add product ID is missing. + $prodid = trim($vcard->getAsString('PRODID')); + if(!$prodid) { + $appinfo = OC_App::getAppInfo('contacts'); + $prodid = '-//ownCloud//NONSGML '.$appinfo['name'].' '.$appinfo['version'].'//EN'; + $vcard->setString('PRODID', $prodid); + } + $now = new DateTime; + $vcard->setString('REV', $now->format(DateTime::W3C)); + } + /** * @brief Adds a card * @param integer $id Addressbook id @@ -114,58 +226,17 @@ class OC_Contacts_VCard{ $card = OC_VObject::parse($data); if(!is_null($card)){ - $fn = $card->getAsString('FN'); - if(!$fn){ // Fix missing 'FN' field. - $n = $card->getAsString('N'); - if(!is_null($n)){ - $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); - $card->setString('FN', $fn); - OC_Log::write('contacts','OC_Contacts_VCard::add. Added missing \'FN\' field: '.$fn,OC_Log::DEBUG); - } else { - $fn = 'Unknown Name'; - } - } - $n = $card->getAsString('N'); - if(!$n){ // Fix missing 'N' field. - $n = implode(';', array_reverse(array_slice(explode(' ', $fn), 0, 2))).';;;'; - $card->setString('N', $n); - OC_Log::write('contacts','OC_Contacts_VCard::add. Added missing \'N\' field: '.$n,OC_Log::DEBUG); - } - $uid = $card->getAsString('UID'); - if(!$uid){ - $card->setUID(); - $uid = $card->getAsString('UID'); - }; - $uri = $uid.'.vcf'; - - // Add product ID. - $prodid = trim($card->getAsString('PRODID')); - if(!$prodid) { - $appinfo = OC_App::getAppInfo('contacts'); - $prodid = '//ownCloud//NONSGML '.$appinfo['name'].' '.$appinfo['version'].'//EN'; - $card->setString('PRODID', $prodid); - } - // VCARD must have a version - $version = $card->getAsString('VERSION'); - // Add version if needed - if(!$version){ - $card->add(new Sabre_VObject_Property('VERSION','3.0')); - //$data = $card->serialize(); - }/* else { - OC_Log::write('contacts','OC_Contacts_VCard::add. Version already set as: '.$version,OC_Log::DEBUG); - }*/ - $now = new DateTime; - $card->setString('REV', $now->format(DateTime::W3C)); + self::updateValuesFromAdd($card); $data = $card->serialize(); } else{ - // that's hard. Creating a UID and not saving it OC_Log::write('contacts','OC_Contacts_VCard::add. Error parsing VCard: '.$data,OC_Log::ERROR); return null; // Ditch cards that can't be parsed by Sabre. - //$uid = self::createUID(); - //$uri = $uid.'.vcf'; }; + $fn = $card->getAsString('FN'); + $uid = $card->getAsString('UID'); + $uri = $uid.'.vcf'; $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); $result = $stmt->execute(array($id,$fn,$data,$uri,time())); $newid = OC_DB::insertid('*PREFIX*contacts_cards'); @@ -183,54 +254,23 @@ class OC_Contacts_VCard{ * @return insertid */ public static function addFromDAVData($id,$uri,$data){ - $fn = $n = $uid = null; - $email = null; $card = OC_VObject::parse($data); if(!is_null($card)){ - foreach($card->children as $property){ - if($property->name == 'FN'){ - $fn = $property->value; - } - if($property->name == 'N'){ - $n = $property->value; - } - if($property->name == 'UID'){ - $uid = $property->value; - } - if($property->name == 'EMAIL' && is_null($email)){ - $email = $property->value; - } - } - } - if(!$fn) { - if($n){ - $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); - } elseif($email) { - $fn = $email; - } else { - $fn = 'Unknown Name'; - } - $card->addProperty('FN', $fn); - $data = $card->serialize(); - OC_Log::write('contacts','OC_Contacts_VCard::add. Added missing \'FN\' field: '.$n,OC_Log::DEBUG); - } - if(!$n){ // Fix missing 'N' field. - $n = implode(';', array_reverse(array_slice(explode(' ', $fn), 0, 2))).';;;'; - $card->setString('N', $n); - $data = $card->serialize(); - OC_Log::write('contacts','OC_Contacts_VCard::add. Added missing \'N\' field: '.$n,OC_Log::DEBUG); - } - if(!$uid) { - $card->setUID(); + self::updateValuesFromAdd($card); $data = $card->serialize(); - } + } else { + OC_Log::write('contacts','OC_Contacts_VCard::addFromDAVData. Error parsing VCard: '.$data, OC_Log::ERROR); + return null; // Ditch cards that can't be parsed by Sabre. + }; + $fn = $card->getAsString('FN'); $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + $newid = OC_DB::insertid('*PREFIX*contacts_cards'); OC_Contacts_Addressbook::touch($id); - return OC_DB::insertid('*PREFIX*contacts_cards'); + return $newid; } /** @@ -304,7 +344,7 @@ class OC_Contacts_VCard{ * @return boolean */ public static function delete($id){ - // FIXME: Add error checking. Touch addressbook. + // FIXME: Add error checking. $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); $stmt->execute(array($id)); @@ -381,10 +421,14 @@ class OC_Contacts_VCard{ 'checksum' => md5($property->serialize())); foreach($property->parameters as $parameter){ // Faulty entries by kaddressbook + // Actually TYPE=PREF is correct according to RFC 2426 + // but this way is more handy in the UI. Tanghus. if($parameter->name == 'TYPE' && $parameter->value == 'PREF'){ $parameter->name = 'PREF'; $parameter->value = '1'; } + // NOTE: Apparently Sabre_VObject_Reader can't always deal with value list parameters + // like TYPE=HOME,CELL,VOICE. Tanghus. if ($property->name == 'TEL' && $parameter->name == 'TYPE'){ if (isset($temp['parameters'][$parameter->name])){ $temp['parameters'][$parameter->name][] = $parameter->value; -- GitLab