From 8d2aeb7082cca4a19b3700b62cae77cf50260217 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 24 Jul 2009 15:04:00 +0000 Subject: [PATCH 001/423] Cloudy theme IE (mostly 7/8) fixes --- theme/cloudy/css/display.css | 5 ++++- theme/cloudy/css/ie.css | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/theme/cloudy/css/display.css b/theme/cloudy/css/display.css index 82a1a1e4e0..ecf23fd74f 100644 --- a/theme/cloudy/css/display.css +++ b/theme/cloudy/css/display.css @@ -934,7 +934,6 @@ float:left; font-size:0.95em; width:16px; float:right; -display:none; } .notices li:hover div.notice-options { display:block; @@ -984,6 +983,10 @@ text-decoration:none; padding-left:16px; } +.notice-options .notice_reply .notice_id { +display:none; +} + .notice-options form input.submit { width:16px; padding:2px 0; diff --git a/theme/cloudy/css/ie.css b/theme/cloudy/css/ie.css index 94c2093b19..dabadcd951 100644 --- a/theme/cloudy/css/ie.css +++ b/theme/cloudy/css/ie.css @@ -8,15 +8,32 @@ color:#fff; background-color:#ddffcc; } +#form_notice { +width:525px; +} +#form_notice .form_note { +top:-5px; +right:0; +} +#form_notice textarea { +width:97.75%; +} #form_notice .form_note + label { position:absolute; -top:25px; -left:83%; +top:87px; +left:77%; text-indent:-9999px; height:16px; width:16px; display:block; } +#form_notice #notice_data-attach { +filter: alpha(opacity = 0); +} + +#form_notice #notice_action-submit { +right:0; +} #aside_primary { width:181px; @@ -24,7 +41,7 @@ width:181px; #form_notice, #anon_notice { -top:158px; +top:190px; } #public #content, From 932eab074d954b7f9add4a8b625c74a86b3bd8e1 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 24 Jul 2009 15:38:58 +0000 Subject: [PATCH 002/423] More IE fixes for Cloudy theme --- theme/cloudy/css/display.css | 16 +++++++++++----- theme/cloudy/css/ie.css | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/theme/cloudy/css/display.css b/theme/cloudy/css/display.css index ecf23fd74f..e3c5c3cc03 100644 --- a/theme/cloudy/css/display.css +++ b/theme/cloudy/css/display.css @@ -414,9 +414,12 @@ width:518px; min-height:322px; padding:20px; float:left; -border-radius-topleft:4px; --moz-border-radius-topleft:4px; --webkit-border-top-left-radius:4px; +border-radius:4px; +-moz-border-radius:4px; +-webkit-border-radius:4px; +border-radius-topright:0; +-moz-border-radius-topright:0; +-webkit-border-top-right-radius:0; border-style:solid; border-width:1px; } @@ -484,7 +487,7 @@ width:16px; height:16px; } #form_notice #notice_data-attach { -left:34.6%; +left:40%; padding:0; height:16px; } @@ -528,9 +531,12 @@ float:left; #form_notice .success { float:left; clear:both; -width:81.5%; +width:83.5%; margin-bottom:0; line-height:1.618; +position:absolute; +top:87px; +left:0; } #form_notice #notice_data-attach_selected code { float:left; diff --git a/theme/cloudy/css/ie.css b/theme/cloudy/css/ie.css index dabadcd951..a698676fbb 100644 --- a/theme/cloudy/css/ie.css +++ b/theme/cloudy/css/ie.css @@ -29,6 +29,7 @@ display:block; } #form_notice #notice_data-attach { filter: alpha(opacity = 0); +left:33.5%; } #form_notice #notice_action-submit { From 70cc09a5c2863f4a9a24f65db8830146becbc72a Mon Sep 17 00:00:00 2001 From: Brenda Wallace Date: Sat, 25 Jul 2009 15:58:42 +1200 Subject: [PATCH 003/423] check the postgresql database is UTF8 before allowing installation to proceed --- install.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/install.php b/install.php index 1d3a531c5a..d5e8e8b61f 100644 --- a/install.php +++ b/install.php @@ -243,6 +243,14 @@ function pgsql_db_installer($host, $database, $username, $password, $sitename) { updateStatus("Checking database..."); $conn = pg_connect($connstring); + //ensure database encoding is UTF8 + $record = pg_fetch_object(pg_query($conn, 'SHOW server_encoding')); + if ($record->server_encoding != 'UTF8') { + updateStatus("Laconica requires UTF8 character encoding. Your database is ". htmlentities($record->server_encoding)); + showForm(); + return false; + } + updateStatus("Running database script..."); //wrap in transaction; pg_query($conn, 'BEGIN'); From f86faaf341ee6e6e8cfd264e1d645cc0d964d85b Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 25 Jul 2009 00:19:12 -0400 Subject: [PATCH 004/423] If cannot connect, then stop the installation --- install.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install.php b/install.php index d5e8e8b61f..901e502f1a 100644 --- a/install.php +++ b/install.php @@ -242,6 +242,12 @@ function pgsql_db_installer($host, $database, $username, $password, $sitename) { updateStatus("Starting installation..."); updateStatus("Checking database..."); $conn = pg_connect($connstring); + + if ($conn ===false) { + updateStatus("Failed to connect to database: $connstring"); + showForm(); + return false; + } //ensure database encoding is UTF8 $record = pg_fetch_object(pg_query($conn, 'SHOW server_encoding')); From e0b877b26c5e93809b2a53b6c46326d5e31fa0e8 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 17:37:37 +0000 Subject: [PATCH 005/423] Removed
structure from NoticeListItem::showDeleteLink. Reason: To speed up DOM load by cutting down 3 nodes in each notice list item. Generally each notice option should be a list item in a
    , however, there is no tangible benefit for the user using this approach. In this case, minimalism is favoured. Similarly, the new approach will make 5 fewer function calls on the server side. --- lib/noticelist.php | 6 +----- theme/base/css/display.css | 6 +----- theme/default/css/display.css | 2 +- theme/identica/css/display.css | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index 44726a17b7..d4d4fc7119 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -479,13 +479,9 @@ class NoticeListItem extends Widget if ($user && $this->notice->profile_id == $user->id) { $deleteurl = common_local_url('deletenotice', array('notice' => $this->notice->id)); - $this->out->elementStart('dl', 'notice_delete'); - $this->out->element('dt', null, _('Delete this notice')); - $this->out->elementStart('dd'); $this->out->element('a', array('href' => $deleteurl, + 'class' => 'notice_delete', 'title' => _('Delete this notice')), _('Delete')); - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 867dc0ef7c..80ab397ee9 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -937,22 +937,18 @@ display:block; border:0; } .notice-options .notice_reply a, -.notice-options .notice_delete a { +.notice-options .notice_delete { text-decoration:none; padding-left:16px; } - .notice-options form input.submit { width:16px; padding:2px 0; } - -.notice-options .notice_delete dt, .notice-options .form_favor legend, .notice-options .form_disfavor legend { display:none; } -.notice-options .notice_delete fieldset, .notice-options .form_favor fieldset, .notice-options .form_disfavor fieldset { border:0; diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 251d6706be..e8df27718f 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -227,7 +227,7 @@ background:transparent url(../../base/images/icons/twotone/green/favourite.gif) .notice-options form.form_disfavor input.submit { background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%; } -.notice-options .notice_delete a { +.notice-options .notice_delete { background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; } diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 42a4573a74..7dd4256bf5 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -227,7 +227,7 @@ background:transparent url(../../base/images/icons/twotone/green/favourite.gif) .notice-options form.form_disfavor input.submit { background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%; } -.notice-options .notice_delete a { +.notice-options .notice_delete { background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; } From 66a959a7762474e00264ddf942fb7b681bdf2045 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 17:44:19 +0000 Subject: [PATCH 006/423] Removed
    structure from NoticeListItem::showReplyLink. Reason: Same as commit e0b877b26c5e93809b2a53b6c46326d5e31fa0e8. --- lib/noticelist.php | 7 +------ theme/base/css/display.css | 8 +------- theme/default/css/display.css | 6 +----- theme/identica/css/display.css | 6 +----- 4 files changed, 4 insertions(+), 23 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index d4d4fc7119..0bd98fef78 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -453,17 +453,12 @@ class NoticeListItem extends Widget if (common_logged_in()) { $reply_url = common_local_url('newnotice', array('replyto' => $this->profile->nickname)); - - $this->out->elementStart('dl', 'notice_reply'); - $this->out->element('dt', null, _('Reply to this notice')); - $this->out->elementStart('dd'); $this->out->elementStart('a', array('href' => $reply_url, + 'class' => 'notice_reply', 'title' => _('Reply to this notice'))); $this->out->text(_('Reply')); $this->out->element('span', 'notice_id', $this->notice->id); $this->out->elementEnd('a'); - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 80ab397ee9..41fc5c20e7 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -921,22 +921,16 @@ left:29px; .notice-options .notice_delete { right:0; } -.notice-options .notice_reply dt { -display:none; -} - .notice-options input, .notice-options a { text-indent:-9999px; outline:none; } - -.notice-options .notice_reply a, .notice-options input.submit { display:block; border:0; } -.notice-options .notice_reply a, +.notice-options .notice_reply, .notice-options .notice_delete { text-decoration:none; padding-left:16px; diff --git a/theme/default/css/display.css b/theme/default/css/display.css index e8df27718f..b7c86ae07b 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -214,11 +214,7 @@ background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no #attachments .attachment { background:none; } -.notice-options .notice_reply a, -.notice-options form input.submit { -background-color:transparent; -} -.notice-options .notice_reply a { +.notice-options .notice_reply { background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%; } .notice-options form.form_favor input.submit { diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 7dd4256bf5..6a88204953 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -214,11 +214,7 @@ background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no #attachments .attachment { background:none; } -.notice-options .notice_reply a, -.notice-options form input.submit { -background-color:transparent; -} -.notice-options .notice_reply a { +.notice-options .notice_reply { background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%; } .notice-options form.form_favor input.submit { From 89f32432bace26feb46299728ce2878fc5df4d20 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 17:53:37 +0000 Subject: [PATCH 007/423] Updated pigeonthoughts theme --- theme/pigeonthoughts/css/base.css | 14 ++------------ theme/pigeonthoughts/css/display.css | 8 ++------ 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/theme/pigeonthoughts/css/base.css b/theme/pigeonthoughts/css/base.css index 5d5eb9896c..f2256b7caa 100644 --- a/theme/pigeonthoughts/css/base.css +++ b/theme/pigeonthoughts/css/base.css @@ -893,38 +893,28 @@ left:29px; .notice-options .notice_delete { right:0; } -.notice-options .notice_reply dt { -display:none; -} - .notice-options input, .notice-options a { text-indent:-9999px; outline:none; } - -.notice-options .notice_reply a, .notice-options input.submit { display:block; border:0; } -.notice-options .notice_reply a, -.notice-options .notice_delete a { +.notice-options .notice_reply, +.notice-options .notice_delete { text-decoration:none; padding-left:16px; } - .notice-options form input.submit { width:16px; padding:2px 0; } - -.notice-options .notice_delete dt, .notice-options .form_favor legend, .notice-options .form_disfavor legend { display:none; } -.notice-options .notice_delete fieldset, .notice-options .form_favor fieldset, .notice-options .form_disfavor fieldset { border:0; diff --git a/theme/pigeonthoughts/css/display.css b/theme/pigeonthoughts/css/display.css index f113225fbf..1bf37bf738 100644 --- a/theme/pigeonthoughts/css/display.css +++ b/theme/pigeonthoughts/css/display.css @@ -269,11 +269,7 @@ background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no #attachments .attachment { background:none; } -.notice-options .notice_reply a, -.notice-options form input.submit { -background-color:transparent; -} -.notice-options .notice_reply a { +.notice-options .notice_reply { background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%; } .notice-options form.form_favor input.submit { @@ -282,7 +278,7 @@ background:transparent url(../../base/images/icons/twotone/green/favourite.gif) .notice-options form.form_disfavor input.submit { background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%; } -.notice-options .notice_delete a { +.notice-options .notice_delete { background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; } From 9c09bfe4d721a7a3be907dcba42eb6d31f50020d Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 18:04:45 +0000 Subject: [PATCH 008/423] Removed
    structure from NoticeListItem::showNoticeLink. Reason: Arguably, the earlier structure was unnecessarily verbose. Same as commit e0b877b26c5e93809b2a53b6c46326d5e31fa0e8. --- lib/noticelist.php | 7 +------ theme/base/css/display.css | 3 +-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index 0bd98fef78..a3d20025f6 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -357,19 +357,14 @@ class NoticeListItem extends Widget preg_match('/^http/', $this->notice->uri)) { $noticeurl = $this->notice->uri; } - $this->out->elementStart('dl', 'timestamp'); - $this->out->element('dt', null, _('Published')); - $this->out->elementStart('dd', null); $this->out->elementStart('a', array('rel' => 'bookmark', + 'class' => 'timestamp', 'href' => $noticeurl)); $dt = common_date_iso8601($this->notice->created); $this->out->element('abbr', array('class' => 'published', 'title' => $dt), common_date_string($this->notice->created)); - $this->out->elementEnd('a'); - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); } /** diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 41fc5c20e7..8b9fcd309d 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -882,11 +882,10 @@ font-size:1.025em; display:inline; } -.notice div.entry-content .timestamp dt, .notice div.entry-content .response dt { display:none; } -.notice div.entry-content .timestamp a { +.notice div.entry-content a.timestamp { display:inline-block; } .notice div.entry-content .device dt { From e37834191082a76370525b41ad57ae56f726fc65 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 18:22:05 +0000 Subject: [PATCH 009/423] Removed
    structure from NoticeListItem::showNoticeSource. Same as commit e0b877b26c5e93809b2a53b6c46326d5e31fa0e8. --- lib/noticelist.php | 14 +++++++------- theme/base/css/display.css | 3 --- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index a3d20025f6..7d363a5a24 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -379,8 +379,8 @@ class NoticeListItem extends Widget function showNoticeSource() { if ($this->notice->source) { - $this->out->elementStart('dl', 'device'); - $this->out->element('dt', null, _('From')); + $this->out->elementStart('span', 'source'); + $this->out->text(_('from')); $source_name = _($this->notice->source); switch ($this->notice->source) { case 'web': @@ -389,22 +389,22 @@ class NoticeListItem extends Widget case 'omb': case 'system': case 'api': - $this->out->element('dd', null, $source_name); + $this->out->element('span', 'device', $source_name); break; default: $ns = Notice_source::staticGet($this->notice->source); if ($ns) { - $this->out->elementStart('dd', null); + $this->out->elementStart('span', 'device'); $this->out->element('a', array('href' => $ns->url, 'rel' => 'external'), $ns->name); - $this->out->elementEnd('dd'); + $this->out->elementEnd('span'); } else { - $this->out->element('dd', null, $source_name); + $this->out->element('span', 'device', $source_name); } break; } - $this->out->elementEnd('dl'); + $this->out->elementEnd('span'); } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 8b9fcd309d..3b3c0e19f1 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -888,9 +888,6 @@ display:none; .notice div.entry-content a.timestamp { display:inline-block; } -.notice div.entry-content .device dt { -text-transform:lowercase; -} .notice-options { position:relative; From 0b47e71e7a693b6bd9230043c6e1078059de16f6 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 18:26:00 +0000 Subject: [PATCH 010/423] Removed
    structure from NoticeListItem::showContext. Same as committ e0b877b26c5e93809b2a53b6c46326d5e31fa0e8. --- lib/noticelist.php | 8 ++------ theme/base/css/display.css | 9 --------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index 7d363a5a24..a8d5059ca4 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -424,13 +424,9 @@ class NoticeListItem extends Widget && $this->notice->conversation != $this->notice->id) { $convurl = common_local_url('conversation', array('id' => $this->notice->conversation)); - $this->out->elementStart('dl', 'response'); - $this->out->element('dt', null, _('To')); - $this->out->elementStart('dd'); - $this->out->element('a', array('href' => $convurl.'#notice-'.$this->notice->id), + $this->out->element('a', array('href' => $convurl.'#notice-'.$this->notice->id, + 'class' => 'response'), _('in context')); - $this->out->elementEnd('dd'); - $this->out->elementEnd('dl'); } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 3b3c0e19f1..1e49374732 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -876,15 +876,6 @@ float:left; font-size:1.025em; } -.notice div.entry-content dl, -.notice div.entry-content dt, -.notice div.entry-content dd { -display:inline; -} - -.notice div.entry-content .response dt { -display:none; -} .notice div.entry-content a.timestamp { display:inline-block; } From cdf6d655b5a1f6378333c9a30aa40ff2f00b92fb Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 18:29:30 +0000 Subject: [PATCH 011/423] Minor change to timestamp selector --- theme/base/css/display.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 1e49374732..364ea0b623 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -876,7 +876,7 @@ float:left; font-size:1.025em; } -.notice div.entry-content a.timestamp { +.notice div.entry-content .timestamp { display:inline-block; } From ef571f731c9a2706f16b969dabf78cae80e0e46d Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 25 Jul 2009 18:30:18 +0000 Subject: [PATCH 012/423] Updated pigeontheme to reflect the changes made to entry-content structure --- theme/pigeonthoughts/css/base.css | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/theme/pigeonthoughts/css/base.css b/theme/pigeonthoughts/css/base.css index f2256b7caa..980d7ddd77 100644 --- a/theme/pigeonthoughts/css/base.css +++ b/theme/pigeonthoughts/css/base.css @@ -847,23 +847,9 @@ margin-left:0; float:left; font-size:1.025em; } - -.notice div.entry-content dl, -.notice div.entry-content dt, -.notice div.entry-content dd { -display:inline; -} - -.notice div.entry-content .timestamp dt, -.notice div.entry-content .response dt { -display:none; -} -.notice div.entry-content .timestamp a { +.notice div.entry-content .timestamp { display:inline-block; } -.notice div.entry-content .device dt { -text-transform:lowercase; -} .notice-options { position:relative; From d3a72431bef054217a71a97d3a13fd9b293fb86d Mon Sep 17 00:00:00 2001 From: Brenda Wallace Date: Sun, 26 Jul 2009 16:34:27 +1200 Subject: [PATCH 013/423] lowercase tags using mb_convert_case(), which understands many more alphabets than I do. --- lib/util.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index c7c82dba29..d784bb7933 100644 --- a/lib/util.php +++ b/lib/util.php @@ -595,7 +595,8 @@ function common_tag_link($tag) function common_canonical_tag($tag) { - return strtolower(str_replace(array('-', '_', '.'), '', $tag)); + $tag = mb_convert_case($tag, MB_CASE_LOWER, "UTF-8"); + return str_replace(array('-', '_', '.'), '', $tag); } function common_valid_profile_tag($str) From b9cf19a2ee4b483709f1e964860fcf9209c4ba05 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 27 Jul 2009 02:54:51 +0000 Subject: [PATCH 014/423] Better error handling when updating Facebook --- lib/facebookutil.php | 13 ++++++++----- lib/mail.php | 8 ++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/facebookutil.php b/lib/facebookutil.php index 85077c254a..b7688f04f0 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -193,14 +193,16 @@ function facebookBroadcastNotice($notice) $facebook->api_client->users_setStatus($status, $fbuid, false, true); } } catch(FacebookRestClientException $e) { - common_log(LOG_ERR, $e->getMessage()); + + $code = $e->getCode(); + + common_log(LOG_ERR, 'Facebook returned error code ' . + $code . ': ' . $e->getMessage()); common_log(LOG_ERR, 'Unable to update Facebook status for ' . "$user->nickname (user id: $user->id)!"); - $code = $e->getCode(); - - if ($code >= 200) { + if ($code == 200 || $code == 250) { // 200 The application does not have permission to operate on the passed in uid parameter. // 250 Updating status requires the extended permission status_update or publish_stream. @@ -216,7 +218,8 @@ function facebookBroadcastNotice($notice) try { updateProfileBox($facebook, $flink, $notice); } catch(FacebookRestClientException $e) { - common_log(LOG_WARNING, $e->getMessage()); + common_log(LOG_ERR, 'Facebook returned error code ' . + $e->getCode() . ': ' . $e->getMessage()); common_log(LOG_WARNING, 'Unable to update Facebook profile box for ' . "$user->nickname (user id: $user->id)."); diff --git a/lib/mail.php b/lib/mail.php index 262f788ee5..0050ad8104 100644 --- a/lib/mail.php +++ b/lib/mail.php @@ -679,17 +679,17 @@ function mail_facebook_app_removed($user) $site_name = common_config('site', 'name'); $subject = sprintf( - _('Your %s Facebook application access has been disabled.', + _('Your %1\$s Facebook application access has been disabled.', $site_name)); $body = sprintf(_("Hi, %1\$s. We're sorry to inform you that we are " . - 'unable to update your Facebook status from %s, and have disabled ' . + 'unable to update your Facebook status from %2\$s, and have disabled ' . 'the Facebook application for your account. This may be because ' . 'you have removed the Facebook application\'s authorization, or ' . 'have deleted your Facebook account. You can re-enable the ' . 'Facebook application and automatic status updating by ' . - "re-installing the %1\$s Facebook application.\n\nRegards,\n\n%1\$s"), - $site_name); + "re-installing the %2\$s Facebook application.\n\nRegards,\n\n%2\$s"), + $user->nickname, $site_name); common_init_locale(); return mail_to_user($user, $subject, $body); From 0c8d003d40fb947d2f79398137c039803e0a5966 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 27 Jul 2009 16:57:30 +0000 Subject: [PATCH 015/423] Added config options for site's default design value --- config.php.sample | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.php.sample b/config.php.sample index 57aa6a6c8c..36e62f70f2 100644 --- a/config.php.sample +++ b/config.php.sample @@ -18,6 +18,14 @@ $config['site']['server'] = 'localhost'; $config['site']['path'] = 'laconica'; // $config['site']['fancy'] = false; // $config['site']['theme'] = 'default'; +// Sets the site's default design values (match it with the values in the theme) +// $config['site']['design']['backgroundcolor'] = '#F0F2F5'; +// $config['site']['design']['contentcolor'] = '#FFFFFF'; +// $config['site']['design']['sidebarcolor'] = '#CEE1E9'; +// $config['site']['design']['textcolor'] = '#000000'; +// $config['site']['design']['linkcolor'] = '#002E6E'; +// $config['site']['design']['backgroundimage'] = null; +// $config['site']['design']['disposition'] = 1; // To enable the built-in mobile style sheet, defaults to false. // $config['site']['mobile'] = true; // For contact email, defaults to $_SERVER["SERVER_ADMIN"] From 50a343bcf73d7ced643ce40ad31f479d584cb5c1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 13:11:46 -0400 Subject: [PATCH 016/423] script to create a simulation database --- scripts/createsim.php | 142 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 scripts/createsim.php diff --git a/scripts/createsim.php b/scripts/createsim.php new file mode 100644 index 0000000000..eb97a624db --- /dev/null +++ b/scripts/createsim.php @@ -0,0 +1,142 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'u:n:b:t:x:'; +$longoptions = array('users=', 'notices=', 'subscriptions=', 'tags=', 'prefix='); + +$helptext = << sprintf('%s%d', $userprefix, $i), + 'password' => sprintf('password%d', $i), + 'fullname' => sprintf('Test User %d', $i))); +} + +function newNotice($i, $tagmax) +{ + global $userprefix; + + $n = rand(0, $i - 1); + $user = User::staticGet('nickname', sprintf('%s%d', $userprefix, $n)); + + $is_reply = rand(0, 4); + + $content = 'Test notice content'; + + if ($is_reply == 0) { + $n = rand(0, $i - 1); + $content = "@$userprefix$n " . $content; + } + + $has_hash = rand(0, 2); + + if ($has_hash == 0) { + $hashcount = rand(0, 2); + for ($j = 0; $j < $hashcount; $j++) { + $h = rand(0, $tagmax); + $content .= " #tag{$h}"; + } + } + + $notice = Notice::saveNew($user->id, $content, 'system'); +} + +function newSub($i) +{ + global $userprefix; + $f = rand(0, $i - 1); + + $fromnick = sprintf('%s%d', $userprefix, $f); + + $from = User::staticGet('nickname', $fromnick); + + if (empty($from)) { + throw new Exception("Can't find user '$fromnick'."); + } + + $t = rand(0, $i - 1); + + if ($t == $f) { + $t++; + if ($t > $i - 1) { + $t = 0; + } + } + + $tunic = sprintf('%s%d', $userprefix, $t); + + $to = User::staticGet('nickname', $tunic); + + if (empty($from)) { + throw new Exception("Can't find user '$tunic'."); + } + + subs_subscribe_to($from, $to); +} + +function main($usercount, $noticeavg, $subsavg, $tagmax) +{ + $n = 1; + + newUser(0); + + // # registrations + # notices + # subs + + $events = $usercount + ($usercount * ($noticeavg + $subsavg)); + + for ($i = 0; $i < $events; $i++) + { + $e = rand(0, 1 + $noticeavg + $subsavg); + + if ($e == 0) { + newUser($n); + $n++; + } else if ($e < $noticeavg + 1) { + newNotice($n, $tagmax); + } else { + newSub($n); + } + } +} + +$usercount = (have_option('u', 'users')) ? get_option_value('u', 'users') : 100; +$noticeavg = (have_option('n', 'notices')) ? get_option_value('n', 'notices') : 100; +$subsavg = (have_option('b', 'subscriptions')) ? get_option_value('b', 'subscriptions') : min($usercount/20, 10); +$tagmax = (have_option('t', 'tags')) ? get_option_value('t', 'tags') : 10000; +$userprefix = (have_option('x', 'prefix')) ? get_option_value('x', 'prefix') : 'testuser'; + +main($usercount, $noticeavg, $subsavg, $tagmax); From ff7f6ea583ee835ee81ec8b00d20a9f72821411f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 13:26:53 -0400 Subject: [PATCH 017/423] want a minimum of 10 subs per user --- scripts/createsim.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/createsim.php b/scripts/createsim.php index eb97a624db..71827ba5b7 100644 --- a/scripts/createsim.php +++ b/scripts/createsim.php @@ -135,7 +135,7 @@ function main($usercount, $noticeavg, $subsavg, $tagmax) $usercount = (have_option('u', 'users')) ? get_option_value('u', 'users') : 100; $noticeavg = (have_option('n', 'notices')) ? get_option_value('n', 'notices') : 100; -$subsavg = (have_option('b', 'subscriptions')) ? get_option_value('b', 'subscriptions') : min($usercount/20, 10); +$subsavg = (have_option('b', 'subscriptions')) ? get_option_value('b', 'subscriptions') : max($usercount/20, 10); $tagmax = (have_option('t', 'tags')) ? get_option_value('t', 'tags') : 10000; $userprefix = (have_option('x', 'prefix')) ? get_option_value('x', 'prefix') : 'testuser'; From ac75772150c3fe9411408ac44db04e774d095aa0 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Mon, 27 Jul 2009 13:42:03 -0400 Subject: [PATCH 018/423] Sanitize html returned by oEmbed providers to protect laconica from XSS attacks --- extlib/htmLawed/htmLawed.php | 715 +++++++++ extlib/htmLawed/htmLawedTest.php | 592 ++++++++ extlib/htmLawed/htmLawed_README.htm | 1979 +++++++++++++++++++++++++ extlib/htmLawed/htmLawed_README.txt | 1600 ++++++++++++++++++++ extlib/htmLawed/htmLawed_TESTCASE.txt | 370 +++++ lib/attachmentlist.php | 7 +- 6 files changed, 5262 insertions(+), 1 deletion(-) create mode 100644 extlib/htmLawed/htmLawed.php create mode 100644 extlib/htmLawed/htmLawedTest.php create mode 100644 extlib/htmLawed/htmLawed_README.htm create mode 100644 extlib/htmLawed/htmLawed_README.txt create mode 100644 extlib/htmLawed/htmLawed_TESTCASE.txt diff --git a/extlib/htmLawed/htmLawed.php b/extlib/htmLawed/htmLawed.php new file mode 100644 index 0000000000..17f6e98ca3 --- /dev/null +++ b/extlib/htmLawed/htmLawed.php @@ -0,0 +1,715 @@ +1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'applet'=>1, 'area'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'blockquote'=>1, 'br'=>1, 'button'=>1, 'caption'=>1, 'center'=>1, 'cite'=>1, 'code'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'del'=>1, 'dfn'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'dt'=>1, 'em'=>1, 'embed'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'isindex'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'p'=>1, 'param'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'tt'=>1, 'u'=>1, 'ul'=>1, 'var'=>1); // 86/deprecated+embed+ruby +if(!empty($C['safe'])){ + unset($e['applet'], $e['embed'], $e['iframe'], $e['object'], $e['script']); +} +$x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*'; +if($x == '-*'){$e = array();} +elseif(strpos($x, '*') === false){$e = array_flip(explode(',', $x));} +else{ + if(isset($x[1])){ + preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER); + for($i=count($m); --$i>=0;){$m[$i] = $m[$i][0];} + foreach($m as $v){ + if($v[0] == '+'){$e[substr($v, 1)] = 1;} + if($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'. $v, $m)){unset($e[$v]);} + } + } +} +$C['elements'] =& $e; +// config attrs +$x = !empty($C['deny_attribute']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute']) : ''; +$x = array_flip((isset($x[0]) && $x[0] == '*') ? explode('-', $x) : explode(',', $x. (!empty($C['safe']) ? ',on*' : ''))); +if(isset($x['on*'])){ + unset($x['on*']); + $x += array('onblur'=>1, 'onchange'=>1, 'onclick'=>1, 'ondblclick'=>1, 'onfocus'=>1, 'onkeydown'=>1, 'onkeypress'=>1, 'onkeyup'=>1, 'onmousedown'=>1, 'onmousemove'=>1, 'onmouseout'=>1, 'onmouseover'=>1, 'onmouseup'=>1, 'onreset'=>1, 'onselect'=>1, 'onsubmit'=>1); +} +$C['deny_attribute'] = $x; +// config URL +$x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; *:file, http, https'; +$C['schemes'] = array(); +foreach(explode(';', str_replace(array(' ', "\t", "\r", "\n"), '', $x)) as $v){ + $x = $x2 = null; list($x, $x2) = explode(':', $v, 2); + if($x2){$C['schemes'][$x] = array_flip(explode(',', $x2));} +} +if(!isset($C['schemes']['*'])){$C['schemes']['*'] = array('file'=>1, 'http'=>1, 'https'=>1,);} +if(!empty($C['safe']) && empty($C['schemes']['style'])){$C['schemes']['style'] = array('nil'=>1);} +$C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0; +if(!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])){ + $C['base_url'] = $C['abs_url'] = 0; +} +// config rest +$C['and_mark'] = empty($C['and_mark']) ? 0 : 1; +$C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0; +$C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0; +$C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1; +$C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0); +$C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char']; +$C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0); +$C['css_expression'] = empty($C['css_expression']) ? 0 : 1; +$C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1; +$C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0; +$C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0; +$C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6; +$C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1; +$C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1; +$C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1; +$C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1; +$C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body'; +$C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0; +$C['style_pass'] = empty($C['style_pass']) ? 0 : 1; +$C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy']; +$C['unique_ids'] = isset($C['unique_ids']) ? $C['unique_ids'] : 1; +$C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0; + +if(isset($GLOBALS['C'])){$reC = $GLOBALS['C'];} +$GLOBALS['C'] = $C; +$S = is_array($S) ? $S : hl_spec($S); +if(isset($GLOBALS['S'])){$reS = $GLOBALS['S'];} +$GLOBALS['S'] = $S; + +$t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t); +if($C['clean_ms_char']){ + $x = array("\x7f"=>'', "\x80"=>'€', "\x81"=>'', "\x83"=>'ƒ', "\x85"=>'…', "\x86"=>'†', "\x87"=>'‡', "\x88"=>'ˆ', "\x89"=>'‰', "\x8a"=>'Š', "\x8b"=>'‹', "\x8c"=>'Œ', "\x8d"=>'', "\x8e"=>'Ž', "\x8f"=>'', "\x90"=>'', "\x95"=>'•', "\x96"=>'–', "\x97"=>'—', "\x98"=>'˜', "\x99"=>'™', "\x9a"=>'š', "\x9b"=>'›', "\x9c"=>'œ', "\x9d"=>'', "\x9e"=>'ž', "\x9f"=>'Ÿ'); + $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82"=>'‚', "\x84"=>'„', "\x91"=>'‘', "\x92"=>'’', "\x93"=>'“', "\x94"=>'”') : array("\x82"=>'\'', "\x84"=>'"', "\x91"=>'\'', "\x92"=>'\'', "\x93"=>'"', "\x94"=>'"')); + $t = strtr($t, $x); +} +if($C['cdata'] or $C['comment']){$t = preg_replace_callback('``sm', 'hl_cmtcd', $t);} +$t = preg_replace_callback('`&([A-Za-z][A-Za-z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'hl_ent', str_replace('&', '&', $t)); +if($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])){$GLOBALS['hl_Ids'] = array();} +if($C['hook']){$t = $C['hook']($t, $C, $S);} +if($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])){ + $GLOBALS[$C['show_setting']] = array('config'=>$C, 'spec'=>$S, 'time'=>microtime()); +} +// main +$t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t); +$t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t; +$t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t; +$t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t; +unset($C, $e); +if(isset($reC)){$GLOBALS['C'] = $reC;} +if(isset($reS)){$GLOBALS['S'] = $reS;} +return $t; +// eof +} + +function hl_attrval($t, $p){ +// check attr val against $S +$o = 1; $l = strlen($t); +foreach($p as $k=>$v){ + switch($k){ + case 'maxlen':if($l > $v){$o = 0;} + break; case 'minlen': if($l < $v){$o = 0;} + break; case 'maxval': if((float)($t) > $v){$o = 0;} + break; case 'minval': if((float)($t) < $v){$o = 0;} + break; case 'match': if(!preg_match($v, $t)){$o = 0;} + break; case 'nomatch': if(preg_match($v, $t)){$o = 0;} + break; case 'oneof': + $m = 0; + foreach(explode('|', $v) as $n){if($t == $n){$m = 1; break;}} + $o = $m; + break; case 'noneof': + $m = 1; + foreach(explode('|', $v) as $n){if($t == $n){$m = 0; break;}} + $o = $m; + break; default: + break; + } + if(!$o){break;} +} +return ($o ? $t : (isset($p['default']) ? $p['default'] : 0)); +// eof +} + +function hl_bal($t, $do=1, $in='div'){ +// balance tags +// by content +$cB = array('blockquote'=>1, 'form'=>1, 'map'=>1, 'noscript'=>1); // Block +$cE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty +$cF = array('button'=>1, 'del'=>1, 'div'=>1, 'dd'=>1, 'fieldset'=>1, 'iframe'=>1, 'ins'=>1, 'li'=>1, 'noscript'=>1, 'object'=>1, 'td'=>1, 'th'=>1); // Flow; later context-wise dynamic move of ins & del to $cI +$cI = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'caption'=>1, 'cite'=>1, 'code'=>1, 'dfn'=>1, 'dt'=>1, 'em'=>1, 'font'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'i'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'p'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rt'=>1, 's'=>1, 'samp'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); // Inline +$cN = array('a'=>array('a'=>1), 'button'=>array('a'=>1, 'button'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'fieldset'=>array('fieldset'=>1), 'form'=>array('form'=>1), 'label'=>array('label'=>1), 'noscript'=>array('script'=>1), 'pre'=>array('big'=>1, 'font'=>1, 'img'=>1, 'object'=>1, 'script'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1), 'rb'=>array('ruby'=>1), 'rt'=>array('ruby'=>1)); // Illegal +$cN2 = array_keys($cN); +$cR = array('blockquote'=>1, 'dir'=>1, 'dl'=>1, 'form'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); +$cS = array('colgroup'=>array('col'=>1), 'dir'=>array('li'), 'dl'=>array('dd'=>1, 'dt'=>1), 'menu'=>array('li'=>1), 'ol'=>array('li'=>1), 'optgroup'=>array('option'=>1), 'option'=>array('#pcdata'=>1), 'rbc'=>array('rb'=>1), 'rp'=>array('#pcdata'=>1), 'rtc'=>array('rt'=>1), 'ruby'=>array('rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1), 'select'=>array('optgroup'=>1, 'option'=>1), 'script'=>array('#pcdata'=>1), 'table'=>array('caption'=>1, 'col'=>1, 'colgroup'=>1, 'tfoot'=>1, 'tbody'=>1, 'tr'=>1, 'thead'=>1), 'tbody'=>array('tr'=>1), 'tfoot'=>array('tr'=>1), 'textarea'=>array('#pcdata'=>1), 'thead'=>array('tr'=>1), 'tr'=>array('td'=>1, 'th'=>1), 'ul'=>array('li'=>1)); // Specific - immediate parent-child +$cO = array('address'=>array('p'=>1), 'applet'=>array('param'=>1), 'blockquote'=>array('script'=>1), 'fieldset'=>array('legend'=>1, '#pcdata'=>1), 'form'=>array('script'=>1), 'map'=>array('area'=>1), 'object'=>array('param'=>1, 'embed'=>1)); // Other +$cT = array('colgroup'=>1, 'dd'=>1, 'dt'=>1, 'li'=>1, 'option'=>1, 'p'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1); // Omitable closing +// block/inline type; ins & del both type; #pcdata: text +$eB = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'del'=>1, 'dir'=>1, 'dl'=>1, 'div'=>1, 'fieldset'=>1, 'form'=>1, 'ins'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'isindex'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'table'=>1, 'ul'=>1); +$eI = array('#pcdata'=>1, 'a'=>1, 'abbr'=>1, 'acronym'=>1, 'applet'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'br'=>1, 'button'=>1, 'cite'=>1, 'code'=>1, 'del'=>1, 'dfn'=>1, 'em'=>1, 'embed'=>1, 'font'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'kbd'=>1, 'label'=>1, 'map'=>1, 'object'=>1, 'param'=>1, 'q'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'select'=>1, 'script'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); +$eN = array('a'=>1, 'big'=>1, 'button'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'label'=>1, 'object'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1); // Exclude from specific ele; $cN values +$eO = array('area'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'dt'=>1, 'legend'=>1, 'li'=>1, 'optgroup'=>1, 'option'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'script'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'thead'=>1, 'th'=>1, 'tr'=>1); // Missing in $eB & $eI +$eF = $eB + $eI; + +// $in sets allowed child +$in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div'; +if(isset($cE[$in])){ + return (!$do ? '' : str_replace(array('<', '>'), array('<', '>'), $t)); +} +if(isset($cS[$in])){$inOk = $cS[$in];} +elseif(isset($cI[$in])){$inOk = $eI; $cI['del'] = 1; $cI['ins'] = 1;} +elseif(isset($cF[$in])){$inOk = $eF; unset($cI['del'], $cI['ins']);} +elseif(isset($cB[$in])){$inOk = $eB; unset($cI['del'], $cI['ins']);} +if(isset($cO[$in])){$inOk = $inOk + $cO[$in];} +if(isset($cN[$in])){$inOk = array_diff_assoc($inOk, $cN[$in]);} + +$t = explode('<', $t); +$ok = $q = array(); // $q seq list of open non-empty ele +ob_start(); + +for($i=-1, $ci=count($t); ++$i<$ci;){ + // allowed $ok in parent $p + if($ql = count($q)){ + $p = array_pop($q); + $q[] = $p; + if(isset($cS[$p])){$ok = $cS[$p];} + elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} + elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} + elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} + if(isset($cO[$p])){$ok = $ok + $cO[$p];} + if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} + }else{$ok = $inOk; unset($cI['del'], $cI['ins']);} + // bad tags, & ele content + if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ + echo '<', $s, $e, $a, '>'; + } + if(isset($x[0])){ + if($do < 3 or isset($ok['#pcdata'])){echo $x;} + elseif(strpos($x, "\x02\x04")){ + foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ + echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); + } + }elseif($do > 4){echo preg_replace('`\S`', '', $x);} + } + // get markup + if(!preg_match('`^(/?)([a-zA-Z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)){$x = $t[$i]; continue;} + $s = null; $e = null; $a = null; $x = null; list($all, $s, $e, $a, $x) = $r; + // close tag + if($s){ + if(isset($cE[$e]) or !in_array($e, $q)){continue;} // Empty/unopen + if($p == $e){array_pop($q); echo ''; unset($e); continue;} // Last open + $add = ''; // Nesting - close open tags that need to be + for($j=-1, $cj=count($q); ++$j<$cj;){ + if(($d = array_pop($q)) == $e){break;} + else{$add .= "";} + } + echo $add, ''; unset($e); continue; + } + // open tag + // $cB ele needs $eB ele as child + if(isset($cB[$e]) && strlen(trim($x))){ + $t[$i] = "{$e}{$a}>"; + array_splice($t, $i+1, 0, 'div>'. $x); unset($e, $x); ++$ci; --$i; continue; + } + if((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])){ + array_splice($t, $i, 0, 'div>'); unset($e, $x); ++$ci; --$i; continue; + } + // if no open ele, $in = parent; mostly immediate parent-child relation should hold + if(!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)){ + if(!isset($ok[$e])){ + if($ql && isset($cT[$p])){echo ''; unset($e, $x); --$i;} + continue; + } + if(!isset($cE[$e])){$q[] = $e;} + echo '<', $e, $a, '>'; unset($e); continue; + } + // specific parent-child + if(isset($cS[$p][$e])){ + if(!isset($cE[$e])){$q[] = $e;} + echo '<', $e, $a, '>'; unset($e); continue; + } + // nesting + $add = ''; + $q2 = array(); + for($k=-1, $kc=count($q); ++$k<$kc;){ + $d = $q[$k]; + $ok2 = array(); + if(isset($cS[$d])){$q2[] = $d; continue;} + $ok2 = isset($cI[$d]) ? $eI : $eF; + if(isset($cO[$d])){$ok2 = $ok2 + $cO[$d];} + if(isset($cN[$d])){$ok2 = array_diff_assoc($ok2, $cN[$d]);} + if(!isset($ok2[$e])){ + if(!$k && !isset($inOk[$e])){continue 2;} + $add = ""; + for(;++$k<$kc;){$add = "{$add}";} + break; + } + else{$q2[] = $d;} + } + $q = $q2; + if(!isset($cE[$e])){$q[] = $e;} + echo $add, '<', $e, $a, '>'; unset($e); continue; +} + +// end +if($ql = count($q)){ + $p = array_pop($q); + $q[] = $p; + if(isset($cS[$p])){$ok = $cS[$p];} + elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;} + elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);} + elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);} + if(isset($cO[$p])){$ok = $ok + $cO[$p];} + if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);} +}else{$ok = $inOk; unset($cI['del'], $cI['ins']);} +if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ + echo '<', $s, $e, $a, '>'; +} +if(isset($x[0])){ + if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ + echo '
    ', $x, '
    '; + } + elseif($do < 3 or isset($ok['#pcdata'])){echo $x;} + elseif(strpos($x, "\x02\x04")){ + foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ + echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); + } + }elseif($do > 4){echo preg_replace('`\S`', '', $x);} +} +while(!empty($q) && ($e = array_pop($q))){echo '';} +$o = ob_get_contents(); +ob_end_clean(); +return $o; +// eof +} + +function hl_cmtcd($t){ +// comment/CDATA sec handler +$t = $t[0]; +global $C; +if($t[3] == '-'){ + if(!$C['comment']){return $t;} + if($C['comment'] == 1){return '';} + if(substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' '){$t .= ' ';} + $t = $C['comment'] == 2 ? str_replace(array('&', '<', '>'), array('&', '<', '>'), $t) : $t; + $t = "\x01\x02\x04!--$t--\x05\x02\x01"; +}else{ // CDATA + if(!$C['cdata']){return $t;} + if($C['cdata'] == 1){return '';} + $t = substr($t, 1, -1); + $t = $C['cdata'] == 2 ? str_replace(array('&', '<', '>'), array('&', '<', '>'), $t) : $t; + $t = "\x01\x01\x04$t\x05\x01\x01"; +} +return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), $t); +// eof +} + +function hl_ent($t){ +// entitity handler +global $C; +$t = $t[1]; +static $U = array('quot'=>1,'amp'=>1,'lt'=>1,'gt'=>1); +static $N = array('fnof'=>'402', 'Alpha'=>'913', 'Beta'=>'914', 'Gamma'=>'915', 'Delta'=>'916', 'Epsilon'=>'917', 'Zeta'=>'918', 'Eta'=>'919', 'Theta'=>'920', 'Iota'=>'921', 'Kappa'=>'922', 'Lambda'=>'923', 'Mu'=>'924', 'Nu'=>'925', 'Xi'=>'926', 'Omicron'=>'927', 'Pi'=>'928', 'Rho'=>'929', 'Sigma'=>'931', 'Tau'=>'932', 'Upsilon'=>'933', 'Phi'=>'934', 'Chi'=>'935', 'Psi'=>'936', 'Omega'=>'937', 'alpha'=>'945', 'beta'=>'946', 'gamma'=>'947', 'delta'=>'948', 'epsilon'=>'949', 'zeta'=>'950', 'eta'=>'951', 'theta'=>'952', 'iota'=>'953', 'kappa'=>'954', 'lambda'=>'955', 'mu'=>'956', 'nu'=>'957', 'xi'=>'958', 'omicron'=>'959', 'pi'=>'960', 'rho'=>'961', 'sigmaf'=>'962', 'sigma'=>'963', 'tau'=>'964', 'upsilon'=>'965', 'phi'=>'966', 'chi'=>'967', 'psi'=>'968', 'omega'=>'969', 'thetasym'=>'977', 'upsih'=>'978', 'piv'=>'982', 'bull'=>'8226', 'hellip'=>'8230', 'prime'=>'8242', 'Prime'=>'8243', 'oline'=>'8254', 'frasl'=>'8260', 'weierp'=>'8472', 'image'=>'8465', 'real'=>'8476', 'trade'=>'8482', 'alefsym'=>'8501', 'larr'=>'8592', 'uarr'=>'8593', 'rarr'=>'8594', 'darr'=>'8595', 'harr'=>'8596', 'crarr'=>'8629', 'lArr'=>'8656', 'uArr'=>'8657', 'rArr'=>'8658', 'dArr'=>'8659', 'hArr'=>'8660', 'forall'=>'8704', 'part'=>'8706', 'exist'=>'8707', 'empty'=>'8709', 'nabla'=>'8711', 'isin'=>'8712', 'notin'=>'8713', 'ni'=>'8715', 'prod'=>'8719', 'sum'=>'8721', 'minus'=>'8722', 'lowast'=>'8727', 'radic'=>'8730', 'prop'=>'8733', 'infin'=>'8734', 'ang'=>'8736', 'and'=>'8743', 'or'=>'8744', 'cap'=>'8745', 'cup'=>'8746', 'int'=>'8747', 'there4'=>'8756', 'sim'=>'8764', 'cong'=>'8773', 'asymp'=>'8776', 'ne'=>'8800', 'equiv'=>'8801', 'le'=>'8804', 'ge'=>'8805', 'sub'=>'8834', 'sup'=>'8835', 'nsub'=>'8836', 'sube'=>'8838', 'supe'=>'8839', 'oplus'=>'8853', 'otimes'=>'8855', 'perp'=>'8869', 'sdot'=>'8901', 'lceil'=>'8968', 'rceil'=>'8969', 'lfloor'=>'8970', 'rfloor'=>'8971', 'lang'=>'9001', 'rang'=>'9002', 'loz'=>'9674', 'spades'=>'9824', 'clubs'=>'9827', 'hearts'=>'9829', 'diams'=>'9830', 'apos'=>'39', 'OElig'=>'338', 'oelig'=>'339', 'Scaron'=>'352', 'scaron'=>'353', 'Yuml'=>'376', 'circ'=>'710', 'tilde'=>'732', 'ensp'=>'8194', 'emsp'=>'8195', 'thinsp'=>'8201', 'zwnj'=>'8204', 'zwj'=>'8205', 'lrm'=>'8206', 'rlm'=>'8207', 'ndash'=>'8211', 'mdash'=>'8212', 'lsquo'=>'8216', 'rsquo'=>'8217', 'sbquo'=>'8218', 'ldquo'=>'8220', 'rdquo'=>'8221', 'bdquo'=>'8222', 'dagger'=>'8224', 'Dagger'=>'8225', 'permil'=>'8240', 'lsaquo'=>'8249', 'rsaquo'=>'8250', 'euro'=>'8364', 'nbsp'=>'160', 'iexcl'=>'161', 'cent'=>'162', 'pound'=>'163', 'curren'=>'164', 'yen'=>'165', 'brvbar'=>'166', 'sect'=>'167', 'uml'=>'168', 'copy'=>'169', 'ordf'=>'170', 'laquo'=>'171', 'not'=>'172', 'shy'=>'173', 'reg'=>'174', 'macr'=>'175', 'deg'=>'176', 'plusmn'=>'177', 'sup2'=>'178', 'sup3'=>'179', 'acute'=>'180', 'micro'=>'181', 'para'=>'182', 'middot'=>'183', 'cedil'=>'184', 'sup1'=>'185', 'ordm'=>'186', 'raquo'=>'187', 'frac14'=>'188', 'frac12'=>'189', 'frac34'=>'190', 'iquest'=>'191', 'Agrave'=>'192', 'Aacute'=>'193', 'Acirc'=>'194', 'Atilde'=>'195', 'Auml'=>'196', 'Aring'=>'197', 'AElig'=>'198', 'Ccedil'=>'199', 'Egrave'=>'200', 'Eacute'=>'201', 'Ecirc'=>'202', 'Euml'=>'203', 'Igrave'=>'204', 'Iacute'=>'205', 'Icirc'=>'206', 'Iuml'=>'207', 'ETH'=>'208', 'Ntilde'=>'209', 'Ograve'=>'210', 'Oacute'=>'211', 'Ocirc'=>'212', 'Otilde'=>'213', 'Ouml'=>'214', 'times'=>'215', 'Oslash'=>'216', 'Ugrave'=>'217', 'Uacute'=>'218', 'Ucirc'=>'219', 'Uuml'=>'220', 'Yacute'=>'221', 'THORN'=>'222', 'szlig'=>'223', 'agrave'=>'224', 'aacute'=>'225', 'acirc'=>'226', 'atilde'=>'227', 'auml'=>'228', 'aring'=>'229', 'aelig'=>'230', 'ccedil'=>'231', 'egrave'=>'232', 'eacute'=>'233', 'ecirc'=>'234', 'euml'=>'235', 'igrave'=>'236', 'iacute'=>'237', 'icirc'=>'238', 'iuml'=>'239', 'eth'=>'240', 'ntilde'=>'241', 'ograve'=>'242', 'oacute'=>'243', 'ocirc'=>'244', 'otilde'=>'245', 'ouml'=>'246', 'divide'=>'247', 'oslash'=>'248', 'ugrave'=>'249', 'uacute'=>'250', 'ucirc'=>'251', 'uuml'=>'252', 'yacute'=>'253', 'thorn'=>'254', 'yuml'=>'255'); +if($t[0] != '#'){ + return ($C['and_mark'] ? "\x06" : '&'). (isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'. ($C['hexdec_entity'] > 1 ? 'x'. dechex($N[$t]) : $N[$t]) : $t) : 'amp;'. $t)). ';'; +} +if(($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))){ + return ($C['and_mark'] ? "\x06" : '&'). "amp;#{$t};"; +} +return ($C['and_mark'] ? "\x06" : '&'). '#'. (((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'. dechex($n)). ';'; +// eof +} + +function hl_prot($p, $c=null){ +// check URL scheme +global $C; +$b = $a = ''; +if($c == null){$c = 'style'; $b = $p[1]; $a = $p[3]; $p = trim($p[2]);} +$c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*']; +if(isset($c['*']) or !strcspn($p, '#?;')){return "{$b}{$p}{$a}";} // All ok, frag, query, param +if(preg_match('`^([a-z\d\-+.&#; ]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])){ // Denied prot + return "{$b}denied:{$p}{$a}"; +} +if($C['abs_url']){ + if($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0){ // Make url rel + $p = substr($p, strlen($C['base_url'])); + }elseif(empty($m[1])){ // Make URL abs + if(substr($p, 0, 2) == '//'){$p = substr($C['base_url'], 0, strpos($C['base_url'], ':')+1). $p;} + elseif($p[0] == '/'){$p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']). $p;} + elseif(strcspn($p, './')){$p = $C['base_url']. $p;} + else{ + preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m); + $p = preg_replace('`(?<=/)\./`', '', $m[2]. $p); + while(preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)){ + $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p); + } + $p = $m[1]. $p; + } + } +} +return "{$b}{$p}{$a}"; +// eof +} + +function hl_regex($p){ +// ?regex +if(empty($p)){return 0;} +if($t = ini_get('track_errors')){$o = isset($php_errormsg) ? $php_errormsg : null;} +else{ini_set('track_errors', 1);} +unset($php_errormsg); +if(($d = ini_get('display_errors'))){ini_set('display_errors', 0);} +preg_match($p, ''); +if($d){ini_set('display_errors', 1);} +$r = isset($php_errormsg) ? 0 : 1; +if($t){$php_errormsg = isset($o) ? $o : null;} +else{ini_set('track_errors', 0);} +return $r; +// eof +} + +function hl_spec($t){ +// final $spec +$s = array(); +$t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace('/"(?>(`.|[^"])*)"/sme', 'substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", \'`"\'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\""), "$0"), 1, -1)', trim($t))); +for($i = count(($t = explode(';', $t))); --$i>=0;){ + $w = $t[$i]; + if(empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e+1)))){continue;} + $y = $n = array(); + foreach(explode(',', $a) as $v){ + if(!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)){continue;} + if(($x = strtolower($m[1])) == '-*'){$n['*'] = 1; continue;} + if($x[0] == '-'){$n[substr($x, 1)] = 1; continue;} + if(!isset($m[2])){$y[$x] = 1; continue;} + foreach(explode('/', $m[2]) as $m){ + if(empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5){$y[$x] = 1; continue;} + $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p+1)); + } + if(isset($y[$x]['match']) && !hl_regex($y[$x]['match'])){unset($y[$x]['match']);} + if(isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])){unset($y[$x]['nomatch']);} + } + if(!count($y) && !count($n)){continue;} + foreach(explode(',', substr($w, 0, $e)) as $v){ + if(!strlen(($v = strtolower($v)))){continue;} + if(count($y)){$s[$v] = $y;} + if(count($n)){$s[$v]['n'] = $n;} + } +} +return $s; +// eof +} + +function hl_tag($t){ +// tag/attribute handler +global $C; +$t = $t[0]; +// invalid < > +if($t == '< '){return '< ';} +if($t == '>'){return '>';} +if(!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)){ + return str_replace(array('<', '>'), array('<', '>'), $t); +}elseif(!isset($C['elements'][($e = strtolower($m[2]))])){ + return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : ''); +} +// attr string +$a = str_replace(array("\xad", "\n", "\r", "\t"), ' ', trim($m[3])); +if(strpos($a, '&') !== false){ + str_replace(array('­', '­', '­'), ' ', $a); +} +// tag transform +static $eD = array('applet'=>1, 'center'=>1, 'dir'=>1, 'embed'=>1, 'font'=>1, 'isindex'=>1, 'menu'=>1, 's'=>1, 'strike'=>1, 'u'=>1); // Deprecated +if($C['make_tag_strict'] && isset($eD[$e])){ + $trt = hl_tag2($e, $a, $C['make_tag_strict']); + if(!$e){return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : '');} +} +// close tag +static $eE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty ele +if(!empty($m[1])){ + return (!isset($eE[$e]) ? "" : (($C['keep_bad'])%2 ? str_replace(array('<', '>'), array('<', '>'), $t) : '')); +} + +// open tag & attr +static $aN = array('abbr'=>array('td'=>1, 'th'=>1), 'accept-charset'=>array('form'=>1), 'accept'=>array('form'=>1, 'input'=>1), 'accesskey'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'legend'=>1, 'textarea'=>1), 'action'=>array('form'=>1), 'align'=>array('caption'=>1, 'embed'=>1, 'applet'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'legend'=>1, 'table'=>1, 'hr'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'p'=>1, 'col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'alt'=>array('applet'=>1, 'area'=>1, 'img'=>1, 'input'=>1), 'archive'=>array('applet'=>1, 'object'=>1), 'axis'=>array('td'=>1, 'th'=>1), 'bgcolor'=>array('embed'=>1, 'table'=>1, 'tr'=>1, 'td'=>1, 'th'=>1), 'border'=>array('table'=>1, 'img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellpadding'=>array('table'=>1), 'cellspacing'=>array('table'=>1), 'char'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charoff'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charset'=>array('a'=>1, 'script'=>1), 'checked'=>array('input'=>1), 'cite'=>array('blockquote'=>1, 'q'=>1, 'del'=>1, 'ins'=>1), 'classid'=>array('object'=>1), 'clear'=>array('br'=>1), 'code'=>array('applet'=>1), 'codebase'=>array('object'=>1, 'applet'=>1), 'codetype'=>array('object'=>1), 'color'=>array('font'=>1), 'cols'=>array('textarea'=>1), 'colspan'=>array('td'=>1, 'th'=>1), 'compact'=>array('dir'=>1, 'dl'=>1, 'menu'=>1, 'ol'=>1, 'ul'=>1), 'coords'=>array('area'=>1, 'a'=>1), 'data'=>array('object'=>1), 'datetime'=>array('del'=>1, 'ins'=>1), 'declare'=>array('object'=>1), 'defer'=>array('script'=>1), 'dir'=>array('bdo'=>1), 'disabled'=>array('button'=>1, 'input'=>1, 'optgroup'=>1, 'option'=>1, 'select'=>1, 'textarea'=>1), 'enctype'=>array('form'=>1), 'face'=>array('font'=>1), 'for'=>array('label'=>1), 'frame'=>array('table'=>1), 'frameborder'=>array('iframe'=>1), 'headers'=>array('td'=>1, 'th'=>1), 'height'=>array('embed'=>1, 'iframe'=>1, 'td'=>1, 'th'=>1, 'img'=>1, 'object'=>1, 'applet'=>1), 'href'=>array('a'=>1, 'area'=>1), 'hreflang'=>array('a'=>1), 'hspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'ismap'=>array('img'=>1, 'input'=>1), 'label'=>array('option'=>1, 'optgroup'=>1), 'language'=>array('script'=>1), 'longdesc'=>array('img'=>1, 'iframe'=>1), 'marginheight'=>array('iframe'=>1), 'marginwidth'=>array('iframe'=>1), 'maxlength'=>array('input'=>1), 'method'=>array('form'=>1), 'model'=>array('embed'=>1), 'multiple'=>array('select'=>1), 'name'=>array('button'=>1, 'embed'=>1, 'textarea'=>1, 'applet'=>1, 'select'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'a'=>1, 'input'=>1, 'object'=>1, 'map'=>1, 'param'=>1), 'nohref'=>array('area'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'object'=>array('applet'=>1), 'onblur'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onchange'=>array('input'=>1, 'select'=>1, 'textarea'=>1), 'onfocus'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onreset'=>array('form'=>1), 'onselect'=>array('input'=>1, 'textarea'=>1), 'onsubmit'=>array('form'=>1), 'pluginspage'=>array('embed'=>1), 'pluginurl'=>array('embed'=>1), 'prompt'=>array('isindex'=>1), 'readonly'=>array('textarea'=>1, 'input'=>1), 'rel'=>array('a'=>1), 'rev'=>array('a'=>1), 'rows'=>array('textarea'=>1), 'rowspan'=>array('td'=>1, 'th'=>1), 'rules'=>array('table'=>1), 'scope'=>array('td'=>1, 'th'=>1), 'scrolling'=>array('iframe'=>1), 'selected'=>array('option'=>1), 'shape'=>array('area'=>1, 'a'=>1), 'size'=>array('hr'=>1, 'font'=>1, 'input'=>1, 'select'=>1), 'span'=>array('col'=>1, 'colgroup'=>1), 'src'=>array('embed'=>1, 'script'=>1, 'input'=>1, 'iframe'=>1, 'img'=>1), 'standby'=>array('object'=>1), 'start'=>array('ol'=>1), 'summary'=>array('table'=>1), 'tabindex'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'object'=>1, 'select'=>1, 'textarea'=>1), 'target'=>array('a'=>1, 'area'=>1, 'form'=>1), 'type'=>array('a'=>1, 'embed'=>1, 'object'=>1, 'param'=>1, 'script'=>1, 'input'=>1, 'li'=>1, 'ol'=>1, 'ul'=>1, 'button'=>1), 'usemap'=>array('img'=>1, 'input'=>1, 'object'=>1), 'valign'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'value'=>array('input'=>1, 'option'=>1, 'param'=>1, 'button'=>1, 'li'=>1), 'valuetype'=>array('param'=>1), 'vspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'width'=>array('embed'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'object'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'applet'=>1, 'col'=>1, 'colgroup'=>1, 'pre'=>1), 'wmode'=>array('embed'=>1), 'xml:space'=>array('pre'=>1, 'script'=>1, 'style'=>1)); // Ele-specific +static $aNE = array('checked'=>1, 'compact'=>1, 'declare'=>1, 'defer'=>1, 'disabled'=>1, 'ismap'=>1, 'multiple'=>1, 'nohref'=>1, 'noresize'=>1, 'noshade'=>1, 'nowrap'=>1, 'readonly'=>1, 'selected'=>1); // Empty +static $aNP = array('action'=>1, 'cite'=>1, 'classid'=>1, 'codebase'=>1, 'data'=>1, 'href'=>1, 'longdesc'=>1, 'model'=>1, 'pluginspage'=>1, 'pluginurl'=>1, 'usemap'=>1); // Need scheme check; excludes style, on* & src +static $aNU = array('class'=>array('param'=>1, 'script'=>1), 'dir'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'id'=>array('script'=>1), 'lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'xml:lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'onclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'ondblclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeydown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeypress'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeyup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousedown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousemove'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseout'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseover'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'style'=>array('param'=>1, 'script'=>1), 'title'=>array('param'=>1, 'script'=>1)); // Univ & exceptions + +if($C['lc_std_val']){ + // predef attr vals for $eAL & $aNE ele + static $aNL = array('all'=>1, 'baseline'=>1, 'bottom'=>1, 'button'=>1, 'center'=>1, 'char'=>1, 'checkbox'=>1, 'circle'=>1, 'col'=>1, 'colgroup'=>1, 'cols'=>1, 'data'=>1, 'default'=>1, 'file'=>1, 'get'=>1, 'groups'=>1, 'hidden'=>1, 'image'=>1, 'justify'=>1, 'left'=>1, 'ltr'=>1, 'middle'=>1, 'none'=>1, 'object'=>1, 'password'=>1, 'poly'=>1, 'post'=>1, 'preserve'=>1, 'radio'=>1, 'rect'=>1, 'ref'=>1, 'reset'=>1, 'right'=>1, 'row'=>1, 'rowgroup'=>1, 'rows'=>1, 'rtl'=>1, 'submit'=>1, 'text'=>1, 'top'=>1); + static $eAL = array('a'=>1, 'area'=>1, 'bdo'=>1, 'button'=>1, 'col'=>1, 'form'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'xml:space'=>1); + $lcase = isset($eAL[$e]) ? 1 : 0; +} + +$depTr = 0; +if($C['no_deprecated_attr']){ + // dep attr:applicable ele + static $aND = array('align'=>array('caption'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1), 'bgcolor'=>array('table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'clear'=>array('br'=>1), 'compact'=>array('dl'=>1, 'ol'=>1, 'ul'=>1), 'height'=>array('td'=>1, 'th'=>1), 'hspace'=>array('img'=>1, 'object'=>1), 'language'=>array('script'=>1), 'name'=>array('a'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'map'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'size'=>array('hr'=>1), 'start'=>array('ol'=>1), 'type'=>array('li'=>1, 'ol'=>1, 'ul'=>1), 'value'=>array('li'=>1), 'vspace'=>array('img'=>1, 'object'=>1), 'width'=>array('hr'=>1, 'pre'=>1, 'td'=>1, 'th'=>1)); + static $eAD = array('a'=>1, 'br'=>1, 'caption'=>1, 'div'=>1, 'dl'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'li'=>1, 'map'=>1, 'object'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'script'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1, 'ul'=>1); + $depTr = isset($eAD[$e]) ? 1 : 0; +} + +// attr name-vals +if(strpos($a, "\x01") !== false){$a = preg_replace('`\x01[^\x01]*\x01`', '', $a);} // No comment/CDATA sec +$mode = 0; $a = trim($a, ' /'); $aA = array(); +while(strlen($a)){ + $w = 0; + switch($mode){ + case 0: // Name + if(preg_match('`^[a-zA-Z][\-a-zA-Z:]+`', $a, $m)){ + $nm = strtolower($m[0]); + $w = $mode = 1; $a = ltrim(substr_replace($a, '', 0, strlen($m[0]))); + } + break; case 1: + if($a[0] == '='){ // = + $w = 1; $mode = 2; $a = ltrim($a, '= '); + }else{ // No val + $w = 1; $mode = 0; $a = ltrim($a); + $aA[$nm] = ''; + } + break; case 2: // Val + if(preg_match('`^"[^"]*"`', $a, $m) or preg_match("`^'[^']*'`", $a, $m) or preg_match("`^\s*[^\s\"']+`", $a, $m)){ + $m = $m[0]; $w = 1; $mode = 0; $a = ltrim(substr_replace($a, '', 0, strlen($m))); + $aA[$nm] = trim(($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m); + } + break; + } + if($w == 0){ // Parse errs, deal with space, " & ' + $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a); + $mode = 0; + } +} +if($mode == 1){$aA[$nm] = '';} + +// clean attrs +global $S; +$rl = isset($S[$e]) ? $S[$e] : array(); +$a = array(); $nfr = 0; +foreach($aA as $k=>$v){ + if(((isset($C['deny_attribute']['*']) ? isset($C['deny_attribute'][$k]) : !isset($C['deny_attribute'][$k])) or isset($rl[$k])) && ((!isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])) && (isset($aN[$k][$e]) or (isset($aNU[$k]) && !isset($aNU[$k][$e])))){ + if(isset($aNE[$k])){$v = $k;} + elseif(!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')){ // Rather loose but ?not cause issues + $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v; + } + if($k == 'style' && !$C['style_pass']){ + if(false !== strpos($v, '&#')){ + static $sC = array(' '=>' ', ' '=>' ', 'E'=>'e', 'E'=>'e', 'e'=>'e', 'e'=>'e', 'X'=>'x', 'X'=>'x', 'x'=>'x', 'x'=>'x', 'P'=>'p', 'P'=>'p', 'p'=>'p', 'p'=>'p', 'S'=>'s', 'S'=>'s', 's'=>'s', 's'=>'s', 'I'=>'i', 'I'=>'i', 'i'=>'i', 'i'=>'i', 'O'=>'o', 'O'=>'o', 'o'=>'o', 'o'=>'o', 'N'=>'n', 'N'=>'n', 'n'=>'n', 'n'=>'n', 'U'=>'u', 'U'=>'u', 'u'=>'u', 'u'=>'u', 'R'=>'r', 'R'=>'r', 'r'=>'r', 'r'=>'r', 'L'=>'l', 'L'=>'l', 'l'=>'l', 'l'=>'l', '('=>'(', '('=>'(', ')'=>')', ')'=>')', ' '=>':', ' '=>':', '"'=>'"', '"'=>'"', '''=>"'", '''=>"'", '/'=>'/', '/'=>'/', '*'=>'*', '*'=>'*', '\'=>'\\', '\'=>'\\'); + $v = strtr($v, $sC); + } + $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v); + $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v; + }elseif(isset($aNP[$k]) or strpos($k, 'src') !== false or $k[0] == 'o'){ + $v = hl_prot($v, $k); + if($k == 'href'){ // X-spam + if($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0){ + $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v); + }elseif($C['anti_link_spam']){ + $r1 = $C['anti_link_spam'][1]; + if(!empty($r1) && preg_match($r1, $v)){continue;} + $r0 = $C['anti_link_spam'][0]; + if(!empty($r0) && preg_match($r0, $v)){ + if(isset($a['rel'])){ + if(!preg_match('`\bnofollow\b`i', $a['rel'])){$a['rel'] .= ' nofollow';} + }elseif(isset($aA['rel'])){ + if(!preg_match('`\bnofollow\b`i', $aA['rel'])){$nfr = 1;} + }else{$a['rel'] = 'nofollow';} + } + } + } + } + if(isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($v, $rl[$k])) === 0){continue;} + $a[$k] = str_replace('"', '"', $v); + } +} +if($nfr){$a['rel'] = isset($a['rel']) ? $a['rel']. ' nofollow' : 'nofollow';} + +// rqd attr +static $eAR = array('area'=>array('alt'=>'area'), 'bdo'=>array('dir'=>'ltr'), 'form'=>array('action'=>''), 'img'=>array('src'=>'', 'alt'=>'image'), 'map'=>array('name'=>''), 'optgroup'=>array('label'=>''), 'param'=>array('name'=>''), 'script'=>array('type'=>'text/javascript'), 'textarea'=>array('rows'=>'10', 'cols'=>'50')); +if(isset($eAR[$e])){ + foreach($eAR[$e] as $k=>$v){ + if(!isset($a[$k])){$a[$k] = isset($v[0]) ? $v : $k;} + } +} + +// depr attrs +if($depTr){ + $c = array(); + foreach($a as $k=>$v){ + if($k == 'style' or !isset($aND[$k][$e])){continue;} + if($k == 'align'){ + unset($a['align']); + if($e == 'img' && ($v == 'left' or $v == 'right')){$c[] = 'float: '. $v;} + elseif(($e == 'div' or $e == 'table') && $v == 'center'){$c[] = 'margin: auto';} + else{$c[] = 'text-align: '. $v;} + }elseif($k == 'bgcolor'){ + unset($a['bgcolor']); + $c[] = 'background-color: '. $v; + }elseif($k == 'border'){ + unset($a['border']); $c[] = "border: {$v}px"; + }elseif($k == 'bordercolor'){ + unset($a['bordercolor']); $c[] = 'border-color: '. $v; + }elseif($k == 'clear'){ + unset($a['clear']); $c[] = 'clear: '. ($v != 'all' ? $v : 'both'); + }elseif($k == 'compact'){ + unset($a['compact']); $c[] = 'font-size: 85%'; + }elseif($k == 'height' or $k == 'width'){ + unset($a[$k]); $c[] = $k. ': '. ($v[0] != '*' ? $v. (ctype_digit($v) ? 'px' : '') : 'auto'); + }elseif($k == 'hspace'){ + unset($a['hspace']); $c[] = "margin-left: {$v}px; margin-right: {$v}px"; + }elseif($k == 'language' && !isset($a['type'])){ + unset($a['language']); + $a['type'] = 'text/'. strtolower($v); + }elseif($k == 'name'){ + if($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')){unset($a['name']);} + if(!isset($a['id']) && preg_match('`[a-zA-Z][a-zA-Z\d.:_\-]*`', $v)){$a['id'] = $v;} + }elseif($k == 'noshade'){ + unset($a['noshade']); $c[] = 'border-style: none; border: 0; background-color: gray; color: gray'; + }elseif($k == 'nowrap'){ + unset($a['nowrap']); $c[] = 'white-space: nowrap'; + }elseif($k == 'size'){ + unset($a['size']); $c[] = 'size: '. $v. 'px'; + }elseif($k == 'start' or $k == 'value'){ + unset($a[$k]); + }elseif($k == 'type'){ + unset($a['type']); + static $ol_type = array('i'=>'lower-roman', 'I'=>'upper-roman', 'a'=>'lower-latin', 'A'=>'upper-latin', '1'=>'decimal'); + $c[] = 'list-style-type: '. (isset($ol_type[$v]) ? $ol_type[$v] : 'decimal'); + }elseif($k == 'vspace'){ + unset($a['vspace']); $c[] = "margin-top: {$v}px; margin-bottom: {$v}px"; + } + } + if(count($c)){ + $c = implode('; ', $c); + $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $c. ';': $c. ';'; + } +} +// unique ID +if($C['unique_ids'] && isset($a['id'])){ + if(!preg_match('`^[A-Za-z][A-Za-z0-9_\-.:]*$`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)){unset($a['id']); + }else{ + while(isset($GLOBALS['hl_Ids'][$id])){$id = $C['unique_ids']. $id;} + $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1; + } +} +// xml:lang +if($C['xml:lang'] && isset($a['lang'])){ + $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang']; + if($C['xml:lang'] == 2){unset($a['lang']);} +} +// for transformed tag +if(!empty($trt)){ + $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $trt : $trt; +} +// return with empty ele / +if(empty($C['hook_tag'])){ + $aA = ''; + foreach($a as $k=>$v){$aA .= " {$k}=\"{$v}\"";} + return "<{$e}{$aA}". (isset($eE[$e]) ? ' /' : ''). '>'; +} +else{return $C['hook_tag']($e, $a);} +// eof +} + +function hl_tag2(&$e, &$a, $t=1){ +// transform tag +if($e == 'center'){$e = 'div'; return 'text-align: center;';} +if($e == 'dir' or $e == 'menu'){$e = 'ul'; return '';} +if($e == 's' or $e == 'strike'){$e = 'span'; return 'text-decoration: line-through;';} +if($e == 'u'){$e = 'span'; return 'text-decoration: underline;';} +static $fs = array('0'=>'xx-small', '1'=>'xx-small', '2'=>'small', '3'=>'medium', '4'=>'large', '5'=>'x-large', '6'=>'xx-large', '7'=>'300%', '-1'=>'smaller', '-2'=>'60%', '+1'=>'larger', '+2'=>'150%', '+3'=>'200%', '+4'=>'300%'); +if($e == 'font'){ + $a2 = ''; + if(preg_match('`face\s*=\s*(\'|")([^=]+?)\\1`i', $a, $m) or preg_match('`face\s*=\s*([^"])(\S+)`i', $a, $m)){ + $a2 .= ' font-family: '. str_replace('"', '\'', trim($m[2])). ';'; + } + if(preg_match('`color\s*=\s*(\'|")?(.+?)(\\1|\s|$)`i', $a, $m)){ + $a2 .= ' color: '. trim($m[2]). ';'; + } + if(preg_match('`size\s*=\s*(\'|")?(.+?)(\\1|\s|$)`i', $a, $m) && isset($fs[($m = trim($m[2]))])){ + $a2 .= ' font-size: '. $fs[$m]. ';'; + } + $e = 'span'; return ltrim($a2); +} +if($t == 2){$e = 0; return 0;} +return ''; +// eof +} + +function hl_tidy($t, $w, $p){ +// Tidy/compact HTM +if(strpos(' pre,script,textarea', "$p,")){return $t;} +$t = str_replace(' ]*(?)\s+`', '`\s+`', '`(<\w[^>]*(?) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea).*?>)(.+?)()`sm'), create_function('$m', 'return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", " "), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4];'), $t))); +if(($w = strtolower($w)) == -1){ + return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); +} +$s = strpos(" $w", 't') ? "\t" : ' '; +$s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2)); +$n = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0; +$a = array('br'=>1); +$b = array('button'=>1, 'input'=>1, 'option'=>1); +$c = array('caption'=>1, 'dd'=>1, 'dt'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'isindex'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'object'=>1, 'p'=>1, 'pre'=>1, 'td'=>1, 'textarea'=>1, 'th'=>1); +$d = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'colgroup'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'fieldset'=>1, 'form'=>1, 'hr'=>1, 'iframe'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); +ob_start(); +if(isset($d[$p])){echo str_repeat($s, ++$n);} +$t = explode('<', $t); +echo ltrim(array_shift($t)); +for($i=-1, $j=count($t); ++$i<$j;){ + $r = ''; list($e, $r) = explode('>', $t[$i]); + $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1)); + $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0); + $e = "<$e>"; + if(isset($d[$y])){ + if(!$x){echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);} + else{echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));} + echo ltrim($r); continue; + } + $f = "\n". str_repeat($s, $n); + if(isset($c[$y])){ + if(!$x){echo $e, $f, ltrim($r);} + else{echo $f, $e, $r;} + }elseif(isset($b[$y])){echo $f, $e, $r; + }elseif(isset($a[$y])){echo $e, $f, ltrim($r); + }elseif(!$y){echo $f, $e, $f, ltrim($r); + }else{echo $e, $r;} +} +$t = preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()); +ob_end_clean(); +if(($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)){ + $t = str_replace("\n", $l, $t); +} +return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); +// eof +} + +function hl_version(){ +// rel +return '1.1.8.1'; +// eof +} + +function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){ +// kses compat +foreach($h as $k=>$v){ + $h[$k]['n']['*'] = 1; +} +$C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0; +$C['keep_bad'] = 1; +$C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*'; +$C['hook'] = 'kses_hook'; +$C['schemes'] = '*:'. implode(',', $p); +return htmLawed($t, $C, $h); +// eof +} + +function kses_hook($t, &$C, &$S){ +// kses compat +return $t; +// eof +} \ No newline at end of file diff --git a/extlib/htmLawed/htmLawedTest.php b/extlib/htmLawed/htmLawedTest.php new file mode 100644 index 0000000000..7768286997 --- /dev/null +++ b/extlib/htmLawed/htmLawedTest.php @@ -0,0 +1,592 @@ + $v){ + $_POST[$k] = stripslashes($v); + } + ini_set('magic_quotes_gpc', 0); +} +set_magic_quotes_runtime(0); + +$_POST['enc'] = (isset($_POST['enc']) and preg_match('`^[-\w]+$`', $_POST['enc'])) ? $_POST['enc'] : 'utf-8'; + +// token for anti-CSRF +if(count($_POST)){ + if((empty($_GET['pre']) and ((!empty($_POST['token']) and !empty($_SESSION['token']) and $_POST['token'] != $_SESSION['token']) or empty($_POST[$_sid]) or $_POST[$_sid] != session_id() or empty($_COOKIE[$_sid]) or $_COOKIE[$_sid] != session_id())) or ($_POST[$_sid] != session_id())){ + $_POST = array('enc'=>'utf-8'); + } +} +if(empty($_GET['pre'])){ + $_SESSION['token'] = md5(uniqid(rand(), 1)); + $token = $_SESSION['token']; + session_regenerate_id(1); +} + +// compress +if(function_exists('gzencode') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && preg_match('`gzip|deflate`i', $_SERVER['HTTP_ACCEPT_ENCODING']) && !ini_get('zlib.output_compression')){ + ob_start('ob_gzhandler'); +} + +// HTM for unprocessed +if(isset($_POST['inputH'])){ + echo 'htmLawed test: HTML view of unprocessed input

      Rendering of unprocessed input without an HTML doctype or charset declaration     close window | htmLawed test page

    ', $_POST['inputH'], '
    '; + exit; +} + +// main +$_POST['text'] = isset($_POST['text']) ? $_POST['text'] : 'text to process; < '. $_limit. ' characters'. ($_hlimit ? ' (for binary hexdump view, < '. $_hlimit. ')' : ''); +$do = (!empty($_POST[$_sid]) && isset($_POST['text'][0]) && !isset($_POST['text'][$_limit])) ? 1 : 0; +$limit_exceeded = isset($_POST['text'][$_limit]) ? 1 : 0; +$pre_mem = memory_get_usage(); +$validation = (!empty($_POST[$_sid]) and isset($_POST['w3c_validate'][0])) ? 1 : 0; +include './htmLawed.php'; + +function format($t){ + $t = "\n". str_replace(array("\t", "\r\n", "\r", '&', '<', '>', "\n"), array(' ', "\n", "\n", '&', '<', '>', "¬
    \n"), $t); + return str_replace(array('
    ', "\n ", ' '), array("\n
    \n", "\n ", '  '), $t); +} + +function hexdump($d){ +// Mainly by Aidan Lister , Peter Waller + $hexi = ''; + $ascii = ''; + ob_start(); + echo '
    ';
    + $offset = 0;
    + $len = strlen($d);
    + for($i=$j=0; $i<$len; $i++)
    + {
    +  // Convert to hexidecimal
    +  $hexi .= sprintf("%02X ", ord($d[$i]));
    +  // Replace non-viewable bytes with '.'
    +  if(ord($d[$i]) >= 32){
    +   $ascii .= htmlspecialchars($d[$i]);
    +  }else{
    +   $ascii .= '.';
    +  } 
    +  // Add extra column spacing
    +  if($j == 7){
    +   $hexi .= ' ';
    +   $ascii .= '  ';
    +  }
    +  // Add row
    +  if(++$j == 16 || $i == $len-1){
    +   // Join the hexi / ascii output
    +   echo sprintf("%04X   %-49s   %s", $offset, $hexi, $ascii);   
    +   // Reset vars
    +   $hexi = $ascii = '';
    +   $offset += 16;
    +   $j = 0;  
    +   // Add newline   
    +   if ($i !== $len-1){
    +    echo "\n";
    +   }
    +  }
    + }
    + echo '
    '; + $o = ob_get_contents(); + ob_end_clean(); + return $o; +} +?> + + + + + + + + +htmLawed (<?php echo hl_version();?>) test + + +
    + +
    HTMLAWED TEST
    +htm / txt documentation
    + +Input » (max. chars) + +
    + +
    + + +
    + + +'; + } +?> + + + + + + + + + + Validator tools: '; + } +} +?> + +Encoding: + +
    +
    + +Input text is too long!
    '; +} +?> + +
    + +Settings » + + +
    + +$v){ + if($k[0] == 'h' && $v != 'nil'){ + $cfg[substr($k, 1)] = $v; + } + } + + if($cfg['anti_link_spam'] && (!empty($cfg['anti_link_spam11']) or !empty($cfg['anti_link_spam12']))){ + $cfg['anti_link_spam'] = array($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); + } + unset($cfg['anti_link_spam11'], $cfg['anti_link_spam12']); + if($cfg['anti_mail_spam'] == 1){ + $cfg['anti_mail_spam'] = isset($cfg['anti_mail_spam1'][0]) ? $cfg['anti_mail_spam1'] : 0; + } + unset($cfg['anti_mail_spam11']); + if($cfg['deny_attribute'] == 1){ + $cfg['deny_attribute'] = isset($cfg['deny_attribute1'][0]) ? $cfg['deny_attribute1'] : 0; + } + unset($cfg['deny_attribute1']); + if($cfg['tidy'] == 2){ + $cfg['tidy'] = isset($cfg['tidy2'][0]) ? $cfg['tidy2'] : 0; + } + unset($cfg['tidy2']); + if($cfg['unique_ids'] == 2){ + $cfg['unique_ids'] = isset($cfg['unique_ids2'][0]) ? $cfg['unique_ids2'] : 1; + } + unset($cfg['unique_ids2']); + unset($cfg['and_mark']); // disabling and_mark + + $cfg['show_setting'] = 'hlcfg'; + $st = microtime(); + $out = htmLawed($_POST['text'], $cfg, str_replace(array('$', '{'), '', $_POST['spec'])); + $et = microtime(); + echo '
    Input code » ', strlen($_POST['text']), ' chars, ~', round((substr_count($_POST['text'], '>') + substr_count($_POST['text'], '<'))/2), ' tags ', (!isset($_POST['text'][$_hlimit]) ? ' Input binary » ' : ''), ' Finalized internal settings »  ', '
    Output » htmLawed processing time ', number_format(((substr($et,0,9)) + (substr($et,-10)) - (substr($st,0,9)) - (substr($st,-10))),4), ' s', (($mem = memory_get_peak_usage()) !== false ? ', peak memory usage '. round(($mem-$pre_mem)/1048576, 2). ' MB' : ''), '
    '; + if($_w3c_validate && $validation) + { +?> + + + + +
    Output code »
    ', format($out), '
    ', (!isset($_POST['text'][$_hlimit]) ? '
    Output binary »' : ''), '
    Output rendered »
    ', $out, '
    '; +} +else{ +?> + +
    + +
    Use with a Javascript- and cookie-enabled, relatively new version of a common browser. Submitted input will also be HTML-rendered (XHTML 1) after htmLawed-filtering. + +
    You can use text from this collection of test-cases in the input. Set the character encoding of the browser to Unicode/utf-8 before copying.' : ''); ?> + +

    For anti-XSS tests, try the special test-page or see these results. + +

    Change Encoding to reflect the character encoding of the input text. Even then, it may not work or some characters may not display properly because of variable browser support and because of the form interface. Developers can write some PHP code to capture the filtered input to a file if this is important. +

    Refer to the htmLawed documentation (htm/txt) for details about Settings, and htmLawed's behavior and limitations. For Settings, incorrectly-specified values like regular expressions are silently ignored. One or more settings form-fields may have been disabled. Some characters are not allowed in the Spec field. + + +

    Hovering the mouse over some of the text can provide additional information in some browsers.
    + + + +

    Because of character-encoding issues, the W3C validator (anyway not perfect) may reject validation requests or invalidate otherwise-valid code, esp. if text was copy-pasted in the input box. Local applications like the HTML Validator Firefox browser add-on may be useful in such cases.
    + + + +
    + + + +
    + + \ No newline at end of file diff --git a/extlib/htmLawed/htmLawed_README.htm b/extlib/htmLawed/htmLawed_README.htm new file mode 100644 index 0000000000..e560e2eb2a --- /dev/null +++ b/extlib/htmLawed/htmLawed_README.htm @@ -0,0 +1,1979 @@ + + + + + + + + +htmLawed documentation | htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter + + +
    +

    htmLawed documentation

    + +
    1  About htmLawed
    1.1  Example uses
    1.2  Features
    1.3  History
    1.4  License & copyright
    1.5  Terms used here
    +2  Usage
    2.1  Simple
    2.2  Configuring htmLawed using the $config parameter
    2.3  Extra HTML specifications using the $spec parameter
    2.4  Performance time & memory usage
    2.5  Some security risks to keep in mind
    2.6  Use without modifying old kses() code
    2.7  Tolerance for ill-written HTML
    2.8  Limitations & work-arounds
    2.9  Examples
    +3  Details
    3.1  Invalid/dangerous characters
    3.2  Character references/entities
    3.3  HTML elements
    +    3.3.1  HTML comments and CDATA sections
    +    3.3.2  Tag-transformation for better XHTML-Strict
    +    3.3.3  Tag balancing and proper nesting
    +    3.3.4  Elements requiring child elements
    +    3.3.5  Beautify or compact HTML
    3.4  Attributes
    +    3.4.1  Auto-addition of XHTML-required attributes
    +    3.4.2  Duplicate/invalid id values
    +    3.4.3  URL schemes (protocols) and scripts in attribute values
    +    3.4.4  Absolute & relative URLs
    +    3.4.5  Lower-cased, standard attribute values
    +    3.4.6  Transformation of deprecated attributes
    +    3.4.7  Anti-spam & href
    +    3.4.8  Inline style properties
    +    3.4.9  Hook function for tag content
    3.5  Simple configuration directive for most valid XHTML
    3.6  Simple configuration directive for most safe HTML
    3.7  Using a hook function
    3.8  Obtaining finalized parameter values
    3.9  Retaining non-HTML tags in input with mixed markup
    +4  Other
    4.1  Support
    4.2  Known issues
    4.3  Change-log
    4.4  Testing
    4.5  Upgrade, & old versions
    4.6  Comparison with HTMLPurifier
    4.7  Use through application plug-ins/modules
    4.8  Use in non-PHP applications
    4.9  Donate
    4.10  Acknowledgements
    +5  Appendices
    5.1  Characters discouraged in HTML
    5.2  Valid attribute-element combinations
    5.3  CSS 2.1 properties accepting URLs
    5.4  Microsoft Windows 1252 character replacements
    5.5  URL format
    5.6  Brief on htmLawed code
    + +
    +
    +
    htmLawed_README.txt, 16 July 2009
    +htmLawed 1.1.8.1, 16 July 2009
    +Copyright Santosh Patnaik
    +GPL v3 license
    +A PHP Labware internal utility - http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed 
    +
    + +

    +1  About htmLawed +

    (to top)
    +
    +  htmLawed is a highly customizable single-file PHP script to make text secure, and standard- and admin policy-compliant for use in the body of HTML 4, XHTML 1 or 1.1, or generic XML documents. It is thus a configurable input (X)HTML filter, processor, purifier, sanitizer, beautifier, etc., and an alternative to the HTMLTidy application.
    +
    +  The lawing in of input text is needed to ensure that HTML code in the text is standard-compliant, does not introduce security vulnerabilities, and does not break the aesthetics, design or layout of web-pages. htmLawed tries to do this by, for example, making HTML well-formed with balanced and properly nested tags, neutralizing code that may be used for cross-site scripting (XSS) attacks, and allowing only specified HTML elements/tags and attributes.
    + +

    +1.1  Example uses +

    (to top)
    +
    +  *  Filtering of text submitted as comments on blogs to allow only certain HTML elements
    +
    +  *  Making RSS/Atom newsfeed item-content standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant
    +
    +  *  Text processing for stricter XML standard-compliance: e.g., to have lowercased x in hexadecimal numeric entities becomes necessary if an XHTML document with MathML content needs to be served as application/xml
    +
    +  *  Scraping text or data from web-pages
    +
    +  *  Pretty-printing HTML code
    + +
    +

    +1.2  Features +

    (to top)
    +
    +  Key: * security feature, ^ standard compliance, ~ requires setting right options, ` different from Kses
    +
    +  *  make input more secure and standard-compliant
    +  *  use for HTML 4, XHTML 1.0 or 1.1, or even generic XML documents  ^~`
    +
    +  *  beautify or compact HTML  ^~`
    +
    +  *  restrict elements  ^~`
    +  *  proper closure of empty elements like img  ^`
    +  *  transform deprecated elements like u  ^~`
    +  *  HTML comments and CDATA sections can be permitted  ^~`
    +  *  elements like script, object and form can be permitted  ~
    +
    +  *  restrict attributes, including element-specifically  ^~`
    +  *  remove invalid attributes  ^`
    +  *  element and attribute names are lower-cased  ^
    +  *  provide required attributes, like alt for image  ^`
    +  *  transform deprecated attributes  ^~`
    +  *  attributes declared only once  ^`
    +
    +  *  restrict attribute values, including element-specifically  ^~`
    +  *  a value is declared for empty (minimized) attributes like checked  ^
    +  *  check for potentially dangerous attribute values  *~
    +  *  ensure unique id attribute values  ^~`
    +  *  double-quote attribute values  ^
    +  *  lower-case standard attribute values like password  ^`
    +
    +  *  attribute-specific URL protocol/scheme restriction  *~`
    +  *  disable dynamic expressions in style values  *~`
    +
    +  *  neutralize invalid named character entities  ^`
    +  *  convert hexadecimal numeric entities to decimal ones, or vice versa  ^~`
    +  *  convert named entities to numeric ones for generic XML use  ^~`
    +
    +  *  remove null characters  *
    +  *  neutralize potentially dangerous proprietary Netscape Javascript entities  *
    +  *  replace potentially dangerous soft-hyphen character in attribute values with spaces  *
    +
    +  *  remove common invalid characters not allowed in HTML or XML  ^`
    +  *  replace characters from Microsoft applications like Word that are discouraged in HTML or XML  ^~`
    +  *  neutralize entities for characters invalid or discouraged in HTML or XML  ^`
    +  *  appropriately neutralize <, &, ", and > characters  ^*`
    +
    +  *  understands improperly spaced tag content (like, spread over more than a line) and properly spaces them  `
    +  *  attempts to balance tags for well-formedness  ^~`
    +  *  understands when omitable closing tags like </p> (allowed in HTML 4, transitional, e.g.) are missing  ^~`
    +  *  attempts to permit only validly nested tags  ^~`
    +  *  option to remove or neutralize bad content ^~`
    +  *  attempts to rectify common errors of plain-text misplacement (e.g., directly inside blockquote) ^~`
    +
    +  *  fast, non-OOP code of ~45 kb incurring peak basal memory usage of ~0.5 MB
    +  *  compatible with pre-existing code using Kses (the filter used by WordPress)
    +
    +  *  optional anti-spam measures such as addition of rel="nofollow" and link-disabling  ~`
    +  *  optionally makes relative URLs absolute, and vice versa  ~`
    +
    +  *  optionally mark & to identify the entities for &, < and > introduced by htmLawed  ~`
    +
    +  *  allows deployment of powerful hook functions to inject HTML, consolidate style attributes to class, finely check attribute values, etc.  ~`
    +
    +  *  independent of character encoding of input and does not affect it
    +
    +  *  tolerance for ill-written HTML to a certain degree
    + +
    +

    +1.3  History +

    (to top)
    +
    +  htmLawed was developed for use with LabWiki, a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like Kses and HTMLPurifier were deemed inadequate, slow, resource-intensive, or dependent on external applications like HTML Tidy.
    +
    +  htmLawed started as a modification of Ulf Harnhammar's Kses (version 0.2.2) software, and is compatible with code that uses Kses; see section 2.6.
    + +
    +

    +1.4  License & copyright +

    (to top)
    +
    +  htmLawed is free and open-source software licensed under GPL license version 3, and copyrighted by Santosh Patnaik, MD, PhD.
    + +
    +

    +1.5  Terms used here +

    (to top)
    +
    +  *  administrator - or admin; person setting up the code to pass input through htmLawed; also, user
    +  *  attributes - name-value pairs like href="http://x.com" in opening tags
    +  *  author - writer
    +  *  character - atomic unit of text; internally represented by a numeric code-point as specified by the encoding or charset in use
    +  *  entity - markup like &gt; and &#160; used to refer to a character
    +  *  element - HTML element like a and img
    +  *  element content -  content between the opening and closing tags of an element, like click of <a href="x">click</a>
    +  *  HTML - implies XHTML unless specified otherwise
    +  *  input - text string given to htmLawed to process
    +  *  processing - involves filtering, correction, etc., of input
    +  *  safe - absence or reduction of certain characters and HTML elements and attributes in the input that can otherwise potentially and circumstantially expose web-site users to security vulnerabilities like cross-site scripting attacks (XSS)
    +  *  scheme - URL protocol like http and ftp
    +  *  specs - standard specifications
    +  *  style property - terms like border and height for which declarations are made in values for the style attribute of elements
    +  *  tag - markers like <a href="x"> and </a> delineating element content; the opening tag can contain attributes
    +  *  tag content - consists of tag markers < and >, element names like div, and possibly attributes
    +  *  user - administrator
    +  *  writer - end-user like a blog commenter providing the input that is to be processed; also, author
    + +
    +
    +

    +2  Usage +

    (to top)
    +
    +  htmLawed should work with PHP 4.3 and higher. Either include() the htmLawed.php file or copy-paste the entire code.
    +
    +  To easily test htmLawed using a form-based interface, use the provided demo (htmLawed.php and htmLawedTest.php should be in the same directory on the web-server).
    + +

    +2.1  Simple +

    (to top)
    +
    +  The input text to be processed, $text, is passed as an argument of type string; htmLawed() returns the processed string:
    +
    + +    $processed = htmLawed($text); +
    +
    Note: If input is from a $_GET or $_POST value, and magic quotes are enabled on the PHP setup, run stripslashes() on the input before passing to htmLawed.
    +
    +  By default, htmLawed will process the text allowing all valid HTML elements/tags, secure URL scheme/CSS style properties, etc. It will allow CDATA sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- $config and $spec:
    +
    + +    $processed = htmLawed($text, $config, $spec); +
    +
    +  These extra parameters are detailed below. Some examples are shown in section 2.9.
    +
    Note: For maximum protection against XSS and other scripting attacks (e.g., by disallowing Javascript code), consider using the safe parameter; see section 3.6.
    + +
    +

    +2.2  Configuring htmLawed using the $config parameter +

    (to top)
    +
    $config instructs htmLawed on how to tackle certain tasks. When $config is not specified, or not set as an array (e.g., $config = 1), htmLawed will take default actions. One or many of the task-action or value-specification pairs can be specified in $config as array key-value pairs. If a parameter is not specified, htmLawed will use the default value/action indicated further below.
    +
    + +    $config = array('comment'=>0, 'cdata'=>1); +
    + +    $processed = htmLawed($text, $config); +
    +
    +  Or,
    +
    + +    $processed = htmLawed($text, array('comment'=>0, 'cdata'=>1)); +
    +
    +  Below are the possible value-specification combinations. In PHP code, values that are integers should not be quoted and should be used as numeric types (unless meant as string/text).
    +
    +  Key: * default, ^ different default when htmLawed is used in the Kses-compatible mode (see section 2.6), ~ different default when valid_xhtml is set to 1 (see section 3.5), " different default when safe is set to 1 (see section 3.6)
    +
    abs_url
    +  Make URLs absolute or relative; $config["base_url"] needs to be set; see section 3.4.4
    +
    -1 - make relative
    0 - no action  *
    1 - make absolute
    +
    and_mark
    +  Mark & characters in the original input; see section 3.2
    +
    anti_link_spam
    +  Anti-link-spam measure; see section 3.4.7
    +
    0 - no measure taken  *
    array("regex1", "regex2") - will ensure a rel attribute with nofollow in its value in case the href attribute value matches the regular expression pattern regex1, and/or will remove href if its value matches the regular expression pattern regex2. E.g., array("/./", "/://\W*(?!(abc\.com|xyz\.org))/"); see section 3.4.7 for more.
    +
    anti_mail_spam
    +  Anti-mail-spam measure; see section 3.4.7
    +
    0 - no measure taken  *
    word - @ in mail address in href attribute value is replaced with specified word
    +
    balance
    +  Balance tags for well-formedness and proper nesting; see section 3.3.3
    +
    0 - no
    1 - yes  *
    +
    base_url
    +  Base URL value that needs to be set if $config["abs_url"] is not 0; see section 3.4.4
    +
    cdata
    +  Handling of CDATA sections; see section 3.3.1
    +
    0 - don't consider CDATA sections as markup and proceed as if plain text  ^"
    1 - remove
    2 - allow, but neutralize any <, >, and & inside by converting them to named entities
    3 - allow  *
    +
    clean_ms_char
    +  Replace discouraged characters introduced by Microsoft Word, etc.; see section 3.1
    +
    0 - no  *
    1 - yes
    2 - yes, but replace special single & double quotes with ordinary ones
    +
    comment
    +  Handling of HTML comments; see section 3.3.1
    +
    0 - don't consider comments as markup and proceed as if plain text  ^"
    1 - remove
    2 - allow, but neutralize any <, >, and & inside by converting to named entities
    3 - allow  *
    +
    css_expression
    +  Allow dynamic CSS expression by not removing the expression from CSS property values in style attributes; see section 3.4.8
    +
    0 - remove  *
    1 - allow
    +
    deny_attribute
    +  Denied HTML attributes; see section 3.4
    +
    0 - none  *
    string - dictated by values in string
    on* (like onfocus) attributes not allowed - "
    +
    elements
    +  Allowed HTML elements; see section 3.3
    +
    * -center -dir -font -isindex -menu -s -strike -u -  ~
    applet, embed, iframe, object, script not allowed - "
    +
    hexdec_entity
    +  Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see section 3.2
    +
    0 - no
    1 - yes  *
    2 - convert decimal to hexadecimal ones
    +
    hook
    +  Name of an optional hook function to alter the input string, $config or $spec before htmLawed starts its main work; see section 3.7
    +
    0 - no hook function  *
    name - name is name of the hook function (kses_hook  ^)
    +
    hook_tag
    +  Name of an optional hook function to alter tag content finalized by htmLawed; see section 3.4.9
    +
    0 - no hook function  *
    name - name is name of the hook function
    +
    keep_bad
    +  Neutralize bad tags by converting < and > to entities, or remove them; see section 3.3.3
    +
    0 - remove  ^
    1 - neutralize both tags and element content
    2 - remove tags but neutralize element content
    3 and 4 - like 1 and 2 but remove if text (pcdata) is invalid in parent element
    5 and 6 * -  like 3 and 4 but line-breaks, tabs and spaces are left
    +
    lc_std_val
    +  For XHTML compliance, predefined, standard attribute values, like get for the method attribute of form, must be lowercased; see section 3.4.5
    +
    0 - no
    1 - yes  *
    +
    make_tag_strict
    +  Transform/remove these non-strict XHTML elements, even if they are allowed by the admin: applet center dir embed font isindex menu s strike u; see section 3.3.2
    +
    0 - no  ^
    1 - yes, but leave applet, embed and isindex elements that currently can't be transformed  *
    2 - yes, removing applet, embed and isindex elements and their contents (nested elements remain)  ~
    +
    named_entity
    +  Allow non-universal named HTML entities, or convert to numeric ones; see section 3.2
    +
    0 - convert
    1 - allow  *
    +
    no_deprecated_attr
    +  Allow deprecated attributes or transform them; see section 3.4.6
    +
    0 - allow  ^
    1 - transform, but name attributes for a and map are retained  *
    2 - transform
    +
    parent
    +  Name of the parent element, possibly imagined, that will hold the input; see section 3.3
    +
    safe
    +  Magic parameter to make input the most secure against XSS without needing to specify other relevant $config parameters; see section 3.6
    +
    0 - no  *
    1 - will auto-adjust other relevant $config parameters (indicated by " in this list)
    +
    schemes
    +  Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs; * covers all unspecified attributes; see section 3.4.3
    +
    href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; *:file, http, https  *
    *: ftp, gopher, http, https, mailto, news, nntp, telnet  ^
    href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; style: nil; *:file, http, https  "
    +
    show_setting
    +  Name of a PHP variable to assign the finalized $config and $spec values; see section 3.8
    +
    style_pass
    +  Do not look at style attribute values, letting them through without any alteration
    +
    0 - no *
    1 - htmLawed will let through any style value; see section 3.4.8
    +
    tidy
    +  Beautify or compact HTML code; see section 3.3.5
    +
    -1 - compact
    0 - no  *
    1 or string - beautify (custom format specified by string)
    +
    unique_ids
    id attribute value checks; see section 3.4.2
    +
    0 - no  ^
    1 - remove duplicate and/or invalid ones  *
    word - remove invalid ones and replace duplicate ones with new and unique ones based on the word; the admin-specified word, like my_, should begin with a letter (a-z) and can contain letters, digits, ., _, -, and :.
    +
    valid_xhtml
    +  Magic parameter to make input the most valid XHTML without needing to specify other relevant $config parameters; see section 3.5
    +
    0 - no  *
    1 - will auto-adjust other relevant $config parameters (indicated by ~ in this list)
    +
    xml:lang
    +  Auto-adding xml:lang attribute; see section 3.4.1
    +
    0 - no  *
    1 - add if lang attribute is present
    2 - add if lang attribute is present, and remove lang  ~
    + +
    +

    +2.3  Extra HTML specifications using the $spec parameter +

    (to top)
    +
    +  The $spec argument can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policy compliance. $spec is specified as a string of text containing one or more rules, with multiple rules separated from each other by a semi-colon (;). E.g.,
    +
    + +    $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'; +
    + +    $processed = htmLawed($text, $config, $spec); +
    +
    +  Or,
    +
    + +    $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'); +
    +
    +  A rule begins with an HTML element name(s) (rule-element), for which the rule applies, followed by an equal (=) sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., th,td,tr=.
    +
    +  Rest of the rule consists of comma-separated HTML attribute names. A minus (-) character before an attribute means that the attribute is not permitted inside the rule-element. E.g., -width. To deny all attributes, -* can be used.
    +
    +  Following shows examples of rule excerpts with rule-element a and the attributes that are being permitted:
    +
    +  *  a= - all
    +  *  a=id - all
    +  *  a=href, title, -id, -onclick - all except id and onclick
    +  *  a=*, id, -id - all except id
    +  *  a=-* - none
    +  *  a=-*, href, title - none except href and title
    +  *  a=-*, -id, href, title - none except href and title
    +
    +  Rules regarding attribute values are optionally specified inside round brackets after attribute names in slash ('/')-separated parameter = value pairs. E.g., title(maxlen=30/minlen=5). None, or one or more of the following parameters may be specified:
    +
    +  *  oneof - one or more choices separated by | that the value should match; if only one choice is provided, then the value must match that choice
    +
    +  *  noneof - one or more choices separated by | that the value should not match
    +
    +  *  maxlen and minlen - upper and lower limits for the number of characters in the attribute value; specified in numbers
    +
    +  *  maxval and minval - upper and lower limits for the numerical value specified in the attribute value; specified in numbers
    +
    +  *  match and nomatch - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers
    +
    +  *  default - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters
    +
    +  If default is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The default value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., maxlen to -1).
    +
    +  Examples with input <input title="WIDTH" value="10em" /><input title="length" value="5" /> are shown below.
    +
    Rule: input=title(maxlen=60/minlen=6), value
    Output: <input value="10em" /><input title="length" value="5" />
    +
    Rule: input=title(), value(maxval=8/default=6)
    Output: <input title="WIDTH" value="6" /><input title="length" value="5" />
    +
    Rule: input=title(nomatch=$w.d$i), value(match=$em$/default=6em)
    Output: <input value="10em" /><input title="length" value="6em" />
    +
    Rule: input=title(oneof=height|depth/default=depth), value(noneof=5|6)
    Output: <input title="depth" value="10em" /><input title="depth" />
    +
    Special characters: The characters ;, ,, /, (, ), |, ~ and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be escaped by enclosing in pairs of double-quotes ("). A back-tick (`) can be used to escape a literal ". An example rule illustrating this is input=value(maxlen=30/match="/^\w/"/default="your `"ID`"").
    +
    Note: To deny an attribute for all elements for which it is legal, $config["deny_attribute"] (see section 3.4) can be used instead of $spec. Also, attributes can be allowed element-specifically through $spec while being denied globally through $config["deny_attribute"]. The hook_tag parameter (section 3.4.9) can also be used to implement the $spec functionality.
    + +
    +

    +2.4  Performance time & memory usage +

    (to top)
    +
    +  The time and memory used by htmLawed depends on its configuration and the size of the input, and the amount, nestedness and well-formedness of the HTML markup within it. In particular, tag balancing and beautification each can increase the processing time by about a quarter.
    +
    +  The htmLawed demo can be used to evaluate the performance and effects of different types of input and $config.
    + +
    +

    +2.5  Some security risks to keep in mind +

    (to top)
    +
    +  When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially dangerous HTML code. (This may not be a problem if the authors are trusted.)
    +
    +  For example, following increase security risks:
    +
    +  *  Allowing script, applet, embed, iframe or object elements, or certain of their attributes like allowscriptaccess
    +
    +  *  Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., <!--[if gte IE 4]><script>alert("xss");</script><![endif]-->
    +
    +  *  Allowing dynamic CSS expressions (a feature of the IE browser)
    +
    Unsafe HTML can be removed by setting $config appropriately. E.g., $config["elements"] = "* -script" (section 3.3), $config["safe"] = 1 (section 3.6), etc.
    + +
    +

    +2.6  Use without modifying old kses() code +

    (to top)
    +
    +  The Kses PHP script is used by many applications (like WordPress). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the kses() function declared in the Kses file (usually named kses.php). E.g., application code like this will continue to work after replacing Kses with htmLawed:
    +
    + +    $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array())); +
    +
    +  For some of the $config parameters, htmLawed will use values other than the default ones. These are indicated by ^ in section 2.2. To force htmLawed to use other values, function kses() in the htmLawed code should be edited -- a few configurable parameters/variables need to be changed.
    +
    +  If the application uses a Kses file that has the kses() function declared, then, to have the application use htmLawed instead of Kses, simply rename htmLawed.php (to kses.php, e.g.) and replace the Kses file (or just replace the code in the Kses file with the htmLawed code). If the kses() function in the Kses file had been renamed by the application developer (e.g., in WordPress, it is named wp_kses()), then appropriately rename the kses() function in the htmLawed code.
    +
    +  If the Kses file used by the application has been highly altered by the application developers, then one may need a different approach. E.g., with WordPress, it is best to copy the htmLawed code to wp_includes/kses.php, rename the newly added function kses() to wp_kses(), and delete the code for the original wp_kses() function.
    +
    +  If the Kses code has a non-empty hook function (e.g., wp_kses_hook() in case of WordPress), then the code for htmLawed's kses_hook() function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With WordPress, the hook function is an essential one. The following code is suggested for the htmLawed kses_hook() in case of WordPress:
    +
    + +    function kses_hook($string, &$cf, &$spec){ +
    + +    // kses compatibility +
    + +    $allowed_html = $spec; +
    + +    $allowed_protocols = array(); +
    + +    foreach($cf['schemes'] as $v){ +
    + +     foreach($v as $k2=>$v2){ +
    + +      if(!in_array($k2, $allowed_protocols)){ +
    + +       $allowed_protocols[] = $k2; +
    + +      } +
    + +     } +
    + +    } +
    + +    return wp_kses_hook($string, $allowed_html, $allowed_protocols); +
    + +    // eof +
    + +    } +
    + +
    +

    +2.7  Tolerance for ill-written HTML +

    (to top)
    +
    +  htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be read as HTML, and be considered mere plain text instead. Following statements indicate the degree of looseness that htmLawed can work with, and can be provided in instructions to writers:
    +
    +  *  Tags must be flanked by < and > with no > inside -- any needed > should be put in as &gt;. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and >, like <div > and <img / >, but not after the <.
    +
    +  *  Element and attribute names need not be lower-cased.
    +
    +  *  Attribute string of elements may be liberally spaced with tabs, line-breaks, etc.
    +
    +  *  Attribute values may not be double-quoted, or may be single-quoted.
    +
    +  *  Left-padding of numeric entities (like, &#0160;, &x07ff;) with 0 is okay as long as the number of characters between between the & and the ; does not exceed 8. All entities must end with ; though.
    +
    +  *  Named character entities must be properly cased. E.g., &Lt; or &TILDE; will not be let through without modification.
    +
    +  *  HTML comments should not be inside element tags (okay between tags), and should begin with <!-- and end with -->. Characters like <, >, and & may be allowed inside depending on $config, but any --> inside should be put in as --&gt;. Any -- inside will be automatically converted to -, and a space will be added before the comment delimiter -->.
    +
    +  *  CDATA sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with <[CDATA[ and end with ]]>. Characters like <, >, and & may be allowed inside depending on $config, but any ]]> inside should be put in as ]]&gt;.
    +
    +  *  For attribute values, character entities &lt;, &gt; and &amp; should be used instead of characters < and >, and & (when & is not part of a character entity). This applies even for Javascript code in values of attributes like onclick.
    +
    +  *  Characters <, >, & and " that are part of actual Javascript, etc., code in script elements should be used as such and not be put in as entities like &gt;. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside CDATA sections.
    +
    +  *  Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on $config["keep_bad"], some code/text may be lost.
    +
    +  *  Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc.
    +
    +  *  With $config["unique_ids"] not 0 and the id attribute being permitted, writers should carefully avoid using duplicate or invalid id values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when <a id="home"></a><input id="home" /><label for="home"></label> is processed into
    +<a id="home"></a><input id="prefix_home" /><label for="home"></label>.
    +
    +  *  Note that even if intended HTML is lost in a highly ill-written input, the processed output will be more secure and standard-compliant.
    +
    +  *  For URLs, unless $config["scheme"] is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., htt&#112; (which many browsers will read as the harmless http) may be considered bad by htmLawed.
    +
    +  *  htmLawed will attempt to put plain text present directly inside blockquote, form, map and noscript elements (illegal as per the specs) inside auto-generated div elements.
    + +
    +

    +2.8  Limitations & work-arounds +

    (to top)
    +
    +  htmLawed's main objective is to make the input text more standard-compliant, secure for web-page readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with work-arounds.
    +
    +  It should be borne in mind that no browser application is 100% standard-compliant, and that some of the standard specs (like asking for normalization of white-spacing within textarea elements) are clearly wrong. Regarding security, note that unsafe HTML code is not necessarily legally invalid.
    +
    +  *  htmLawed is meant for input that goes into the body of HTML documents. HTML's head-level elements are not supported, nor are the frameset elements frameset, frame and noframes.
    +
    +  *  It cannot transform the non-standard embed elements to the standard-compliant object elements. Yet, it can allow embed elements if permitted (embed is widely used and supported). Admins can certainly use the hook_tag parameter (section 3.4.9) to deploy a custom embed-to-object converter function.
    +
    +  *  The only non-standard element that may be permitted is embed; others like noembed and nobr cannot be permitted without modifying the htmLawed code.
    +
    +  *  It cannot handle input that has non-HTML code like SVG and MathML. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in section 3.9. A third way may be to some how take advantage of the $config["and_mark"] parameter (see section 3.2).
    +
    +  *  By default, htmLawed won't check many attribute values for standard compliance. E.g., width="20m" with the dimension in non-standard m is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the hook_tag parameter (section 3.4.9) or $spec to enforce finer checks.
    +
    +  *  The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specs. Only a few of the proprietary attributes are supported.
    +
    +  *  Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the hook_tag parameter (section 3.4.9) or $spec for finer checks. Perhaps the best option is to disallow style but allow class attributes with the right oneof or match values for class, and have the various class style properties in .css CSS stylesheet files.
    +
    +  *  htmLawed does not parse emoticons, decode BBcode, or wikify, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to br elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes.
    +
    +  *  htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate target and onclick attributes to a). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks (hook_tag parameter; see section 3.4.9).
    +
    +  *  Nesting-based checks are not possible. E.g., one cannot disallow p elements specifically inside td while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks (hook_tag parameter; see section 3.4.9).
    +
    +  *  Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert http to https. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks (hook_tag parameter; see section 3.4.9).
    +
    +  *  Pairs of opening and closing tags that do not enclose any content (like <em></em>) are not removed. This may be against the standard specs for certain elements (e.g., table). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code.
    +
    +  *  htmLawed does not check for certain element orderings described in the standard specs (e.g., in a table, tbody is allowed before tfoot). Admins may be able to use a custom hook function to enforce such checks (hook_tag parameter; see section 3.4.9).
    +
    +  *  htmLawed does not check the number of nested elements. E.g., it will allow two caption elements in a table element, illegal as per the specs. Admins may be able to use a custom hook function to enforce such checks (hook_tag parameter; see section 3.4.9).
    +
    +  *  htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers (/*) in style attribute values in order to detect malicious HTML like crafted IE-specific dynamic expressions like &#101;xpression.... If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the hook_tag parameter (section 3.4.9) to more specifically identify CSS expressions in the style attribute values. Also, using $config["style_pass"], it is possible to have htmLawed pass style attribute values without even looking at them (section 3.4.8).
    +
    +  *  htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., <a href="http://x%22+style=%22background-image:xss">x</a>). These arise when browsers mis-identify markup in escaped text, defeating the very purpose of escaping text (a bad browser will read the given example as <a href="http://x" style="background-image:xss">x</a>).
    +
    +  *  Because of poor Unicode support in PHP, htmLawed does not remove the high value HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see section 3.1).
    +
    +  *  Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts.
    + +
    +

    +2.9  Examples +

    (to top)
    +
    1. A blog administrator wants to allow only a, em, strike, strong and u in comments, but needs strike and u transformed to span for better XHTML 1-strict compliance, and, he wants the a links to be to http or https resources:
    +
    + +    $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href'); +
    +
    2. An author uses a custom-made web application to load content on his web-site. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional bad characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows:
    +
    + +    $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1)); +
    +
    +  For the final submission process, keep_bad is set to 6. A value of 1 for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text.
    +
    3. A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces:
    +
    + +    $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td ='); +
    + +
    +
    +

    +3  Details +

    (to top)
    +

    +3.1  Invalid/dangerous characters +

    (to top)
    +
    +  Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, 9, a, d, 20 to d7ff, and e000 to 10ffff, except fffe and ffff (decimally, 9, 10, 13, 32 to 55295, and 57344 to 1114111, except 65534 and 65535). htmLawed removes the invalid characters 0 to 8, b, c, and e to 1f.
    +
    +  Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input.
    +
    +  Characters that are discouraged (see section 5.1) but not invalid are not removed by htmLawed.
    +
    +  It (function hl_tag()) also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, ad, or decimally, 173) in attribute values with spaces. Where required, the characters <, >, &, and " are converted to entities.
    +
    +  With $config["clean_ms_char"] set as 1 or 2, many of the discouraged characters (decimal code-points 127 to 159 except 133) that many Microsoft applications incorrectly use (as per the Windows 1252 [Cp-1252] or a similar encoding system), and the character for decimal code-point 133, are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in section 5.4. This can help avoid some display issues arising from copying-pasting of content.
    +
    +  With $config["clean_ms_char"] set as 2, characters for the hexadecimal code-points 82, 91, and 92 (for special single-quotes), and 84, 93, and 94 (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities.
    +
    +  The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text.
    +
    +  The $config["clean_ms_char"] parameter need not be used if authors do not copy-paste Microsoft-created text or if the input text is not believed to use the Windows 1252 or a similar encoding. Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up.
    + +
    +

    +3.2  Character references/entities +

    (to top)
    +
    +  Valid character entities take the form &*; where * is #x followed by a hexadecimal number (hexadecimal numeric entity; like &#xA0; for non-breaking space), or alphanumeric like gt (external or named entity; like &nbsp; for non-breaking space), or # followed by a number (decimal numeric entity; like &#160; for non-breaking space). Character entities referring to the soft-hyphen character (the &shy; or \xad character; hexadecimal code-point ad [decimal 173]) in attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers.
    +
    +  htmLawed (function hl_ent()):
    +
    +  *  Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous)
    +
    +  *  Lowercases the X (for XML-compliance) and A-F of hexadecimal numeric entities
    +
    +  *  Neutralizes entities referring to characters that are HTML-invalid (see section 3.1)
    +
    +  *  Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, 7f to 84, 86 to 9f, and fdd0 to fddf, or decimally, 127 to 132, 134 to 159, and 64991 to 64976). Entities referring to the remaining discouraged characters (see section 5.1 for a full list) are let through.
    +
    +  *  Neutralizes named entities that are not in the specs.
    +
    +  *  Optionally converts valid HTML-specific named entities except &gt;, &lt;, &quot;, and &amp; to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is 2) for generic XML-compliance. For this, $config["named_entity"] should be 1.
    +
    +  *  Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, $config["hexdec_entity"] should be 0.
    +
    +  *  Optionally converts decimal numeric entities to the hexadecimal ones. For this, $config["hexdec_entity"] should be 2.
    +
    Neutralization refers to the entitification of & to &amp;.
    +
    Note: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's html_entity_decode function for that.
    +
    Note: If $config["and_mark"] is set, and set to a value other than 0, then the & characters in the original input are replaced with the control character for the hexadecimal code-point 6 (\x06; & characters introduced by htmLawed, e.g., after converting < to &lt;, are not affected). This allows one to distinguish, say, an &gt; introduced by htmLawed and an &gt; put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence o(><)o to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the \x06 can break documents. Before use in such documents, and preferably before any storage, any remaining \x06 should be changed back to &, e.g., with:
    +
    + +    $final = str_replace("\x06", '&', $prelim); +
    +
    +  Also, see section 3.9.
    + +
    +

    +3.3  HTML elements +

    (to top)
    +
    +  htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on $config["keep_bad"], are either neutralized (converted to plain text by entitification of < and >) or removed.
    +
    +  E.g., with only em permitted:
    +
    +  Input:
    +
    + +      <em>My</em> website is <a href="http://a.com>a.com</a>. +
    +
    +  Output, with $config["keep_bad"] = 0:
    +
    + +      <em>My</em> website is a.com. +
    +
    +  Output, with $config["keep_bad"] not 0:
    +
    + +      <em>My</em> website is &lt;a href=""&gt;a.com&lt;/a&gt;. +
    +
    +  See section 3.3.3 for differences between the various non-zero $config["keep_bad"] values.
    +
    +  htmLawed by default permits these 86 elements:
    +
    + +    a, abbr, acronym, address, applet, area, b, bdo, big, blockquote, br, button, caption, center, cite, code, col, colgroup, dd, del, dfn, dir, div, dl, dt, em, embed, fieldset, font, form, h1, h2, h3, h4, h5, h6, hr, i, iframe, img, input, ins, isindex, kbd, label, legend, li, map, menu, noscript, object, ol, optgroup, option, p, param, pre, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, select, small, span, strike, strong, sub, sup, table, tbody, td, textarea, tfoot, th, thead, tr, tt, u, ul, var +
    +
    +  Except for embed (included because of its wide-spread use) and the Ruby elements (rb, rbc, rp, rt, rtc, ruby; part of XHTML 1.1), these are all the elements in the HTML 4/XHTML 1 specs. Strict-specific specs. exclude center, dir, font, isindex, menu, s, strike, and u.
    +
    +  With $config["safe"] = 1, the default set will exclude applet, embed, iframe, object and script; see section 3.6.
    +
    +  When $config["elements"], which specifies allowed elements, is properly defined, and neither empty nor set to 0 or *, the default set is not used. To have elements added to or removed from the default set, a +/- notation is used. E.g., *-script-object implies that only script and object are disallowed, whereas *+embed means that noembed is also allowed. Elements can also be specified as comma separated names. E.g., a, b, i means only a, b and i are permitted. In this notation, *, + and - have no significance and can actually cause a mis-reading.
    +
    +  Some more examples of $config["elements"] values indicating permitted elements (note that empty spaces are liberally allowed for clarity):
    +
    +  *  a, blockquote, code, em, strong -- only a, blockquote, code, em, and strong
    +  *  *-script -- all excluding script
    +  *  * -center -dir -font -isindex -menu -s -strike -u -- only XHTML-Strict elements
    +  *  *+noembed-script -- all including noembed excluding script
    +
    +  Some mis-usages (and the resulting permitted elements) that can be avoided:
    +
    +  *  -* -- none; instead of htmLawed, one might just use, e.g., the htmlspecialchars() PHP function
    +  *  *, -script -- all except script; admin probably meant *-script
    +  *  -*, a, em, strong -- all; admin probably meant a, em, strong
    +  *  * -- all; admin need not have set elements
    +  *  *-form+form -- all; a + will always over-ride any -
    +  *  *, noembed -- only noembed; admin probably meant *+noembed
    +  *  a, +b, i -- only a and i; admin probably meant a, b, i
    +
    +  Basically, when using the +/- notation, commas (,) should not be used, and vice versa, and * should be used with the former but not the latter.
    +
    Note: Even if an element that is not in the default set is allowed through $config["elements"], like noembed in the last example, it will eventually be removed during tag balancing unless such balancing is turned off ($config["balance"] set to 0). Currently, the only way around this, which actually is simple, is to edit the various arrays in the function hl_bal() to accommodate the element and its nesting properties.
    +
    A possibly second way to specify allowed elements is to set $config["parent"] to an element name that supposedly will hold the input, and to set $config["balance"] to 1. During tag balancing (see section 3.3.3), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to div if $config["parent"] is empty, body, or an element not in htmLawed's default set of 86 elements.
    +
    Tag transformation is possible for improving XHTML-Strict compliance -- most of the deprecated elements are removed or converted to valid XHTML-Strict ones; see section 3.3.2.
    + +

    +3.3.1  Handling of comments and CDATA sections +

    (to top)
    +
    CDATA sections have the format <![CDATA[...anything but not "]]>"...]]>, and HTML comments, <!--...anything but not "-->"... -->. Neither HTML comments nor CDATA sections can reside inside tags. HTML comments can exist anywhere else, but CDATA sections can exist only where plain text is allowed (e.g., immediately inside td element content but not immediately inside tr element content).
    +
    +  htmLawed (function hl_cmtcd()) handles HTML comments or CDATA sections depending on the values of $config["comment"] or $config["cdata"]. If 0, such markup is not looked for and the text is processed like plain text. If 1, it is removed completely. If 2, it is preserved but any <, > and & inside are changed to entities. If 3, they are left as such.
    +
    +  Note that for the last two cases, HTML comments and CDATA sections will always be removed from tag content (function hl_tag()).
    +
    +  Examples:
    +
    +  Input:
    + +    <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> +
    +  Output ($config["comment"] = 0, $config["cdata"] = 2):
    + +    &lt;-- home link --&gt;<a href="home.htm"><![CDATA[x=&amp;y]]>Home</a> +
    +  Output ($config["comment"] = 1, $config["cdata"] = 2):
    + +    <a href="home.htm"><![CDATA[x=&amp;y]]>Home</a> +
    +  Output ($config["comment"] = 2, $config["cdata"] = 2):
    + +    <!-- home link --><a href="home.htm"><![CDATA[x=&amp;y]]>Home</a> +
    +  Output ($config["comment"] = 2, $config["cdata"] = 1):
    + +    <!-- home link --><a href="home.htm">Home</a> +
    +  Output ($config["comment"] = 3, $config["cdata"] = 3):
    + +    <!-- home link --><a href="home.htm"><![CDATA[x=&y]]>Home</a> +
    +
    +  For standard-compliance, comments are given the form <!--comment -->, and any -- in the content is made -.
    +
    +  When $config["safe"] = 1, CDATA sections and comments are considered plain text unless $config["comment"] or $config["cdata"] is explicitly specified; see section 3.6.
    + +
    +

    +3.3.2  Tag-transformation for better XHTML-Strict +

    (to top)
    +
    +  If $config["make_tag_strict"] is set and not 0, following non-XHTML-Strict elements (and attributes), even if admin-permitted, are mutated as indicated (element content remains intact; function hl_tag2()):
    +
    +  *  applet - (based on $config["make_tag_strict"], unchanged (1) or removed (2))
    +  *  center - div style="text-align: center;"
    +  *  dir - ul
    +  *  embed - (based on $config["make_tag_strict"], unchanged (1) or removed (2))
    +  *  font (face, size, color) -    span style="font-family: ; font-size: ; color: ;" (size transformation reference)
    +  *  isindex - (based on $config["make_tag_strict"], unchanged (1) or removed (2))
    +  *  menu - ul
    +  *  s - span style="text-decoration: line-through;"
    +  *  strike - span style="text-decoration: line-through;"
    +  *  u - span style="text-decoration: underline;"
    +
    +  For an element with a pre-existing style attribute value, the extra style properties are appended.
    +
    +  Example input:
    +
    + +    <center> +
    + +     The PHP <s>software</s> script used for this <strike>web-page</strike> web-page is <font style="font-weight: bold " face=arial size='+3' color   =  "red  ">htmLawedTest.php</font>, from <u style= 'color:green'>PHP Labware</u>. +
    + +    </center> +
    +
    +  The output:
    +
    + +    <div style="text-align: center;"> +
    + +     The PHP <span style="text-decoration: line-through;">software</span> script used for this <span style="text-decoration: line-through;">web-page</span> web-page is <span style="font-weight: bold; font-family: arial; color: red; font-size: 200%;">htmLawedTest.php</span>, from <span style="color:green; text-decoration: underline;">PHP Labware</span>. +
    + +    </div> +
    + +
    +

    +3.3.3  Tag balancing and proper nesting +

    (to top)
    +
    +  If $config["balance"] is set to 1, htmLawed (function hl_bal()) checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them).
    +
    +  Depending on the value of $config["keep_bad"] (see section 2.2 and section 3.3), illegal content may be removed or neutralized to plain text by converting < and > to entities:
    +
    0 - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see section 2.6)
    1 - neutralize tags and keep element content
    2 - remove tags but keep element content
    3 and 4 - like 1 and 2, but keep element content only if text (pcdata) is valid in parent element as per specs
    5 and 6 -  like 3 and 4, but line-breaks, tabs and spaces are left
    +
    +  Example input (disallowing the p element):
    +
    + +    <*> Pseudo-tags <*> +
    + +    <xml>Non-HTML tag xml</xml> +
    + +    <p> +
    + +    Disallowed tag p +
    + +    </p> +
    + +    <ul>Bad<li>OK</li></ul> +
    +
    +  The output with $config["keep_bad"] = 1:
    +
    + +    &lt;*&gt; Pseudo-tags &lt;*&gt; +
    + +    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt; +
    + +    &lt;p&gt; +
    + +    Disallowed tag p +
    + +    &lt;/p&gt; +
    + +    <ul>Bad<li>OK</li></ul> +
    +
    +  The output with $config["keep_bad"] = 3:
    +
    + +    &lt;*&gt; Pseudo-tags &lt;*&gt; +
    + +    &lt;xml&gt;Non-HTML tag xml&lt;/xml&gt; +
    + +    &lt;p&gt; +
    + +    Disallowed tag p +
    + +    &lt;/p&gt; +
    + +    <ul><li>OK</li></ul> +
    +
    +  The output with $config["keep_bad"] = 6:
    +
    + +    &lt;*&gt; Pseudo-tags &lt;*&gt; +
    + +    Non-HTML tag xml +
    +
    + +    Disallowed tag p +
    +
    + +    <ul><li>OK</li></ul> +
    +
    +  An option like 1 is useful, e.g., when a writer previews his submission, whereas one like 3 is useful before content is finalized and made available to all.
    +
    Note: In the example above, unlike <*>, <xml> gets considered as a tag (even though there is no HTML element named xml). In general, text matching the regular expression pattern <(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?> is considered a tag (phrase enclosed by the angled brackets < and >, and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...).
    +
    +  Nesting/content rules for each of the 86 elements in htmLawed's default set (see section 3.3) are defined in function hl_bal(). This means that if a non-standard element besides embed is being permitted through $config["elements"], the element's tag content will end up getting removed if $config["balance"] is set to 1.
    +
    +  Plain text and/or certain elements nested inside blockquote, form, map and noscript need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as form, the input B:<input type="text" value="b" />C:<input type="text" value="c" /> is converted to <div>B:<input type="text" value="b" />C:<input type="text" value="c" /></div>.
    + +
    +

    +3.3.4  Elements requiring child elements +

    (to top)
    +
    +  As per specs, the following elements require legal child elements nested inside them:
    +
    + +    blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul +
    +
    +  In some cases, the specs stipulate the number and/or the ordering of the child elements. A table can have 0 or 1 caption, tbody, tfoot, and thead, but they must be in this order: caption, thead, tfoot, tbody.
    +
    +  htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages.
    + +
    +

    +3.3.5  Beautify or compact HTML +

    (to top)
    +
    +  By default, htmLawed will neither beautify HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.)
    +
    +  As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside pre elements) are all considered equivalent, and referred to as white-spaces. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space normalization allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such pretty HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome.
    +
    +  With the $config parameter tidy, htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides pre, the script and textarea elements, CDATA sections, and HTML comments are not subjected to the tidying process.
    +
    +  To compact, use $config["tidy"] = -1; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed.
    +
    +  To beautify, $config["tidy"] is set as 1, or for customized tidying, as a string like 2s2n. The s or t character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The r and n characters are used to specify line-break characters: n for \n (Unix/Mac OS X line-breaks), rn or nr for \r\n (Windows/DOS line-breaks), or r for \r.
    +
    +  The $config["tidy"] value of 1 is equivalent to 2s0n. Other $config["tidy"] values are read loosely: a value of 4 is equivalent to 4s0n; t2, to 1t2n; s, to 2s0n; 2TR, to 2t0r; T1, to 1t1n; nr3, to 3s0nr, and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification.
    +
    +  Input formatting using $config["tidy"] is not recommended when input text has mixed markup (like HTML + PHP).
    + +
    +
    +

    +3.4  Attributes +

    (to top)
    +
    +  htmLawed will only permit attributes described in the HTML specs (including deprecated ones). It also permits some attributes for use with the embed element (the non-standard embed element is supported in htmLawed because of its widespread use), and the the xml:space attribute (valid only in XHTML 1.1). A list of such 111 attributes and the elements they are allowed in is in section 5.2.
    +
    +  When $config["deny_attribute"] is not set, or set to 0, or empty (""), all the 111 attributes are permitted. Otherwise, $config["deny_attribute"] can be set as a list of comma-separated names of the denied attributes. on* can be used to refer to the group of potentially dangerous, script-accepting attributes: onblur, onchange, onclick, ondblclick, onfocus, onkeydown, onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onreset, onselect and onsubmit.
    +
    +  Note that attributes specified in $config["deny_attribute"] are denied globally, for all elements. To deny attributes for only specific elements, $spec (see section 2.3) can be used. $spec can also be used to element-specifically permit an attribute otherwise denied through $config["deny_attribute"].
    +
    +  With $config["safe"] = 1 (section 3.6), the on* attributes are automatically disallowed.
    +
    Note: To deny all but a few attributes globally, a simpler way to specify $config["deny_attribute"] would be to use the notation * -attribute1 -attribute2 .... Thus, a value of * -title -href implies that except href and title (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter safe (section 3.6) will have no effect on deny_attribute.
    +
    +  htmLawed (function hl_tag()) also:
    +
    +  *  Lower-cases attribute names
    +  *  Removes duplicate attributes (last one stays)
    +  *  Gives attributes the form name="value" and single-spaces them, removing unnecessary white-spacing
    +  *  Provides required attributes (see section 3.4.1)
    +  *  Double-quotes values and escapes any " inside them
    +  *  Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point ad) in the values with spaces
    +  *  Allows custom function to additionally filter/modify attribute values (see section 3.4.9)
    + +

    +3.4.1  Auto-addition of XHTML-required attributes +

    (to top)
    +
    +  If indicated attributes for the following elements are found missing, htmLawed (function hl_tag()) will add them (with values same as attribute names unless indicated otherwise below):
    +
    +  *  area - alt (area)
    +  *  area, img - src, alt (image)
    +  *  bdo - dir (ltr)
    +  *  form - action
    +  *  map - name
    +  *  optgroup - label
    +  *  param - name
    +  *  script - type (text/javascript)
    +  *  textarea - rows (10), cols (50)
    +
    +  Additionally, with $config["xml:lang"] set to 1 or 2, if the lang but not the xml:lang attribute is declared, then the latter is added too, with a value copied from that of lang. This is for better standard-compliance. With $config["xml:lang"] set to 2, the lang attribute is removed (XHTML 1.1 specs).
    +
    +  Note that the name attribute for map, invalid in XHTML 1.1, is also transformed if required -- see section 3.4.6.
    + +
    +

    +3.4.2  Duplicate/invalid id values +

    (to top)
    +
    +  If $config["unique_ids"] is 1, htmLawed (function hl_tag()) removes id attributes with values that are not XHTML-compliant (must begin with a letter and can contain letters, digits, :, ., - and _) or duplicate. If $config["unique_ids"] is a word, any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness. The word should begin with a letter and should contain only letters, numbers, :, ., _ and -.
    +
    +  Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of id values as it uses a global variable ($GLOBALS["hl_Ids"] array). Further, an admin can restrict the use of certain id values by presetting this variable before htmLawed is called into use. E.g.:
    +
    + +    $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input +
    + +    $processed = htmLawed($text); // filter input +
    + +
    +

    +3.4.3  URL schemes (protocols) and scripts in attribute values +

    (to top)
    +
    +  htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the afp scheme is not permitted, then <a href="afp://domain.org"> becomes <a href="denied:afp://domain.org">, and if Javascript is not permitted <a onclick="javascript:xss();"> becomes <a onclick="denied:javascript:xss();">.
    +
    +  By default htmLawed permits these schemes in URLs for the href attribute:
    +
    + +    aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet +
    +
    +  Also, only file, http and https are permitted in attributes whose names start with o (like onmouseover), and in these attributes that accept URLs:
    +
    + +    action, cite, classid, codebase, data, href, longdesc, model, pluginspage, pluginurl, src, style, usemap +
    +
    +  These default sets are used when $config["schemes"] is not set (see section 2.2). To over-ride the defaults, $config["schemes"] is defined as a string of semi-colon-separated sub-strings of type attribute: comma-separated schemes. E.g., href: mailto, http, https; onclick: javascript; src: http, https. For unspecified attributes, file, http and https are permitted. This can be changed by passing schemes for * in $config["schemes"]. E.g., href: mailto, http, https; *: https, https.
    +
    * can be put in the list of schemes to permit all protocols. E.g., style: *; img: http, https results in protocols not being checked in style attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (section 3.4.4) is not done.
    +
    +  Thus, to allow Javascript, one can set $config["schemes"] as href: mailto, http, https; *: http, https, javascript, or href: mailto, http, https, javascript; *: http, https, javascript, or *: *, and so on.
    +
    +  As a side-note, one may find style: * useful as URLs in style attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text.
    +
    Note: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string src (e.g., dynsrc) or starts with o (e.g., onbeforecopy).
    +
    +  With $config["safe"] = 1, all URLs are disallowed in the style attribute values.
    + +
    +

    +3.4.4  Absolute & relative URLs in attribute values +

    (to top)
    +
    +  htmLawed can make absolute URLs in attributes like href relative ($config["abs_url"] is -1), and vice versa ($config["abs_url"] is 1). URLs in scripts are not considered for this, and so are URLs like #section_6 (fragment), ?name=Tim#show (starting with query string), and ;var=1?name=Tim#show (starting with parameters). Further, this requires that $config["base_url"] be set properly, with the :// and a trailing slash (/), with no query string, etc. E.g., file:///D:/page/, https://abc.com/x/y/, or http://localhost/demo/ are okay, but file:///D:/page/?help=1, abc.com/x/y/ and http://localhost/demo/index.htm are not.
    +
    +  For making absolute URLs relative, only those URLs that have the $config["base_url"] string at the beginning are converted. E.g., with $config["base_url"] = "https://abc.com/x/y/", https://abc.com/x/y/a.gif and https://abc.com/x/y/z/b.gif become a.gif and z/b.gif respectively, while https://abc.com/x/c.gif is not changed.
    +
    +  When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See section 5.5 for more about the URL specification as per RFC 1808.
    + +
    +

    +3.4.5  Lower-cased, standard attribute values +

    (to top)
    +
    +  Optionally, for standard-compliance, htmLawed (function hl_tag()) lower-cases standard attribute values to give, e.g., input type="password" instead of input type="Password", if $config["lc_std_val"] is 1. Attribute values matching those listed below for any of the elements (plus those for the type attribute of button or input) are lower-cased:
    +
    + +    all, baseline, bottom, button, center, char, checkbox, circle, col, colgroup, cols, data, default, file, get, groups, hidden, image, justify, left, ltr, middle, none, object, password, poly, post, preserve, radio, rect, ref, reset, right, row, rowgroup, rows, rtl, submit, text, top +
    +
    + +    a, area, bdo, button, col, form, img, input, object, option, optgroup, param, script, select, table, td, tfoot, th, thead, tr, xml:space +
    +
    +  The following empty (minimized) attributes are always assigned lower-cased values (same as the names):
    +
    + +    checked, compact, declare, defer, disabled, ismap, multiple, nohref, noresize, noshade, nowrap, readonly, selected +
    + +
    +

    +3.4.6  Transformation of deprecated attributes +

    (to top)
    +
    +  If $config["no_deprecated_attr"] is 0, then deprecated attributes (see appendix in section 5.2) are removed and, in most cases, their values are transformed to CSS style properties and added to the style attributes (function hl_tag()). Except for bordercolor for table, tr and td, the scores of proprietary attributes that were never part of any cross-browser standard are not supported.
    +
    Note: The attribute target for a is allowed even though it is not in XHTML 1.0 specs. This is because of the attribute's wide-spread use and browser-support, and because the attribute is valid in XHTML 1.1 onwards.
    +
    +  *  align - for img with value of left or right, becomes, e.g., float: left; for div and table with value center, becomes margin: auto; all others become, e.g., text-align: right
    +
    +  *  bgcolor - E.g., bgcolor="#ffffff" becomes background-color: #ffffff
    +  *  border - E.g., height= "10" becomes height: 10px
    +  *  bordercolor - E.g., bordercolor=#999999 becomes border-color: #999999;
    +  *  compact - font-size: 85%
    +  *  clear - E.g., 'clear="all" becomes clear: both
    +
    +  *  height - E.g., height= "10" becomes height: 10px and height="*" becomes height: auto
    +
    +  *  hspace - E.g., hspace="10" becomes margin-left: 10px; margin-right: 10px
    +  *  language - language="VBScript" becomes type="text/vbscript"
    +  *  name - E.g., name="xx" becomes id="xx"
    +  *  noshade - border-style: none; border: 0; background-color: gray; color: gray
    +  *  nowrap - white-space: nowrap
    +  *  size - E.g., size="10" becomes height: 10px
    +  *  start - removed
    +  *  type - E.g., type="i" becomes list-style-type: lower-roman
    +  *  value - removed
    +  *  vspace - E.g., vspace="10" becomes margin-top: 10px; margin-bottom: 10px
    +  *  width - like height
    +
    +  Example input:
    +
    + +    <img src="j.gif" alt="image" name="dad's" /><img src="k.gif" alt="image" id="dad_off" name="dad" /> +
    + +    <br clear="left" /> +
    + +    <hr noshade size="1" /> +
    + +    <img name="img" src="i.gif" align="left" alt="image" hspace="10" vspace="10" width="10em" height="20" border="1" style="padding:5px;" /> +
    + +    <table width="50em" align="center" bgcolor="red"> +
    + +     <tr> +
    + +      <td width="20%"> +
    + +       <div align="center"> +
    + +        <h3 align="right">Section</h3> +
    + +        <p align="right">Para</p> +
    + +        <ol type="a" start="e"><li value="x">First item</li></ol> +
    + +       </div> +
    + +      </td> +
    + +      <td width="*"> +
    + +       <ol type="1"><li>First item</li></ol> +
    + +      </td> +
    + +     </tr> +
    + +    </table> +
    + +    <br clear="all" /> +
    +
    +  And the output with $config["no_deprecated_attr"] = 1:
    +
    + +    <img src="j.gif" alt="image" /><img src="k.gif" alt="image" id="dad_off" /> +
    + +    <br style="clear: left;" /> +
    + +    <hr style="border-style: none; border: 0; background-color: gray; color: gray; size: 1px;" /> +
    + +    <img src="i.gif" alt="image" width="10em" height="20" style="padding:5px; float: left; margin-left: 10px; margin-right: 10px; margin-top: 10px; margin-bottom: 10px; border: 1px;" id="img" /> +
    + +    <table width="50em" style="margin: auto; background-color: red;"> +
    + +     <tr> +
    + +      <td style="width: 20%;"> +
    + +       <div style="margin: auto;"> +
    + +        <h3 style="text-align: right;">Section</h3> +
    + +        <p style="text-align: right;">Para</p> +
    + +        <ol style="list-style-type: lower-latin;"><li>First item</li></ol> +
    + +       </div> +
    + +      </td> +
    + +      <td style="width: auto;"> +
    + +       <ol style="list-style-type: decimal;"><li>First item</li></ol> +
    + +      </td> +
    + +     </tr> +
    + +    </table> +
    + +    <br style="clear: both;" /> +
    +
    +  For lang, deprecated in XHTML 1.1, transformation is taken care of through $config["xml:lang"]; see section 3.4.1.
    +
    +  The attribute name is deprecated in form, iframe, and img, and is replaced with id if an id attribute doesn't exist and if the name value is appropriate for id. For such replacements for a and map, for which the name attribute is deprecated in XHTML 1.1, $config["no_deprecated_attr"] should be set to 2 (when set to 1, for these two elements, the name attribute is retained).
    + +
    +

    +3.4.7  Anti-spam & href +

    (to top)
    +
    +  htmLawed (function hl_tag()) can check the href attribute values (link addresses) as an anti-spam (email or link spam) measure.
    +
    +  If $config["anti_mail_spam"] is not 0, the @ of email addresses in href values like mailto:a@b.com is replaced with text specified by $config["anti_mail_spam"]. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., <remove_this_antispam>@ (makes the example address a<remove_this_antispam>@b.com).
    +
    +  For regular links, one can choose to have a rel attribute with nofollow in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the href value altogether (disable the link).
    +
    +  For use of these options, $config["anti_link_spam"] should be set as an array with values regex1 and regex2, both or one of which can be empty (like array("", "regex2")) to indicate that that option is not to be used. Otherwise, regex1 or regex2 should be PHP- and PCRE-compatible regular expression patterns: href values will be matched against them and those matching the pattern will accordingly be treated.
    +
    +  Note that the regular expressions should have delimiters, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed.
    +
    +  An example, to have a rel attribute with nofollow for all links, and to disable links that do not point to domains abc.com and xyz.org:
    +
    + +    $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`'); +
    + +
    +

    +3.4.8  Inline style properties +

    (to top)
    +
    +  htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the style attributes. (CSS properties like background-image that accept URLs in their values are noted in section 5.3.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting $config["css_expression"] to 1 (default setting).
    +
    Note: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the style attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off ($config["schemes"] = "...style:*...", see section 3.4.3, and $config["css_expression"] = 0). Alternately, admins can use their own custom function for finer handling of style values through the hook_tag parameter (see section 3.4.9).
    +
    +  It is also possible to have htmLawed let through any style value by setting $config["style_pass"] to 1.
    +
    +  As such, it is better to set up a CSS file with class declarations, disallow the style attribute, set a $spec rule (see section 2.3) for class for the oneof or match parameter, and ask writers to make use of the class attribute.
    + +
    +

    +3.4.9  Hook function for tag content +

    (to top)
    +
    +  It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.).
    +
    +  When $config parameter hook_tag is set to the name of a function, htmLawed (function hl_tag()) will pass on the element name, and the finalized attribute name-value pairs as array elements to the function. The function is expected to return the full opening tag string like <element_name attribute_1_name="attribute_1_value"...> (for empty elements like img and input, the element-closing slash / should also be included).
    +
    +  This is a powerful functionality that can be exploited for various objectives: consolidate-and-convert inline style attributes to class, convert embed elements to object, permit only one caption element in a table element, disallow embedding of certain types of media, inject HTML, use CSSTidy to sanitize style attribute values, etc.
    +
    +  As an example, the custom hook code below can be used to force a series of specifically ordered id attributes on all elements, and a specific param element inside all object elements:
    +
    + +    function my_tag_function($element, $attribute_array){ +
    + +      static $id = 0; +
    + +      // Remove any duplicate element +
    + +      if($element == 'param' && isset($attribute_array['allowscriptaccess'])){ +
    + +        return ''; +
    + +      } +
    +
    + +      $new_element = ''; +
    +
    + +      // Force a serialized ID number +
    + +      $attribute_array['id'] = 'my_'. $id; +
    + +      ++$id; +
    +
    + +      // Inject param for allowscriptaccess +
    + +      if($element == 'object'){ +
    + +        $new_element = '<param id='my_'. $id; allowscriptaccess="never" />'; +
    + +        ++$id; +
    + +      } +
    +
    + +      $string = ''; +
    + +      foreach($attribute_array as $k=>$v){ +
    + +        $string .= " {$k}=\"{$v}\""; +
    + +      } +
    + +      return "<{$element}{$string}". (isset($in_array($element, $empty_elements) ? ' /' : ''). '>'. $new_element; +
    + +    } +
    +
    +  The hook_tag parameter is different from the hook parameter (section 3.7).
    +
    +  Snippets of hook function code developed by others may be available on the htmLawed website.
    + +
    +
    +

    +3.5  Simple configuration directive for most valid XHTML +

    (to top)
    +
    +  If $config["valid_xhtml"] is set to 1, some relevant $config parameters (indicated by ~ in section 2.2) are auto-adjusted. This allows one to pass the $config argument with a simpler value. If a value for a parameter auto-set through valid_xhtml is still manually provided, then that value will over-ride the auto-set value.
    + +
    +

    +3.6  Simple configuration directive for most safe HTML +

    (to top)
    +
    Safe HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specs. When elements such as script and object, and attributes such as onmouseover and style are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered safe depends on the nature of the web application and the trust-level accorded to its users.
    +
    +  htmLawed allows an admin to use $config["safe"] to auto-adjust multiple $config parameters (such as elements which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by " in section 2.2). Thus, one can pass the $config argument with a simpler value.
    +
    +  With the value of 1, htmLawed considers CDATA sections and HTML comments as plain text, and prohibits the applet, embed, iframe, object and script elements, and the on* attributes like onclick. ( There are $config parameters like css_expression that are not affected by the value set for safe but whose default values still contribute towards a more safe output.) Further, URLs with schemes (see section 3.4.3) are neutralized so that, e.g., style="moz-binding:url(http://danger)" becomes style="moz-binding:url(denied:http://danger)" while style="moz-binding:url(ok)" remains intact.
    +
    +  Admins, however, may still want to completely deny the style attribute, e.g., with code like
    +
    + +    $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style')); +
    +
    +  If a value for a parameter auto-set through safe is still manually provided, then that value can over-ride the auto-set value. E.g., with $config["safe"] = 1 and $config["elements"] = "*+script", script, but not applet, is allowed.
    +
    +  A page illustrating the efficacy of htmLawed's anti-XSS abilities with safe set to 1 against XSS vectors listed by RSnake may be available here.
    + +
    +

    +3.7  Using a hook function +

    (to top)
    +
    +  If $config["hook"] is not set to 0, then htmLawed will allow preliminarily processed input to be altered by a hook function named by $config["hook"] before starting the main work (but after handling of characters, entities, HTML comments and CDATA sections -- see code for function htmLawed()).
    +
    +  The hook function also allows one to alter the finalized values of $config and $spec.
    +
    +  Note that the hook parameter is different from the hook_tag parameter (section 3.4.9).
    +
    +  Snippets of hook function code developed by others may be available on the htmLawed website.
    + +
    +

    +3.8  Obtaining finalized parameter values +

    (to top)
    +
    +  htmLawed can assign the finalized $config and $spec values to a variable named by $config["show_setting"]. The variable, made global by htmLawed, is set as an array with three keys: config, with the $config value, spec, with the $spec value, and time, with a value that is the Unix time (the output of PHP's microtime() function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code.
    +
    +  The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers.
    + +
    +

    +3.9  Retaining non-HTML tags in input with mixed markup +

    (to top)
    +
    +  htmLawed does not remove certain characters that though invalid are nevertheless discouraged in HTML documents as per the specs (see section 5.1). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the <, > and & characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code).
    +
    +  To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the <, > and & characters with some of the HTML-discouraged characters (see section 3.1.2). Post-htmLawed processing, the replacements are reverted.
    +
    +  An example (mixed HTML and PHP code in input text):
    +
    + +    $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text); +
    + +    $processed = htmLawed($text); +
    + +    $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '<?php$1?>', $processed); +
    +
    +  This code will not work if $config["clean_ms_char"] is set to 1 (section 3.1), in which case one should instead deploy a hook function (section 3.7). (htmLawed internally uses certain control characters, code-points 1 to 7, and use of these characters as markers in the logic of hook functions may cause issues.)
    +
    +  Admins may also be able to use $config["and_mark"] to deal with such mixed markup; see section 3.2.
    + +
    +
    +

    +4  Other +

    (to top)
    +

    +4.1  Support +

    (to top)
    +
    +  A careful re-reading of this documentation will very likely answer your questions.
    +
    +  Software updates and forum-based community-support may be found at http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at http://php.net.
    + +
    +

    +4.2  Known issues +

    (to top)
    +
    +  See section 2.8.
    +
    +  Readers are advised to cross-check information given in this document.
    + +
    +

    +4.3  Change-log +

    (to top)
    +
    +  (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the htmLawed.php file may be updated independently if the secondary files are revised.)
    +
    Version number - Release date. Notes
    +
    +  1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice
    +
    +  1.1.8 - 23 April 2009. Parameter deny_attribute now accepts the wild-card *, making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting $spec
    +
    +  1.1.7 - 11-12 March 2009. Attributes globally denied through deny_attribute can be allowed element-specifically through $spec; $config["style_pass"] allowing letting through any style value introduced; altered logic to catch certain types of dynamic crafted CSS expressions
    +
    +  1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions
    +
    +  1.1.2 - 22 January 2009. Fixed bug in parsing of font attributes during tag transformation
    +
    +  1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent
    +
    +  1.1 - 29 June 2008. $config["hook_tag"] and $config["format"] introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug
    +
    +  1.0.9 - 11 June 2008. Fixed bug in invalid HTML code-point entity check
    +
    +  1.0.8 - 15 May 2008. bordercolor attribute for table, td and tr
    +
    +  1.0.7 - 1 May 2008. Support for wmode attribute for embed; $config["show_setting"] introduced; improved $config["elements"] evaluation
    +
    +  1.0.6 - 20 April 2008. $config["and_mark"] introduced
    +
    +  1.0.5 - 12 March 2008. style URL schemes essentially disallowed when $config safe is on; improved regex for CSS expression search
    +
    +  1.0.4 - 10 March 2008. Improved corrections for blockquote, form, map and noscript
    +
    +  1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); a bug allowing td directly inside table fixed; safe $config parameter added
    +
    +  1.0.2 - 13 February 2008. Improved implementation of $config["keep_bad"]
    +
    +  1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions (hl_tag() and hl_prot()); no error display with hl_regex()
    +
    +  1.0 - 2 November 2007. First release
    + +
    +

    +4.4  Testing +

    (to top)
    +
    +  To test htmLawed using a form interface, a demo web-page is provided with the htmLawed distribution (htmLawed.php and htmLawedTest.php should be in the same directory on the web-server). A file with test-cases is also provided.
    + +
    +

    +4.5  Upgrade, & old versions +

    (to top)
    +
    +  Upgrading is as simple as replacing the previous version of htmLawed.php (assuming it was not modified for customized features). As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content.
    +
    +  Old versions of htmLawed may be available online. E.g., for version 1.0, check http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip, for 1.1.1, htmLawed111.zip, and for 1.1.10, htmLawed1110.zip.
    + +
    +

    +4.6  Comparison with HTMLPurifier +

    (to top)
    +
    +  The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it:
    +
    +  *  does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2)
    +
    +  *  is 15-20 times bigger (scores of files totalling more than 750 kb)
    +
    +  *  consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory)
    +
    +  *  is expectedly slower
    +
    +  *  does not allow admins to fully allow all valid HTML (because of incomplete HTML support, it always considers elements like script illegal)
    +
    +  *  lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification)
    +
    +  *  has poor documentation
    +
    +  However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier website for updated information.
    + +
    +

    +4.7  Use through application plug-ins/modules +

    (to top)
    +
    +  Plug-ins/modules to implement htmLawed in applications such as Drupal and DokuWiki may have been developed. Please check the application websites and the forum on the htmLawed site.
    + +
    +

    +4.8  Use in non-PHP applications +

    (to top)
    +
    +  Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed site.
    + +
    +

    +4.9  Donate +

    (to top)
    +
    +  A donation in any currency and amount to appreciate or support this software can be sent by PayPal to this email address: drpatnaik at yahoo dot com.
    + +
    +

    +4.10  Acknowledgements +

    (to top)
    +
    +  Bryan Blakey, Ulf Harnhammer, Gareth Heyes, Lukasz Pilorz, Shelley Powers, Edward Yang, and many anonymous users.
    +
    +  Thank you!
    + +
    +
    +

    +5  Appendices +

    (to top)
    +

    +5.1  Characters discouraged in XHTML +

    (to top)
    +
    +  Characters represented by the following hexadecimal code-points are not invalid, even though some validators may issue messages stating otherwise.
    +
    7f to 84, 86 to 9f, fdd0 to fddf, 1fffe, 1ffff, 2fffe, 2ffff, 3fffe, 3ffff, 4fffe, 4ffff, 5fffe, 5ffff, 6fffe, 6ffff, 7fffe, 7ffff, 8fffe, 8ffff, 9fffe, 9ffff, afffe, affff, bfffe, bffff, cfffe, cffff, dfffe, dffff, efffe, effff, ffffe, fffff, 10fffe and 10ffff
    + +
    +

    +5.2  Valid attribute-element combinations +

    (to top)
    +
    +  Valid attribute-element combinations as per W3C specs.
    +
    +  *  includes deprecated attributes (marked ^), attributes for the non-standard embed element (marked *), and the proprietary bordercolor (marked ~)
    +  *  only non-frameset, HTML body elements
    +  *  name for a and map, and lang are invalid in XHTML 1.1
    +  *  target is valid for a in XHTML 1.1 and higher
    +  *  xml:space is only for XHTML 1.1
    +
    +  abbr - td, th
    +  accept - form, input
    +  accept-charset - form
    +  accesskey - a, area, button, input, label, legend, textarea
    +  action - form
    +  align - caption^, embed, applet, iframe, img^, input^, object^, legend^, table^, hr^, div^, h1^, h2^, h3^, h4^, h5^, h6^, p^, col, colgroup, tbody, td, tfoot, th, thead, tr
    +  alt - applet, area, img, input
    +  archive - applet, object
    +  axis - td, th
    +  bgcolor - embed, table^, tr^, td^, th^
    +  border - table, img^, object^
    +  bordercolor~ - table, td, tr
    +  cellpadding - table
    +  cellspacing - table
    +  char - col, colgroup, tbody, td, tfoot, th, thead, tr
    +  charoff - col, colgroup, tbody, td, tfoot, th, thead, tr
    +  charset - a, script
    +  checked - input
    +  cite - blockquote, q, del, ins
    +  classid - object
    +  clear - br^
    +  code - applet
    +  codebase - object, applet
    +  codetype - object
    +  color - font
    +  cols - textarea
    +  colspan - td, th
    +  compact - dir, dl^, menu, ol^, ul^
    +  coords - area, a
    +  data - object
    +  datetime - del, ins
    +  declare - object
    +  defer - script
    +  dir - bdo
    +  disabled - button, input, optgroup, option, select, textarea
    +  enctype - form
    +  face - font
    +  for - label
    +  frame - table
    +  frameborder - iframe
    +  headers - td, th
    +  height - embed, iframe, td^, th^, img, object, applet
    +  href - a, area
    +  hreflang - a
    +  hspace - applet, img^, object^
    +  ismap - img, input
    +  label - option, optgroup
    +  language - script^
    +  longdesc - img, iframe
    +  marginheight - iframe
    +  marginwidth - iframe
    +  maxlength - input
    +  method - form
    +  model* - embed
    +  multiple - select
    +  name - button, embed, textarea, applet^, select, form^, iframe^, img^, a^, input, object, map^, param
    +  nohref - area
    +  noshade - hr^
    +  nowrap - td^, th^
    +  object - applet
    +  onblur - a, area, button, input, label, select, textarea
    +  onchange - input, select, textarea
    +  onfocus - a, area, button, input, label, select, textarea
    +  onreset - form
    +  onselect - input, textarea
    +  onsubmit - form
    +  pluginspage* - embed
    +  pluginurl* - embed
    +  prompt - isindex
    +  readonly - textarea, input
    +  rel - a
    +  rev - a
    +  rows - textarea
    +  rowspan - td, th
    +  rules - table
    +  scope - td, th
    +  scrolling - iframe
    +  selected - option
    +  shape - area, a
    +  size - hr^, font, input, select
    +  span - col, colgroup
    +  src - embed, script, input, iframe, img
    +  standby - object
    +  start - ol^
    +  summary - table
    +  tabindex - a, area, button, input, object, select, textarea
    +  target - a^, area, form
    +  type - a, embed, object, param, script, input, li^, ol^, ul^, button
    +  usemap - img, input, object
    +  valign - col, colgroup, tbody, td, tfoot, th, thead, tr
    +  value - input, option, param, button, li^
    +  valuetype - param
    +  vspace - applet, img^, object^
    +  width - embed, hr^, iframe, img, object, table, td^, th^, applet, col, colgroup, pre^
    +  wmode - embed
    +  xml:space - pre, script, style
    +
    +  These are allowed in all but the shown elements:
    +
    +  class - param, script
    +  dir - applet, bdo, br, iframe, param, script
    +  id - script
    +  lang - applet, br, iframe, param, script
    +  onclick - applet, bdo, br, font, iframe, isindex, param, script
    +  ondblclick - applet, bdo, br, font, iframe, isindex, param, script
    +  onkeydown - applet, bdo, br, font, iframe, isindex, param, script
    +  onkeypress - applet, bdo, br, font, iframe, isindex, param, script
    +  onkeyup - applet, bdo, br, font, iframe, isindex, param, script
    +  onmousedown - applet, bdo, br, font, iframe, isindex, param, script
    +  onmousemove - applet, bdo, br, font, iframe, isindex, param, script
    +  onmouseout - applet, bdo, br, font, iframe, isindex, param, script
    +  onmouseover - applet, bdo, br, font, iframe, isindex, param, script
    +  onmouseup - applet, bdo, br, font, iframe, isindex, param, script
    +  style - param, script
    +  title - param, script
    +  xml:lang - applet, br, iframe, param, script
    + +
    +

    +5.3  CSS 2.1 properties accepting URLs +

    (to top)
    +
    +  background
    +  background-image
    +  content
    +  cue-after
    +  cue-before
    +  cursor
    +  list-style
    +  list-style-image
    +  play-during
    + +
    +

    +5.4  Microsoft Windows 1252 character replacements +

    (to top)
    +
    +  Key: d double, l left, q quote, r right, s. single
    +
    +  Code-point (decimal) - hexadecimal value - replacement entity - represented character
    +
    +  127 - 7f - (removed) - (not used)
    +  128 - 80 - &#8364; - euro
    +  129 - 81 - (removed) - (not used)
    +  130 - 82 - &#8218; - baseline s. q
    +  131 - 83 - &#402; - florin
    +  132 - 84 - &#8222; - baseline d q
    +  133 - 85 - &#8230; - ellipsis
    +  134 - 86 - &#8224; - dagger
    +  135 - 87 - &#8225; - d dagger
    +  136 - 88 - &#710; - circumflex accent
    +  137 - 89 - &#8240; - permile
    +  138 - 8a - &#352; - S Hacek
    +  139 - 8b - &#8249; - l s. guillemet
    +  140 - 8c - &#338; - OE ligature
    +  141 - 8d - (removed) - (not used)
    +  142 - 8e - &#381; - Z dieresis
    +  143 - 8f - (removed) - (not used)
    +  144 - 90 - (removed) - (not used)
    +  145 - 91 - &#8216; - l s. q
    +  146 - 92 - &#8217; - r s. q
    +  147 - 93 - &#8220; - l d q
    +  148 - 94 - &#8221; - r d q
    +  149 - 95 - &#8226; - bullet
    +  150 - 96 - &#8211; - en dash
    +  151 - 97 - &#8212; - em dash
    +  152 - 98 - &#732; - tilde accent
    +  153 - 99 - &#8482; - trademark
    +  154 - 9a - &#353; - s Hacek
    +  155 - 9b - &#8250; - r s. guillemet
    +  156 - 9c - &#339; - oe ligature
    +  157 - 9d - (removed) - (not used)
    +  158 - 9e - &#382; - z dieresis
    +  159 - 9f - &#376; - Y dieresis
    + +
    +

    +5.5  URL format +

    (to top)
    +
    +  An absolute URL has a protocol or scheme, a network location or hostname, and, optional path, parameters, query and fragment segments. Thus, an absolute URL has this generic structure:
    +
    + +    (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment) +
    +
    +  The schemes can only contain letters, digits, +, . and -. Hostname is the portion after the // and up to the first / (if any; else, up to the end) when : is followed by a // (e.g., abc.com in ftp://abc.com/def); otherwise, it consists of everything after the : (e.g., def@abc.com in mailto:def@abc.com').
    +
    Relative URLs do not have explicit schemes and network locations; such values are inherited from a base URL.
    + +
    +

    +5.6  Brief on htmLawed code +

    (to top)
    +
    +  Much of the code's logic and reasoning can be understood from the documentation above.
    +
    +  The output of htmLawed is a text string containing the processed input. There is no custom error tracking.
    +
    Function arguments for htmLawed are:
    +
    +  *  $in - 1st argument; a text string; the input text to be processed. Any extraneous slashes added by PHP when magic quotes are enabled should be removed beforehand using PHP's stripslashes() function.
    +
    +  *  $config - 2nd argument; an associative array; optional (named $C in htmLawed code). The array has keys with names like balance and keep_bad, and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the configurable parameters (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through $config. Finalized $config is thus a filtered and possibly larger array.
    +
    +  *  $spec - 3rd argument; a text string; optional. The string has rules, written in an htmLawed-designated format, specifying element-specific attribute and attribute value restrictions. Function hl_spec() is used to convert the string to an associative-array for internal use. Finalized $spec is thus an array.
    +
    Finalized $config and $spec are made global variables while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the finalized values, the show_settings parameter of $config should be used). Depending on $config, another global variable hl_Ids, to track id attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing.
    +
    +  Except for the main function htmLawed() and the functions kses() and kses_hook(), htmLawed's functions are name-spaced using the hl_ prefix. The functions and their roles are:
    +
    +  *  hl_attrval - checking attribute values against $spec
    +  *  hl_bal - tag balancing
    +  *  hl_cmtcd - handling CDATA sections and HTML comments
    +  *  hl_ent - entity handling
    +  *  hl_prot - checking a URL scheme/protocol
    +  *  hl_regex - checking syntax of a regular expression
    +  *  hl_spec - converting user-supplied $spec value to one used by htmLawed internally
    +  *  hl_tag - handling tags
    +  *  hl_tag2 - transforming tags
    +  *  hl_tidy - compact/beautify HTML
    +  *  hl_version - reporting htmLawed version
    +  *  htmLawed - main function
    +  *  kses - main function of kses
    +  *  kses_hook - hook function of kses
    +
    +  The last two are for compatibility with pre-existing code using the kses script. htmLawed's kses() basically passes on the filtering task to htmLawed() function after deciphering $config and $spec from the argument values supplied to it. kses_hook() is an empty function and is meant for being filled with custom code if the kses script users were using one.
    +
    htmLawed() finalizes $spec (with the help of hl_spec()) and $config, and globalizes them. Finalization of $config involves setting default values if an inappropriate or invalid one is supplied. This includes calling hl_regex() to check well-formedness of regular expression patterns if such expressions are user-supplied through $config. htmLawed() then removes invalid characters like nulls and x01 and appropriately handles entities using hl_ent(). HTML comments and CDATA sections are identified and treated as per $config with the help of hl_cmtcd(). When retained, the < and > characters identifying them, and the <, > and & characters inside them, are replaced with control characters (code-points 1 to 5) till any tag balancing is completed.
    +
    +  After this initial processing htmLawed() identifies tags using regex and processes them with the help of hl_tag() --  a large function that analyzes tag content, filtering it as per HTML standards, $config and $spec. Among other things, hl_tag() transforms deprecated elements using hl_tag2(), removes attributes from closing tags, checks attribute values as per $spec rules using hl_attrval(), and checks URL protocols using hl_prot(). htmLawed() performs tag balancing and nesting checks with a call to hl_bal(), and optionally compacts/beautifies the output with proper white-spacing with a call to hl_tidy(). The latter temporarily replaces white-space, and <, > and & characters inside pre, script and textarea elements, and HTML comments and CDATA sections with control characters (code-points 1 to 5, and 7).
    +
    +  htmLawed permits the use of custom code or hook functions at two stages. The first, called inside htmLawed(), allows the input text as well as the finalized $config and $spec values to be altered right after the initial processing (see section 3.7). The second is called by hl_tag() once the tag content is finalized (see section 3.4.9).
    +
    +  Being dictated by the external and stable HTML standard, htmLawed's objective is very clear-cut and less concerned with tweakability. The code is only minimally annotated with comments -- it is not meant to instruct; PHP developers familiar with the HTML specs will see the logic, and others can always refer to the htmLawed documentation. The compact structuring of the statements is meant to aid in quickly grasping the logic, at least when viewed with code syntax highlighted. +
    +
    +
    +


    HTM version of htmLawed_README.txt generated on 23 Apr, 2009 using rTxt2htm from PHP Labware +
    +
    + + \ No newline at end of file diff --git a/extlib/htmLawed/htmLawed_README.txt b/extlib/htmLawed/htmLawed_README.txt new file mode 100644 index 0000000000..3ce4b9ac1a --- /dev/null +++ b/extlib/htmLawed/htmLawed_README.txt @@ -0,0 +1,1600 @@ +/* +htmLawed_README.txt, 16 July 2009 +htmLawed 1.1.8.1, 16 July 2009 +Copyright Santosh Patnaik +GPL v3 license +A PHP Labware internal utility - http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed +*/ + + +== Content ========================================================== + + +1 About htmLawed + 1.1 Example uses + 1.2 Features + 1.3 History + 1.4 License & copyright + 1.5 Terms used here +2 Usage + 2.1 Simple + 2.2 Configuring htmLawed using the '$config' parameter + 2.3 Extra HTML specifications using the '$spec' parameter + 2.4 Performance time & memory usage + 2.5 Some security risks to keep in mind + 2.6 Use without modifying old 'kses()' code + 2.7 Tolerance for ill-written HTML + 2.8 Limitations & work-arounds + 2.9 Examples +3 Details + 3.1 Invalid/dangerous characters + 3.2 Character references/entities + 3.3 HTML elements + 3.3.1 HTML comments and 'CDATA' sections + 3.3.2 Tag-transformation for better XHTML-Strict + 3.3.3 Tag balancing and proper nesting + 3.3.4 Elements requiring child elements + 3.3.5 Beautify or compact HTML + 3.4 Attributes + 3.4.1 Auto-addition of XHTML-required attributes + 3.4.2 Duplicate/invalid 'id' values + 3.4.3 URL schemes (protocols) and scripts in attribute values + 3.4.4 Absolute & relative URLs + 3.4.5 Lower-cased, standard attribute values + 3.4.6 Transformation of deprecated attributes + 3.4.7 Anti-spam & 'href' + 3.4.8 Inline style properties + 3.4.9 Hook function for tag content + 3.5 Simple configuration directive for most valid XHTML + 3.6 Simple configuration directive for most `safe` HTML + 3.7 Using a hook function + 3.8 Obtaining `finalized` parameter values + 3.9 Retaining non-HTML tags in input with mixed markup +4 Other + 4.1 Support + 4.2 Known issues + 4.3 Change-log + 4.4 Testing + 4.5 Upgrade, & old versions + 4.6 Comparison with 'HTMLPurifier' + 4.7 Use through application plug-ins/modules + 4.8 Use in non-PHP applications + 4.9 Donate + 4.10 Acknowledgements +5 Appendices + 5.1 Characters discouraged in HTML + 5.2 Valid attribute-element combinations + 5.3 CSS 2.1 properties accepting URLs + 5.4 Microsoft Windows 1252 character replacements + 5.5 URL format + 5.6 Brief on htmLawed code + + +== 1 About htmLawed ================================================ + + + htmLawed is a highly customizable single-file PHP script to make text secure, and standard- and admin policy-compliant for use in the body of HTML 4, XHTML 1 or 1.1, or generic XML documents. It is thus a configurable input (X)HTML filter, processor, purifier, sanitizer, beautifier, etc., and an alternative to the HTMLTidy:- http://tidy.sourceforge.net application. + + The `lawing in` of input text is needed to ensure that HTML code in the text is standard-compliant, does not introduce security vulnerabilities, and does not break the aesthetics, design or layout of web-pages. htmLawed tries to do this by, for example, making HTML well-formed with balanced and properly nested tags, neutralizing code that may be used for cross-site scripting ('XSS') attacks, and allowing only specified HTML elements/tags and attributes. + + +-- 1.1 Example uses ------------------------------------------------ + + + * Filtering of text submitted as comments on blogs to allow only certain HTML elements + + * Making RSS/Atom newsfeed item-content standard-compliant: often one uses an excerpt from an HTML document for the content, and with unbalanced tags, non-numerical entities, etc., such excerpts may not be XML-compliant + + * Text processing for stricter XML standard-compliance: e.g., to have lowercased 'x' in hexadecimal numeric entities becomes necessary if an XHTML document with MathML content needs to be served as 'application/xml' + + * Scraping text or data from web-pages + + * Pretty-printing HTML code + + +-- 1.2 Features ---------------------------------------------------o + + + Key: '*' security feature, '^' standard compliance, '~' requires setting right options, '`' different from 'Kses' + + * make input more *secure* and *standard-compliant* + * use for HTML 4, XHTML 1.0 or 1.1, or even generic *XML* documents ^~` + + * *beautify* or *compact* HTML ^~` + + * *restrict elements* ^~` + * proper closure of empty elements like 'img' ^` + * *transform deprecated elements* like 'u' ^~` + * HTML *comments* and 'CDATA' sections can be permitted ^~` + * elements like 'script', 'object' and 'form' can be permitted ~ + + * *restrict attributes*, including *element-specifically* ^~` + * remove *invalid attributes* ^` + * element and attribute names are *lower-cased* ^ + * provide *required attributes*, like 'alt' for 'image' ^` + * *transform deprecated attributes* ^~` + * attributes *declared only once* ^` + + * *restrict attribute values*, including *element-specifically* ^~` + * a value is declared for `empty` (`minimized`) attributes like 'checked' ^ + * check for potentially dangerous attribute values *~ + * ensure *unique* 'id' attribute values ^~` + * *double-quote* attribute values ^ + * lower-case *standard attribute values* like 'password' ^` + + * *attribute-specific URL protocol/scheme restriction* *~` + * disable *dynamic expressions* in 'style' values *~` + + * neutralize invalid named character entities ^` + * *convert* hexadecimal numeric entities to decimal ones, or vice versa ^~` + * convert named entities to numeric ones for generic XML use ^~` + + * remove *null* characters * + * neutralize potentially dangerous proprietary Netscape *Javascript entities* * + * replace potentially dangerous *soft-hyphen* character in attribute values with spaces * + + * remove common *invalid characters* not allowed in HTML or XML ^` + * replace *characters from Microsoft applications* like 'Word' that are discouraged in HTML or XML ^~` + * neutralize entities for characters invalid or discouraged in HTML or XML ^` + * appropriately neutralize '<', '&', '"', and '>' characters ^*` + + * understands improperly spaced tag content (like, spread over more than a line) and properly spaces them ` + * attempts to *balance tags* for well-formedness ^~` + * understands when *omitable closing tags* like '

    ' (allowed in HTML 4, transitional, e.g.) are missing ^~` + * attempts to permit only *validly nested tags* ^~` + * option to *remove or neutralize bad content* ^~` + * attempts to *rectify common errors of plain-text misplacement* (e.g., directly inside 'blockquote') ^~` + + * fast, *non-OOP* code of ~45 kb incurring peak basal memory usage of ~0.5 MB + * *compatible* with pre-existing code using 'Kses' (the filter used by 'WordPress') + + * optional *anti-spam* measures such as addition of 'rel="nofollow"' and link-disabling ~` + * optionally makes *relative URLs absolute*, and vice versa ~` + + * optionally mark '&' to identify the entities for '&', '<' and '>' introduced by htmLawed ~` + + * allows deployment of powerful *hook functions* to *inject* HTML, *consolidate* 'style' attributes to 'class', finely check attribute values, etc. ~` + + * *independent of character encoding* of input and does not affect it + + * *tolerance for ill-written HTML* to a certain degree + + +-- 1.3 History ----------------------------------------------------o + + + htmLawed was developed for use with 'LabWiki', a wiki software developed at PHP Labware, as a suitable software could not be found. Existing PHP software like 'Kses' and 'HTMLPurifier' were deemed inadequate, slow, resource-intensive, or dependent on external applications like 'HTML Tidy'. + + htmLawed started as a modification of Ulf Harnhammar's 'Kses' (version 0.2.2) software, and is compatible with code that uses 'Kses'; see section:- #2.6. + + +-- 1.4 License & copyright ----------------------------------------o + + + htmLawed is free and open-source software licensed under GPL license version 3:- http://www.gnu.org/licenses/gpl-3.0.txt, and copyrighted by Santosh Patnaik, MD, PhD. + + +-- 1.5 Terms used here --------------------------------------------o + + + * `administrator` - or admin; person setting up the code to pass input through htmLawed; also, `user` + * `attributes` - name-value pairs like 'href="http://x.com"' in opening tags + * `author` - `writer` + * `character` - atomic unit of text; internally represented by a numeric `code-point` as specified by the `encoding` or `charset` in use + * `entity` - markup like '>' and ' ' used to refer to a character + * `element` - HTML element like 'a' and 'img' + * `element content` - content between the opening and closing tags of an element, like 'click' of 'click' + * `HTML` - implies XHTML unless specified otherwise + * `input` - text string given to htmLawed to process + * `processing` - involves filtering, correction, etc., of input + * `safe` - absence or reduction of certain characters and HTML elements and attributes in the input that can otherwise potentially and circumstantially expose web-site users to security vulnerabilities like cross-site scripting attacks (XSS) + * `scheme` - URL protocol like 'http' and 'ftp' + * `specs` - standard specifications + * `style property` - terms like 'border' and 'height' for which declarations are made in values for the 'style' attribute of elements + * `tag` - markers like '' and '' delineating element content; the opening tag can contain attributes + * `tag content` - consists of tag markers '<' and '>', element names like 'div', and possibly attributes + * `user` - administrator + * `writer` - end-user like a blog commenter providing the input that is to be processed; also, `author` + + +== 2 Usage ========================================================oo + + + htmLawed should work with PHP 4.3 and higher. Either 'include()' the 'htmLawed.php' file or copy-paste the entire code. + + To easily *test* htmLawed using a form-based interface, use the provided demo:- htmLawedTest.php ('htmLawed.php' and 'htmLawedTest.php' should be in the same directory on the web-server). + + +-- 2.1 Simple ------------------------------------------------------ + + + The input text to be processed, '$text', is passed as an argument of type string; 'htmLawed()' returns the processed string: + + $processed = htmLawed($text); + + *Note*: If input is from a '$_GET' or '$_POST' value, and 'magic quotes' are enabled on the PHP setup, run 'stripslashes()' on the input before passing to htmLawed. + + By default, htmLawed will process the text allowing all valid HTML elements/tags, secure URL scheme/CSS style properties, etc. It will allow 'CDATA' sections and HTML comments, balance tags, and ensure proper nesting of elements. Such actions can be configured using two other optional arguments -- '$config' and '$spec': + + $processed = htmLawed($text, $config, $spec); + + These extra parameters are detailed below. Some examples are shown in section:- #2.9. + + *Note*: For maximum protection against 'XSS' and other scripting attacks (e.g., by disallowing Javascript code), consider using the 'safe' parameter; see section:- #3.6. + + +-- 2.2 Configuring htmLawed using the '$config' parameter ---------o + + + '$config' instructs htmLawed on how to tackle certain tasks. When '$config' is not specified, or not set as an array (e.g., '$config = 1'), htmLawed will take default actions. One or many of the task-action or value-specification pairs can be specified in '$config' as array key-value pairs. If a parameter is not specified, htmLawed will use the default value/action indicated further below. + + $config = array('comment'=>0, 'cdata'=>1); + $processed = htmLawed($text, $config); + + Or, + + $processed = htmLawed($text, array('comment'=>0, 'cdata'=>1)); + + Below are the possible value-specification combinations. In PHP code, values that are integers should not be quoted and should be used as numeric types (unless meant as string/text). + + Key: '*' default, '^' different default when htmLawed is used in the Kses-compatible mode (see section:- #2.6), '~' different default when 'valid_xhtml' is set to '1' (see section:- #3.5), '"' different default when 'safe' is set to '1' (see section:- #3.6) + + *abs_url* + Make URLs absolute or relative; '$config["base_url"]' needs to be set; see section:- #3.4.4 + + '-1' - make relative + '0' - no action * + '1' - make absolute + + *and_mark* + Mark '&' characters in the original input; see section:- #3.2 + + *anti_link_spam* + Anti-link-spam measure; see section:- #3.4.7 + + '0' - no measure taken * + 'array("regex1", "regex2")' - will ensure a 'rel' attribute with 'nofollow' in its value in case the 'href' attribute value matches the regular expression pattern 'regex1', and/or will remove 'href' if its value matches the regular expression pattern 'regex2'. E.g., 'array("/./", "/://\W*(?!(abc\.com|xyz\.org))/")'; see section:- #3.4.7 for more. + + *anti_mail_spam* + Anti-mail-spam measure; see section:- #3.4.7 + + '0' - no measure taken * + 'word' - '@' in mail address in 'href' attribute value is replaced with specified 'word' + + *balance* + Balance tags for well-formedness and proper nesting; see section:- #3.3.3 + + '0' - no + '1' - yes * + + *base_url* + Base URL value that needs to be set if '$config["abs_url"]' is not '0'; see section:- #3.4.4 + + *cdata* + Handling of 'CDATA' sections; see section:- #3.3.1 + + '0' - don't consider 'CDATA' sections as markup and proceed as if plain text ^" + '1' - remove + '2' - allow, but neutralize any '<', '>', and '&' inside by converting them to named entities + '3' - allow * + + *clean_ms_char* + Replace discouraged characters introduced by Microsoft Word, etc.; see section:- #3.1 + + '0' - no * + '1' - yes + '2' - yes, but replace special single & double quotes with ordinary ones + + *comment* + Handling of HTML comments; see section:- #3.3.1 + + '0' - don't consider comments as markup and proceed as if plain text ^" + '1' - remove + '2' - allow, but neutralize any '<', '>', and '&' inside by converting to named entities + '3' - allow * + + *css_expression* + Allow dynamic CSS expression by not removing the expression from CSS property values in 'style' attributes; see section:- #3.4.8 + + '0' - remove * + '1' - allow + + *deny_attribute* + Denied HTML attributes; see section:- #3.4 + + '0' - none * + 'string' - dictated by values in 'string' + 'on*' (like 'onfocus') attributes not allowed - " + + *elements* + Allowed HTML elements; see section:- #3.3 + + '* -center -dir -font -isindex -menu -s -strike -u' - ~ + 'applet, embed, iframe, object, script' not allowed - " + + *hexdec_entity* + Allow hexadecimal numeric entities and do not convert to the more widely accepted decimal ones, or convert decimal to hexadecimal ones; see section:- #3.2 + + '0' - no + '1' - yes * + '2' - convert decimal to hexadecimal ones + + *hook* + Name of an optional hook function to alter the input string, '$config' or '$spec' before htmLawed starts its main work; see section:- #3.7 + + '0' - no hook function * + 'name' - 'name' is name of the hook function ('kses_hook' ^) + + *hook_tag* + Name of an optional hook function to alter tag content finalized by htmLawed; see section:- #3.4.9 + + '0' - no hook function * + 'name' - 'name' is name of the hook function + + *keep_bad* + Neutralize bad tags by converting '<' and '>' to entities, or remove them; see section:- #3.3.3 + + '0' - remove ^ + '1' - neutralize both tags and element content + '2' - remove tags but neutralize element content + '3' and '4' - like '1' and '2' but remove if text ('pcdata') is invalid in parent element + '5' and '6' * - like '3' and '4' but line-breaks, tabs and spaces are left + + *lc_std_val* + For XHTML compliance, predefined, standard attribute values, like 'get' for the 'method' attribute of 'form', must be lowercased; see section:- #3.4.5 + + '0' - no + '1' - yes * + + *make_tag_strict* + Transform/remove these non-strict XHTML elements, even if they are allowed by the admin: 'applet' 'center' 'dir' 'embed' 'font' 'isindex' 'menu' 's' 'strike' 'u'; see section:- #3.3.2 + + '0' - no ^ + '1' - yes, but leave 'applet', 'embed' and 'isindex' elements that currently can't be transformed * + '2' - yes, removing 'applet', 'embed' and 'isindex' elements and their contents (nested elements remain) ~ + + *named_entity* + Allow non-universal named HTML entities, or convert to numeric ones; see section:- #3.2 + + '0' - convert + '1' - allow * + + *no_deprecated_attr* + Allow deprecated attributes or transform them; see section:- #3.4.6 + + '0' - allow ^ + '1' - transform, but 'name' attributes for 'a' and 'map' are retained * + '2' - transform + + *parent* + Name of the parent element, possibly imagined, that will hold the input; see section:- #3.3 + + *safe* + Magic parameter to make input the most secure against XSS without needing to specify other relevant '$config' parameters; see section:- #3.6 + + '0' - no * + '1' - will auto-adjust other relevant '$config' parameters (indicated by '"' in this list) + + *schemes* + Array of attribute-specific, comma-separated, lower-cased list of schemes (protocols) allowed in attributes accepting URLs; '*' covers all unspecified attributes; see section:- #3.4.3 + + 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; *:file, http, https' * + '*: ftp, gopher, http, https, mailto, news, nntp, telnet' ^ + 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; style: nil; *:file, http, https' " + + *show_setting* + Name of a PHP variable to assign the `finalized` '$config' and '$spec' values; see section:- #3.8 + + *style_pass* + Do not look at 'style' attribute values, letting them through without any alteration + + '0' - no * + '1' - htmLawed will let through any 'style' value; see section:- #3.4.8 + + *tidy* + Beautify or compact HTML code; see section:- #3.3.5 + + '-1' - compact + '0' - no * + '1' or 'string' - beautify (custom format specified by 'string') + + *unique_ids* + 'id' attribute value checks; see section:- #3.4.2 + + '0' - no ^ + '1' - remove duplicate and/or invalid ones * + 'word' - remove invalid ones and replace duplicate ones with new and unique ones based on the 'word'; the admin-specified 'word', like 'my_', should begin with a letter (a-z) and can contain letters, digits, '.', '_', '-', and ':'. + + *valid_xhtml* + Magic parameter to make input the most valid XHTML without needing to specify other relevant '$config' parameters; see section:- #3.5 + + '0' - no * + '1' - will auto-adjust other relevant '$config' parameters (indicated by '~' in this list) + + *xml:lang* + Auto-adding 'xml:lang' attribute; see section:- #3.4.1 + + '0' - no * + '1' - add if 'lang' attribute is present + '2' - add if 'lang' attribute is present, and remove 'lang' ~ + + +-- 2.3 Extra HTML specifications using the $spec parameter --------o + + + The '$spec' argument can be used to disallow an otherwise legal attribute for an element, or to restrict the attribute's values. This can also be helpful as a security measure (e.g., in certain versions of browsers, certain values can cause buffer overflows and denial of service attacks), or in enforcing admin policy compliance. '$spec' is specified as a string of text containing one or more `rules`, with multiple rules separated from each other by a semi-colon (';'). E.g., + + $spec = 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'; + $processed = htmLawed($text, $config, $spec); + + Or, + + $processed = htmLawed($text, $config, 'i=-*; td, tr=style, id, -*; a=id(match="/[a-z][a-z\d.:\-`"]*/i"/minval=2), href(maxlen=100/minlen=34); img=-width,-alt'); + + A rule begins with an HTML *element* name(s) (`rule-element`), for which the rule applies, followed by an equal ('=') sign. A rule-element may represent multiple elements if comma (,)-separated element names are used. E.g., 'th,td,tr='. + + Rest of the rule consists of comma-separated HTML *attribute names*. A minus ('-') character before an attribute means that the attribute is not permitted inside the rule-element. E.g., '-width'. To deny all attributes, '-*' can be used. + + Following shows examples of rule excerpts with rule-element 'a' and the attributes that are being permitted: + + * 'a=' - all + * 'a=id' - all + * 'a=href, title, -id, -onclick' - all except 'id' and 'onclick' + * 'a=*, id, -id' - all except 'id' + * 'a=-*' - none + * 'a=-*, href, title' - none except 'href' and 'title' + * 'a=-*, -id, href, title' - none except 'href' and 'title' + + Rules regarding *attribute values* are optionally specified inside round brackets after attribute names in slash ('/')-separated `parameter = value` pairs. E.g., 'title(maxlen=30/minlen=5)'. None, or one or more of the following parameters may be specified: + + * 'oneof' - one or more choices separated by '|' that the value should match; if only one choice is provided, then the value must match that choice + + * 'noneof' - one or more choices separated by '|' that the value should not match + + * 'maxlen' and 'minlen' - upper and lower limits for the number of characters in the attribute value; specified in numbers + + * 'maxval' and 'minval' - upper and lower limits for the numerical value specified in the attribute value; specified in numbers + + * 'match' and 'nomatch' - pattern that the attribute value should or should not match; specified as PHP/PCRE-compatible regular expressions with delimiters and possibly modifiers + + * 'default' - a value to force on the attribute if the value provided by the writer does not fit any of the specified parameters + + If 'default' is not set and the attribute value does not satisfy any of the specified parameters, then the attribute is removed. The 'default' value can also be used to force all attribute declarations to take the same value (by getting the values declared illegal by setting, e.g., 'maxlen' to '-1'). + + Examples with `input` '' are shown below. + + `Rule`: 'input=title(maxlen=60/minlen=6), value' + `Output`: '' + + `Rule`: 'input=title(), value(maxval=8/default=6)' + `Output`: '' + + `Rule`: 'input=title(nomatch=$w.d$i), value(match=$em$/default=6em)' + `Output`: '' + + `Rule`: 'input=title(oneof=height|depth/default=depth), value(noneof=5|6)' + `Output`: '' + + *Special characters*: The characters ';', ',', '/', '(', ')', '|', '~' and space have special meanings in the rules. Words in the rules that use such characters, or the characters themselves, should be `escaped` by enclosing in pairs of double-quotes ('"'). A back-tick ('`') can be used to escape a literal '"'. An example rule illustrating this is 'input=value(maxlen=30/match="/^\w/"/default="your `"ID`"")'. + + *Note*: To deny an attribute for all elements for which it is legal, '$config["deny_attribute"]' (see section:- #3.4) can be used instead of '$spec'. Also, attributes can be allowed element-specifically through '$spec' while being denied globally through '$config["deny_attribute"]'. The 'hook_tag' parameter (section:- #3.4.9) can also be used to implement the '$spec' functionality. + + +-- 2.4 Performance time & memory usage ----------------------------o + + + The time and memory used by htmLawed depends on its configuration and the size of the input, and the amount, nestedness and well-formedness of the HTML markup within it. In particular, tag balancing and beautification each can increase the processing time by about a quarter. + + The htmLawed demo:- htmLawedTest.php can be used to evaluate the performance and effects of different types of input and '$config'. + + +-- 2.5 Some security risks to keep in mind ------------------------o + + + When setting the parameters/arguments (like those to allow certain HTML elements) for use with htmLawed, one should bear in mind that the setting may let through potentially `dangerous` HTML code. (This may not be a problem if the authors are trusted.) + + For example, following increase security risks: + + * Allowing 'script', 'applet', 'embed', 'iframe' or 'object' elements, or certain of their attributes like 'allowscriptaccess' + + * Allowing HTML comments (some Internet Explorer versions are vulnerable with, e.g., '' + + * Allowing dynamic CSS expressions (a feature of the IE browser) + + `Unsafe` HTML can be removed by setting '$config' appropriately. E.g., '$config["elements"] = "* -script"' (section:- #3.3), '$config["safe"] = 1' (section:- #3.6), etc. + + +-- 2.6 Use without modifying old 'kses()' code --------------------o + + + The 'Kses' PHP script is used by many applications (like 'WordPress'). It is possible to have such applications use htmLawed instead, since it is compatible with code that calls the 'kses()' function declared in the 'Kses' file (usually named 'kses.php'). E.g., application code like this will continue to work after replacing 'Kses' with htmLawed: + + $comment_filtered = kses($comment_input, array('a'=>array(), 'b'=>array(), 'i'=>array())); + + For some of the '$config' parameters, htmLawed will use values other than the default ones. These are indicated by '^' in section:- #2.2. To force htmLawed to use other values, function 'kses()' in the htmLawed code should be edited -- a few configurable parameters/variables need to be changed. + + If the application uses a 'Kses' file that has the 'kses()' function declared, then, to have the application use htmLawed instead of 'Kses', simply rename 'htmLawed.php' (to 'kses.php', e.g.) and replace the 'Kses' file (or just replace the code in the 'Kses' file with the htmLawed code). If the 'kses()' function in the 'Kses' file had been renamed by the application developer (e.g., in 'WordPress', it is named 'wp_kses()'), then appropriately rename the 'kses()' function in the htmLawed code. + + If the 'Kses' file used by the application has been highly altered by the application developers, then one may need a different approach. E.g., with 'WordPress', it is best to copy the htmLawed code to 'wp_includes/kses.php', rename the newly added function 'kses()' to 'wp_kses()', and delete the code for the original 'wp_kses()' function. + + If the 'Kses' code has a non-empty hook function (e.g., 'wp_kses_hook()' in case of 'WordPress'), then the code for htmLawed's 'kses_hook()' function should be appropriately edited. However, the requirement of the hook function should be re-evaluated considering that htmLawed has extra capabilities. With 'WordPress', the hook function is an essential one. The following code is suggested for the htmLawed 'kses_hook()' in case of 'WordPress': + + function kses_hook($string, &$cf, &$spec){ + // kses compatibility + $allowed_html = $spec; + $allowed_protocols = array(); + foreach($cf['schemes'] as $v){ + foreach($v as $k2=>$v2){ + if(!in_array($k2, $allowed_protocols)){ + $allowed_protocols[] = $k2; + } + } + } + return wp_kses_hook($string, $allowed_html, $allowed_protocols); + // eof + } + + +-- 2.7 Tolerance for ill-written HTML -----------------------------o + + + htmLawed can work with ill-written HTML code in the input. However, HTML that is too ill-written may not be `read` as HTML, and be considered mere plain text instead. Following statements indicate the degree of `looseness` that htmLawed can work with, and can be provided in instructions to writers: + + * Tags must be flanked by '<' and '>' with no '>' inside -- any needed '>' should be put in as '>'. It is possible for tag content (element name and attributes) to be spread over many lines instead of being on one. A space may be present between the tag content and '>', like '
    ' and '', but not after the '<'. + + * Element and attribute names need not be lower-cased. + + * Attribute string of elements may be liberally spaced with tabs, line-breaks, etc. + + * Attribute values may not be double-quoted, or may be single-quoted. + + * Left-padding of numeric entities (like, ' ', '&x07ff;') with '0' is okay as long as the number of characters between between the '&' and the ';' does not exceed 8. All entities must end with ';' though. + + * Named character entities must be properly cased. E.g., '≪' or '&TILDE;' will not be let through without modification. + + * HTML comments should not be inside element tags (okay between tags), and should begin with ''. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any '-->' inside should be put in as '-->'. Any '--' inside will be automatically converted to '-', and a space will be added before the comment delimiter '-->'. + + * 'CDATA' sections should not be inside element tags, and can be in element content only if plain text is allowed for that element. They should begin with '<[CDATA[' and end with ']]>'. Characters like '<', '>', and '&' may be allowed inside depending on '$config', but any ']]>' inside should be put in as ']]>'. + + * For attribute values, character entities '<', '>' and '&' should be used instead of characters '<' and '>', and '&' (when '&' is not part of a character entity). This applies even for Javascript code in values of attributes like 'onclick'. + + * Characters '<', '>', '&' and '"' that are part of actual Javascript, etc., code in 'script' elements should be used as such and not be put in as entities like '>'. Otherwise, though the HTML will be valid, the code may fail to work. Further, if such characters have to be used, then they should be put inside 'CDATA' sections. + + * Simple instructions like "an opening tag cannot be present between two closing tags" and "nested elements should be closed in the reverse order of how they were opened" can help authors write balanced HTML. If tags are imbalanced, htmLawed will try to balance them, but in the process, depending on '$config["keep_bad"]', some code/text may be lost. + + * Input authors should be notified of admin-specified allowed elements, attributes, configuration values (like conversion of named entities to numeric ones), etc. + + * With '$config["unique_ids"]' not '0' and the 'id' attribute being permitted, writers should carefully avoid using duplicate or invalid 'id' values as even though htmLawed will correct/remove the values, the final output may not be the one desired. E.g., when '' is processed into +''. + + * Note that even if intended HTML is lost in a highly ill-written input, the processed output will be more secure and standard-compliant. + + * For URLs, unless '$config["scheme"]' is appropriately set, writers should avoid using escape characters or entities in schemes. E.g., 'http' (which many browsers will read as the harmless 'http') may be considered bad by htmLawed. + + * htmLawed will attempt to put plain text present directly inside 'blockquote', 'form', 'map' and 'noscript' elements (illegal as per the specs) inside auto-generated 'div' elements. + + +-- 2.8 Limitations & work-arounds ---------------------------------o + + + htmLawed's main objective is to make the input text `more` standard-compliant, secure for web-page readers, and free of HTML elements and attributes considered undesirable by the administrator. Some of its current limitations, regardless of this objective, are noted below along with work-arounds. + + It should be borne in mind that no browser application is 100% standard-compliant, and that some of the standard specs (like asking for normalization of white-spacing within 'textarea' elements) are clearly wrong. Regarding security, note that `unsafe` HTML code is not necessarily legally invalid. + + * htmLawed is meant for input that goes into the 'body' of HTML documents. HTML's head-level elements are not supported, nor are the frameset elements 'frameset', 'frame' and 'noframes'. + + * It cannot transform the non-standard 'embed' elements to the standard-compliant 'object' elements. Yet, it can allow 'embed' elements if permitted ('embed' is widely used and supported). Admins can certainly use the 'hook_tag' parameter (section:- #3.4.9) to deploy a custom embed-to-object converter function. + + * The only non-standard element that may be permitted is 'embed'; others like 'noembed' and 'nobr' cannot be permitted without modifying the htmLawed code. + + * It cannot handle input that has non-HTML code like 'SVG' and 'MathML'. One way around is to break the input into pieces and passing only those without non-HTML code to htmLawed. Another is described in section:- #3.9. A third way may be to some how take advantage of the '$config["and_mark"]' parameter (see section:- #3.2). + + * By default, htmLawed won't check many attribute values for standard compliance. E.g., 'width="20m"' with the dimension in non-standard 'm' is let through. Implementing universal and strict attribute value checks can make htmLawed slow and resource-intensive. Admins should look at the 'hook_tag' parameter (section:- #3.4.9) or '$spec' to enforce finer checks. + + * The attributes, deprecated (which can be transformed too) or not, that it supports are largely those that are in the specs. Only a few of the proprietary attributes are supported. + + * Except for contained URLs and dynamic expressions (also optional), htmLawed does not check CSS style property values. Admins should look at using the 'hook_tag' parameter (section:- #3.4.9) or '$spec' for finer checks. Perhaps the best option is to disallow 'style' but allow 'class' attributes with the right 'oneof' or 'match' values for 'class', and have the various class style properties in '.css' CSS stylesheet files. + + * htmLawed does not parse emoticons, decode `BBcode`, or `wikify`, auto-converting text to proper HTML. Similarly, it won't convert line-breaks to 'br' elements. Such functions are beyond its purview. Admins should use other code to pre- or post-process the input for such purposes. + + * htmLawed cannot be used to have links force-opened in new windows (by auto-adding appropriate 'target' and 'onclick' attributes to 'a'). Admins should look at Javascript-based DOM-modifying solutions for this. Admins may also be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). + + * Nesting-based checks are not possible. E.g., one cannot disallow 'p' elements specifically inside 'td' while permitting it elsewhere. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). + + * Except for optionally converting absolute or relative URLs to the other type, htmLawed will not alter URLs (e.g., to change the value of query strings or to convert 'http' to 'https'. Having absolute URLs may be a standard-requirement, e.g., when HTML is embedded in email messages, whereas altering URLs for other purposes is beyond htmLawed's goals. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). + + * Pairs of opening and closing tags that do not enclose any content (like '') are not removed. This may be against the standard specs for certain elements (e.g., 'table'). However, presence of such standard-incompliant code will not break the display or layout of content. Admins can also use simple regex-based code to filter out such code. + + * htmLawed does not check for certain element orderings described in the standard specs (e.g., in a 'table', 'tbody' is allowed before 'tfoot'). Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). + + * htmLawed does not check the number of nested elements. E.g., it will allow two 'caption' elements in a 'table' element, illegal as per the specs. Admins may be able to use a custom hook function to enforce such checks ('hook_tag' parameter; see section:- #3.4.9). + + * htmLawed might convert certain entities to actual characters and remove backslashes and CSS comment-markers ('/*') in 'style' attribute values in order to detect malicious HTML like crafted IE-specific dynamic expressions like 'expression...'. If this is too harsh, admins can allow CSS expressions through htmLawed core but then use a custom function through the 'hook_tag' parameter (section:- #3.4.9) to more specifically identify CSS expressions in the 'style' attribute values. Also, using '$config["style_pass"]', it is possible to have htmLawed pass 'style' attribute values without even looking at them (section:- #3.4.8). + + * htmLawed does not correct certain possible attribute-based security vulnerabilities (e.g., 'x'). These arise when browsers mis-identify markup in `escaped` text, defeating the very purpose of escaping text (a bad browser will read the given example as 'x'). + + * Because of poor Unicode support in PHP, htmLawed does not remove the `high value` HTML-invalid characters with multi-byte code-points. Such characters however are extremely unlikely to be in the input. (see section:- #3.1). + + * Like any script using PHP's PCRE regex functions, PHP setup-specific low PCRE limit values can cause htmLawed to at least partially fail with very long input texts. + + +-- 2.9 Examples ---------------------------------------------------o + + + *1.* A blog administrator wants to allow only 'a', 'em', 'strike', 'strong' and 'u' in comments, but needs 'strike' and 'u' transformed to 'span' for better XHTML 1-strict compliance, and, he wants the 'a' links to be to 'http' or 'https' resources: + + $processed = htmLawed($in, array('elements'=>'a, em, strike, strong, u', 'make_tag_strict'=>1, 'safe'=>1, 'schemes'=>'*:http, https'), 'a=href'); + + *2.* An author uses a custom-made web application to load content on his web-site. He is the only one using that application and the content he generates has all types of HTML, including scripts. The web application uses htmLawed primarily as a tool to correct errors that creep in while writing HTML and to take care of the occasional `bad` characters in copy-paste text introduced by Microsoft Office. The web application provides a preview before submitted input is added to the content. For the previewing process, htmLawed is set up as follows: + + $processed = htmLawed($in, array('css_expression'=>1, 'keep_bad'=>1, 'make_tag_strict'=>1, 'schemes'=>'*:*', 'valid_xhtml'=>1)); + + For the final submission process, 'keep_bad' is set to '6'. A value of '1' for the preview process allows the author to note and correct any HTML mistake without losing any of the typed text. + + *3.* A data-miner is scraping information in a specific table of similar web-pages and is collating the data rows, and uses htmLawed to reduce unnecessary markup and white-spaces: + + $processed = htmLawed($in, array('elements'=>'tr, td', 'tidy'=>-1), 'tr, td ='); + + +== 3 Details =====================================================oo + + +-- 3.1 Invalid/dangerous characters -------------------------------- + + + Valid characters (more correctly, their code-points) in HTML or XML are, hexadecimally, '9', 'a', 'd', '20' to 'd7ff', and 'e000' to '10ffff', except 'fffe' and 'ffff' (decimally, '9', '10', '13', '32' to '55295', and '57344' to '1114111', except '65534' and '65535'). htmLawed removes the invalid characters '0' to '8', 'b', 'c', and 'e' to '1f'. + + Because of PHP's poor native support for multi-byte characters, htmLawed cannot check for the remaining invalid code-points. However, for various reasons, it is very unlikely for any of those characters to be in the input. + + Characters that are discouraged (see section:- #5.1) but not invalid are not removed by htmLawed. + + It (function 'hl_tag()') also replaces the potentially dangerous (in some Mozilla [Firefox] and Opera browsers) soft-hyphen character (code-point, hexadecimally, 'ad', or decimally, '173') in attribute values with spaces. Where required, the characters '<', '>', '&', and '"' are converted to entities. + + With '$config["clean_ms_char"]' set as '1' or '2', many of the discouraged characters (decimal code-points '127' to '159' except '133') that many Microsoft applications incorrectly use (as per the 'Windows 1252' ['Cp-1252'] or a similar encoding system), and the character for decimal code-point '133', are converted to appropriate decimal numerical entities (or removed for a few cases)-- see appendix in section:- #5.4. This can help avoid some display issues arising from copying-pasting of content. + + With '$config["clean_ms_char"]' set as '2', characters for the hexadecimal code-points '82', '91', and '92' (for special single-quotes), and '84', '93', and '94' (for special double-quotes) are converted to ordinary single and double quotes respectively and not to entities. + + The character values are replaced with entities/characters and not character values referred to by the entities/characters to keep this task independent of the character-encoding of input text. + + The '$config["clean_ms_char"]' parameter need not be used if authors do not copy-paste Microsoft-created text or if the input text is not believed to use the 'Windows 1252' or a similar encoding. Further, the input form and the web-pages displaying it or its content should have the character encoding appropriately marked-up. + + +-- 3.2 Character references/entities ------------------------------o + + + Valid character entities take the form '&*;' where '*' is '#x' followed by a hexadecimal number (hexadecimal numeric entity; like ' ' for non-breaking space), or alphanumeric like 'gt' (external or named entity; like ' ' for non-breaking space), or '#' followed by a number (decimal numeric entity; like ' ' for non-breaking space). Character entities referring to the soft-hyphen character (the '­' or '\xad' character; hexadecimal code-point 'ad' [decimal '173']) in attribute values are always replaced with spaces; soft-hyphens in attribute values introduce vulnerabilities in some older versions of the Opera and Mozilla [Firefox] browsers. + + htmLawed (function 'hl_ent()'): + + * Neutralizes entities with multiple leading zeroes or missing semi-colons (potentially dangerous) + + * Lowercases the 'X' (for XML-compliance) and 'A-F' of hexadecimal numeric entities + + * Neutralizes entities referring to characters that are HTML-invalid (see section:- #3.1) + + * Neutralizes entities referring to characters that are HTML-discouraged (code-points, hexadecimally, '7f' to '84', '86' to '9f', and 'fdd0' to 'fddf', or decimally, '127' to '132', '134' to '159', and '64991' to '64976'). Entities referring to the remaining discouraged characters (see section:- #5.1 for a full list) are let through. + + * Neutralizes named entities that are not in the specs. + + * Optionally converts valid HTML-specific named entities except '>', '<', '"', and '&' to decimal numeric ones (hexadecimal if $config["hexdec_entity"] is '2') for generic XML-compliance. For this, '$config["named_entity"]' should be '1'. + + * Optionally converts hexadecimal numeric entities to the more widely supported decimal ones. For this, '$config["hexdec_entity"]' should be '0'. + + * Optionally converts decimal numeric entities to the hexadecimal ones. For this, '$config["hexdec_entity"]' should be '2'. + + `Neutralization` refers to the `entitification` of '&' to '&'. + + *Note*: htmLawed does not convert entities to the actual characters represented by them; one can pass the htmLawed output through PHP's 'html_entity_decode' function:- http://www.php.net/html_entity_decode for that. + + *Note*: If '$config["and_mark"]' is set, and set to a value other than '0', then the '&' characters in the original input are replaced with the control character for the hexadecimal code-point '6' ('\x06'; '&' characters introduced by htmLawed, e.g., after converting '<' to '<', are not affected). This allows one to distinguish, say, an '>' introduced by htmLawed and an '>' put in by the input writer, and can be helpful in further processing of the htmLawed-processed text (e.g., to identify the character sequence 'o(><)o' to generate an emoticon image). When this feature is active, admins should ensure that the htmLawed output is not directly used in web pages or XML documents as the presence of the '\x06' can break documents. Before use in such documents, and preferably before any storage, any remaining '\x06' should be changed back to '&', e.g., with: + + $final = str_replace("\x06", '&', $prelim); + + Also, see section:- #3.9. + + +-- 3.3 HTML elements ----------------------------------------------o + + + htmLawed can be configured to allow only certain HTML elements (tags) in the input. Disallowed elements (just tag-content, and not element-content), based on '$config["keep_bad"]', are either `neutralized` (converted to plain text by entitification of '<' and '>') or removed. + + E.g., with only 'em' permitted: + + Input: + + My website is My website is a.com. + + Output, with '$config["keep_bad"]' not '0': + + My website is <a href="">a.com</a>. + + See section:- #3.3.3 for differences between the various non-zero '$config["keep_bad"]' values. + + htmLawed by default permits these 86 elements: + + a, abbr, acronym, address, applet, area, b, bdo, big, blockquote, br, button, caption, center, cite, code, col, colgroup, dd, del, dfn, dir, div, dl, dt, em, embed, fieldset, font, form, h1, h2, h3, h4, h5, h6, hr, i, iframe, img, input, ins, isindex, kbd, label, legend, li, map, menu, noscript, object, ol, optgroup, option, p, param, pre, q, rb, rbc, rp, rt, rtc, ruby, s, samp, script, select, small, span, strike, strong, sub, sup, table, tbody, td, textarea, tfoot, th, thead, tr, tt, u, ul, var + + Except for 'embed' (included because of its wide-spread use) and the Ruby elements ('rb', 'rbc', 'rp', 'rt', 'rtc', 'ruby'; part of XHTML 1.1), these are all the elements in the HTML 4/XHTML 1 specs. Strict-specific specs. exclude 'center', 'dir', 'font', 'isindex', 'menu', 's', 'strike', and 'u'. + + With '$config["safe"] = 1', the default set will exclude 'applet', 'embed', 'iframe', 'object' and 'script'; see section:- #3.6. + + When '$config["elements"]', which specifies allowed elements, is `properly` defined, and neither empty nor set to '0' or '*', the default set is not used. To have elements added to or removed from the default set, a '+/-' notation is used. E.g., '*-script-object' implies that only 'script' and 'object' are disallowed, whereas '*+embed' means that 'noembed' is also allowed. Elements can also be specified as comma separated names. E.g., 'a, b, i' means only 'a', 'b' and 'i' are permitted. In this notation, '*', '+' and '-' have no significance and can actually cause a mis-reading. + + Some more examples of '$config["elements"]' values indicating permitted elements (note that empty spaces are liberally allowed for clarity): + + * 'a, blockquote, code, em, strong' -- only 'a', 'blockquote', 'code', 'em', and 'strong' + * '*-script' -- all excluding 'script' + * '* -center -dir -font -isindex -menu -s -strike -u' -- only XHTML-Strict elements + * '*+noembed-script' -- all including 'noembed' excluding 'script' + + Some mis-usages (and the resulting permitted elements) that can be avoided: + + * '-*' -- none; instead of htmLawed, one might just use, e.g., the 'htmlspecialchars()' PHP function + * '*, -script' -- all except 'script'; admin probably meant '*-script' + * '-*, a, em, strong' -- all; admin probably meant 'a, em, strong' + * '*' -- all; admin need not have set 'elements' + * '*-form+form' -- all; a '+' will always over-ride any '-' + * '*, noembed' -- only 'noembed'; admin probably meant '*+noembed' + * 'a, +b, i' -- only 'a' and 'i'; admin probably meant 'a, b, i' + + Basically, when using the '+/-' notation, commas (',') should not be used, and vice versa, and '*' should be used with the former but not the latter. + + *Note*: Even if an element that is not in the default set is allowed through '$config["elements"]', like 'noembed' in the last example, it will eventually be removed during tag balancing unless such balancing is turned off ('$config["balance"]' set to '0'). Currently, the only way around this, which actually is simple, is to edit the various arrays in the function 'hl_bal()' to accommodate the element and its nesting properties. + + *A possibly second way to specify allowed elements* is to set '$config["parent"]' to an element name that supposedly will hold the input, and to set '$config["balance"]' to '1'. During tag balancing (see section:- #3.3.3), all elements that cannot legally nest inside the parent element will be removed. The parent element is auto-reset to 'div' if '$config["parent"]' is empty, 'body', or an element not in htmLawed's default set of 86 elements. + + `Tag transformation` is possible for improving XHTML-Strict compliance -- most of the deprecated elements are removed or converted to valid XHTML-Strict ones; see section:- #3.3.2. + + +.. 3.3.1 Handling of comments and CDATA sections ................... + + + 'CDATA' sections have the format '"...]]>', and HTML comments, '"... -->'. Neither HTML comments nor 'CDATA' sections can reside inside tags. HTML comments can exist anywhere else, but 'CDATA' sections can exist only where plain text is allowed (e.g., immediately inside 'td' element content but not immediately inside 'tr' element content). + + htmLawed (function 'hl_cmtcd()') handles HTML comments or 'CDATA' sections depending on the values of '$config["comment"]' or '$config["cdata"]'. If '0', such markup is not looked for and the text is processed like plain text. If '1', it is removed completely. If '2', it is preserved but any '<', '>' and '&' inside are changed to entities. If '3', they are left as such. + + Note that for the last two cases, HTML comments and 'CDATA' sections will always be removed from tag content (function 'hl_tag()'). + + Examples: + + Input: + Home + Output ('$config["comment"] = 0, $config["cdata"] = 2'): + <-- home link -->Home + Output ('$config["comment"] = 1, $config["cdata"] = 2'): + Home + Output ('$config["comment"] = 2, $config["cdata"] = 2'): + Home + Output ('$config["comment"] = 2, $config["cdata"] = 1'): + Home + Output ('$config["comment"] = 3, $config["cdata"] = 3'): + Home + + For standard-compliance, comments are given the form '', and any '--' in the content is made '-'. + + When '$config["safe"] = 1', CDATA sections and comments are considered plain text unless '$config["comment"]' or '$config["cdata"]' is explicitly specified; see section:- #3.6. + + +.. 3.3.2 Tag-transformation for better XHTML-Strict ................o + + + If '$config["make_tag_strict"]' is set and not '0', following non-XHTML-Strict elements (and attributes), even if admin-permitted, are mutated as indicated (element content remains intact; function 'hl_tag2()'): + + * applet - (based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2')) + * center - 'div style="text-align: center;"' + * dir - 'ul' + * embed - (based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2')) + * font (face, size, color) - 'span style="font-family: ; font-size: ; color: ;"' (size transformation reference:- http://style.cleverchimp.com/font_size_intervals/altintervals.html) + * isindex - (based on '$config["make_tag_strict"]', unchanged ('1') or removed ('2')) + * menu - 'ul' + * s - 'span style="text-decoration: line-through;"' + * strike - 'span style="text-decoration: line-through;"' + * u - 'span style="text-decoration: underline;"' + + For an element with a pre-existing 'style' attribute value, the extra style properties are appended. + + Example input: + +
    + The PHP software script used for this web-page web-page is htmLawedTest.php, from PHP Labware. +
    + + The output: + +
    + The PHP software script used for this web-page web-page is htmLawedTest.php, from PHP Labware. +
    + + +-- 3.3.3 Tag balancing and proper nesting -------------------------o + + + If '$config["balance"]' is set to '1', htmLawed (function 'hl_bal()') checks and corrects the input to have properly balanced tags and legal element content (i.e., any element nesting should be valid, and plain text may be present only in the content of elements that allow them). + + Depending on the value of '$config["keep_bad"]' (see section:- #2.2 and section:- #3.3), illegal content may be removed or neutralized to plain text by converting < and > to entities: + + '0' - remove; this option is available only to maintain Kses-compatibility and should not be used otherwise (see section:- #2.6) + '1' - neutralize tags and keep element content + '2' - remove tags but keep element content + '3' and '4' - like '1' and '2', but keep element content only if text ('pcdata') is valid in parent element as per specs + '5' and '6' - like '3' and '4', but line-breaks, tabs and spaces are left + + Example input (disallowing the 'p' element): + + <*> Pseudo-tags <*> + Non-HTML tag xml +

    + Disallowed tag p +

    +
      Bad
    • OK
    + + The output with '$config["keep_bad"] = 1': + + <*> Pseudo-tags <*> + <xml>Non-HTML tag xml</xml> + <p> + Disallowed tag p + </p> +
      Bad
    • OK
    + + The output with '$config["keep_bad"] = 3': + + <*> Pseudo-tags <*> + <xml>Non-HTML tag xml</xml> + <p> + Disallowed tag p + </p> +
    • OK
    + + The output with '$config["keep_bad"] = 6': + + <*> Pseudo-tags <*> + Non-HTML tag xml + + Disallowed tag p + +
    • OK
    + + An option like '1' is useful, e.g., when a writer previews his submission, whereas one like '3' is useful before content is finalized and made available to all. + + *Note:* In the example above, unlike '<*>', '' gets considered as a tag (even though there is no HTML element named 'xml'). In general, text matching the regular expression pattern '<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>' is considered a tag (phrase enclosed by the angled brackets '<' and '>', and starting [with an optional slash preceding] with an alphanumeric word that starts with an alphabet...). + + Nesting/content rules for each of the 86 elements in htmLawed's default set (see section:- #3.3) are defined in function 'hl_bal()'. This means that if a non-standard element besides 'embed' is being permitted through '$config["elements"]', the element's tag content will end up getting removed if '$config["balance"]' is set to '1'. + + Plain text and/or certain elements nested inside 'blockquote', 'form', 'map' and 'noscript' need to be in block-level elements. This point is often missed during manual writing of HTML code. htmLawed attempts to address this during balancing. E.g., if the parent container is set as 'form', the input 'B:C:' is converted to '
    B:C:
    '. + + +-- 3.3.4 Elements requiring child elements ------------------------o + + + As per specs, the following elements require legal child elements nested inside them: + + blockquote, dir, dl, form, map, menu, noscript, ol, optgroup, rbc, rtc, ruby, select, table, tbody, tfoot, thead, tr, ul + + In some cases, the specs stipulate the number and/or the ordering of the child elements. A 'table' can have 0 or 1 'caption', 'tbody', 'tfoot', and 'thead', but they must be in this order: 'caption', 'thead', 'tfoot', 'tbody'. + + htmLawed currently does not check for conformance to these rules. Note that any non-compliance in this regard will not introduce security vulnerabilities, crash browser applications, or affect the rendering of web-pages. + + +-- 3.3.5 Beautify or compact HTML ---------------------------------o + + + By default, htmLawed will neither `beautify` HTML code by formatting it with indentations, etc., nor will it make it compact by removing un-needed white-space.(It does always properly white-space tag content.) + + As per the HTML standards, spaces, tabs and line-breaks in web-pages (except those inside 'pre' elements) are all considered equivalent, and referred to as `white-spaces`. Browser applications are supposed to consider contiguous white-spaces as just a single space, and to disregard white-spaces trailing opening tags or preceding closing tags. This white-space `normalization` allows the use of text/code beautifully formatted with indentations and line-spacings for readability. Such `pretty` HTML can, however, increase the size of web-pages, or make the extraction or scraping of plain text cumbersome. + + With the '$config' parameter 'tidy', htmLawed can be used to beautify or compact the input text. Input with just plain text and no HTML markup is also subject to this. Besides 'pre', the 'script' and 'textarea' elements, CDATA sections, and HTML comments are not subjected to the tidying process. + + To `compact`, use '$config["tidy"] = -1'; single instances or runs of white-spaces are replaced with a single space, and white-spaces trailing and leading open and closing tags, respectively, are removed. + + To `beautify`, '$config["tidy"]' is set as '1', or for customized tidying, as a string like '2s2n'. The 's' or 't' character specifies the use of spaces or tabs for indentation. The first and third characters, any of the digits 0-9, specify the number of spaces or tabs per indentation, and any parental lead spacing (extra indenting of the whole block of input text). The 'r' and 'n' characters are used to specify line-break characters: 'n' for '\n' (Unix/Mac OS X line-breaks), 'rn' or 'nr' for '\r\n' (Windows/DOS line-breaks), or 'r' for '\r'. + + The '$config["tidy"]' value of '1' is equivalent to '2s0n'. Other '$config["tidy"]' values are read loosely: a value of '4' is equivalent to '4s0n'; 't2', to '1t2n'; 's', to '2s0n'; '2TR', to '2t0r'; 'T1', to '1t1n'; 'nr3', to '3s0nr', and so on. Except in the indentations and line-spacings, runs of white-spaces are replaced with a single space during beautification. + + Input formatting using '$config["tidy"]' is not recommended when input text has mixed markup (like HTML + PHP). + + +-- 3.4 Attributes ------------------------------------------------oo + + + htmLawed will only permit attributes described in the HTML specs (including deprecated ones). It also permits some attributes for use with the 'embed' element (the non-standard 'embed' element is supported in htmLawed because of its widespread use), and the the 'xml:space' attribute (valid only in XHTML 1.1). A list of such 111 attributes and the elements they are allowed in is in section:- #5.2. + + When '$config["deny_attribute"]' is not set, or set to '0', or empty ('""'), all the 111 attributes are permitted. Otherwise, '$config["deny_attribute"]' can be set as a list of comma-separated names of the denied attributes. 'on*' can be used to refer to the group of potentially dangerous, script-accepting attributes: 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect' and 'onsubmit'. + + Note that attributes specified in '$config["deny_attribute"]' are denied globally, for all elements. To deny attributes for only specific elements, '$spec' (see section:- #2.3) can be used. '$spec' can also be used to element-specifically permit an attribute otherwise denied through '$config["deny_attribute"]'. + + With '$config["safe"] = 1' (section:- #3.6), the 'on*' attributes are automatically disallowed. + + *Note*: To deny all but a few attributes globally, a simpler way to specify '$config["deny_attribute"]' would be to use the notation '* -attribute1 -attribute2 ...'. Thus, a value of '* -title -href' implies that except 'href' and 'title' (where allowed as per standards) all other attributes are to be removed. With this notation, the value for the parameter 'safe' (section:- #3.6) will have no effect on 'deny_attribute'. + + htmLawed (function 'hl_tag()') also: + + * Lower-cases attribute names + * Removes duplicate attributes (last one stays) + * Gives attributes the form 'name="value"' and single-spaces them, removing unnecessary white-spacing + * Provides `required` attributes (see section:- #3.4.1) + * Double-quotes values and escapes any '"' inside them + * Replaces the possibly dangerous soft-hyphen characters (hexadecimal code-point 'ad') in the values with spaces + * Allows custom function to additionally filter/modify attribute values (see section:- #3.4.9) + + +.. 3.4.1 Auto-addition of XHTML-required attributes ................ + + + If indicated attributes for the following elements are found missing, htmLawed (function 'hl_tag()') will add them (with values same as attribute names unless indicated otherwise below): + + * area - alt ('area') + * area, img - src, alt ('image') + * bdo - dir ('ltr') + * form - action + * map - name + * optgroup - label + * param - name + * script - type ('text/javascript') + * textarea - rows ('10'), cols ('50') + + Additionally, with '$config["xml:lang"]' set to '1' or '2', if the 'lang' but not the 'xml:lang' attribute is declared, then the latter is added too, with a value copied from that of 'lang'. This is for better standard-compliance. With '$config["xml:lang"]' set to '2', the 'lang' attribute is removed (XHTML 1.1 specs). + + Note that the 'name' attribute for 'map', invalid in XHTML 1.1, is also transformed if required -- see section:- #3.4.6. + + +.. 3.4.2 Duplicate/invalid 'id' values ............................o + + + If '$config["unique_ids"]' is '1', htmLawed (function 'hl_tag()') removes 'id' attributes with values that are not XHTML-compliant (must begin with a letter and can contain letters, digits, ':', '.', '-' and '_') or duplicate. If '$config["unique_ids"]' is a word, any duplicate but otherwise valid value will be appropriately prefixed with the word to ensure its uniqueness. The word should begin with a letter and should contain only letters, numbers, ':', '.', '_' and '-'. + + Even if multiple inputs need to be filtered (through multiple calls to htmLawed), htmLawed ensures uniqueness of 'id' values as it uses a global variable ('$GLOBALS["hl_Ids"]' array). Further, an admin can restrict the use of certain 'id' values by presetting this variable before htmLawed is called into use. E.g.: + + $GLOBALS['hl_Ids'] = array('top'=>1, 'bottom'=>1, 'myform'=>1); // id values not allowed in input + $processed = htmLawed($text); // filter input + + +.. 3.4.3 URL schemes (protocols) and scripts in attribute values ............o + + + htmLawed edits attributes that take URLs as values if they are found to contain un-permitted schemes. E.g., if the 'afp' scheme is not permitted, then '' becomes '', and if Javascript is not permitted '' becomes ''. + + By default htmLawed permits these schemes in URLs for the 'href' attribute: + + aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet + + Also, only 'file', 'http' and 'https' are permitted in attributes whose names start with 'o' (like 'onmouseover'), and in these attributes that accept URLs: + + action, cite, classid, codebase, data, href, longdesc, model, pluginspage, pluginurl, src, style, usemap + + These default sets are used when '$config["schemes"]' is not set (see section:- #2.2). To over-ride the defaults, '$config["schemes"]' is defined as a string of semi-colon-separated sub-strings of type 'attribute: comma-separated schemes'. E.g., 'href: mailto, http, https; onclick: javascript; src: http, https'. For unspecified attributes, 'file', 'http' and 'https' are permitted. This can be changed by passing schemes for '*' in '$config["schemes"]'. E.g., 'href: mailto, http, https; *: https, https'. + + '*' can be put in the list of schemes to permit all protocols. E.g., 'style: *; img: http, https' results in protocols not being checked in 'style' attribute values. However, in such cases, any relative-to-absolute URL conversion, or vice versa, (section:- #3.4.4) is not done. + + Thus, `to allow Javascript`, one can set '$config["schemes"]' as 'href: mailto, http, https; *: http, https, javascript', or 'href: mailto, http, https, javascript; *: http, https, javascript', or '*: *', and so on. + + As a side-note, one may find 'style: *' useful as URLs in 'style' attributes can be specified in a variety of ways, and the patterns that htmLawed uses to identify URLs may mistakenly identify non-URL text. + + *Note*: If URL-accepting attributes other than those listed above are being allowed, then the scheme will not be checked unless the attribute name contains the string 'src' (e.g., 'dynsrc') or starts with 'o' (e.g., 'onbeforecopy'). + + With '$config["safe"] = 1', all URLs are disallowed in the 'style' attribute values. + + +.. 3.4.4 Absolute & relative URLs in attribute values .............o + + + htmLawed can make absolute URLs in attributes like 'href' relative ('$config["abs_url"]' is '-1'), and vice versa ('$config["abs_url"]' is '1'). URLs in scripts are not considered for this, and so are URLs like '#section_6' (fragment), '?name=Tim#show' (starting with query string), and ';var=1?name=Tim#show' (starting with parameters). Further, this requires that '$config["base_url"]' be set properly, with the '://' and a trailing slash ('/'), with no query string, etc. E.g., 'file:///D:/page/', 'https://abc.com/x/y/', or 'http://localhost/demo/' are okay, but 'file:///D:/page/?help=1', 'abc.com/x/y/' and 'http://localhost/demo/index.htm' are not. + + For making absolute URLs relative, only those URLs that have the '$config["base_url"]' string at the beginning are converted. E.g., with '$config["base_url"] = "https://abc.com/x/y/"', 'https://abc.com/x/y/a.gif' and 'https://abc.com/x/y/z/b.gif' become 'a.gif' and 'z/b.gif' respectively, while 'https://abc.com/x/c.gif' is not changed. + + When making relative URLs absolute, only values for scheme, network location (host-name) and path values in the base URL are inherited. See section:- #5.5 for more about the URL specification as per RFC 1808:- http://www.ietf.org/rfc/rfc1808.txt. + + +.. 3.4.5 Lower-cased, standard attribute values ....................o + + + Optionally, for standard-compliance, htmLawed (function 'hl_tag()') lower-cases standard attribute values to give, e.g., 'input type="password"' instead of 'input type="Password"', if '$config["lc_std_val"]' is '1'. Attribute values matching those listed below for any of the elements (plus those for the 'type' attribute of 'button' or 'input') are lower-cased: + + all, baseline, bottom, button, center, char, checkbox, circle, col, colgroup, cols, data, default, file, get, groups, hidden, image, justify, left, ltr, middle, none, object, password, poly, post, preserve, radio, rect, ref, reset, right, row, rowgroup, rows, rtl, submit, text, top + + a, area, bdo, button, col, form, img, input, object, option, optgroup, param, script, select, table, td, tfoot, th, thead, tr, xml:space + + The following `empty` (`minimized`) attributes are always assigned lower-cased values (same as the names): + + checked, compact, declare, defer, disabled, ismap, multiple, nohref, noresize, noshade, nowrap, readonly, selected + + +.. 3.4.6 Transformation of deprecated attributes ..................o + + + If '$config["no_deprecated_attr"]' is '0', then deprecated attributes (see appendix in section:- #5.2) are removed and, in most cases, their values are transformed to CSS style properties and added to the 'style' attributes (function 'hl_tag()'). Except for 'bordercolor' for 'table', 'tr' and 'td', the scores of proprietary attributes that were never part of any cross-browser standard are not supported. + + *Note*: The attribute 'target' for 'a' is allowed even though it is not in XHTML 1.0 specs. This is because of the attribute's wide-spread use and browser-support, and because the attribute is valid in XHTML 1.1 onwards. + + * align - for 'img' with value of 'left' or 'right', becomes, e.g., 'float: left'; for 'div' and 'table' with value 'center', becomes 'margin: auto'; all others become, e.g., 'text-align: right' + + * bgcolor - E.g., 'bgcolor="#ffffff"' becomes 'background-color: #ffffff' + * border - E.g., 'height= "10"' becomes 'height: 10px' + * bordercolor - E.g., 'bordercolor=#999999' becomes 'border-color: #999999;' + * compact - 'font-size: 85%' + * clear - E.g., 'clear="all" becomes 'clear: both' + + * height - E.g., 'height= "10"' becomes 'height: 10px' and 'height="*"' becomes 'height: auto' + + * hspace - E.g., 'hspace="10"' becomes 'margin-left: 10px; margin-right: 10px' + * language - 'language="VBScript"' becomes 'type="text/vbscript"' + * name - E.g., 'name="xx"' becomes 'id="xx"' + * noshade - 'border-style: none; border: 0; background-color: gray; color: gray' + * nowrap - 'white-space: nowrap' + * size - E.g., 'size="10"' becomes 'height: 10px' + * start - removed + * type - E.g., 'type="i"' becomes 'list-style-type: lower-roman' + * value - removed + * vspace - E.g., 'vspace="10"' becomes 'margin-top: 10px; margin-bottom: 10px' + * width - like 'height' + + Example input: + + imageimage +
    +
    + image + + + + + +
    +
    +

    Section

    +

    Para

    +
    1. First item
    +
    +
    +
    1. First item
    +
    +
    + + And the output with '$config["no_deprecated_attr"] = 1': + + imageimage +
    +
    + image + + + + + +
    +
    +

    Section

    +

    Para

    +
    1. First item
    +
    +
    +
    1. First item
    +
    +
    + + For 'lang', deprecated in XHTML 1.1, transformation is taken care of through '$config["xml:lang"]'; see section:- #3.4.1. + + The attribute 'name' is deprecated in 'form', 'iframe', and 'img', and is replaced with 'id' if an 'id' attribute doesn't exist and if the 'name' value is appropriate for 'id'. For such replacements for 'a' and 'map', for which the 'name' attribute is deprecated in XHTML 1.1, '$config["no_deprecated_attr"]' should be set to '2' (when set to '1', for these two elements, the 'name' attribute is retained). + + +-- 3.4.7 Anti-spam & 'href' ---------------------------------------o + + + htmLawed (function 'hl_tag()') can check the 'href' attribute values (link addresses) as an anti-spam (email or link spam) measure. + + If '$config["anti_mail_spam"]' is not '0', the '@' of email addresses in 'href' values like 'mailto:a@b.com' is replaced with text specified by '$config["anti_mail_spam"]'. The text should be of a form that makes it clear to others that the address needs to be edited before a mail is sent; e.g., '@' (makes the example address 'a@b.com'). + + For regular links, one can choose to have a 'rel' attribute with 'nofollow' in its value (which tells some search engines to not follow a link). This can discourage link spammers. Additionally, or as an alternative, one can choose to empty the 'href' value altogether (disable the link). + + For use of these options, '$config["anti_link_spam"]' should be set as an array with values 'regex1' and 'regex2', both or one of which can be empty (like 'array("", "regex2")') to indicate that that option is not to be used. Otherwise, 'regex1' or 'regex2' should be PHP- and PCRE-compatible regular expression patterns: 'href' values will be matched against them and those matching the pattern will accordingly be treated. + + Note that the regular expressions should have `delimiters`, and be well-formed and preferably fast. Absolute efficiency/accuracy is often not needed. + + An example, to have a 'rel' attribute with 'nofollow' for all links, and to disable links that do not point to domains 'abc.com' and 'xyz.org': + + $config["anti_link_spam"] = array('`.`', '`://\W*(?!(abc\.com|xyz\.org))`'); + + +-- 3.4.8 Inline style properties ----------------------------------o + + + htmLawed can check URL schemes and dynamic expressions (to guard against Javascript, etc., script-based insecurities) in inline CSS style property values in the 'style' attributes. (CSS properties like 'background-image' that accept URLs in their values are noted in section:- #5.3.) Dynamic CSS expressions that allow scripting in the IE browser, and can be a vulnerability, can be removed from property values by setting '$config["css_expression"]' to '1' (default setting). + + *Note*: Because of the various ways of representing characters in attribute values (URL-escapement, entitification, etc.), htmLawed might alter the values of the 'style' attribute values, and may even falsely identify dynamic CSS expressions and URL schemes in them. If this is an important issue, checking of URLs and dynamic expressions can be turned off ('$config["schemes"] = "...style:*..."', see section:- #3.4.3, and '$config["css_expression"] = 0'). Alternately, admins can use their own custom function for finer handling of 'style' values through the 'hook_tag' parameter (see section:- #3.4.9). + + It is also possible to have htmLawed let through any 'style' value by setting '$config["style_pass"]' to '1'. + + As such, it is better to set up a CSS file with class declarations, disallow the 'style' attribute, set a '$spec' rule (see section:- #2.3) for 'class' for the 'oneof' or 'match' parameter, and ask writers to make use of the 'class' attribute. + + +-- 3.4.9 Hook function for tag content ----------------------------o + + + It is possible to utilize a custom hook function to alter the tag content htmLawed has finalized (i.e., after it has checked/corrected for required attributes, transformed attributes, lower-cased attribute names, etc.). + + When '$config' parameter 'hook_tag' is set to the name of a function, htmLawed (function 'hl_tag()') will pass on the element name, and the `finalized` attribute name-value pairs as array elements to the function. The function is expected to return the full opening tag string like '' (for empty elements like 'img' and 'input', the element-closing slash '/' should also be included). + + This is a *powerful functionality* that can be exploited for various objectives: consolidate-and-convert inline 'style' attributes to 'class', convert 'embed' elements to 'object', permit only one 'caption' element in a 'table' element, disallow embedding of certain types of media, *inject HTML*, use CSSTidy:- http://csstidy.sourceforge.net to sanitize 'style' attribute values, etc. + + As an example, the custom hook code below can be used to force a series of specifically ordered 'id' attributes on all elements, and a specific 'param' element inside all 'object' elements: + + function my_tag_function($element, $attribute_array){ + static $id = 0; + // Remove any duplicate element + if($element == 'param' && isset($attribute_array['allowscriptaccess'])){ + return ''; + } + + $new_element = ''; + + // Force a serialized ID number + $attribute_array['id'] = 'my_'. $id; + ++$id; + + // Inject param for allowscriptaccess + if($element == 'object'){ + $new_element = ''; + ++$id; + } + + $string = ''; + foreach($attribute_array as $k=>$v){ + $string .= " {$k}=\"{$v}\""; + } + return "<{$element}{$string}". (isset($in_array($element, $empty_elements) ? ' /' : ''). '>'. $new_element; + } + + The 'hook_tag' parameter is different from the 'hook' parameter (section:- #3.7). + + Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. + + +-- 3.5 Simple configuration directive for most valid XHTML -------oo + + + If '$config["valid_xhtml"]' is set to '1', some relevant '$config' parameters (indicated by '~' in section:- #2.2) are auto-adjusted. This allows one to pass the '$config' argument with a simpler value. If a value for a parameter auto-set through 'valid_xhtml' is still manually provided, then that value will over-ride the auto-set value. + + +-- 3.6 Simple configuration directive for most `safe` HTML --------o + + + `Safe` HTML refers to HTML that is restricted to reduce the vulnerability for scripting attacks (such as XSS) based on HTML code which otherwise may still be legal and compliant with the HTML standard specs. When elements such as 'script' and 'object', and attributes such as 'onmouseover' and 'style' are allowed in the input text, an input writer can introduce malevolent HTML code. Note that what is considered 'safe' depends on the nature of the web application and the trust-level accorded to its users. + + htmLawed allows an admin to use '$config["safe"]' to auto-adjust multiple '$config' parameters (such as 'elements' which declares the allowed element-set), which otherwise would have to be manually set. The relevant parameters are indicated by '"' in section:- #2.2). Thus, one can pass the '$config' argument with a simpler value. + + With the value of '1', htmLawed considers 'CDATA' sections and HTML comments as plain text, and prohibits the 'applet', 'embed', 'iframe', 'object' and 'script' elements, and the 'on*' attributes like 'onclick'. ( There are '$config' parameters like 'css_expression' that are not affected by the value set for 'safe' but whose default values still contribute towards a more `safe` output.) Further, URLs with schemes (see section:- #3.4.3) are neutralized so that, e.g., 'style="moz-binding:url(http://danger)"' becomes 'style="moz-binding:url(denied:http://danger)"' while 'style="moz-binding:url(ok)"' remains intact. + + Admins, however, may still want to completely deny the 'style' attribute, e.g., with code like + + $processed = htmLawed($text, array('safe'=>1, 'deny_attribute'=>'style')); + + If a value for a parameter auto-set through 'safe' is still manually provided, then that value can over-ride the auto-set value. E.g., with '$config["safe"] = 1' and '$config["elements"] = "*+script"', 'script', but not 'applet', is allowed. + + A page illustrating the efficacy of htmLawed's anti-XSS abilities with 'safe' set to '1' against XSS vectors listed by RSnake:- http://ha.ckers.org/xss.html may be available here:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm. + + +-- 3.7 Using a hook function --------------------------------------o + + + If '$config["hook"]' is not set to '0', then htmLawed will allow preliminarily processed input to be altered by a hook function named by '$config["hook"]' before starting the main work (but after handling of characters, entities, HTML comments and 'CDATA' sections -- see code for function 'htmLawed()'). + + The hook function also allows one to alter the `finalized` values of '$config' and '$spec'. + + Note that the 'hook' parameter is different from the 'hook_tag' parameter (section:- #3.4.9). + + Snippets of hook function code developed by others may be available on the htmLawed:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed website. + + +-- 3.8 Obtaining `finalized` parameter values ---------------------o + + + htmLawed can assign the `finalized` '$config' and '$spec' values to a variable named by '$config["show_setting"]'. The variable, made global by htmLawed, is set as an array with three keys: 'config', with the '$config' value, 'spec', with the '$spec' value, and 'time', with a value that is the Unix time (the output of PHP's 'microtime()' function) when the value was assigned. Admins should use a PHP-compliant variable name (e.g., one that does not begin with a numerical digit) that does not conflict with variable names in their non-htmLawed code. + + The values, which are also post-hook function (if any), can be used to auto-generate information (on, e.g., the elements that are permitted) for input writers. + + +-- 3.9 Retaining non-HTML tags in input with mixed markup ---------o + + + htmLawed does not remove certain characters that though invalid are nevertheless discouraged in HTML documents as per the specs (see section:- #5.1). This can be utilized to deal with input that contains mixed markup. Input that may have HTML markup as well as some other markup that is based on the '<', '>' and '&' characters is considered to have mixed markup. The non-HTML markup can be rather proprietary (like markup for emoticons/smileys), or standard (like MathML or SVG). Or it can be programming code meant for execution/evaluation (such as embedded PHP code). + + To deal with such mixed markup, the input text can be pre-processed to hide the non-HTML markup by specifically replacing the '<', '>' and '&' characters with some of the HTML-discouraged characters (see section:- #3.1.2). Post-htmLawed processing, the replacements are reverted. + + An example (mixed HTML and PHP code in input text): + + $text = preg_replace('`<\?php(.+?)\?>`sm', "\x83?php\\1?\x84", $text); + $processed = htmLawed($text); + $processed = preg_replace('`\x83\?php(.+?)\?\x84`sm', '', $processed); + + This code will not work if '$config["clean_ms_char"]' is set to '1' (section:- #3.1), in which case one should instead deploy a hook function (section:- #3.7). (htmLawed internally uses certain control characters, code-points '1' to '7', and use of these characters as markers in the logic of hook functions may cause issues.) + + Admins may also be able to use '$config["and_mark"]' to deal with such mixed markup; see section:- #3.2. + + +== 4 Other =======================================================oo + + +-- 4.1 Support ----------------------------------------------------- + + + A careful re-reading of this documentation will very likely answer your questions. + + Software updates and forum-based community-support may be found at http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. For general PHP issues (not htmLawed-specific), support may be found through internet searches and at http://php.net. + + +-- 4.2 Known issues -----------------------------------------------o + + + See section:- #2.8. + + Readers are advised to cross-check information given in this document. + + +-- 4.3 Change-log -------------------------------------------------o + + + (The release date for the downloadable package of files containing documentation, demo script, test-cases, etc., besides the 'htmLawed.php' file may be updated independently if the secondary files are revised.) + + `Version number - Release date. Notes` + + 1.1.8.1 - 16 July 2009. Minor code-change to fix a PHP error notice + + 1.1.8 - 23 April 2009. Parameter 'deny_attribute' now accepts the wild-card '*', making it simpler to specify its value when all but a few attributes are being denied; fixed a bug in interpreting '$spec' + + 1.1.7 - 11-12 March 2009. Attributes globally denied through 'deny_attribute' can be allowed element-specifically through '$spec'; '$config["style_pass"]' allowing letting through any 'style' value introduced; altered logic to catch certain types of dynamic crafted CSS expressions + + 1.1.3-6 - 28-31 January - 4 February 2009. Altered logic to catch certain types of dynamic crafted CSS expressions + + 1.1.2 - 22 January 2009. Fixed bug in parsing of 'font' attributes during tag transformation + + 1.1.1 - 27 September 2008. Better nesting correction when omitable closing tags are absent + + 1.1 - 29 June 2008. '$config["hook_tag"]' and '$config["format"]' introduced for custom tag/attribute check/modification/injection and output compaction/beautification; fixed a regex-in-$spec parsing bug + + 1.0.9 - 11 June 2008. Fixed bug in invalid HTML code-point entity check + + 1.0.8 - 15 May 2008. 'bordercolor' attribute for 'table', 'td' and 'tr' + + 1.0.7 - 1 May 2008. Support for 'wmode' attribute for 'embed'; '$config["show_setting"]' introduced; improved '$config["elements"]' evaluation + + 1.0.6 - 20 April 2008. '$config["and_mark"]' introduced + + 1.0.5 - 12 March 2008. 'style' URL schemes essentially disallowed when $config 'safe' is on; improved regex for CSS expression search + + 1.0.4 - 10 March 2008. Improved corrections for 'blockquote', 'form', 'map' and 'noscript' + + 1.0.3 - 3 March 2008. Character entities for soft-hyphens are now replaced with spaces (instead of being removed); a bug allowing 'td' directly inside 'table' fixed; 'safe' '$config' parameter added + + 1.0.2 - 13 February 2008. Improved implementation of '$config["keep_bad"]' + + 1.0.1 - 7 November 2007. Improved regex for identifying URLs, protocols and dynamic expressions ('hl_tag()' and 'hl_prot()'); no error display with 'hl_regex()' + + 1.0 - 2 November 2007. First release + + +-- 4.4 Testing ----------------------------------------------------o + + + To test htmLawed using a form interface, a demo:- htmLawedTest.php web-page is provided with the htmLawed distribution ('htmLawed.php' and 'htmLawedTest.php' should be in the same directory on the web-server). A file with test-cases:- htmLawed_TESTCASE.txt is also provided. + + +-- 4.5 Upgrade, & old versions ------------------------------------o + + + Upgrading is as simple as replacing the previous version of 'htmLawed.php' (assuming it was not modified for customized features). As htmLawed output is almost always used in static documents, upgrading should not affect old, finalized content. + + Old versions of htmLawed may be available online. E.g., for version 1.0, check http://www.bioinformatics.org/phplabware/downloads/htmLawed1.zip, for 1.1.1, htmLawed111.zip, and for 1.1.10, htmLawed1110.zip. + + +-- 4.6 Comparison with 'HTMLPurifier' -----------------------------o + + + The HTMLPurifier PHP library by Edward Yang is a very good HTML filtering script that uses object oriented PHP code. Compared to htmLawed, it: + + * does not support PHP versions older than 5.0 (HTMLPurifier dropped PHP 4 support after version 2) + + * is 15-20 times bigger (scores of files totalling more than 750 kb) + + * consumes 10-15 times more RAM memory (just including the HTMLPurifier files without calling the filter requires a few MBs of memory) + + * is expectedly slower + + * does not allow admins to fully allow all valid HTML (because of incomplete HTML support, it always considers elements like 'script' illegal) + + * lacks many of the extra features of htmLawed (like entity conversions and code compaction/beautification) + + * has poor documentation + + However, HTMLPurifier has finer checks for character encodings and attribute values, and can log warnings and errors. Visit the HTMLPurifier website:- http://htmlpurifier.org for updated information. + + +-- 4.7 Use through application plug-ins/modules -------------------o + + + Plug-ins/modules to implement htmLawed in applications such as Drupal and DokuWiki may have been developed. Please check the application websites and the forum on the htmLawed site:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. + + +-- 4.8 Use in non-PHP applications --------------------------------o + + + Non-PHP applications written in Python, Ruby, etc., may be able to use htmLawed through system calls to the PHP engine. Such code may have been documented on the internet. Also check the forum on the htmLawed site:- http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed. + + +-- 4.9 Donate -----------------------------------------------------o + + + A donation in any currency and amount to appreciate or support this software can be sent by PayPal:- http://paypal.com to this email address: drpatnaik at yahoo dot com. + + +-- 4.10 Acknowledgements ------------------------------------------o + + + Bryan Blakey, Ulf Harnhammer, Gareth Heyes, Lukasz Pilorz, Shelley Powers, Edward Yang, and many anonymous users. + + Thank you! + + +== 5 Appendices ==================================================oo + + +-- 5.1 Characters discouraged in XHTML ----------------------------- + + + Characters represented by the following hexadecimal code-points are `not` invalid, even though some validators may issue messages stating otherwise. + + '7f' to '84', '86' to '9f', 'fdd0' to 'fddf', '1fffe', '1ffff', '2fffe', '2ffff', '3fffe', '3ffff', '4fffe', '4ffff', '5fffe', '5ffff', '6fffe', '6ffff', '7fffe', '7ffff', '8fffe', '8ffff', '9fffe', '9ffff', 'afffe', 'affff', 'bfffe', 'bffff', 'cfffe', 'cffff', 'dfffe', 'dffff', 'efffe', 'effff', 'ffffe', 'fffff', '10fffe' and '10ffff' + + +-- 5.2 Valid attribute-element combinations -----------------------o + + + Valid attribute-element combinations as per W3C specs. + + * includes deprecated attributes (marked '^'), attributes for the non-standard 'embed' element (marked '*'), and the proprietary 'bordercolor' (marked '~') + * only non-frameset, HTML body elements + * 'name' for 'a' and 'map', and 'lang' are invalid in XHTML 1.1 + * 'target' is valid for 'a' in XHTML 1.1 and higher + * 'xml:space' is only for XHTML 1.1 + + abbr - td, th + accept - form, input + accept-charset - form + accesskey - a, area, button, input, label, legend, textarea + action - form + align - caption^, embed, applet, iframe, img^, input^, object^, legend^, table^, hr^, div^, h1^, h2^, h3^, h4^, h5^, h6^, p^, col, colgroup, tbody, td, tfoot, th, thead, tr + alt - applet, area, img, input + archive - applet, object + axis - td, th + bgcolor - embed, table^, tr^, td^, th^ + border - table, img^, object^ + bordercolor~ - table, td, tr + cellpadding - table + cellspacing - table + char - col, colgroup, tbody, td, tfoot, th, thead, tr + charoff - col, colgroup, tbody, td, tfoot, th, thead, tr + charset - a, script + checked - input + cite - blockquote, q, del, ins + classid - object + clear - br^ + code - applet + codebase - object, applet + codetype - object + color - font + cols - textarea + colspan - td, th + compact - dir, dl^, menu, ol^, ul^ + coords - area, a + data - object + datetime - del, ins + declare - object + defer - script + dir - bdo + disabled - button, input, optgroup, option, select, textarea + enctype - form + face - font + for - label + frame - table + frameborder - iframe + headers - td, th + height - embed, iframe, td^, th^, img, object, applet + href - a, area + hreflang - a + hspace - applet, img^, object^ + ismap - img, input + label - option, optgroup + language - script^ + longdesc - img, iframe + marginheight - iframe + marginwidth - iframe + maxlength - input + method - form + model* - embed + multiple - select + name - button, embed, textarea, applet^, select, form^, iframe^, img^, a^, input, object, map^, param + nohref - area + noshade - hr^ + nowrap - td^, th^ + object - applet + onblur - a, area, button, input, label, select, textarea + onchange - input, select, textarea + onfocus - a, area, button, input, label, select, textarea + onreset - form + onselect - input, textarea + onsubmit - form + pluginspage* - embed + pluginurl* - embed + prompt - isindex + readonly - textarea, input + rel - a + rev - a + rows - textarea + rowspan - td, th + rules - table + scope - td, th + scrolling - iframe + selected - option + shape - area, a + size - hr^, font, input, select + span - col, colgroup + src - embed, script, input, iframe, img + standby - object + start - ol^ + summary - table + tabindex - a, area, button, input, object, select, textarea + target - a^, area, form + type - a, embed, object, param, script, input, li^, ol^, ul^, button + usemap - img, input, object + valign - col, colgroup, tbody, td, tfoot, th, thead, tr + value - input, option, param, button, li^ + valuetype - param + vspace - applet, img^, object^ + width - embed, hr^, iframe, img, object, table, td^, th^, applet, col, colgroup, pre^ + wmode - embed + xml:space - pre, script, style + + These are allowed in all but the shown elements: + + class - param, script + dir - applet, bdo, br, iframe, param, script + id - script + lang - applet, br, iframe, param, script + onclick - applet, bdo, br, font, iframe, isindex, param, script + ondblclick - applet, bdo, br, font, iframe, isindex, param, script + onkeydown - applet, bdo, br, font, iframe, isindex, param, script + onkeypress - applet, bdo, br, font, iframe, isindex, param, script + onkeyup - applet, bdo, br, font, iframe, isindex, param, script + onmousedown - applet, bdo, br, font, iframe, isindex, param, script + onmousemove - applet, bdo, br, font, iframe, isindex, param, script + onmouseout - applet, bdo, br, font, iframe, isindex, param, script + onmouseover - applet, bdo, br, font, iframe, isindex, param, script + onmouseup - applet, bdo, br, font, iframe, isindex, param, script + style - param, script + title - param, script + xml:lang - applet, br, iframe, param, script + + +-- 5.3 CSS 2.1 properties accepting URLs ------------------------o + + + background + background-image + content + cue-after + cue-before + cursor + list-style + list-style-image + play-during + + +-- 5.4 Microsoft Windows 1252 character replacements --------------o + + + Key: 'd' double, 'l' left, 'q' quote, 'r' right, 's.' single + + Code-point (decimal) - hexadecimal value - replacement entity - represented character + + 127 - 7f - (removed) - (not used) + 128 - 80 - € - euro + 129 - 81 - (removed) - (not used) + 130 - 82 - ‚ - baseline s. q + 131 - 83 - ƒ - florin + 132 - 84 - „ - baseline d q + 133 - 85 - … - ellipsis + 134 - 86 - † - dagger + 135 - 87 - ‡ - d dagger + 136 - 88 - ˆ - circumflex accent + 137 - 89 - ‰ - permile + 138 - 8a - Š - S Hacek + 139 - 8b - ‹ - l s. guillemet + 140 - 8c - Œ - OE ligature + 141 - 8d - (removed) - (not used) + 142 - 8e - Ž - Z dieresis + 143 - 8f - (removed) - (not used) + 144 - 90 - (removed) - (not used) + 145 - 91 - ‘ - l s. q + 146 - 92 - ’ - r s. q + 147 - 93 - “ - l d q + 148 - 94 - ” - r d q + 149 - 95 - • - bullet + 150 - 96 - – - en dash + 151 - 97 - — - em dash + 152 - 98 - ˜ - tilde accent + 153 - 99 - ™ - trademark + 154 - 9a - š - s Hacek + 155 - 9b - › - r s. guillemet + 156 - 9c - œ - oe ligature + 157 - 9d - (removed) - (not used) + 158 - 9e - ž - z dieresis + 159 - 9f - Ÿ - Y dieresis + + +-- 5.5 URL format -------------------------------------------------o + + + An `absolute` URL has a 'protocol' or 'scheme', a 'network location' or 'hostname', and, optional 'path', 'parameters', 'query' and 'fragment' segments. Thus, an absolute URL has this generic structure: + + (scheme) : (//network location) /(path) ;(parameters) ?(query) #(fragment) + + The schemes can only contain letters, digits, '+', '.' and '-'. Hostname is the portion after the '//' and up to the first '/' (if any; else, up to the end) when ':' is followed by a '//' (e.g., 'abc.com' in 'ftp://abc.com/def'); otherwise, it consists of everything after the ':' (e.g., 'def@abc.com' in mailto:def@abc.com'). + + `Relative` URLs do not have explicit schemes and network locations; such values are inherited from a `base` URL. + + +-- 5.6 Brief on htmLawed code -------------------------------------o + + + Much of the code's logic and reasoning can be understood from the documentation above. + + The *output* of htmLawed is a text string containing the processed input. There is no custom error tracking. + + *Function arguments* for htmLawed are: + + * '$in' - 1st argument; a text string; the *input text* to be processed. Any extraneous slashes added by PHP when `magic quotes` are enabled should be removed beforehand using PHP's 'stripslashes()' function. + + * '$config' - 2nd argument; an associative array; optional (named '$C' in htmLawed code). The array has keys with names like 'balance' and 'keep_bad', and the values, which can be boolean, string, or array, depending on the key, are read to accordingly set the *configurable parameters* (indicated by the keys). All configurable parameters receive some default value if the value to be used is not specified by the user through '$config'. `Finalized` '$config' is thus a filtered and possibly larger array. + + * '$spec' - 3rd argument; a text string; optional. The string has rules, written in an htmLawed-designated format, *specifying* element-specific attribute and attribute value restrictions. Function 'hl_spec()' is used to convert the string to an associative-array for internal use. `Finalized` '$spec' is thus an array. + + `Finalized` '$config' and '$spec' are made *global variables* while htmLawed is at work. Values of any pre-existing global variables with same names are noted, and their values are restored after htmLawed finishes processing the input (to capture the `finalized` values, the 'show_settings' parameter of '$config' should be used). Depending on '$config', another global variable 'hl_Ids', to track 'id' attribute values for uniqueness, may be set. Unlike the other two variables, this one is not reset (or unset) post-processing. + + Except for the main function 'htmLawed()' and the functions 'kses()' and 'kses_hook()', htmLawed's functions are *name-spaced* using the 'hl_' prefix. The *functions* and their roles are: + + * 'hl_attrval' - checking attribute values against $spec + * 'hl_bal' - tag balancing + * 'hl_cmtcd' - handling CDATA sections and HTML comments + * 'hl_ent' - entity handling + * 'hl_prot' - checking a URL scheme/protocol + * 'hl_regex' - checking syntax of a regular expression + * 'hl_spec' - converting user-supplied $spec value to one used by htmLawed internally + * 'hl_tag' - handling tags + * 'hl_tag2' - transforming tags + * 'hl_tidy' - compact/beautify HTML + * 'hl_version' - reporting htmLawed version + * 'htmLawed' - main function + * 'kses' - main function of 'kses' + * 'kses_hook' - hook function of 'kses' + + The last two are for compatibility with pre-existing code using the 'kses' script. htmLawed's 'kses()' basically passes on the filtering task to 'htmLawed()' function after deciphering '$config' and '$spec' from the argument values supplied to it. 'kses_hook()' is an empty function and is meant for being filled with custom code if the 'kses' script users were using one. + + 'htmLawed()' finalizes '$spec' (with the help of 'hl_spec()') and '$config', and globalizes them. Finalization of '$config' involves setting default values if an inappropriate or invalid one is supplied. This includes calling 'hl_regex()' to check well-formedness of regular expression patterns if such expressions are user-supplied through '$config'. 'htmLawed()' then removes invalid characters like nulls and 'x01' and appropriately handles entities using 'hl_ent()'. HTML comments and CDATA sections are identified and treated as per '$config' with the help of 'hl_cmtcd()'. When retained, the '<' and '>' characters identifying them, and the '<', '>' and '&' characters inside them, are replaced with control characters (code-points '1' to '5') till any tag balancing is completed. + + After this `initial processing` 'htmLawed()' identifies tags using regex and processes them with the help of 'hl_tag()' -- a large function that analyzes tag content, filtering it as per HTML standards, '$config' and '$spec'. Among other things, 'hl_tag()' transforms deprecated elements using 'hl_tag2()', removes attributes from closing tags, checks attribute values as per '$spec' rules using 'hl_attrval()', and checks URL protocols using 'hl_prot()'. 'htmLawed()' performs tag balancing and nesting checks with a call to 'hl_bal()', and optionally compacts/beautifies the output with proper white-spacing with a call to 'hl_tidy()'. The latter temporarily replaces white-space, and '<', '>' and '&' characters inside 'pre', 'script' and 'textarea' elements, and HTML comments and CDATA sections with control characters (code-points '1' to '5', and '7'). + + htmLawed permits the use of custom code or *hook functions* at two stages. The first, called inside 'htmLawed()', allows the input text as well as the finalized $config and $spec values to be altered right after the initial processing (see section:- #3.7). The second is called by 'hl_tag()' once the tag content is finalized (see section:- #3.4.9). + + Being dictated by the external and stable HTML standard, htmLawed's objective is very clear-cut and less concerned with tweakability. The code is only minimally annotated with comments -- it is not meant to instruct; PHP developers familiar with the HTML specs will see the logic, and others can always refer to the htmLawed documentation. The compact structuring of the statements is meant to aid in quickly grasping the logic, at least when viewed with code syntax highlighted. + +___________________________________________________________________oo + + +@@description: htmLawed PHP software is a free, open-source, customizable HTML input purifier and filter +@@encoding: utf-8 +@@keywords: htmLawed, HTM, HTML, HTML Tidy, converter, filter, formatter, purifier, sanitizer, XSS, input, PHP, software, code, script, security, cross-site scripting, hack, sanitize, remove, standards, tags, attributes, elements +@@language: en +@@title: htmLawed documentation \ No newline at end of file diff --git a/extlib/htmLawed/htmLawed_TESTCASE.txt b/extlib/htmLawed/htmLawed_TESTCASE.txt new file mode 100644 index 0000000000..366465ce38 --- /dev/null +++ b/extlib/htmLawed/htmLawed_TESTCASE.txt @@ -0,0 +1,370 @@ +/* +htmLawed_TESTCASE.txt, 23 April 2009 +htmLawed 1.1.8.1, 16 July 2009 +Copyright Santosh Patnaik +GPL v3 license +A PHP Labware internal utility - http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed +*/ + +This file has UTF-8-encoded text with both correct and incorrect/malformed HTML/XHTML code snippets to test htmLawed (test cases/samples). The entire text may also be used as a unit. + +************************************************ +when viewing this file in a web browser, set the +character encoding to Unicode/UTF-8 +************************************************ + +--------------------- start -------------------- + +Try different $config and $spec values. Some text even when filtered in will not be displayed in a rendered web-page
    + +
    Attributes
    + +Xml:lang:
    , ,
    +Standard, predefined value, or empty attribute: , ,
    +Required: , image
    +Quote & space variation: a, a, a
    +Invalid: a
    +Duplicated: a
    +Deprecated: a,

    +Casing:
    +Admin-restricted?: + +
    Attribute values
    + +Duplicate ID value:, ,
    +(try 'my_' for prefix)
    +Double-quotes in value:, ,
    +(try filter for CSS expression)
    +CSS expression:

    +Other: ,
    +(try 'maxlen', 'maxval', etc., for 'input' in '$spec') + +
    Blockquotes
    + +
    abc

    +
    abc
    def

    +
    abc
    def

    +
    abc
    def
    ghi

    +abc
    def
    ghi
    +(try with blockquote parent) + +
    CDATA sections
    + +Special characters inside: ]]>, 3.5, & 4 > 4 ]]>
    +Normal: , CDATA follows:
    +Malformed: , < ![CDATA check ]]>, , < ![CDATA check ] ]>
    +Invalid: >CDATA in tag content,
    text not allowed
    + +
    Complex-1: deprecated elements
    + +
    +The PHP software script used for this web-page webpage is htmLawedTest.php, from PHP Labware. +
    + +
    Complex-2: deprecated attributes
    + +aa +
    +
    +image + + + + + +
    +
    +

    Section

    +

    Para

    +
    1. First item
    +
    +
    +
    1. First item
    +
    +
    + +
    Complex-3: embed, object, area
    + +
    + +
    + + +

    navigate the site: 1 | 3 | 4

    + +
    + +
    Complex-4: nested and other tables
    + +
    Cell
    Cell
    Cell
    Cell Cell Cell
    Cell
    Cell Cell Cell

    +PCDATA wrong: Well
    Hello

    +Missing tr:
    Well

    + +
    Complex-5: pseudo, disallowed or non-HTML tags
    + +(Try different 'keep_bad' values) +<*> Pseudotags <*> +Non-HTML tag xml +

    +Disallowed tag p +

    +
      Bad
    • OK
    + +
    Elements
    + +Unbalanced: check
    +Non-XHTML:

    +Malformed: < a href="">, , , , < /a>, < a href="">, a, a,
    +Invalid: a
    +Empty: a, a, atext
    +Content invalid: 12
    +Content invalid?:

    (try setting 'form' as parent) +Casing: + +
    Entities
    + +Special: & 3 < 2 & 5>4 and j >i >a & ia
    +Padding: B B f f  
    +Malformed: & #x27;, &x27;, ' &TILDE;, &tilde
    +Invalid: , �, , �, ￿, &bad;
    +Discouraged characters: , „, ﷠, 􏿾
    +Context: '>', <?
    +Casing: ', ', &TILDE;, ˜ +
    +(also check named-to-numeric and hexdec-to-decimal, and vice versa, conversions) + +
    Format
    + +Valid but ill-formatted: text +text + text text
    p r e
    + text text

    +text none text +text none t e x t +
    text none t e x t + +text none t e x t + +
    +
    p r e  
    +
    +				pre
    +		
    +
    +
    Cell
    Cell
    Cell
    CellCellCell
    Cell
    CellCellCell
    +(try to compact or beautify) + +
    Forms
    + +(note nesting of 'form', missing required attributes, etc.)
    +
    + +
    pl
    + h + +

    +


    +
    B:C:

    +(try each of these lines separately)
    +
    what
    +what +(try with container as div and as form)
    +c a b + +
    HTML comments (also CDATA)
    + +Special characters inside: , , , c
    +Normal: , , comment:,
    text not allowed

    +Malformed: , < ![CDATA check ]]>, < ![CDATA check ] ]>
    +Invalid: >comment in tag content, + +
    Ins-Del
    + +(depending on context, these elements can be of either block or inline type)
    +

    block


    +

    d


    +

    d

    d

    d
    + +
    Lists
    + +Invalid character data:
    • (item
    • )

    +Definition list:
    a
    bad
    first one
    b
    second

    +Definition list, close-tags omitted:
    a
    bad
    first one
    b
    second

    +Definition lists, nested:
    +
    T1
    +
    D1
    +
    T2
    +
    D2
    t1
    d1
    t2
    d2
    +
    T3
    +
    D3
    +
    T4
    +
    D4
    t1
    d1
    +

    +Definition lists, nested, close-tags omitted:
    +
    T1 +
    D1
    +
    T2
    +
    D2
    t1
    d1
    t2
    d2
    +
    T3 +
    D3 +
    T4 +
    D4
    t1
    d1
    +

    +Nested:
      +
    • l1
    • +
    • l2
      1. lo1
      2. lo2
    • +
    • l3
    • +
    • l4
      1. lo3
      2. lo4
        1. lo5
    • +

    +Nested, close-tags omitted:
      +
    • l1
    • +
    • l2
      1. lo1
      2. lo2
      +
    • l3 +
    • l4
      1. lo3
      2. lo4
        1. lo5
      +

    +Complex: +
    1. +
      +
    + +
    Non-English text-1
    + +Inscrieţi-vă acum la a Zecea Conferinţă Internaţională
    +გთხოვთ ახლავე გაიაროთ რეგისტრაცია
    +večjezično računalništvo
    +Зарегистрируйтесь сейчас +на Десятую Международную Конференцию по
    +(this file should have utf-8 encoding; some characters may not be displayed because of missing fonts, etc.) + +
    Non-English text-2: entities
    + +用统一码
    +გთხოვთ
    +Inscreva-se agora para a Décima Conferência Internacional Sobre O Unicode, realizada entre os dias 10 e 12 de março de 1997 em Mainz +na Alemanha. + +
    Ruby
    + +(need compatible browser)
    + + + + + + + + + さい + とう + のぶ + + + + W3C Associate Chairman + +
    + + WWW + (World Wide Web) +
    + + A + (aaa) + + +
    Tables
    + +Omitted closing tags: ++ + +
    h1c1h1c2 +
    r1c1r1c2 +
    r2c1r2c2 +

    +Nested, omitted closing tags: ++ + +
    h1c1h1c2 +
    r1c1r1c2 ++ + +
    h1c1h1c2 +
    r1c1r1c2 +
    r2c1r2c2 +
    +
    r2c1r2c2 +

    + +
    URLs
    + +Relative and absolute: , , , , , ,
    +(try base URL value of 'http://a.com/b/')
    +CSS URLs:
    ,
    ,
    ,
    ,

    +Anti-spam: (try regex for 'http://a.com', etc.) , , , , , ,
    + +
    XSS
    + +'';!--"=&{()}
    +
    +
    +
    +
    +

    +

    +

    +
    +
    +

    +test
    +Bad IE7: x
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: xxx
    +Bad IE7: x
    +Bad IE7: x
    +Bad IE7: x
    +Bad IE7: x
    +Bad IE7: exp/*x
    +Bad IE7: hi
    +Bad IE7: hi
    +Bad IE7: test
    +Bad IE7: hi
    +Bad IE7: hi
    + +
    Other
    + +3 < 4
    +3 > 4
    + > 3
    \ No newline at end of file diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php index f6a1b59d03..41d03f8e21 100644 --- a/lib/attachmentlist.php +++ b/lib/attachmentlist.php @@ -340,7 +340,12 @@ class Attachment extends AttachmentListItem case 'video': case 'link': if (!empty($this->oembed->html)) { - $this->out->raw($this->oembed->html); + require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; + $config = array( + 'safe'=>1, + 'elements'=>'*+object+embed'); + $this->out->raw(htmLawed($this->oembed->html,$config)); + //$this->out->raw($this->oembed->html); } break; From a5f78449b1d1f6a517727388cfbd350914d66b6e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 13:51:40 -0400 Subject: [PATCH 019/423] better check for existing DB connection runs SET NAMES UTF8 less --- classes/Memcached_DataObject.php | 69 ++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index f7cbb9d5b6..ea070ec849 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -241,10 +241,19 @@ class Memcached_DataObject extends DB_DataObject function _connect() { global $_DB_DATAOBJECT; - $exists = !empty($this->_database_dsn_md5) && - isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]); + + $sum = $this->_getDbDsnMD5(); + + if (!empty($_DB_DATAOBJECT['CONNECTIONS'][$sum]) && + !PEAR::isError($_DB_DATAOBJECT['CONNECTIONS'][$sum])) { + $exists = true; + } else { + $exists = false; + } + $result = parent::_connect(); - if (!$exists) { + + if ($result && !$exists) { $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]; if (common_config('db', 'type') == 'mysql' && common_config('db', 'utf8')) { @@ -258,7 +267,61 @@ class Memcached_DataObject extends DB_DataObject } } } + return $result; } + // XXX: largely cadged from DB_DataObject + + function _getDbDsnMD5() + { + if ($this->_database_dsn_md5) { + return $this->_database_dsn_md5; + } + + $dsn = $this->_getDbDsn(); + + if (is_string($dsn)) { + $sum = md5($dsn); + } else { + /// support array based dsn's + $sum = md5(serialize($dsn)); + } + + return $sum; + } + + function _getDbDsn() + { + global $_DB_DATAOBJECT; + + if (empty($_DB_DATAOBJECT['CONFIG'])) { + DB_DataObject::_loadConfig(); + } + + $options = &$_DB_DATAOBJECT['CONFIG']; + + // if the databse dsn dis defined in the object.. + + $dsn = isset($this->_database_dsn) ? $this->_database_dsn : null; + + if (!$dsn) { + + if (!$this->_database) { + $this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null; + } + + if ($this->_database && !empty($options["database_{$this->_database}"])) { + $dsn = $options["database_{$this->_database}"]; + } else if (!empty($options['database'])) { + $dsn = $options['database']; + } + } + + if (!$dsn) { + throw new Exception("No database name / dsn found anywhere"); + } + + return $dsn; + } } From 7835393c25e26ea31b8ee3ca4f956ff9d209c6cf Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 15:07:39 -0400 Subject: [PATCH 020/423] change front page to link to max member groups --- actions/public.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/public.php b/actions/public.php index ef9ef0d1ab..d0317ac706 100644 --- a/actions/public.php +++ b/actions/public.php @@ -229,7 +229,7 @@ class PublicAction extends Action // $top->show(); $pop = new PopularNoticeSection($this); $pop->show(); - $gbp = new GroupsByPostsSection($this); + $gbp = new GroupsByMembersSection($this); $gbp->show(); $feat = new FeaturedUsersSection($this); $feat->show(); From 92c12898e780ed3685c93bd85cae5772f1547c5e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 15:07:39 -0400 Subject: [PATCH 021/423] change front page to link to max member groups --- actions/public.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/public.php b/actions/public.php index ef9ef0d1ab..d0317ac706 100644 --- a/actions/public.php +++ b/actions/public.php @@ -229,7 +229,7 @@ class PublicAction extends Action // $top->show(); $pop = new PopularNoticeSection($this); $pop->show(); - $gbp = new GroupsByPostsSection($this); + $gbp = new GroupsByMembersSection($this); $gbp->show(); $feat = new FeaturedUsersSection($this); $feat->show(); From 2cbee8213ae9973c929d8d130cdc54d031e0ccd6 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 27 Jul 2009 13:51:40 -0400 Subject: [PATCH 022/423] better check for existing DB connection runs SET NAMES UTF8 less --- classes/Memcached_DataObject.php | 69 ++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index f7cbb9d5b6..ea070ec849 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -241,10 +241,19 @@ class Memcached_DataObject extends DB_DataObject function _connect() { global $_DB_DATAOBJECT; - $exists = !empty($this->_database_dsn_md5) && - isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]); + + $sum = $this->_getDbDsnMD5(); + + if (!empty($_DB_DATAOBJECT['CONNECTIONS'][$sum]) && + !PEAR::isError($_DB_DATAOBJECT['CONNECTIONS'][$sum])) { + $exists = true; + } else { + $exists = false; + } + $result = parent::_connect(); - if (!$exists) { + + if ($result && !$exists) { $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]; if (common_config('db', 'type') == 'mysql' && common_config('db', 'utf8')) { @@ -258,7 +267,61 @@ class Memcached_DataObject extends DB_DataObject } } } + return $result; } + // XXX: largely cadged from DB_DataObject + + function _getDbDsnMD5() + { + if ($this->_database_dsn_md5) { + return $this->_database_dsn_md5; + } + + $dsn = $this->_getDbDsn(); + + if (is_string($dsn)) { + $sum = md5($dsn); + } else { + /// support array based dsn's + $sum = md5(serialize($dsn)); + } + + return $sum; + } + + function _getDbDsn() + { + global $_DB_DATAOBJECT; + + if (empty($_DB_DATAOBJECT['CONFIG'])) { + DB_DataObject::_loadConfig(); + } + + $options = &$_DB_DATAOBJECT['CONFIG']; + + // if the databse dsn dis defined in the object.. + + $dsn = isset($this->_database_dsn) ? $this->_database_dsn : null; + + if (!$dsn) { + + if (!$this->_database) { + $this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null; + } + + if ($this->_database && !empty($options["database_{$this->_database}"])) { + $dsn = $options["database_{$this->_database}"]; + } else if (!empty($options['database'])) { + $dsn = $options['database']; + } + } + + if (!$dsn) { + throw new Exception("No database name / dsn found anywhere"); + } + + return $dsn; + } } From e804b2a500959289e233cd6ca80979c40400d9a0 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Mon, 27 Jul 2009 16:02:03 -0400 Subject: [PATCH 023/423] trim the subject line of invite emails Thanks semjaza http://laconi.ca/trac/ticket/1746 --- actions/invite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/invite.php b/actions/invite.php index bdea4807d8..26c951ed22 100644 --- a/actions/invite.php +++ b/actions/invite.php @@ -216,7 +216,7 @@ class InviteAction extends CurrentUserDesignAction $recipients = array($email); $headers['From'] = mail_notify_from(); - $headers['To'] = $email; + $headers['To'] = trim($email); $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename); $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n". From 87bc612778932748d5b638af4c45493435c404d4 Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Mon, 27 Jul 2009 18:29:11 -0500 Subject: [PATCH 024/423] pgsql's install had windows newlines. ran db/laconica_pg.sql Thanks grim26 --- db/laconica_pg.sql | 1058 ++++++++++++++++++++++---------------------- 1 file changed, 529 insertions(+), 529 deletions(-) diff --git a/db/laconica_pg.sql b/db/laconica_pg.sql index 31210fd1e4..24581bad0c 100644 --- a/db/laconica_pg.sql +++ b/db/laconica_pg.sql @@ -1,529 +1,529 @@ -/* local and remote users have profiles */ - -create sequence profile_seq; -create table profile ( - id bigint default nextval('profile_seq') primary key /* comment 'unique identifier' */, - nickname varchar(64) not null /* comment 'nickname or username' */, - fullname varchar(255) /* comment 'display name' */, - profileurl varchar(255) /* comment 'URL, cached so we dont regenerate' */, - homepage varchar(255) /* comment 'identifying URL' */, - bio varchar(140) /* comment 'descriptive biography' */, - location varchar(255) /* comment 'physical location' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - textsearch tsvector -); -create index profile_nickname_idx on profile using btree(nickname); - -create table avatar ( - profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id) , - original integer default 0 /* comment 'uploaded by user or generated?' */, - width integer not null /* comment 'image width' */, - height integer not null /* comment 'image height' */, - mediatype varchar(32) not null /* comment 'file type' */, - filename varchar(255) null /* comment 'local filename, if local' */, - url varchar(255) unique /* comment 'avatar location' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key(profile_id, width, height) -); -create index avatar_profile_id_idx on avatar using btree(profile_id); - -create sequence sms_carrier_seq; -create table sms_carrier ( - id bigint default nextval('sms_carrier_seq') primary key /* comment 'primary key for SMS carrier' */, - name varchar(64) unique /* comment 'name of the carrier' */, - email_pattern varchar(255) not null /* comment 'sprintf pattern for making an email address from a phone number' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified ' */ -); - -create sequence design_seq; -create table design ( - id bigint default nextval('design_seq') /* comment 'design ID'*/, - backgroundcolor integer /* comment 'main background color'*/ , - contentcolor integer /*comment 'content area background color'*/ , - sidebarcolor integer /*comment 'sidebar background color'*/ , - textcolor integer /*comment 'text color'*/ , - linkcolor integer /*comment 'link color'*/, - backgroundimage varchar(255) /*comment 'background image, if any'*/, - disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/, - primary key (id) -); - -/* local users */ - -create table "user" ( - id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , - nickname varchar(64) unique /* comment 'nickname or username, duped in profile' */, - password varchar(255) /* comment 'salted password, can be null for OpenID users' */, - email varchar(255) unique /* comment 'email address for password recovery etc.' */, - incomingemail varchar(255) unique /* comment 'email address for post-by-email' */, - emailnotifysub integer default 1 /* comment 'Notify by email of subscriptions' */, - emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */, - emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */, - emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */, - emailnotifyattn integer default 1 /* command 'Notify by email of @-replies' */, - emailmicroid integer default 1 /* comment 'whether to publish email microid' */, - language varchar(50) /* comment 'preferred language' */, - timezone varchar(50) /* comment 'timezone' */, - emailpost integer default 1 /* comment 'Post by email' */, - jabber varchar(255) unique /* comment 'jabber ID for notices' */, - jabbernotify integer default 0 /* comment 'whether to send notices to jabber' */, - jabberreplies integer default 0 /* comment 'whether to send notices to jabber on replies' */, - jabbermicroid integer default 1 /* comment 'whether to publish xmpp microid' */, - updatefrompresence integer default 0 /* comment 'whether to record updates from Jabber presence notices' */, - sms varchar(64) unique /* comment 'sms phone number' */, - carrier integer /* comment 'foreign key to sms_carrier' */ references sms_carrier (id) , - smsnotify integer default 0 /* comment 'whether to send notices to SMS' */, - smsreplies integer default 0 /* comment 'whether to send notices to SMS on replies' */, - smsemail varchar(255) /* comment 'built from sms and carrier' */, - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */, - urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */, - inboxed integer default 0 /* comment 'has an inbox been created for this user?' */, - design_id integer /* comment 'id of a design' */references design(id), - viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); -create index user_smsemail_idx on "user" using btree(smsemail); - -/* remote people */ - -create table remote_profile ( - id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - postnoticeurl varchar(255) /* comment 'URL we use for posting notices' */, - updateprofileurl varchar(255) /* comment 'URL we use for updates to this profile' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table subscription ( - subscriber integer not null /* comment 'profile listening' */, - subscribed integer not null /* comment 'profile being listened to' */, - jabber integer default 1 /* comment 'deliver jabber messages' */, - sms integer default 1 /* comment 'deliver sms messages' */, - token varchar(255) /* comment 'authorization token' */, - secret varchar(255) /* comment 'token secret' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (subscriber, subscribed) -); -create index subscription_subscriber_idx on subscription using btree(subscriber); -create index subscription_subscribed_idx on subscription using btree(subscribed); - -create sequence notice_seq; -create table notice ( - - id bigint default nextval('notice_seq') primary key /* comment 'unique identifier' */, - profile_id integer not null /* comment 'who made the update' */ references profile (id) , - uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, - content varchar(140) /* comment 'update content' */, - rendered text /* comment 'HTML version of the content' */, - url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - reply_to integer /* comment 'notice replied to (usually a guess)' */ references notice (id) , - is_local integer default 0 /* comment 'notice was generated by a user' */, - source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */, - conversation integer /*id of root notice in this conversation' */ references notice (id) - - -/* FULLTEXT(content) */ -); -create index notice_profile_id_idx on notice using btree(profile_id); -create index notice_created_idx on notice using btree(created); - -create table notice_source ( - code varchar(32) primary key not null /* comment 'source code' */, - name varchar(255) not null /* comment 'name of the source' */, - url varchar(255) not null /* comment 'url to link to' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table reply ( - - notice_id integer not null /* comment 'notice that is the reply' */ references notice (id) , - profile_id integer not null /* comment 'profile replied to' */ references profile (id) , - modified timestamp /* comment 'date this record was modified' */, - replied_id integer /* comment 'notice replied to (not used, see notice.reply_to)' */, - - primary key (notice_id, profile_id) - -); -create index reply_notice_id_idx on reply using btree(notice_id); -create index reply_profile_id_idx on reply using btree(profile_id); -create index reply_replied_id_idx on reply using btree(replied_id); - -create table fave ( - - notice_id integer not null /* comment 'notice that is the favorite' */ references notice (id), - user_id integer not null /* comment 'user who likes this notice' */ references "user" (id) , - modified timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was modified' */, - primary key (notice_id, user_id) - -); -create index fave_notice_id_idx on fave using btree(notice_id); -create index fave_user_id_idx on fave using btree(user_id); -create index fave_modified_idx on fave using btree(modified); - -/* tables for OAuth */ - -create table consumer ( - consumer_key varchar(255) primary key /* comment 'unique identifier, root URL' */, - seed char(32) not null /* comment 'seed for new tokens by this consumer' */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table token ( - consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */ references consumer (consumer_key), - tok char(32) not null /* comment 'identifying value' */, - secret char(32) not null /* comment 'secret value' */, - type integer not null default 0 /* comment 'request or access' */, - state integer default 0 /* comment 'for requests 0 = initial, 1 = authorized, 2 = used' */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (consumer_key, tok) -); - -create table nonce ( - consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */, - tok char(32) /* comment 'buggy old value, ignored' */, - nonce char(32) null /* comment 'buggy old value, ignored */, - ts integer not null /* comment 'timestamp sent' values are epoch, and only used internally */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (consumer_key, ts, nonce) -); - -/* One-to-many relationship of user to openid_url */ - -create table user_openid ( - canonical varchar(255) primary key /* comment 'Canonical true URL' */, - display varchar(255) not null unique /* comment 'URL for viewing, may be different from canonical' */, - user_id integer not null /* comment 'user owning this URL' */ references "user" (id) , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); -create index user_openid_user_id_idx on user_openid using btree(user_id); - -/* These are used by JanRain OpenID library */ - -create table oid_associations ( - server_url varchar(2047), - handle varchar(255), - secret bytea, - issued integer, - lifetime integer, - assoc_type varchar(64), - primary key (server_url, handle) -); - -create table oid_nonces ( - server_url varchar(2047), - "timestamp" integer, - salt character(40), - unique (server_url, "timestamp", salt) -); - -create table confirm_address ( - code varchar(32) not null primary key /* comment 'good random code' */, - user_id integer not null /* comment 'user who requested confirmation' */ references "user" (id), - address varchar(255) not null /* comment 'address (email, Jabber, SMS, etc.)' */, - address_extra varchar(255) not null default '' /* comment 'carrier ID, for SMS' */, - address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms")' */, - claimed timestamp /* comment 'date this was claimed for queueing' */, - sent timestamp /* comment 'date this was sent for queueing' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table remember_me ( - code varchar(32) not null primary key /* comment 'good random code' */, - user_id integer not null /* comment 'user who is logged in' */ references "user" (id), - modified timestamp /* comment 'date this record was modified' */ -); - -create table queue_item ( - - notice_id integer not null /* comment 'notice queued' */ references notice (id) , - transport varchar(8) not null /* comment 'queue for what? "email", "jabber", "sms", "irc", ...' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - claimed timestamp /* comment 'date this item was claimed' */, - - primary key (notice_id, transport) - -); -create index queue_item_created_idx on queue_item using btree(created); - -/* Hash tags */ -create table notice_tag ( - tag varchar( 64 ) not null /* comment 'hash tag associated with this notice' */, - notice_id integer not null /* comment 'notice tagged' */ references notice (id) , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (tag, notice_id) -); -create index notice_tag_created_idx on notice_tag using btree(created); - -/* Synching with foreign services */ - -create table foreign_service ( - id int not null primary key /* comment 'numeric key for service' */, - name varchar(32) not null unique /* comment 'name of the service' */, - description varchar(255) /* comment 'description' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ -); - -create table foreign_user ( - id int not null unique /* comment 'unique numeric key on foreign service' */, - service int not null /* comment 'foreign key to service' */ references foreign_service(id) , - uri varchar(255) not null unique /* comment 'identifying URI' */, - nickname varchar(255) /* comment 'nickname on foreign service' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (id, service) -); - -create table foreign_link ( - user_id int /* comment 'link to user on this system, if exists' */ references "user" (id), - foreign_id int /* comment 'link' */ references foreign_user (id), - service int not null /* comment 'foreign key to service' */ references foreign_service (id), - credentials varchar(255) /* comment 'authc credentials, typically a password' */, - noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */, - friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, - profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */, - last_noticesync timestamp default null /* comment 'last time notices were imported' */, - last_friendsync timestamp default null /* comment 'last time friends were imported' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (user_id,foreign_id,service) -); -create index foreign_user_user_id_idx on foreign_link using btree(user_id); - -create table foreign_subscription ( - service int not null /* comment 'service where relationship happens' */ references foreign_service(id) , - subscriber int not null /* comment 'subscriber on foreign service' */ , - subscribed int not null /* comment 'subscribed user' */ , - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (service, subscriber, subscribed) -); -create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber); -create index foreign_subscription_subscribed_idx on foreign_subscription using btree(subscribed); - -create table invitation ( - code varchar(32) not null primary key /* comment 'random code for an invitation' */, - user_id int not null /* comment 'who sent the invitation' */ references "user" (id), - address varchar(255) not null /* comment 'invitation sent to' */, - address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms") '*/, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */ - -); -create index invitation_address_idx on invitation using btree(address,address_type); -create index invitation_user_id_idx on invitation using btree(user_id); - -create sequence message_seq; -create table message ( - - id bigint default nextval('message_seq') primary key /* comment 'unique identifier' */, - uri varchar(255) unique /* comment 'universally unique identifier' */, - from_profile integer not null /* comment 'who the message is from' */ references profile (id), - to_profile integer not null /* comment 'who the message is to' */ references profile (id), - content varchar(140) /* comment 'message content' */, - rendered text /* comment 'HTML version of the content' */, - url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ - -); -create index message_from_idx on message using btree(from_profile); -create index message_to_idx on message using btree(to_profile); -create index message_created_idx on message using btree(created); - -create table notice_inbox ( - - user_id integer not null /* comment 'user receiving the message' */ references "user" (id), - notice_id integer not null /* comment 'notice received' */ references notice (id), - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, - source integer default 1 /* comment 'reason it is in the inbox: 1=subscription' */, - - primary key (user_id, notice_id) -); -create index notice_inbox_notice_id_idx on notice_inbox using btree(notice_id); - -create table profile_tag ( - tagger integer not null /* comment 'user making the tag' */ references "user" (id), - tagged integer not null /* comment 'profile tagged' */ references profile (id), - tag varchar(64) not null /* comment 'hash tag associated with this notice' */, - modified timestamp /* comment 'date the tag was added' */, - - primary key (tagger, tagged, tag) -); -create index profile_tag_modified_idx on profile_tag using btree(modified); -create index profile_tag_tagger_tag_idx on profile_tag using btree(tagger,tag); - -create table profile_block ( - - blocker integer not null /* comment 'user making the block' */ references "user" (id), - blocked integer not null /* comment 'profile that is blocked' */ references profile (id), - modified timestamp /* comment 'date of blocking' */, - - primary key (blocker, blocked) - -); - -create sequence user_group_seq; -create table user_group ( - - id bigint default nextval('user_group_seq') primary key /* comment 'unique identifier' */, - - nickname varchar(64) unique /* comment 'nickname for addressing' */, - fullname varchar(255) /* comment 'display name' */, - homepage varchar(255) /* comment 'URL, cached so we dont regenerate' */, - description varchar(140) /* comment 'descriptive biography' */, - location varchar(255) /* comment 'related physical location, if any' */, - - original_logo varchar(255) /* comment 'original size logo' */, - homepage_logo varchar(255) /* comment 'homepage (profile) size logo' */, - stream_logo varchar(255) /* comment 'stream-sized logo' */, - mini_logo varchar(255) /* comment 'mini logo' */, - design_id integer /*comment 'id of a design' */ references design(id), - - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */ - -); -create index user_group_nickname_idx on user_group using btree(nickname); - -create table group_member ( - - group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), - profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id), - is_admin integer default 0 /* comment 'is this user an admin?' */, - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - modified timestamp /* comment 'date this record was modified' */, - - primary key (group_id, profile_id) -); - -create table related_group ( - - group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id) , - related_group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), - - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, - - primary key (group_id, related_group_id) - -); - -create table group_inbox ( - group_id integer not null /* comment 'group receiving the message' references user_group (id) */, - notice_id integer not null /* comment 'notice received' references notice (id) */, - created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, - primary key (group_id, notice_id) -); -create index group_inbox_created_idx on group_inbox using btree(created); - - -/*attachments and URLs stuff */ -create sequence file_seq; -create table file ( - id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, - url varchar(255) unique, - mimetype varchar(50), - size integer, - title varchar(255), - date integer, - protected integer, - filename text /* comment 'if a local file, name of the file' */, - modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ -); - -create sequence file_oembed_seq; -create table file_oembed ( - file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, - version varchar(20), - type varchar(20), - provider varchar(50), - provider_url varchar(255), - width integer, - height integer, - html text, - title varchar(255), - author_name varchar(50), - author_url varchar(255), - url varchar(255) -); - -create sequence file_redirection_seq; -create table file_redirection ( - url varchar(255) primary key, - file_id bigint, - redirections integer, - httpcode integer -); - -create sequence file_thumbnail_seq; -create table file_thumbnail ( - file_id bigint primary key, - url varchar(255) unique, - width integer, - height integer -); - -create sequence file_to_post_seq; -create table file_to_post ( - file_id bigint, - post_id bigint, - - primary key (file_id, post_id) -); - -create table group_block ( - group_id integer not null /* comment 'group profile is blocked from' */ references user_group (id), - blocked integer not null /* comment 'profile that is blocked' */references profile (id), - blocker integer not null /* comment 'user making the block'*/ references "user" (id), - modified timestamp /* comment 'date of blocking'*/ , - - primary key (group_id, blocked) -); - -create table group_alias ( - - alias varchar(64) /* comment 'additional nickname for the group'*/ , - group_id integer not null /* comment 'group profile is blocked from'*/ references user_group (id), - modified timestamp /* comment 'date alias was created'*/, - primary key (alias) - -); -create index group_alias_group_id_idx on group_alias (group_id); - - -/* Textsearch stuff */ - -create index textsearch_idx on profile using gist(textsearch); -create index noticecontent_idx on notice using gist(to_tsvector('english',content)); -create trigger textsearchupdate before insert or update on profile for each row -execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage); - +/* local and remote users have profiles */ + +create sequence profile_seq; +create table profile ( + id bigint default nextval('profile_seq') primary key /* comment 'unique identifier' */, + nickname varchar(64) not null /* comment 'nickname or username' */, + fullname varchar(255) /* comment 'display name' */, + profileurl varchar(255) /* comment 'URL, cached so we dont regenerate' */, + homepage varchar(255) /* comment 'identifying URL' */, + bio varchar(140) /* comment 'descriptive biography' */, + location varchar(255) /* comment 'physical location' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + textsearch tsvector +); +create index profile_nickname_idx on profile using btree(nickname); + +create table avatar ( + profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id) , + original integer default 0 /* comment 'uploaded by user or generated?' */, + width integer not null /* comment 'image width' */, + height integer not null /* comment 'image height' */, + mediatype varchar(32) not null /* comment 'file type' */, + filename varchar(255) null /* comment 'local filename, if local' */, + url varchar(255) unique /* comment 'avatar location' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key(profile_id, width, height) +); +create index avatar_profile_id_idx on avatar using btree(profile_id); + +create sequence sms_carrier_seq; +create table sms_carrier ( + id bigint default nextval('sms_carrier_seq') primary key /* comment 'primary key for SMS carrier' */, + name varchar(64) unique /* comment 'name of the carrier' */, + email_pattern varchar(255) not null /* comment 'sprintf pattern for making an email address from a phone number' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified ' */ +); + +create sequence design_seq; +create table design ( + id bigint default nextval('design_seq') /* comment 'design ID'*/, + backgroundcolor integer /* comment 'main background color'*/ , + contentcolor integer /*comment 'content area background color'*/ , + sidebarcolor integer /*comment 'sidebar background color'*/ , + textcolor integer /*comment 'text color'*/ , + linkcolor integer /*comment 'link color'*/, + backgroundimage varchar(255) /*comment 'background image, if any'*/, + disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/, + primary key (id) +); + +/* local users */ + +create table "user" ( + id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , + nickname varchar(64) unique /* comment 'nickname or username, duped in profile' */, + password varchar(255) /* comment 'salted password, can be null for OpenID users' */, + email varchar(255) unique /* comment 'email address for password recovery etc.' */, + incomingemail varchar(255) unique /* comment 'email address for post-by-email' */, + emailnotifysub integer default 1 /* comment 'Notify by email of subscriptions' */, + emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */, + emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */, + emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */, + emailnotifyattn integer default 1 /* command 'Notify by email of @-replies' */, + emailmicroid integer default 1 /* comment 'whether to publish email microid' */, + language varchar(50) /* comment 'preferred language' */, + timezone varchar(50) /* comment 'timezone' */, + emailpost integer default 1 /* comment 'Post by email' */, + jabber varchar(255) unique /* comment 'jabber ID for notices' */, + jabbernotify integer default 0 /* comment 'whether to send notices to jabber' */, + jabberreplies integer default 0 /* comment 'whether to send notices to jabber on replies' */, + jabbermicroid integer default 1 /* comment 'whether to publish xmpp microid' */, + updatefrompresence integer default 0 /* comment 'whether to record updates from Jabber presence notices' */, + sms varchar(64) unique /* comment 'sms phone number' */, + carrier integer /* comment 'foreign key to sms_carrier' */ references sms_carrier (id) , + smsnotify integer default 0 /* comment 'whether to send notices to SMS' */, + smsreplies integer default 0 /* comment 'whether to send notices to SMS on replies' */, + smsemail varchar(255) /* comment 'built from sms and carrier' */, + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */, + urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */, + inboxed integer default 0 /* comment 'has an inbox been created for this user?' */, + design_id integer /* comment 'id of a design' */references design(id), + viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ + +); +create index user_smsemail_idx on "user" using btree(smsemail); + +/* remote people */ + +create table remote_profile ( + id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + postnoticeurl varchar(255) /* comment 'URL we use for posting notices' */, + updateprofileurl varchar(255) /* comment 'URL we use for updates to this profile' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table subscription ( + subscriber integer not null /* comment 'profile listening' */, + subscribed integer not null /* comment 'profile being listened to' */, + jabber integer default 1 /* comment 'deliver jabber messages' */, + sms integer default 1 /* comment 'deliver sms messages' */, + token varchar(255) /* comment 'authorization token' */, + secret varchar(255) /* comment 'token secret' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (subscriber, subscribed) +); +create index subscription_subscriber_idx on subscription using btree(subscriber); +create index subscription_subscribed_idx on subscription using btree(subscribed); + +create sequence notice_seq; +create table notice ( + + id bigint default nextval('notice_seq') primary key /* comment 'unique identifier' */, + profile_id integer not null /* comment 'who made the update' */ references profile (id) , + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + content varchar(140) /* comment 'update content' */, + rendered text /* comment 'HTML version of the content' */, + url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + reply_to integer /* comment 'notice replied to (usually a guess)' */ references notice (id) , + is_local integer default 0 /* comment 'notice was generated by a user' */, + source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */, + conversation integer /*id of root notice in this conversation' */ references notice (id) + + +/* FULLTEXT(content) */ +); +create index notice_profile_id_idx on notice using btree(profile_id); +create index notice_created_idx on notice using btree(created); + +create table notice_source ( + code varchar(32) primary key not null /* comment 'source code' */, + name varchar(255) not null /* comment 'name of the source' */, + url varchar(255) not null /* comment 'url to link to' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table reply ( + + notice_id integer not null /* comment 'notice that is the reply' */ references notice (id) , + profile_id integer not null /* comment 'profile replied to' */ references profile (id) , + modified timestamp /* comment 'date this record was modified' */, + replied_id integer /* comment 'notice replied to (not used, see notice.reply_to)' */, + + primary key (notice_id, profile_id) + +); +create index reply_notice_id_idx on reply using btree(notice_id); +create index reply_profile_id_idx on reply using btree(profile_id); +create index reply_replied_id_idx on reply using btree(replied_id); + +create table fave ( + + notice_id integer not null /* comment 'notice that is the favorite' */ references notice (id), + user_id integer not null /* comment 'user who likes this notice' */ references "user" (id) , + modified timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was modified' */, + primary key (notice_id, user_id) + +); +create index fave_notice_id_idx on fave using btree(notice_id); +create index fave_user_id_idx on fave using btree(user_id); +create index fave_modified_idx on fave using btree(modified); + +/* tables for OAuth */ + +create table consumer ( + consumer_key varchar(255) primary key /* comment 'unique identifier, root URL' */, + seed char(32) not null /* comment 'seed for new tokens by this consumer' */, + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table token ( + consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */ references consumer (consumer_key), + tok char(32) not null /* comment 'identifying value' */, + secret char(32) not null /* comment 'secret value' */, + type integer not null default 0 /* comment 'request or access' */, + state integer default 0 /* comment 'for requests 0 = initial, 1 = authorized, 2 = used' */, + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (consumer_key, tok) +); + +create table nonce ( + consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */, + tok char(32) /* comment 'buggy old value, ignored' */, + nonce char(32) null /* comment 'buggy old value, ignored */, + ts integer not null /* comment 'timestamp sent' values are epoch, and only used internally */, + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (consumer_key, ts, nonce) +); + +/* One-to-many relationship of user to openid_url */ + +create table user_openid ( + canonical varchar(255) primary key /* comment 'Canonical true URL' */, + display varchar(255) not null unique /* comment 'URL for viewing, may be different from canonical' */, + user_id integer not null /* comment 'user owning this URL' */ references "user" (id) , + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ + +); +create index user_openid_user_id_idx on user_openid using btree(user_id); + +/* These are used by JanRain OpenID library */ + +create table oid_associations ( + server_url varchar(2047), + handle varchar(255), + secret bytea, + issued integer, + lifetime integer, + assoc_type varchar(64), + primary key (server_url, handle) +); + +create table oid_nonces ( + server_url varchar(2047), + "timestamp" integer, + salt character(40), + unique (server_url, "timestamp", salt) +); + +create table confirm_address ( + code varchar(32) not null primary key /* comment 'good random code' */, + user_id integer not null /* comment 'user who requested confirmation' */ references "user" (id), + address varchar(255) not null /* comment 'address (email, Jabber, SMS, etc.)' */, + address_extra varchar(255) not null default '' /* comment 'carrier ID, for SMS' */, + address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms")' */, + claimed timestamp /* comment 'date this was claimed for queueing' */, + sent timestamp /* comment 'date this was sent for queueing' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table remember_me ( + code varchar(32) not null primary key /* comment 'good random code' */, + user_id integer not null /* comment 'user who is logged in' */ references "user" (id), + modified timestamp /* comment 'date this record was modified' */ +); + +create table queue_item ( + + notice_id integer not null /* comment 'notice queued' */ references notice (id) , + transport varchar(8) not null /* comment 'queue for what? "email", "jabber", "sms", "irc", ...' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + claimed timestamp /* comment 'date this item was claimed' */, + + primary key (notice_id, transport) + +); +create index queue_item_created_idx on queue_item using btree(created); + +/* Hash tags */ +create table notice_tag ( + tag varchar( 64 ) not null /* comment 'hash tag associated with this notice' */, + notice_id integer not null /* comment 'notice tagged' */ references notice (id) , + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + + primary key (tag, notice_id) +); +create index notice_tag_created_idx on notice_tag using btree(created); + +/* Synching with foreign services */ + +create table foreign_service ( + id int not null primary key /* comment 'numeric key for service' */, + name varchar(32) not null unique /* comment 'name of the service' */, + description varchar(255) /* comment 'description' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table foreign_user ( + id int not null unique /* comment 'unique numeric key on foreign service' */, + service int not null /* comment 'foreign key to service' */ references foreign_service(id) , + uri varchar(255) not null unique /* comment 'identifying URI' */, + nickname varchar(255) /* comment 'nickname on foreign service' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (id, service) +); + +create table foreign_link ( + user_id int /* comment 'link to user on this system, if exists' */ references "user" (id), + foreign_id int /* comment 'link' */ references foreign_user (id), + service int not null /* comment 'foreign key to service' */ references foreign_service (id), + credentials varchar(255) /* comment 'authc credentials, typically a password' */, + noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */, + friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, + profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */, + last_noticesync timestamp default null /* comment 'last time notices were imported' */, + last_friendsync timestamp default null /* comment 'last time friends were imported' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (user_id,foreign_id,service) +); +create index foreign_user_user_id_idx on foreign_link using btree(user_id); + +create table foreign_subscription ( + service int not null /* comment 'service where relationship happens' */ references foreign_service(id) , + subscriber int not null /* comment 'subscriber on foreign service' */ , + subscribed int not null /* comment 'subscribed user' */ , + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + + primary key (service, subscriber, subscribed) +); +create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber); +create index foreign_subscription_subscribed_idx on foreign_subscription using btree(subscribed); + +create table invitation ( + code varchar(32) not null primary key /* comment 'random code for an invitation' */, + user_id int not null /* comment 'who sent the invitation' */ references "user" (id), + address varchar(255) not null /* comment 'invitation sent to' */, + address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms") '*/, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */ + +); +create index invitation_address_idx on invitation using btree(address,address_type); +create index invitation_user_id_idx on invitation using btree(user_id); + +create sequence message_seq; +create table message ( + + id bigint default nextval('message_seq') primary key /* comment 'unique identifier' */, + uri varchar(255) unique /* comment 'universally unique identifier' */, + from_profile integer not null /* comment 'who the message is from' */ references profile (id), + to_profile integer not null /* comment 'who the message is to' */ references profile (id), + content varchar(140) /* comment 'message content' */, + rendered text /* comment 'HTML version of the content' */, + url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ + +); +create index message_from_idx on message using btree(from_profile); +create index message_to_idx on message using btree(to_profile); +create index message_created_idx on message using btree(created); + +create table notice_inbox ( + + user_id integer not null /* comment 'user receiving the message' */ references "user" (id), + notice_id integer not null /* comment 'notice received' */ references notice (id), + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, + source integer default 1 /* comment 'reason it is in the inbox: 1=subscription' */, + + primary key (user_id, notice_id) +); +create index notice_inbox_notice_id_idx on notice_inbox using btree(notice_id); + +create table profile_tag ( + tagger integer not null /* comment 'user making the tag' */ references "user" (id), + tagged integer not null /* comment 'profile tagged' */ references profile (id), + tag varchar(64) not null /* comment 'hash tag associated with this notice' */, + modified timestamp /* comment 'date the tag was added' */, + + primary key (tagger, tagged, tag) +); +create index profile_tag_modified_idx on profile_tag using btree(modified); +create index profile_tag_tagger_tag_idx on profile_tag using btree(tagger,tag); + +create table profile_block ( + + blocker integer not null /* comment 'user making the block' */ references "user" (id), + blocked integer not null /* comment 'profile that is blocked' */ references profile (id), + modified timestamp /* comment 'date of blocking' */, + + primary key (blocker, blocked) + +); + +create sequence user_group_seq; +create table user_group ( + + id bigint default nextval('user_group_seq') primary key /* comment 'unique identifier' */, + + nickname varchar(64) unique /* comment 'nickname for addressing' */, + fullname varchar(255) /* comment 'display name' */, + homepage varchar(255) /* comment 'URL, cached so we dont regenerate' */, + description varchar(140) /* comment 'descriptive biography' */, + location varchar(255) /* comment 'related physical location, if any' */, + + original_logo varchar(255) /* comment 'original size logo' */, + homepage_logo varchar(255) /* comment 'homepage (profile) size logo' */, + stream_logo varchar(255) /* comment 'stream-sized logo' */, + mini_logo varchar(255) /* comment 'mini logo' */, + design_id integer /*comment 'id of a design' */ references design(id), + + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ + +); +create index user_group_nickname_idx on user_group using btree(nickname); + +create table group_member ( + + group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), + profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id), + is_admin integer default 0 /* comment 'is this user an admin?' */, + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (group_id, profile_id) +); + +create table related_group ( + + group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id) , + related_group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id), + + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, + + primary key (group_id, related_group_id) + +); + +create table group_inbox ( + group_id integer not null /* comment 'group receiving the message' references user_group (id) */, + notice_id integer not null /* comment 'notice received' references notice (id) */, + created timestamp not null default CURRENT_TIMESTAMP /* comment 'date the notice was created' */, + primary key (group_id, notice_id) +); +create index group_inbox_created_idx on group_inbox using btree(created); + + +/*attachments and URLs stuff */ +create sequence file_seq; +create table file ( + id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, + url varchar(255) unique, + mimetype varchar(50), + size integer, + title varchar(255), + date integer, + protected integer, + filename text /* comment 'if a local file, name of the file' */, + modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ +); + +create sequence file_oembed_seq; +create table file_oembed ( + file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, + version varchar(20), + type varchar(20), + provider varchar(50), + provider_url varchar(255), + width integer, + height integer, + html text, + title varchar(255), + author_name varchar(50), + author_url varchar(255), + url varchar(255) +); + +create sequence file_redirection_seq; +create table file_redirection ( + url varchar(255) primary key, + file_id bigint, + redirections integer, + httpcode integer +); + +create sequence file_thumbnail_seq; +create table file_thumbnail ( + file_id bigint primary key, + url varchar(255) unique, + width integer, + height integer +); + +create sequence file_to_post_seq; +create table file_to_post ( + file_id bigint, + post_id bigint, + + primary key (file_id, post_id) +); + +create table group_block ( + group_id integer not null /* comment 'group profile is blocked from' */ references user_group (id), + blocked integer not null /* comment 'profile that is blocked' */references profile (id), + blocker integer not null /* comment 'user making the block'*/ references "user" (id), + modified timestamp /* comment 'date of blocking'*/ , + + primary key (group_id, blocked) +); + +create table group_alias ( + + alias varchar(64) /* comment 'additional nickname for the group'*/ , + group_id integer not null /* comment 'group profile is blocked from'*/ references user_group (id), + modified timestamp /* comment 'date alias was created'*/, + primary key (alias) + +); +create index group_alias_group_id_idx on group_alias (group_id); + + +/* Textsearch stuff */ + +create index textsearch_idx on profile using gist(textsearch); +create index noticecontent_idx on notice using gist(to_tsvector('english',content)); +create trigger textsearchupdate before insert or update on profile for each row +execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage); + From 421ee4297ef5055bdd190fe2bd62cdc22b41c82b Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 17 Jul 2009 22:59:58 -0400 Subject: [PATCH 025/423] Fix RDFS namespace declaration. Thanks tobyink --- lib/rssaction.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rssaction.php b/lib/rssaction.php index ffa1f9e99f..7686d06460 100644 --- a/lib/rssaction.php +++ b/lib/rssaction.php @@ -320,6 +320,8 @@ class Rss10Action extends Action 'http://rdfs.org/sioc/ns#', 'xmlns:sioct' => 'http://rdfs.org/sioc/types#', + 'xmlns:rdfs' => + 'http://www.w3.org/2000/01/rdf-schema#', 'xmlns:laconica' => 'http://laconi.ca/ont/', 'xmlns' => 'http://purl.org/rss/1.0/')); From c85b6155eb004fe556de255482c04b87046c90b3 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 28 Jul 2009 17:14:11 +0000 Subject: [PATCH 026/423] Minor UI fix for IE6 notice-options --- theme/base/css/ie6.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/theme/base/css/ie6.css b/theme/base/css/ie6.css index eca240faae..edc49478f5 100644 --- a/theme/base/css/ie6.css +++ b/theme/base/css/ie6.css @@ -35,3 +35,6 @@ width:20%; width:50%; margin-left:30px; } +.notice-options a { +width:16px; +} \ No newline at end of file From 72117294d7675434fc14303ad84711d43be003b9 Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Tue, 28 Jul 2009 20:17:20 -0500 Subject: [PATCH 027/423] Splitting br3nda's merge 97db6e17b3f76e9a6acf87ddbad47ba54e9b1a3b Add session table to pg.sql --- db/laconica_pg.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/db/laconica_pg.sql b/db/laconica_pg.sql index 24581bad0c..ad34720a23 100644 --- a/db/laconica_pg.sql +++ b/db/laconica_pg.sql @@ -519,6 +519,16 @@ create table group_alias ( ); create index group_alias_group_id_idx on group_alias (group_id); +create table session ( + + id varchar(32) primary key /* comment 'session ID'*/, + session_data text /* comment 'session data'*/, + created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, + modified integer DEFAULT extract(epoch from CURRENT_TIMESTAMP) /* comment 'date this record was modified'*/ +); + +create index session_modified_idx on session (modified); + /* Textsearch stuff */ From 5aa303320b4e57f5296eccba5bba7134cc12503f Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 28 Jul 2009 22:22:07 -0400 Subject: [PATCH 028/423] Handle UTF-8 encoded text in emails. Thanks to jaakko for pointing this out! http://identi.ca/notice/7169471 --- scripts/maildaemon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/maildaemon.php b/scripts/maildaemon.php index a4003b6b26..9b3628b863 100755 --- a/scripts/maildaemon.php +++ b/scripts/maildaemon.php @@ -301,7 +301,7 @@ class MailerDaemon $this->extract_part($parsed,$msg,$attachments); - return array($from, $to, $msg, $attachments); + return array($from, $to, utf8_encode($msg), $attachments); } function extract_part($parsed,&$msg,&$attachments){ From f3352254b792b201b1acaa93c9f58530c671ad11 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 28 Jul 2009 22:47:32 -0400 Subject: [PATCH 029/423] Avoid potentially double encoding already utf-8 encoded messages --- scripts/maildaemon.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/maildaemon.php b/scripts/maildaemon.php index 9b3628b863..3ef4d06383 100755 --- a/scripts/maildaemon.php +++ b/scripts/maildaemon.php @@ -301,7 +301,7 @@ class MailerDaemon $this->extract_part($parsed,$msg,$attachments); - return array($from, $to, utf8_encode($msg), $attachments); + return array($from, $to, $msg, $attachments); } function extract_part($parsed,&$msg,&$attachments){ @@ -317,6 +317,9 @@ class MailerDaemon } else if ($parsed->ctype_primary == 'text' && $parsed->ctype_secondary=='plain') { $msg = $parsed->body; + if(strtolower($parsed->ctype_parameters['charset']) != "utf-8"){ + $msg = utf8_encode($msg); + } }else if(!empty($parsed->body)){ if(common_config('attachments', 'uploads')){ //only save attachments if uploads are enabled From 18573632b463c8ecf865b8a6f6a1887fa91e5ca7 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 29 Jul 2009 11:45:32 -0400 Subject: [PATCH 030/423] New algorithm for reply_to saving I changed the reply-to algorithm so that we only say a notice is in reply to another notice if a) we receive that information from the Web or API or b) it's in a "low bandwidth" (XMPP, SMS) channel, and begins with "@nickname" or "T NICKNAME". The goal is to avoid false-positives and make conversation trees more accurate and useful. --- classes/Notice.php | 160 +++++++++++++++++++++++++++++++++------------ 1 file changed, 117 insertions(+), 43 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index c2770edbe8..ebd5e1efd5 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -102,15 +102,14 @@ class Notice extends Memcached_DataObject if (!$count) { return true; } - + //turn each into their canonical tag //this is needed to remove dupes before saving e.g. #hash.tag = #hashtag $hashtags = array(); for($i=0; $iis_local = $is_local; } - $notice->query('BEGIN'); - - $notice->reply_to = $reply_to; if (!empty($created)) { $notice->created = $created; } else { $notice->created = common_sql_now(); } + $notice->content = $final; $notice->rendered = common_render_content($final, $notice); $notice->source = $source; $notice->uri = $uri; - if (!empty($reply_to)) { - $reply_notice = Notice::staticGet('id', $reply_to); - if (!empty($reply_notice)) { - $notice->reply_to = $reply_to; - $notice->conversation = $reply_notice->conversation; - } + $notice->reply_to = self::getReplyTo($reply_to, $profile_id, $source, $final); + + if (!empty($notice->reply_to)) { + $reply = Notice::staticGet('id', $notice->reply_to); + $notice->conversation = $reply->conversation; } if (Event::handle('StartNoticeSave', array(&$notice))) { + // XXX: some of these functions write to the DB + + $notice->query('BEGIN'); + $id = $notice->insert(); if (!$id) { @@ -213,18 +213,33 @@ class Notice extends Memcached_DataObject return _('Problem saving notice.'); } - # Update the URI after the notice is in the database - if (!$uri) { - $orig = clone($notice); - $notice->uri = common_notice_uri($notice); + // Update ID-dependent columns: URI, conversation + $orig = clone($notice); + + $changed = false; + + if (empty($uri)) { + $notice->uri = common_notice_uri($notice); + $changed = true; + } + + // If it's not part of a conversation, it's + // the beginning of a new conversation. + + if (empty($notice->conversation)) { + $notice->conversation = $notice->id; + $changed = true; + } + + if ($changed) { if (!$notice->update($orig)) { common_log_db_error($notice, 'UPDATE', __FILE__); return _('Problem saving notice.'); } } - # XXX: do we need to change this for remote users? + // XXX: do we need to change this for remote users? $notice->saveReplies(); $notice->saveTags(); @@ -232,8 +247,13 @@ class Notice extends Memcached_DataObject $notice->addToInboxes(); $notice->saveUrls(); + + // FIXME: why do we have to re-render the content? + // Remove this if it's not necessary. + $orig2 = clone($notice); - $notice->rendered = common_render_content($final, $notice); + + $notice->rendered = common_render_content($final, $notice); if (!$notice->update($orig2)) { common_log_db_error($notice, 'UPDATE', __FILE__); return _('Problem saving notice.'); @@ -290,9 +310,9 @@ class Notice extends Memcached_DataObject $notice->profile_id = $profile_id; $notice->content = $content; if (common_config('db','type') == 'pgsql') - $notice->whereAdd('extract(epoch from now() - created) < ' . common_config('site', 'dupelimit')); + $notice->whereAdd('extract(epoch from now() - created) < ' . common_config('site', 'dupelimit')); else - $notice->whereAdd('now() - created < ' . common_config('site', 'dupelimit')); + $notice->whereAdd('now() - created < ' . common_config('site', 'dupelimit')); $cnt = $notice->count(); return ($cnt == 0); @@ -906,14 +926,14 @@ class Notice extends Memcached_DataObject { $user = new User(); - if(common_config('db','quote_identifiers')) - $user_table = '"user"'; - else $user_table = 'user'; + if(common_config('db','quote_identifiers')) + $user_table = '"user"'; + else $user_table = 'user'; $qry = 'SELECT id ' . - 'FROM '. $user_table .' JOIN subscription '. - 'ON '. $user_table .'.id = subscription.subscriber ' . + 'FROM '. $user_table .' JOIN subscription '. + 'ON '. $user_table .'.id = subscription.subscriber ' . 'WHERE subscription.subscribed = %d '; $user->query(sprintf($qry, $this->profile_id)); @@ -1031,16 +1051,6 @@ class Notice extends Memcached_DataObject if (!$recipient) { continue; } - if ($i == 0 && ($recipient->id != $sender->id) && !$this->reply_to) { // Don't save reply to self - $reply_for = $recipient; - $recipient_notice = $reply_for->getCurrentNotice(); - if ($recipient_notice) { - $orig = clone($this); - $this->reply_to = $recipient_notice->id; - $this->conversation = $recipient_notice->conversation; - $this->update($orig); - } - } // Don't save replies from blocked profile to local user $recipient_user = User::staticGet('id', $recipient->id); if ($recipient_user && $recipient_user->hasBlocked($sender)) { @@ -1087,14 +1097,6 @@ class Notice extends Memcached_DataObject } } - // If it's not a reply, make it the root of a new conversation - - if (empty($this->conversation)) { - $orig = clone($this); - $this->conversation = $this->id; - $this->update($orig); - } - foreach (array_keys($replied) as $recipient) { $user = User::staticGet('id', $recipient); if ($user) { @@ -1266,4 +1268,76 @@ class Notice extends Memcached_DataObject return $ids; } + + /** + * Determine which notice, if any, a new notice is in reply to. + * + * For conversation tracking, we try to see where this notice fits + * in the tree. Rough algorithm is: + * + * if (reply_to is set and valid) { + * return reply_to; + * } else if ((source not API or Web) and (content starts with "T NAME" or "@name ")) { + * return ID of last notice by initial @name in content; + * } + * + * Note that all @nickname instances will still be used to save "reply" records, + * so the notice shows up in the mentioned users' "replies" tab. + * + * @param integer $reply_to ID passed in by Web or API + * @param integer $profile_id ID of author + * @param string $source Source tag, like 'web' or 'gwibber' + * @param string $content Final notice content + * + * @return integer ID of replied-to notice, or null for not a reply. + */ + + static function getReplyTo($reply_to, $profile_id, $source, $content) + { + static $lb = array('xmpp', 'mail', 'sms', 'omb'); + + // If $reply_to is specified, we check that it exists, and then + // return it if it does + + if (!empty($reply_to)) { + $reply_notice = Notice::staticGet('id', $reply_to); + if (!empty($reply_notice)) { + return $reply_to; + } + } + + // If it's not a "low bandwidth" source (one where you can't set + // a reply_to argument), we return. This is mostly web and API + // clients. + + if (!in_array($source, $lb)) { + return null; + } + + // Is there an initial @ or T? + + if (preg_match('/^T ([A-Z0-9]{1,64}) /', $content, $match) || + preg_match('/^@([a-z0-9]{1,64})\s+/', $content, $match)) { + $nickname = common_canonical_nickname($match[1]); + } else { + return null; + } + + // Figure out who that is. + + $sender = Profile::staticGet('id', $profile_id); + $recipient = common_relative_profile($sender, $nickname, common_sql_now()); + + if (empty($recipient)) { + return null; + } + + // Get their last notice + + $last = $recipient->getCurrentNotice(); + + if (!empty($last)) { + return $last->id; + } + } } From 6b48fd8f86cd4e6ee7309104bdb4e5b44b9b60c6 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 29 Jul 2009 15:33:09 -0400 Subject: [PATCH 031/423] move oEmbed router connection after plugins, so other endpoints (such as main/facebooklogin) from plugins don't get accidentally intercepted --- lib/router.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/router.php b/lib/router.php index 8e48364979..e10d484f4e 100644 --- a/lib/router.php +++ b/lib/router.php @@ -129,11 +129,6 @@ class Router $m->connect('index.php?action=' . $action, array('action' => $action)); } - $m->connect('main/:method', - array('action' => 'api', - 'method' => 'oembed(.xml|.json)?', - 'apiaction' => 'oembed')); - // settings foreach (array('profile', 'avatar', 'password', 'openid', 'im', @@ -480,6 +475,11 @@ class Router Event::handle('RouterInitialized', array($m)); + $m->connect('main/:method', + array('action' => 'api', + 'method' => 'oembed(.xml|.json)?', + 'apiaction' => 'oembed')); + return $m; } From 3350770cc7d4636fa1c0942ed01d5f26a5faa66a Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Tue, 28 Jul 2009 06:19:02 +0100 Subject: [PATCH 032/423] Use

    Cannot write directory:

    On your server, try this command: chmod a+w

    - Date: Tue, 28 Jul 2009 06:21:18 +0100 Subject: [PATCH 033/423] Pass $fancy to *_db_installer. --- install.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install.php b/install.php index 3346715990..c222afa7b5 100644 --- a/install.php +++ b/install.php @@ -219,9 +219,9 @@ function handlePost() } switch($dbtype) { - case 'mysql': mysql_db_installer($host, $database, $username, $password, $sitename); + case 'mysql': mysql_db_installer($host, $database, $username, $password, $sitename, $fancy); break; - case 'pgsql': pgsql_db_installer($host, $database, $username, $password, $sitename); + case 'pgsql': pgsql_db_installer($host, $database, $username, $password, $sitename, $fancy); break; default: } @@ -232,7 +232,7 @@ function handlePost() Date: Thu, 30 Jul 2009 00:20:13 +0000 Subject: [PATCH 034/423] Add new Foreign_link col to store OAuth access token --- classes/Foreign_link.php | 1 + classes/laconica.ini | 1 + db/laconica.sql | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index c0b356eced..a3a159eb54 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -14,6 +14,7 @@ class Foreign_link extends Memcached_DataObject public $foreign_id; // bigint(8) primary_key not_null unsigned public $service; // int(4) primary_key not_null public $credentials; // varchar(255) + public $token; // varchar(255) public $noticesync; // tinyint(1) not_null default_1 public $friendsync; // tinyint(1) not_null default_2 public $profilesync; // tinyint(1) not_null default_1 diff --git a/classes/laconica.ini b/classes/laconica.ini index 766bed75de..85d5f528d1 100644 --- a/classes/laconica.ini +++ b/classes/laconica.ini @@ -127,6 +127,7 @@ user_id = 129 foreign_id = 129 service = 129 credentials = 2 +token = 2 noticesync = 145 friendsync = 145 profilesync = 145 diff --git a/db/laconica.sql b/db/laconica.sql index 2c04f680a8..8b1152cbdc 100644 --- a/db/laconica.sql +++ b/db/laconica.sql @@ -291,7 +291,8 @@ create table foreign_link ( user_id int comment 'link to user on this system, if exists' references user (id), foreign_id bigint unsigned comment 'link to user on foreign service, if exists' references foreign_user(id), service int not null comment 'foreign key to service' references foreign_service(id), - credentials varchar(255) comment 'authc credentials, typically a password', + credentials varchar(255) comment 'auth credentials, typically a password or token secret', + token varchar(255) comment 'access token', noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies', friendsync tinyint not null default 2 comment 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', profilesync tinyint not null default 1 comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', From 63e8f15448ac2cfb5217ddd96bb95821b6f106c5 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Thu, 30 Jul 2009 00:12:18 +0100 Subject: [PATCH 035/423] /check-fancy now works when installed in root dir. --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 69c0bc1b23..a73983b595 100644 --- a/index.php +++ b/index.php @@ -108,7 +108,7 @@ function checkMirror($action_obj) function main() { // quick check for fancy URL auto-detection support in installer. - if (isset($_SERVER['REDIRECT_URL']) && ((dirname($_SERVER['REQUEST_URI']) . '/check-fancy') === $_SERVER['REDIRECT_URL'])) { + if (isset($_SERVER['REDIRECT_URL']) && (preg_replace("/^\/$/","",(dirname($_SERVER['REQUEST_URI']))) . '/check-fancy') === $_SERVER['REDIRECT_URL']) { die("Fancy URL support detection succeeded. We suggest you enable this to get fancy (pretty) URLs."); } global $user, $action; From cd9748ad563ac8a0cf6f00f9aa3cf825647d394f Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 30 Jul 2009 19:34:32 +0000 Subject: [PATCH 036/423] Attempt to reduce the number of calls to FB to speed things up --- plugins/FBConnect/FBConnectPlugin.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/FBConnect/FBConnectPlugin.php b/plugins/FBConnect/FBConnectPlugin.php index 2e32ad198f..6788793b25 100644 --- a/plugins/FBConnect/FBConnectPlugin.php +++ b/plugins/FBConnect/FBConnectPlugin.php @@ -122,9 +122,7 @@ class FBConnectPlugin extends Plugin FB_RequireFeatures( ["XFBML"], function() { - FB.init("%s", "../xd_receiver.html", - {"doNotUseCachedConnectState":true }); - + FB.init("%s", "../xd_receiver.html"); } ); } @@ -222,7 +220,7 @@ class FBConnectPlugin extends Plugin try { $facebook = getFacebook(); - $fbuid = $facebook->api_client->users_getLoggedInUser(); + $fbuid = $facebook->get_loggedin_user(); } catch (Exception $e) { common_log(LOG_WARNING, From 15848a815efa00d89c0daa7abf340ec899059f8f Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 30 Jul 2009 15:37:35 -0400 Subject: [PATCH 037/423] Fix the router entries for the oEmbed endpoint so they don't accidentally catch too much --- lib/router.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/router.php b/lib/router.php index e10d484f4e..19839b9972 100644 --- a/lib/router.php +++ b/lib/router.php @@ -113,6 +113,16 @@ class Router $m->connect('main/tagother/:id', array('action' => 'tagother')); + $m->connect('main/oembed.xml', + array('action' => 'api', + 'method' => 'oembed.xml', + 'apiaction' => 'oembed')); + + $m->connect('main/oembed.json', + array('action' => 'api', + 'method' => 'oembed.json', + 'apiaction' => 'oembed')); + // these take a code foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { @@ -475,11 +485,6 @@ class Router Event::handle('RouterInitialized', array($m)); - $m->connect('main/:method', - array('action' => 'api', - 'method' => 'oembed(.xml|.json)?', - 'apiaction' => 'oembed')); - return $m; } From ae81d361374641ce5cd73b353fae613711e145fe Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 30 Jul 2009 16:24:04 -0400 Subject: [PATCH 038/423] Site-wide design configuration I added some code so that the site-wide design can be set, using the configuration interface. I also moved the configuration option from $config['site']['design']['background'] to just $config['design']['background'], but the old syntax will still work. --- README | 17 ++++-- classes/Design.php | 92 +++++++++++++++++++++++++++------ config.php.sample | 16 +++--- lib/action.php | 28 ++++++++++ lib/common.php | 20 ++++--- lib/currentuserdesignaction.php | 37 ++++--------- lib/groupdesignaction.php | 30 +++-------- lib/ownerdesignaction.php | 31 +++-------- 8 files changed, 160 insertions(+), 111 deletions(-) diff --git a/README b/README index 0bf1319c6d..ef5a139346 100644 --- a/README +++ b/README @@ -964,9 +964,6 @@ sslserver: use an alternate server name for SSL URLs, like shorturllength: Length of URL at which URLs in a message exceeding 140 characters will be sent to the user's chosen shortening service. -design: a default design (colors and background) for the site. - Sub-items are: backgroundcolor, contentcolor, sidebarcolor, - textcolor, linkcolor, backgroundimage, disposition. dupelimit: minimum time allowed for one person to say the same thing twice. Default 60s. Anything lower is considered a user or UI error. @@ -1432,6 +1429,20 @@ notify third-party servers of updates. notify: an array of URLs for ping endpoints. Default is the empty array (no notification). +design +------ + +Default design (colors and background) for the site. Actual appearance +depends on the theme. Null values mean to use the theme defaults. + +backgroundcolor: Hex color of the site background. +contentcolor: Hex color of the content area background. +sidebarcolor: Hex color of the sidebar background. +textcolor: Hex color of all non-link text. +linkcolor: Hex color of all links. +backgroundimage: Image to use for the background. +disposition: Flags for whether or not to tile the background image. + Plugins ======= diff --git a/classes/Design.php b/classes/Design.php index 0927fcda70..43544f1c9d 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -55,26 +55,38 @@ class Design extends Memcached_DataObject function showCSS($out) { - try { + $css = ''; - $bgcolor = new WebColor($this->backgroundcolor); - $ccolor = new WebColor($this->contentcolor); - $sbcolor = new WebColor($this->sidebarcolor); - $tcolor = new WebColor($this->textcolor); - $lcolor = new WebColor($this->linkcolor); + $bgcolor = Design::toWebColor($this->backgroundcolor); - } catch (WebColorException $e) { - // This shouldn't happen - common_log(LOG_ERR, "Unable to create color for design $id.", - __FILE__); + if (!empty($bgcolor)) { + $css .= 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; } - $css = 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; - $css .= '#content, #site_nav_local_views .current a { background-color: #'; - $css .= $ccolor->hexValue() . '} '."\n"; - $css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; - $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; - $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; + $ccolor = Design::toWebColor($this->contentcolor); + + if (!empty($ccolor)) { + $css .= '#content, #site_nav_local_views .current a { background-color: #'; + $css .= $ccolor->hexValue() . '} '."\n"; + } + + $sbcolor = Design::toWebColor($this->sidebarcolor); + + if (!empty($sbcolor)) { + $css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; + } + + $tcolor = Design::toWebColor($this->textcolor); + + if (!empty($tcolor)) { + $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; + } + + $lcolor = Design::toWebColor($this->linkcolor); + + if (!empty($lcolor)) { + $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; + } if (!empty($this->backgroundimage) && $this->disposition & BACKGROUND_ON) { @@ -88,8 +100,25 @@ class Design extends Memcached_DataObject '); ' . $repeat . ' background-attachment:fixed; }' . "\n"; } - $out->element('style', array('type' => 'text/css'), $css); + if (0 != mb_strlen($css)) { + $out->element('style', array('type' => 'text/css'), $css); + } + } + static function toWebColor($color) + { + if (is_null($color)) { + return null; + } + + try { + return new WebColor($color); + } catch (WebColorException $e) { + // This shouldn't happen + common_log(LOG_ERR, "Unable to create color for design $id.", + __FILE__); + return null; + } } static function filename($id, $extension, $extra=null) @@ -152,4 +181,33 @@ class Design extends Memcached_DataObject } } + /** + * Return a design object based on the configured site design. + * + * @return Design a singleton design object for the site. + */ + + static function siteDesign() + { + static $siteDesign = null; + + if (empty($siteDesign)) { + + $siteDesign = new Design(); + + $attrs = array('backgroundcolor', + 'contentcolor', + 'sidebarcolor', + 'textcolor', + 'linkcolor', + 'backgroundimage', + 'disposition'); + + foreach ($attrs as $attr) { + $siteDesign->$attr = common_config('design', $attr); + } + } + + return $siteDesign; + } } diff --git a/config.php.sample b/config.php.sample index 36e62f70f2..c27645ff87 100644 --- a/config.php.sample +++ b/config.php.sample @@ -18,14 +18,14 @@ $config['site']['server'] = 'localhost'; $config['site']['path'] = 'laconica'; // $config['site']['fancy'] = false; // $config['site']['theme'] = 'default'; -// Sets the site's default design values (match it with the values in the theme) -// $config['site']['design']['backgroundcolor'] = '#F0F2F5'; -// $config['site']['design']['contentcolor'] = '#FFFFFF'; -// $config['site']['design']['sidebarcolor'] = '#CEE1E9'; -// $config['site']['design']['textcolor'] = '#000000'; -// $config['site']['design']['linkcolor'] = '#002E6E'; -// $config['site']['design']['backgroundimage'] = null; -// $config['site']['design']['disposition'] = 1; +// Sets the site's default design values +// $config['design']['backgroundcolor'] = '#F0F2F5'; +// $config['design']['contentcolor'] = '#FFFFFF'; +// $config['design']['sidebarcolor'] = '#CEE1E9'; +// $config['design']['textcolor'] = '#000000'; +// $config['design']['linkcolor'] = '#002E6E'; +// $config['design']['backgroundimage'] = null; +// $config['design']['disposition'] = 1; // To enable the built-in mobile style sheet, defaults to false. // $config['site']['mobile'] = true; // For contact email, defaults to $_SERVER["SERVER_ADMIN"] diff --git a/lib/action.php b/lib/action.php index 95ee10c642..a5244371a5 100644 --- a/lib/action.php +++ b/lib/action.php @@ -191,6 +191,7 @@ class Action extends HTMLOutputter // lawsuit function showStylesheets() { if (Event::handle('StartShowStyles', array($this))) { + if (Event::handle('StartShowLaconicaStyles', array($this))) { $this->element('link', array('rel' => 'stylesheet', 'type' => 'text/css', @@ -209,6 +210,7 @@ class Action extends HTMLOutputter // lawsuit 'media' => 'print')); Event::handle('EndShowLaconicaStyles', array($this)); } + if (Event::handle('StartShowUAStyles', array($this))) { $this->comment('[if IE]>viewdesigns) { + $design = $this->getDesign(); + + if (!empty($design)) { + $design->showCSS($this); + } + } + + Event::handle('EndShowDesign', array($this)); + } Event::handle('EndShowStyles', array($this)); } } @@ -1074,4 +1091,15 @@ class Action extends HTMLOutputter // lawsuit { return null; } + + /** + * A design for this action + * + * @return Design a design object to use + */ + + function getDesign() + { + return Design::siteDesign(); + } } diff --git a/lib/common.php b/lib/common.php index 9d7954fa98..b3d3018620 100644 --- a/lib/common.php +++ b/lib/common.php @@ -94,14 +94,6 @@ $config = array('name' => 'Just another Laconica microblog', 'server' => $_server, 'theme' => 'default', - 'design' => - array('backgroundcolor' => '#CEE1E9', - 'contentcolor' => '#FFFFFF', - 'sidebarcolor' => '#C8D1D5', - 'textcolor' => '#000000', - 'linkcolor' => '#002E6E', - 'backgroundimage' => null, - 'disposition' => 1), 'path' => $_path, 'logfile' => null, 'logo' => null, @@ -261,6 +253,14 @@ $config = 'sessions' => array('handle' => false, // whether to handle sessions ourselves 'debug' => false), // debugging output for sessions + 'design' => + array('backgroundcolor' => null, // null -> 'use theme default' + 'contentcolor' => null, + 'sidebarcolor' => null, + 'textcolor' => null, + 'linkcolor' => null, + 'backgroundimage' => null, + 'disposition' => null), ); $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options'); @@ -277,6 +277,10 @@ $config['db'] = 'quote_identifiers' => false, 'type' => 'mysql' ); +// Backward compatibility + +$config['site']['design'] =& $config['design']; + if (function_exists('date_default_timezone_set')) { /* Work internally in UTC */ date_default_timezone_set('UTC'); diff --git a/lib/currentuserdesignaction.php b/lib/currentuserdesignaction.php index 4c7e15a8b7..52516b624a 100644 --- a/lib/currentuserdesignaction.php +++ b/lib/currentuserdesignaction.php @@ -47,33 +47,10 @@ if (!defined('LACONICA')) { class CurrentUserDesignAction extends Action { - - /** - * Show the user's design stylesheet - * - * @return nothing - */ - - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * - * if the user attribute has been set, returns that user's - * design. + * Returns the design preferences for the current user. * * @return Design a design object to use */ @@ -82,11 +59,15 @@ class CurrentUserDesignAction extends Action { $cur = common_current_user(); - if (empty($cur)) { - return null; + if (!empty($cur)) { + + $design = $cur->getDesign(); + + if (!empty($design)) { + return $design; + } } - return $cur->getDesign(); + return parent::getDesign(); } - } diff --git a/lib/groupdesignaction.php b/lib/groupdesignaction.php index 58777c283a..c7cdff1fe9 100644 --- a/lib/groupdesignaction.php +++ b/lib/groupdesignaction.php @@ -49,26 +49,6 @@ class GroupDesignAction extends Action { /** The group in question */ var $group = null; - /** - * Show the groups's design stylesheet - * - * @return nothing - */ - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * @@ -80,10 +60,12 @@ class GroupDesignAction extends Action { function getDesign() { - if (empty($this->group)) { - return null; + if (!empty($this->group)) { + $design = $this->group->getDesign(); + if (!empty($design)) { + return $design; + } } - - return $this->group->getDesign(); + return parent::getDesign(); } } diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php index 785b8a93d3..b42df926d0 100644 --- a/lib/ownerdesignaction.php +++ b/lib/ownerdesignaction.php @@ -52,26 +52,6 @@ class OwnerDesignAction extends Action { var $user = null; - /** - * Show the owner's design stylesheet - * - * @return nothing - */ - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * @@ -83,10 +63,15 @@ class OwnerDesignAction extends Action { function getDesign() { - if (empty($this->user)) { - return null; + if (!empty($this->user)) { + + $design = $this->user->getDesign(); + + if (!empty($design)) { + return $design; + } } - return $this->user->getDesign(); + return parent::getDesign(); } } From 8371aea9c1320f8902465dea8cdf1d45a789a971 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 30 Jul 2009 16:38:50 -0400 Subject: [PATCH 039/423] remove debugging code about processing a new URL --- classes/File.php | 1 - 1 file changed, 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index 0c4fbf7e69..7f1e7881f8 100644 --- a/classes/File.php +++ b/classes/File.php @@ -93,7 +93,6 @@ class File extends Memcached_DataObject if (empty($file)) { $file_redir = File_redirection::staticGet('url', $given_url); if (empty($file_redir)) { - common_debug("processNew() '$given_url' not a known redirect.\n"); $redir_data = File_redirection::where($given_url); $redir_url = $redir_data['url']; if ($redir_url === $given_url) { From 80ad02610a428bef62b18e284e15ca847a435cde Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 30 Jul 2009 20:44:51 +0000 Subject: [PATCH 040/423] Removed default values from s. JavaScript will now get the colours from the theme. This approach removes data that was previously available in HTML. It was only necessary if the user wanted to know the site's default values. --- js/userdesign.go.js | 31 ++++++++++++++++++++++++++++++- lib/designsettings.php | 10 +++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/js/userdesign.go.js b/js/userdesign.go.js index dda86294ed..70dd9c7de7 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -7,6 +7,35 @@ * @link http://laconi.ca/ */ $(document).ready(function() { + function InitColors(i, E) { + switch (parseInt(E.id.slice(-1))) { + case 1: default: + $(E).val(rgb2hex($('body').css('background-color'))); + break; + case 2: + $(E).val(rgb2hex($('#content').css('background-color'))); + break; + case 3: + $(E).val(rgb2hex($('#aside_primary').css('background-color'))); + break; + case 4: + $(E).val(rgb2hex($('html body').css('color'))); + break; + case 5: + $(E).val(rgb2hex($('a').css('color'))); + break; + } + } + + function rgb2hex(rgb) { + rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + function hex(x) { + hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"); + return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; + } + return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); + } + function UpdateColors(S) { C = $(S).val(); switch (parseInt(S.id.slice(-1))) { @@ -55,7 +84,7 @@ $(document).ready(function() { f = $.farbtastic('#color-picker', SynchColors); swatches = $('#settings_design_color .swatch'); - + swatches.each(InitColors); swatches .each(SynchColors) .blur(function() { diff --git a/lib/designsettings.php b/lib/designsettings.php index fbffdb208f..1b0e621669 100644 --- a/lib/designsettings.php +++ b/lib/designsettings.php @@ -182,7 +182,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $bgcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $ccolor = new WebColor($design->contentcolor); @@ -195,7 +195,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $ccolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $sbcolor = new WebColor($design->sidebarcolor); @@ -208,7 +208,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $sbcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $tcolor = new WebColor($design->textcolor); @@ -221,7 +221,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $tcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $lcolor = new WebColor($design->linkcolor); @@ -234,7 +234,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $lcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); } catch (WebColorException $e) { From 3af5774769bd1a8193b4061c0b94ed867272c485 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 30 Jul 2009 16:55:09 -0400 Subject: [PATCH 041/423] throw an exception rather than die() --- classes/File.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index 7f1e7881f8..959301edae 100644 --- a/classes/File.php +++ b/classes/File.php @@ -113,7 +113,9 @@ class File extends Memcached_DataObject if (empty($x)) { $x = File::staticGet($file_id); - if (empty($x)) die('Impossible!'); + if (empty($x)) { + throw new ServerException("Robin thinks something is impossible."); + } } File_to_post::processNew($file_id, $notice_id); From 854d24b05a052bffe21f112b705d58c9abf126a9 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 30 Jul 2009 17:05:35 -0400 Subject: [PATCH 042/423] Site-wide design configuration I added some code so that the site-wide design can be set, using the configuration interface. I also moved the configuration option from $config['site']['design']['background'] to just $config['design']['background'], but the old syntax will still work. Conflicts: config.php.sample --- README | 17 ++++-- classes/Design.php | 92 +++++++++++++++++++++++++++------ config.php.sample | 8 +++ lib/action.php | 28 ++++++++++ lib/common.php | 20 ++++--- lib/currentuserdesignaction.php | 37 ++++--------- lib/groupdesignaction.php | 30 +++-------- lib/ownerdesignaction.php | 31 +++-------- 8 files changed, 160 insertions(+), 103 deletions(-) diff --git a/README b/README index 0214e49315..41c015d29b 100644 --- a/README +++ b/README @@ -961,9 +961,6 @@ sslserver: use an alternate server name for SSL URLs, like shorturllength: Length of URL at which URLs in a message exceeding 140 characters will be sent to the user's chosen shortening service. -design: a default design (colors and background) for the site. - Sub-items are: backgroundcolor, contentcolor, sidebarcolor, - textcolor, linkcolor, backgroundimage, disposition. dupelimit: minimum time allowed for one person to say the same thing twice. Default 60s. Anything lower is considered a user or UI error. @@ -1429,6 +1426,20 @@ notify third-party servers of updates. notify: an array of URLs for ping endpoints. Default is the empty array (no notification). +design +------ + +Default design (colors and background) for the site. Actual appearance +depends on the theme. Null values mean to use the theme defaults. + +backgroundcolor: Hex color of the site background. +contentcolor: Hex color of the content area background. +sidebarcolor: Hex color of the sidebar background. +textcolor: Hex color of all non-link text. +linkcolor: Hex color of all links. +backgroundimage: Image to use for the background. +disposition: Flags for whether or not to tile the background image. + Plugins ======= diff --git a/classes/Design.php b/classes/Design.php index 0927fcda70..43544f1c9d 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -55,26 +55,38 @@ class Design extends Memcached_DataObject function showCSS($out) { - try { + $css = ''; - $bgcolor = new WebColor($this->backgroundcolor); - $ccolor = new WebColor($this->contentcolor); - $sbcolor = new WebColor($this->sidebarcolor); - $tcolor = new WebColor($this->textcolor); - $lcolor = new WebColor($this->linkcolor); + $bgcolor = Design::toWebColor($this->backgroundcolor); - } catch (WebColorException $e) { - // This shouldn't happen - common_log(LOG_ERR, "Unable to create color for design $id.", - __FILE__); + if (!empty($bgcolor)) { + $css .= 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; } - $css = 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; - $css .= '#content, #site_nav_local_views .current a { background-color: #'; - $css .= $ccolor->hexValue() . '} '."\n"; - $css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; - $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; - $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; + $ccolor = Design::toWebColor($this->contentcolor); + + if (!empty($ccolor)) { + $css .= '#content, #site_nav_local_views .current a { background-color: #'; + $css .= $ccolor->hexValue() . '} '."\n"; + } + + $sbcolor = Design::toWebColor($this->sidebarcolor); + + if (!empty($sbcolor)) { + $css .= '#aside_primary { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; + } + + $tcolor = Design::toWebColor($this->textcolor); + + if (!empty($tcolor)) { + $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; + } + + $lcolor = Design::toWebColor($this->linkcolor); + + if (!empty($lcolor)) { + $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; + } if (!empty($this->backgroundimage) && $this->disposition & BACKGROUND_ON) { @@ -88,8 +100,25 @@ class Design extends Memcached_DataObject '); ' . $repeat . ' background-attachment:fixed; }' . "\n"; } - $out->element('style', array('type' => 'text/css'), $css); + if (0 != mb_strlen($css)) { + $out->element('style', array('type' => 'text/css'), $css); + } + } + static function toWebColor($color) + { + if (is_null($color)) { + return null; + } + + try { + return new WebColor($color); + } catch (WebColorException $e) { + // This shouldn't happen + common_log(LOG_ERR, "Unable to create color for design $id.", + __FILE__); + return null; + } } static function filename($id, $extension, $extra=null) @@ -152,4 +181,33 @@ class Design extends Memcached_DataObject } } + /** + * Return a design object based on the configured site design. + * + * @return Design a singleton design object for the site. + */ + + static function siteDesign() + { + static $siteDesign = null; + + if (empty($siteDesign)) { + + $siteDesign = new Design(); + + $attrs = array('backgroundcolor', + 'contentcolor', + 'sidebarcolor', + 'textcolor', + 'linkcolor', + 'backgroundimage', + 'disposition'); + + foreach ($attrs as $attr) { + $siteDesign->$attr = common_config('design', $attr); + } + } + + return $siteDesign; + } } diff --git a/config.php.sample b/config.php.sample index 57aa6a6c8c..c27645ff87 100644 --- a/config.php.sample +++ b/config.php.sample @@ -18,6 +18,14 @@ $config['site']['server'] = 'localhost'; $config['site']['path'] = 'laconica'; // $config['site']['fancy'] = false; // $config['site']['theme'] = 'default'; +// Sets the site's default design values +// $config['design']['backgroundcolor'] = '#F0F2F5'; +// $config['design']['contentcolor'] = '#FFFFFF'; +// $config['design']['sidebarcolor'] = '#CEE1E9'; +// $config['design']['textcolor'] = '#000000'; +// $config['design']['linkcolor'] = '#002E6E'; +// $config['design']['backgroundimage'] = null; +// $config['design']['disposition'] = 1; // To enable the built-in mobile style sheet, defaults to false. // $config['site']['mobile'] = true; // For contact email, defaults to $_SERVER["SERVER_ADMIN"] diff --git a/lib/action.php b/lib/action.php index 95ee10c642..a5244371a5 100644 --- a/lib/action.php +++ b/lib/action.php @@ -191,6 +191,7 @@ class Action extends HTMLOutputter // lawsuit function showStylesheets() { if (Event::handle('StartShowStyles', array($this))) { + if (Event::handle('StartShowLaconicaStyles', array($this))) { $this->element('link', array('rel' => 'stylesheet', 'type' => 'text/css', @@ -209,6 +210,7 @@ class Action extends HTMLOutputter // lawsuit 'media' => 'print')); Event::handle('EndShowLaconicaStyles', array($this)); } + if (Event::handle('StartShowUAStyles', array($this))) { $this->comment('[if IE]>viewdesigns) { + $design = $this->getDesign(); + + if (!empty($design)) { + $design->showCSS($this); + } + } + + Event::handle('EndShowDesign', array($this)); + } Event::handle('EndShowStyles', array($this)); } } @@ -1074,4 +1091,15 @@ class Action extends HTMLOutputter // lawsuit { return null; } + + /** + * A design for this action + * + * @return Design a design object to use + */ + + function getDesign() + { + return Design::siteDesign(); + } } diff --git a/lib/common.php b/lib/common.php index c47702779d..507a2a281f 100644 --- a/lib/common.php +++ b/lib/common.php @@ -94,14 +94,6 @@ $config = array('name' => 'Just another Laconica microblog', 'server' => $_server, 'theme' => 'default', - 'design' => - array('backgroundcolor' => '#CEE1E9', - 'contentcolor' => '#FFFFFF', - 'sidebarcolor' => '#C8D1D5', - 'textcolor' => '#000000', - 'linkcolor' => '#002E6E', - 'backgroundimage' => null, - 'disposition' => 1), 'path' => $_path, 'logfile' => null, 'logo' => null, @@ -261,6 +253,14 @@ $config = 'sessions' => array('handle' => false, // whether to handle sessions ourselves 'debug' => false), // debugging output for sessions + 'design' => + array('backgroundcolor' => null, // null -> 'use theme default' + 'contentcolor' => null, + 'sidebarcolor' => null, + 'textcolor' => null, + 'linkcolor' => null, + 'backgroundimage' => null, + 'disposition' => null), ); $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options'); @@ -277,6 +277,10 @@ $config['db'] = 'quote_identifiers' => false, 'type' => 'mysql' ); +// Backward compatibility + +$config['site']['design'] =& $config['design']; + if (function_exists('date_default_timezone_set')) { /* Work internally in UTC */ date_default_timezone_set('UTC'); diff --git a/lib/currentuserdesignaction.php b/lib/currentuserdesignaction.php index 4c7e15a8b7..52516b624a 100644 --- a/lib/currentuserdesignaction.php +++ b/lib/currentuserdesignaction.php @@ -47,33 +47,10 @@ if (!defined('LACONICA')) { class CurrentUserDesignAction extends Action { - - /** - * Show the user's design stylesheet - * - * @return nothing - */ - - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * - * if the user attribute has been set, returns that user's - * design. + * Returns the design preferences for the current user. * * @return Design a design object to use */ @@ -82,11 +59,15 @@ class CurrentUserDesignAction extends Action { $cur = common_current_user(); - if (empty($cur)) { - return null; + if (!empty($cur)) { + + $design = $cur->getDesign(); + + if (!empty($design)) { + return $design; + } } - return $cur->getDesign(); + return parent::getDesign(); } - } diff --git a/lib/groupdesignaction.php b/lib/groupdesignaction.php index 58777c283a..c7cdff1fe9 100644 --- a/lib/groupdesignaction.php +++ b/lib/groupdesignaction.php @@ -49,26 +49,6 @@ class GroupDesignAction extends Action { /** The group in question */ var $group = null; - /** - * Show the groups's design stylesheet - * - * @return nothing - */ - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * @@ -80,10 +60,12 @@ class GroupDesignAction extends Action { function getDesign() { - if (empty($this->group)) { - return null; + if (!empty($this->group)) { + $design = $this->group->getDesign(); + if (!empty($design)) { + return $design; + } } - - return $this->group->getDesign(); + return parent::getDesign(); } } diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php index 785b8a93d3..b42df926d0 100644 --- a/lib/ownerdesignaction.php +++ b/lib/ownerdesignaction.php @@ -52,26 +52,6 @@ class OwnerDesignAction extends Action { var $user = null; - /** - * Show the owner's design stylesheet - * - * @return nothing - */ - function showStylesheets() - { - parent::showStylesheets(); - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - } - /** * A design for this action * @@ -83,10 +63,15 @@ class OwnerDesignAction extends Action { function getDesign() { - if (empty($this->user)) { - return null; + if (!empty($this->user)) { + + $design = $this->user->getDesign(); + + if (!empty($design)) { + return $design; + } } - return $this->user->getDesign(); + return parent::getDesign(); } } From d5cc1357fdc90c70b0a71a04f9448abf558c3f94 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 30 Jul 2009 17:06:03 -0400 Subject: [PATCH 043/423] don't ignore config.php.sample --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f4c2bba5f7..5394f5eac5 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ config-*.php good-config.php lac08.log php.log -config.php.* + From 77c5f9481c5cf1cc548c73c71bd4723001d912f5 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 30 Jul 2009 20:44:51 +0000 Subject: [PATCH 044/423] Removed default values from s. JavaScript will now get the colours from the theme. This approach removes data that was previously available in HTML. It was only necessary if the user wanted to know the site's default values. --- js/userdesign.go.js | 31 ++++++++++++++++++++++++++++++- lib/designsettings.php | 10 +++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/js/userdesign.go.js b/js/userdesign.go.js index dda86294ed..70dd9c7de7 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -7,6 +7,35 @@ * @link http://laconi.ca/ */ $(document).ready(function() { + function InitColors(i, E) { + switch (parseInt(E.id.slice(-1))) { + case 1: default: + $(E).val(rgb2hex($('body').css('background-color'))); + break; + case 2: + $(E).val(rgb2hex($('#content').css('background-color'))); + break; + case 3: + $(E).val(rgb2hex($('#aside_primary').css('background-color'))); + break; + case 4: + $(E).val(rgb2hex($('html body').css('color'))); + break; + case 5: + $(E).val(rgb2hex($('a').css('color'))); + break; + } + } + + function rgb2hex(rgb) { + rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + function hex(x) { + hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"); + return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; + } + return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); + } + function UpdateColors(S) { C = $(S).val(); switch (parseInt(S.id.slice(-1))) { @@ -55,7 +84,7 @@ $(document).ready(function() { f = $.farbtastic('#color-picker', SynchColors); swatches = $('#settings_design_color .swatch'); - + swatches.each(InitColors); swatches .each(SynchColors) .blur(function() { diff --git a/lib/designsettings.php b/lib/designsettings.php index fbffdb208f..1b0e621669 100644 --- a/lib/designsettings.php +++ b/lib/designsettings.php @@ -182,7 +182,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $bgcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $ccolor = new WebColor($design->contentcolor); @@ -195,7 +195,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $ccolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $sbcolor = new WebColor($design->sidebarcolor); @@ -208,7 +208,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $sbcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $tcolor = new WebColor($design->textcolor); @@ -221,7 +221,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $tcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); $lcolor = new WebColor($design->linkcolor); @@ -234,7 +234,7 @@ class DesignSettingsAction extends AccountSettingsAction 'class' => 'swatch', 'maxlength' => '7', 'size' => '7', - 'value' => '#' . $lcolor->hexValue())); + 'value' => '')); $this->elementEnd('li'); } catch (WebColorException $e) { From ec103b90e39c20bfdc2f5663e35eae8b1df212e9 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 30 Jul 2009 22:15:24 -0400 Subject: [PATCH 045/423] Implemented the "show" method of the laconica groups api --- actions/api.php | 1 + actions/twitapigroups.php | 26 +++++++++++++++++++++++ lib/twitterapi.php | 44 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/actions/api.php b/actions/api.php index 8b92889f8a..99ab262ad7 100644 --- a/actions/api.php +++ b/actions/api.php @@ -130,6 +130,7 @@ class ApiAction extends Action 'laconica/wadl', 'tags/timeline', 'oembed/oembed', + 'groups/show', 'groups/timeline'); static $bareauth = array('statuses/user_timeline', diff --git a/actions/twitapigroups.php b/actions/twitapigroups.php index 71a0776f46..f899bc3698 100644 --- a/actions/twitapigroups.php +++ b/actions/twitapigroups.php @@ -51,6 +51,32 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; class TwitapigroupsAction extends TwitterapiAction { + function show($args, $apidata) + { + parent::handle($args); + + common_debug("in groups api action"); + + $this->auth_user = $apidata['user']; + $group = $this->get_group($apidata['api_arg'], $apidata); + + if (empty($group)) { + $this->clientError('Not Found', 404, $apidata['content-type']); + return; + } + + switch($apidata['content-type']) { + case 'xml': + $this->show_single_xml_group($group); + break; + case 'json': + $this->show_single_json_group($group); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + } + } + function timeline($args, $apidata) { parent::handle($args); diff --git a/lib/twitterapi.php b/lib/twitterapi.php index b2602e77ca..2f969f2baf 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -213,6 +213,25 @@ class TwitterapiAction extends Action return $twitter_status; } + function twitter_group_array($group) + { + $twitter_group=array(); + $twitter_group['id']=$group->id; + $twitter_group['nickname']=$group->nickname; + $twitter_group['fullname']=$group->fullname; + $twitter_group['url']=$group->url; + $twitter_group['original_logo']=$group->original_logo; + $twitter_group['homepage_logo']=$group->homepage_logo; + $twitter_group['stream_logo']=$group->stream_logo; + $twitter_group['mini_logo']=$group->mini_logo; + $twitter_group['homepage']=$group->homepage; + $twitter_group['description']=$group->description; + $twitter_group['location']=$group->location; + $twitter_group['created']=$this->date_twitter($group->created); + $twitter_group['modified']=$this->date_twitter($group->modified); + return $twitter_group; + } + function twitter_rss_entry_array($notice) { $profile = $notice->getProfile(); @@ -413,6 +432,15 @@ class TwitterapiAction extends Action $this->elementEnd('status'); } + function show_twitter_xml_group($twitter_group) + { + $this->elementStart('group'); + foreach($twitter_group as $element => $value) { + $this->element($element, null, $value); + } + $this->elementEnd('group'); + } + function show_twitter_xml_user($twitter_user, $role='user') { $this->elementStart($role); @@ -639,6 +667,22 @@ class TwitterapiAction extends Action $this->end_document('json'); } + function show_single_json_group($group) + { + $this->init_document('json'); + $twitter_group = $this->twitter_group_array($group); + $this->show_json_objects($twitter_group); + $this->end_document('json'); + } + + function show_single_xml_group($group) + { + $this->init_document('xml'); + $twitter_group = $this->twitter_group_array($group); + $this->show_twitter_xml_group($twitter_group); + $this->end_document('xml'); + } + // Anyone know what date format this is? // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach function date_twitter($dt) From 45ad4cfe7253d1cd2da219378fd714644c906f53 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 30 Jul 2009 22:43:07 -0400 Subject: [PATCH 046/423] Added a url field to hold the permalink. I believe this field is very useful for api consumers. --- lib/twitterapi.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/twitterapi.php b/lib/twitterapi.php index 2f969f2baf..e6af33e828 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -217,9 +217,10 @@ class TwitterapiAction extends Action { $twitter_group=array(); $twitter_group['id']=$group->id; + $twitter_group['url']=$group->permalink(); $twitter_group['nickname']=$group->nickname; $twitter_group['fullname']=$group->fullname; - $twitter_group['url']=$group->url; + $twitter_group['homepage_url']=$group->homepage_url; $twitter_group['original_logo']=$group->original_logo; $twitter_group['homepage_logo']=$group->homepage_logo; $twitter_group['stream_logo']=$group->stream_logo; From 5f3af3e121a7ff06f5961bb4158e0b777ce5b5c1 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 31 Jul 2009 19:31:23 +0000 Subject: [PATCH 047/423] Added credit to rgb2hex() author --- js/userdesign.go.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/userdesign.go.js b/js/userdesign.go.js index 70dd9c7de7..4416dc8aee 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -27,6 +27,7 @@ $(document).ready(function() { } } + /* rgb2hex written by R0bb13 */ function rgb2hex(rgb) { rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); function hex(x) { From 6f4b2f0ac2f235332c850b050d9e4563fc71f89d Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sat, 1 Aug 2009 08:20:44 +0000 Subject: [PATCH 048/423] Twitter OAuth server dance working --- actions/twitterauthorization.php | 136 +++++++++++++++++++++++++++++++ actions/twittersettings.php | 111 ++++++++++++------------- lib/common.php | 3 + lib/router.php | 4 + lib/twitteroauthclient.php | 109 +++++++++++++++++++++++++ 5 files changed, 302 insertions(+), 61 deletions(-) create mode 100644 actions/twitterauthorization.php create mode 100644 lib/twitteroauthclient.php diff --git a/actions/twitterauthorization.php b/actions/twitterauthorization.php new file mode 100644 index 0000000000..f19cd7f653 --- /dev/null +++ b/actions/twitterauthorization.php @@ -0,0 +1,136 @@ +. + * + * @category TwitterauthorizationAction + * @package Laconica + * @author Zach Copely + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +class TwitterauthorizationAction extends Action +{ + + function prepare($args) + { + parent::prepare($args); + + $this->oauth_token = $this->arg('oauth_token'); + + return true; + } + + function handle($args) + { + parent::handle($args); + + if (!common_logged_in()) { + $this->clientError(_('Not logged in.'), 403); + } + + $user = common_current_user(); + $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); + + // If there's already a foreign link record, it means we already + // have an access token, and this is unecessary. So go back. + + if (isset($flink)) { + common_redirect(common_local_url('twittersettings')); + } + + // $this->oauth_token is only populated once Twitter authorizes our + // request token. If it's empty we're at the beginning of the auth + // process + + if (empty($this->oauth_token)) { + + // Get a new request token and authorize it + + $client = new TwitterOAuthClient(); + $req_tok = $client->getRequestToken(); + + // Sock the request token away in the session temporarily + + $_SESSION['twitter_request_token'] = $req_tok->key; + $_SESSION['twitter_request_token_secret'] = $req_tok->key; + + $auth_link = $client->getAuthorizeLink($req_tok); + common_redirect($auth_link); + + } else { + + // Check to make sure Twitter sent us the same request token we sent + + if ($_SESSION['twitter_request_token'] != $this->oauth_token) { + $this->serverError(_('Couldn\'t link your Twitter account.')); + } + + $client = new TwitterOAuthClient($_SESSION['twitter_request_token'], + $_SESSION['twitter_request_token_secret']); + + // Exchange the request token for an access token + + $atok = $client->getAccessToken(); + + // Save the access token and Twitter user info + + $client = new TwitterOAuthClient($atok->key, $atok->secret); + + $twitter_user = $client->verify_credentials(); + + $user = common_current_user(); + + $flink = new Foreign_link(); + + $flink->user_id = $user->id; + $flink->foreign_id = $twitter_user->id; + $flink->service = TWITTER_SERVICE; + $flink->token = $atok->key; + $flink->credentials = $atok->secret; + $flink->created = common_sql_now(); + + $flink->set_flags(true, false, false, false); + + $flink_id = $flink->insert(); + + if (empty($flink_id)) { + common_log_db_error($flink, 'INSERT', __FILE__); + $this->serverError(_('Couldn\'t link your Twitter account.')); + } + + save_twitter_user($twitter_user->id, $twitter_user->screen_name); + + // clean up the the mess we made in the session + + unset($_SESSION['twitter_request_token']); + unset($_SESSION['twitter_request_token_secret']); + + common_redirect(common_local_url('twittersettings')); + } + } + +} + diff --git a/actions/twittersettings.php b/actions/twittersettings.php index 2b742788ee..acc9fb935f 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -69,9 +69,8 @@ class TwittersettingsAction extends ConnectSettingsAction function getInstructions() { - return _('Add your Twitter account to automatically send '. - ' your notices to Twitter, ' . - 'and subscribe to Twitter friends already here.'); + return _('Connect your Twitter account to share your updates ' . + 'with your Twitter friends and vice-versa.'); } /** @@ -93,7 +92,7 @@ class TwittersettingsAction extends ConnectSettingsAction $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); - if ($flink) { + if (!empty($flink)) { $fuser = $flink->getForeignUser(); } @@ -102,73 +101,61 @@ class TwittersettingsAction extends ConnectSettingsAction 'class' => 'form_settings', 'action' => common_local_url('twittersettings'))); - $this->elementStart('fieldset', array('id' => 'settings_twitter_account')); - $this->element('legend', null, _('Twitter Account')); + $this->hidden('token', common_session_token()); - if ($fuser) { + + + if (empty($fuser)) { + + $this->elementStart('fieldset', array('id' => 'settings_twitter_account')); $this->elementStart('ul', 'form_data'); - $this->elementStart('li', array('id' => 'settings_twitter_remove')); - $this->element('span', 'twitter_user', $fuser->nickname); - $this->element('a', array('href' => $fuser->uri), $fuser->uri); - $this->element('p', 'form_note', - _('Current verified Twitter account.')); - $this->hidden('flink_foreign_id', $flink->foreign_id); - $this->elementEnd('li'); + $this->elementStart('li', array('id' => 'settings_twitter_login_button')); + $this->element('a', array('href' => common_local_url('twitterauthorization')), + 'Connect my Twitter account'); + $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('remove', _('Remove')); + $this->elementEnd('fieldset'); + } else { + + $this->elementStart('fieldset', + array('id' => 'settings_twitter_preferences')); + $this->element('legend', null, _('Preferences')); + $this->elementStart('ul', 'form_data'); - $this->elementStart('li', array('id' => 'settings_twitter_login')); - $this->input('twitter_username', _('Twitter user name'), - ($this->arg('twitter_username')) ? - $this->arg('twitter_username') : - $profile->nickname, - _('No spaces, please.')); // hey, it's what Twitter says + $this->elementStart('li'); + $this->checkbox('noticesend', + _('Automatically send my notices to Twitter.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_SEND) : + true); $this->elementEnd('li'); $this->elementStart('li'); - $this->password('twitter_password', _('Twitter password')); - $this->elementend('li'); - $this->elementEnd('ul'); - } - $this->elementEnd('fieldset'); + $this->checkbox('replysync', + _('Send local "@" replies to Twitter.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : + true); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->checkbox('friendsync', + _('Subscribe to my Twitter friends here.'), + ($flink) ? + ($flink->friendsync & FOREIGN_FRIEND_RECV) : + false); + $this->elementEnd('li'); - $this->elementStart('fieldset', - array('id' => 'settings_twitter_preferences')); - $this->element('legend', null, _('Preferences')); - - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - $this->checkbox('noticesend', - _('Automatically send my notices to Twitter.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_SEND) : - true); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->checkbox('replysync', - _('Send local "@" replies to Twitter.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : - true); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->checkbox('friendsync', - _('Subscribe to my Twitter friends here.'), - ($flink) ? - ($flink->friendsync & FOREIGN_FRIEND_RECV) : - false); - $this->elementEnd('li'); - - if (common_config('twitterbridge','enabled')) { + if (common_config('twitterbridge','enabled')) { $this->elementStart('li'); $this->checkbox('noticerecv', - _('Import my Friends Timeline.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_RECV) : - false); + _('Import my Friends Timeline.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_RECV) : + false); $this->elementEnd('li'); - } else { + // preserve setting even if bidrection bridge toggled off + if ($flink && ($flink->noticesync & FOREIGN_NOTICE_RECV)) { $this->hidden('noticerecv', true, 'noticerecv'); } @@ -181,11 +168,13 @@ class TwittersettingsAction extends ConnectSettingsAction } else { $this->submit('add', _('Add')); } + $this->elementEnd('fieldset'); + } - $this->showTwitterSubscriptions(); + $this->showTwitterSubscriptions(); - $this->elementEnd('form'); + $this->elementEnd('form'); } /** diff --git a/lib/common.php b/lib/common.php index 9d7954fa98..f9ac66f4f0 100644 --- a/lib/common.php +++ b/lib/common.php @@ -196,6 +196,9 @@ $config = 'integration' => array('source' => 'Laconica', # source attribute for Twitter 'taguri' => $_server.',2009'), # base for tag URIs + 'twitter' => + array('consumer_key' => null, + 'consumer_secret' => null), 'memcached' => array('enabled' => false, 'server' => 'localhost', diff --git a/lib/router.php b/lib/router.php index e10d484f4e..582dfae6d7 100644 --- a/lib/router.php +++ b/lib/router.php @@ -88,6 +88,10 @@ class Router $m->connect('doc/:title', array('action' => 'doc')); + // Twitter + + $m->connect('twitter/authorization', array('action' => 'twitterauthorization')); + // facebook $m->connect('facebook', array('action' => 'facebookhome')); diff --git a/lib/twitteroauthclient.php b/lib/twitteroauthclient.php new file mode 100644 index 0000000000..616fbc2134 --- /dev/null +++ b/lib/twitteroauthclient.php @@ -0,0 +1,109 @@ +sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); + $consumer_key = common_config('twitter', 'consumer_key'); + $consumer_secret = common_config('twitter', 'consumer_secret'); + $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); + $this->token = null; + + if (isset($oauth_token) && isset($oauth_token_secret)) { + $this->token = new OAuthToken($oauth_token, $oauth_token_secret); + } + } + + function getRequestToken() + { + $response = $this->oAuthGet(TwitterOAuthClient::$requestTokenURL); + parse_str($response); + $token = new OAuthToken($oauth_token, $oauth_token_secret); + return $token; + } + + function getAuthorizeLink($request_token) + { + // Not sure Twitter actually looks at oauth_callback + + return TwitterOAuthClient::$authorizeURL . + '?oauth_token=' . $request_token->key . '&oauth_callback=' . + urlencode(common_local_url('twitterauthorization')); + } + + function getAccessToken() + { + $response = $this->oAuthPost(TwitterOAuthClient::$accessTokenURL); + parse_str($response); + $token = new OAuthToken($oauth_token, $oauth_token_secret); + return $token; + } + + function verify_credentials() + { + $url = 'https://twitter.com/account/verify_credentials.json'; + $response = $this->oAuthGet($url); + $twitter_user = json_decode($response); + return $twitter_user; + } + + function oAuthGet($url) + { + $request = OAuthRequest::from_consumer_and_token($this->consumer, + $this->token, 'GET', $url, null); + $request->sign_request($this->sha1_method, + $this->consumer, $this->token); + + return $this->httpRequest($request->to_url()); + } + + function oAuthPost($url, $params = null) + { + $request = OAuthRequest::from_consumer_and_token($this->consumer, + $this->token, 'POST', $url, $params); + $request->sign_request($this->sha1_method, + $this->consumer, $this->token); + + return $this->httpRequest($request->get_normalized_http_url(), + $request->to_postdata()); + } + + function httpRequest($url, $params = null) + { + $options = array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true, + CURLOPT_HEADER => false, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_USERAGENT => 'Laconica', + CURLOPT_CONNECTTIMEOUT => 120, + CURLOPT_TIMEOUT => 120, + CURLOPT_HTTPAUTH => CURLAUTH_ANY, + CURLOPT_SSL_VERIFYPEER => false, + + // Twitter is strict about accepting invalid "Expect" headers + + CURLOPT_HTTPHEADER => array('Expect:') + ); + + if (isset($params)) { + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = $params; + } + + $ch = curl_init($url); + curl_setopt_array($ch, $options); + $response = curl_exec($ch); + curl_close($ch); + + return $response; + } + +} From b2d2b19d3a8fae84e1bc6532661c71ac180eceec Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Sun, 2 Aug 2009 19:36:09 +0800 Subject: [PATCH 049/423] Fixed PHP Notice "Use of undefined constant session_name - assumed 'session_name'" --- lib/util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index d784bb7933..db794181ca 100644 --- a/lib/util.php +++ b/lib/util.php @@ -140,7 +140,7 @@ function common_have_session() function common_ensure_session() { $c = null; - if (array_key_exists(session_name, $_COOKIE)) { + if (array_key_exists(session_name(), $_COOKIE)) { $c = $_COOKIE[session_name()]; } if (!common_have_session()) { From 6c1bd6759127968908a0d7f179447a7a6f653d17 Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Sun, 2 Aug 2009 19:38:03 +0800 Subject: [PATCH 050/423] Fixed PHP Notice "Undefined index: enclosures" (and a possible one for 'tags') --- lib/twitterapi.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/twitterapi.php b/lib/twitterapi.php index e6af33e828..4115d9dcb4 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -479,12 +479,12 @@ class TwitterapiAction extends Action $this->element('link', null, $entry['link']); # RSS only supports 1 enclosure per item - if($entry['enclosures']){ + if(array_key_exists('enclosures', $entry) and !empty($entry['enclosures'])){ $enclosure = $entry['enclosures'][0]; $this->element('enclosure', array('url'=>$enclosure['url'],'type'=>$enclosure['mimetype'],'length'=>$enclosure['size']), null); } - if($entry['tags']){ + if(array_key_exists('tags', $entry)){ foreach($entry['tags'] as $tag){ $this->element('category', null,$tag); } From fe57e2e06b3ae5e7eb9001a0ffe80d9a7d20a5be Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Sun, 2 Aug 2009 19:47:36 +0800 Subject: [PATCH 051/423] Fixed PHP Notice "Undefined variable: suplink" --- actions/twitapigroups.php | 5 ++--- actions/twitapitags.php | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/actions/twitapigroups.php b/actions/twitapigroups.php index f899bc3698..82604ebff2 100644 --- a/actions/twitapigroups.php +++ b/actions/twitapigroups.php @@ -114,8 +114,7 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; $this->show_xml_timeline($notice); break; case 'rss': - $this->show_rss_timeline($notice, $title, $link, - $subtitle, $suplink); + $this->show_rss_timeline($notice, $title, $link, $subtitle); break; case 'atom': if (isset($apidata['api_arg'])) { @@ -127,7 +126,7 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; 'api/laconica/groups/timeline.atom'; } $this->show_atom_timeline($notice, $title, $id, $link, - $subtitle, $suplink, $selfuri); + $subtitle, null, $selfuri); break; case 'json': $this->show_json_timeline($notice); diff --git a/actions/twitapitags.php b/actions/twitapitags.php index 5c85275302..e19e1b1ed6 100644 --- a/actions/twitapitags.php +++ b/actions/twitapitags.php @@ -88,8 +88,7 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; $this->show_xml_timeline($notice); break; case 'rss': - $this->show_rss_timeline($notice, $title, $link, - $subtitle, $suplink); + $this->show_rss_timeline($notice, $title, $link, $subtitle); break; case 'atom': if (isset($apidata['api_arg'])) { @@ -101,7 +100,7 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; 'api/laconica/tags/timeline.atom'; } $this->show_atom_timeline($notice, $title, $id, $link, - $subtitle, $suplink, $selfuri); + $subtitle, null, $selfuri); break; case 'json': $this->show_json_timeline($notice); From 20c536fdd461c8f39dd6a03751b534a996a94078 Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Sun, 2 Aug 2009 19:52:27 +0800 Subject: [PATCH 052/423] Fixed PHP Notice "Undefined variable: cnt" --- actions/conversation.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/actions/conversation.php b/actions/conversation.php index c8755ba6ef..6b5d8d54d9 100644 --- a/actions/conversation.php +++ b/actions/conversation.php @@ -167,6 +167,8 @@ class ConversationTree extends NoticeList function _buildTree() { + $cnt = 0; + $this->tree = array(); $this->table = array(); From e670e4306bf3e0e7e90523bcbfa2eb8060f4ed67 Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Sun, 2 Aug 2009 20:10:31 +0800 Subject: [PATCH 053/423] Fixed PHP Notices: Undefined index: HTTP_X_FORWARDED_FOR Undefined index: HTTP_CLIENT_IP Undefined variable: proxy Also fixed the return value order to match calls to common_client_ip() in actions/api.php and lib/rssaction.php --- lib/util.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/util.php b/lib/util.php index db794181ca..c8e318efec 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1410,20 +1410,21 @@ function common_client_ip() return null; } - if ($_SERVER['HTTP_X_FORWARDED_FOR']) { - if ($_SERVER['HTTP_CLIENT_IP']) { + if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) { + if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) { $proxy = $_SERVER['HTTP_CLIENT_IP']; } else { $proxy = $_SERVER['REMOTE_ADDR']; } $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { - if ($_SERVER['HTTP_CLIENT_IP']) { + $proxy = null; + if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) { $ip = $_SERVER['HTTP_CLIENT_IP']; } else { $ip = $_SERVER['REMOTE_ADDR']; } } - return array($ip, $proxy); + return array($proxy, $ip); } From 34e8b25ceef890c0d1e41b75696b19e8b53db960 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 2 Aug 2009 10:34:23 -0400 Subject: [PATCH 054/423] GC sessions one by one to make sure memcached gets cleared --- classes/Session.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/classes/Session.php b/classes/Session.php index ac80279c5e..a92ce405b5 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -110,9 +110,18 @@ class Session extends Memcached_DataObject $session = new Session(); $session->whereAdd('modified < "'.$epoch.'"'); - $result = $session->delete(DB_DATAOBJECT_WHEREADD_ONLY); - self::logdeb("garbage collection result = $result"); + $session->find(); + + while ($session->fetch()) { + $other = new Session(); + $other->id = $session->id; + self::logdeb("Collecting session $other->id"); + $result = $other->delete(); + self::logdeb("garbage collection result = $result"); + } + + $session->free(); } static function setSaveHandler() From 2934099fbd17281ed00055af654aa5b813d535a2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 2 Aug 2009 10:34:40 -0400 Subject: [PATCH 055/423] A script to GC sessions correctly --- scripts/sessiongc.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 scripts/sessiongc.php diff --git a/scripts/sessiongc.php b/scripts/sessiongc.php new file mode 100644 index 0000000000..314b641eb9 --- /dev/null +++ b/scripts/sessiongc.php @@ -0,0 +1,36 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$helptext = << Date: Sun, 2 Aug 2009 10:34:23 -0400 Subject: [PATCH 056/423] GC sessions one by one to make sure memcached gets cleared --- classes/Session.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/classes/Session.php b/classes/Session.php index ac80279c5e..a92ce405b5 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -110,9 +110,18 @@ class Session extends Memcached_DataObject $session = new Session(); $session->whereAdd('modified < "'.$epoch.'"'); - $result = $session->delete(DB_DATAOBJECT_WHEREADD_ONLY); - self::logdeb("garbage collection result = $result"); + $session->find(); + + while ($session->fetch()) { + $other = new Session(); + $other->id = $session->id; + self::logdeb("Collecting session $other->id"); + $result = $other->delete(); + self::logdeb("garbage collection result = $result"); + } + + $session->free(); } static function setSaveHandler() From f342db586d2d95035c53581bebba66eb7e7f7eec Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 2 Aug 2009 10:34:40 -0400 Subject: [PATCH 057/423] A script to GC sessions correctly --- scripts/sessiongc.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 scripts/sessiongc.php diff --git a/scripts/sessiongc.php b/scripts/sessiongc.php new file mode 100644 index 0000000000..314b641eb9 --- /dev/null +++ b/scripts/sessiongc.php @@ -0,0 +1,36 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$helptext = << Date: Sun, 2 Aug 2009 11:18:41 -0400 Subject: [PATCH 058/423] don't delete during select --- classes/Session.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/classes/Session.php b/classes/Session.php index a92ce405b5..5ec509f5f9 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -108,20 +108,24 @@ class Session extends Memcached_DataObject $epoch = common_sql_date(time() - $maxlifetime); + $ids = array(); + $session = new Session(); $session->whereAdd('modified < "'.$epoch.'"'); + $session->selectAdd(); + $session->selectAdd('id'); $session->find(); while ($session->fetch()) { - $other = new Session(); - $other->id = $session->id; - self::logdeb("Collecting session $other->id"); - $result = $other->delete(); - self::logdeb("garbage collection result = $result"); + $ids[] = $session->id; } $session->free(); + + foreach ($ids as $id) { + self::destroy($id); + } } static function setSaveHandler() From b27af3247d4e0a13a1cd8b29e3938e8d81fa3d22 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 2 Aug 2009 11:18:41 -0400 Subject: [PATCH 059/423] don't delete during select --- classes/Session.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/classes/Session.php b/classes/Session.php index a92ce405b5..5ec509f5f9 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -108,20 +108,24 @@ class Session extends Memcached_DataObject $epoch = common_sql_date(time() - $maxlifetime); + $ids = array(); + $session = new Session(); $session->whereAdd('modified < "'.$epoch.'"'); + $session->selectAdd(); + $session->selectAdd('id'); $session->find(); while ($session->fetch()) { - $other = new Session(); - $other->id = $session->id; - self::logdeb("Collecting session $other->id"); - $result = $other->delete(); - self::logdeb("garbage collection result = $result"); + $ids[] = $session->id; } $session->free(); + + foreach ($ids as $id) { + self::destroy($id); + } } static function setSaveHandler() From 92ef468fcc5adf6e9445b3b80b87fdc8e55896dd Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Mon, 3 Aug 2009 11:47:58 -0400 Subject: [PATCH 060/423] Use the same favorite notification function in the API as everywhere else http://laconi.ca/trac/ticket/873 --- actions/twitapifavorites.php | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/actions/twitapifavorites.php b/actions/twitapifavorites.php index 8256668f3d..6f93610650 100644 --- a/actions/twitapifavorites.php +++ b/actions/twitapifavorites.php @@ -207,32 +207,10 @@ class TwitapifavoritesAction extends TwitterapiAction $other = User::staticGet('id', $notice->profile_id); if ($other && $other->id != $user->id) { if ($other->email && $other->emailnotifyfav) { - $this->notify_mail($other, $user, $notice); + mail_notify_fave($other, $user, $notice); } # XXX: notify by IM # XXX: notify by SMS } } - - function notify_mail($other, $user, $notice) - { - $profile = $user->getProfile(); - $bestname = $profile->getBestName(); - $subject = sprintf(_('%s added your notice as a favorite'), $bestname); - $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" . - "In case you forgot, you can see the text of your notice here:\n\n" . - "%3\$s\n\n" . - "You can see the list of %1\$s's favorites here:\n\n" . - "%4\$s\n\n" . - "Faithfully yours,\n" . - "%5\$s\n"), - $bestname, - common_exact_date($notice->created), - common_local_url('shownotice', array('notice' => $notice->id)), - common_local_url('showfavorites', array('nickname' => $user->nickname)), - common_config('site', 'name')); - - mail_to_user($other, $subject, $body); - } - -} \ No newline at end of file +} From d0b85d3ad2cb8244a62489742706ad95b78ef4eb Mon Sep 17 00:00:00 2001 From: Brenda Wallace Date: Tue, 4 Aug 2009 08:43:13 +1200 Subject: [PATCH 061/423] Upgrade script --- db/074to080_pg.sql | 108 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 db/074to080_pg.sql diff --git a/db/074to080_pg.sql b/db/074to080_pg.sql new file mode 100644 index 0000000000..0a7171ae56 --- /dev/null +++ b/db/074to080_pg.sql @@ -0,0 +1,108 @@ +BEGIN; +create sequence design_seq; +create table design ( + id bigint default nextval('design_seq') /* comment 'design ID'*/, + backgroundcolor integer /* comment 'main background color'*/ , + contentcolor integer /*comment 'content area background color'*/ , + sidebarcolor integer /*comment 'sidebar background color'*/ , + textcolor integer /*comment 'text color'*/ , + linkcolor integer /*comment 'link color'*/, + backgroundimage varchar(255) /*comment 'background image, if any'*/, + disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/, + primary key (id) +); +alter table "user" + add column design_id integer references design(id); +alter table "user" + add column viewdesigns integer default 1; + +alter table notice add column + conversation integer references notice (id); + +create index notice_conversation_idx on notice(conversation); + +alter table foreign_user + alter column id TYPE bigint; + +alter table foreign_user alter column id set not null; + +alter table foreign_link + alter column foreign_id TYPE bigint; + +alter table user_group + add column design_id integer; + +/*attachments and URLs stuff */ +create sequence file_seq; +create table file ( + id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, + url varchar(255) unique, + mimetype varchar(50), + size integer, + title varchar(255), + date integer, + protected integer, + filename text /* comment 'if a local file, name of the file' */, + modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ +); + +create sequence file_oembed_seq; +create table file_oembed ( + file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, + version varchar(20), + type varchar(20), + provider varchar(50), + provider_url varchar(255), + width integer, + height integer, + html text, + title varchar(255), + author_name varchar(50), + author_url varchar(255), + url varchar(255) +); + +create sequence file_redirection_seq; +create table file_redirection ( + url varchar(255) primary key, + file_id bigint, + redirections integer, + httpcode integer +); + +create sequence file_thumbnail_seq; +create table file_thumbnail ( + file_id bigint primary key, + url varchar(255) unique, + width integer, + height integer +); +create sequence file_to_post_seq; +create table file_to_post ( + file_id bigint, + post_id bigint, + + primary key (file_id, post_id) +); + + +create table group_block ( + group_id integer not null /* comment 'group profile is blocked from' */ references user_group (id), + blocked integer not null /* comment 'profile that is blocked' */references profile (id), + blocker integer not null /* comment 'user making the block'*/ references "user" (id), + modified timestamp /* comment 'date of blocking'*/ , + + primary key (group_id, blocked) +); + +create table group_alias ( + + alias varchar(64) /* comment 'additional nickname for the group'*/ , + group_id integer not null /* comment 'group profile is blocked from'*/ references user_group (id), + modified timestamp /* comment 'date alias was created'*/, + primary key (alias) + +); +create index group_alias_group_id_idx on group_alias (group_id); + +COMMIT; \ No newline at end of file From ff6e976d0315c57fc5b7e31845e9a3bad4f095bc Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Mon, 3 Aug 2009 16:39:10 -0500 Subject: [PATCH 062/423] Added the 0.2 recaptcha plugin. Should work in all browsers. Please test. --- plugins/recaptcha/LICENSE | 22 +++ plugins/recaptcha/README | 23 +++ plugins/recaptcha/recaptcha.php | 106 +++++++++++ plugins/recaptcha/recaptchalib.php | 277 +++++++++++++++++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 plugins/recaptcha/LICENSE create mode 100644 plugins/recaptcha/README create mode 100644 plugins/recaptcha/recaptcha.php create mode 100644 plugins/recaptcha/recaptchalib.php diff --git a/plugins/recaptcha/LICENSE b/plugins/recaptcha/LICENSE new file mode 100644 index 0000000000..b612f71f01 --- /dev/null +++ b/plugins/recaptcha/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net +AUTHORS: + Mike Crawford + Ben Maurer + +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/plugins/recaptcha/README b/plugins/recaptcha/README new file mode 100644 index 0000000000..3100f697e4 --- /dev/null +++ b/plugins/recaptcha/README @@ -0,0 +1,23 @@ +Laconica reCAPTCHA plugin 0.2 8/3/09 +==================================== +Adds a captcha to your registration page to reduce automated spam bots registering. + +Use: +1. Get an API key from http://recaptcha.net + +2. In config.php add: +include_once('plugins/recaptcha.php'); +$captcha = new recaptcha(publickey, privatekey, showErrors); + +Changelog +========= +0.1 initial release +0.2 Work around for webkit browsers + +reCAPTCHA README +================ + +The reCAPTCHA PHP Lirary helps you use the reCAPTCHA API. Documentation +for this library can be found at + + http://recaptcha.net/plugins/php diff --git a/plugins/recaptcha/recaptcha.php b/plugins/recaptcha/recaptcha.php new file mode 100644 index 0000000000..5ef8352d18 --- /dev/null +++ b/plugins/recaptcha/recaptcha.php @@ -0,0 +1,106 @@ +. + * + * @category Plugin + * @package Laconica + * @author Eric Helgeson + * @copyright 2009 + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +define('RECAPTCHA', '0.2'); + +class recaptcha extends Plugin +{ + var $private_key; + var $public_key; + var $display_errors; + var $failed; + var $ssl; + + function __construct($public_key, $private_key, $display_errors=false) + { + parent::__construct(); + require_once(INSTALLDIR.'/plugins/recaptcha/recaptchalib.php'); + $this->public_key = $public_key; + $this->private_key = $private_key; + $this->display_errors = $display_errors; + } + + function checkssl(){ + if(common_config('site', 'ssl') === 'sometimes' || common_config('site', 'ssl') === 'always') { + return true; + } + return false; + } + + function onStartShowHTML($action) + { + //XXX: Horrible hack to make Safari, FF2, and Chrome work with + //reChapcha. reChapcha beaks xhtml strict + header('Content-Type: text/html'); + + $action->extraHeaders(); + + $action->startXML('html', + '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + + $action->raw(''); + return false; + } + + function onEndRegistrationFormData($action) + { + $action->elementStart('li'); + $action->raw(''); + if($this->checkssl() === true){ + $action->raw(recaptcha_get_html($this->public_key), null, true); + } else { + $action->raw(recaptcha_get_html($this->public_key)); + } + $action->elementEnd('li'); + return true; + } + + function onStartRegistrationTry($action) + { + $resp = recaptcha_check_answer ($this->private_key, + $_SERVER["REMOTE_ADDR"], + $action->trimmed('recaptcha_challenge_field'), + $action->trimmed('recaptcha_response_field')); + + if (!$resp->is_valid) + { + if($this->display_errors) + { + $action->showForm ("(reCAPTCHA said: " . $resp->error . ")"); + } + $action->showForm("Captcha does not match!"); + return false; + } + } +} diff --git a/plugins/recaptcha/recaptchalib.php b/plugins/recaptcha/recaptchalib.php new file mode 100644 index 0000000000..897c50981a --- /dev/null +++ b/plugins/recaptcha/recaptchalib.php @@ -0,0 +1,277 @@ + $value ) + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; + + // Cut the last '&' + $req=substr($req,0,strlen($req)-1); + return $req; +} + + + +/** + * Submits an HTTP POST to a reCAPTCHA server + * @param string $host + * @param string $path + * @param array $data + * @param int port + * @return array response + */ +function _recaptcha_http_post($host, $path, $data, $port = 80) { + + $req = _recaptcha_qsencode ($data); + + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; + $http_request .= "Content-Length: " . strlen($req) . "\r\n"; + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; + $http_request .= "\r\n"; + $http_request .= $req; + + $response = ''; + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { + die ('Could not open socket'); + } + + fwrite($fs, $http_request); + + while ( !feof($fs) ) + $response .= fgets($fs, 1160); // One TCP-IP packet + fclose($fs); + $response = explode("\r\n\r\n", $response, 2); + + return $response; +} + + + +/** + * Gets the challenge HTML (javascript and non-javascript version). + * This is called from the browser, and the resulting reCAPTCHA HTML widget + * is embedded within the HTML form it was called from. + * @param string $pubkey A public key for reCAPTCHA + * @param string $error The error given by reCAPTCHA (optional, default is null) + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) + + * @return string - The HTML to be embedded in the user's form. + */ +function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) +{ + if ($pubkey == null || $pubkey == '') { + die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey"); + } + + if ($use_ssl) { + $server = RECAPTCHA_API_SECURE_SERVER; + } else { + $server = RECAPTCHA_API_SERVER; + } + + $errorpart = ""; + if ($error) { + $errorpart = "&error=" . $error; + } + return ' + + '; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +class ReCaptchaResponse { + var $is_valid; + var $error; +} + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from http://recaptcha.net/api/getkey"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "http://recaptcha.net/api/getkey?" . _recaptcha_qsencode (array ('domain' => $domain, 'app' => $appname)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at http://mailhide.recaptcha.net/apikey"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://mailhide.recaptcha.net/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://mailhide.recaptcha.net/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); + +} + + +?> From 981fa1b33a8073bd0d53d8bee7dfccd171685e61 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 3 Aug 2009 22:46:01 +0000 Subject: [PATCH 063/423] Make the TwitterQueuehandler post to Twitter using OAuth --- actions/twitterauthorization.php | 48 ++++++++---- lib/mail.php | 19 ++--- lib/twitter.php | 129 ++++++++++++------------------- lib/twitteroauthclient.php | 39 +++++++--- 4 files changed, 122 insertions(+), 113 deletions(-) diff --git a/actions/twitterauthorization.php b/actions/twitterauthorization.php index f19cd7f653..519427dacd 100644 --- a/actions/twitterauthorization.php +++ b/actions/twitterauthorization.php @@ -67,39 +67,57 @@ class TwitterauthorizationAction extends Action if (empty($this->oauth_token)) { - // Get a new request token and authorize it + try { - $client = new TwitterOAuthClient(); - $req_tok = $client->getRequestToken(); + // Get a new request token and authorize it - // Sock the request token away in the session temporarily + $client = new TwitterOAuthClient(); + $req_tok = $client->getRequestToken(); - $_SESSION['twitter_request_token'] = $req_tok->key; - $_SESSION['twitter_request_token_secret'] = $req_tok->key; + // Sock the request token away in the session temporarily + + $_SESSION['twitter_request_token'] = $req_tok->key; + $_SESSION['twitter_request_token_secret'] = $req_tok->key; + + $auth_link = $client->getAuthorizeLink($req_tok); + + } catch (TwitterOAuthClientException $e) { + $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', + $e->getCode(), $e->getMessage()); + $this->serverError(_('Couldn\'t link your Twitter account.')); + } - $auth_link = $client->getAuthorizeLink($req_tok); common_redirect($auth_link); } else { - // Check to make sure Twitter sent us the same request token we sent + // Check to make sure Twitter returned the same request + // token we sent them if ($_SESSION['twitter_request_token'] != $this->oauth_token) { $this->serverError(_('Couldn\'t link your Twitter account.')); } - $client = new TwitterOAuthClient($_SESSION['twitter_request_token'], - $_SESSION['twitter_request_token_secret']); + try { - // Exchange the request token for an access token + $client = new TwitterOAuthClient($_SESSION['twitter_request_token'], + $_SESSION['twitter_request_token_secret']); - $atok = $client->getAccessToken(); + // Exchange the request token for an access token - // Save the access token and Twitter user info + $atok = $client->getAccessToken(); - $client = new TwitterOAuthClient($atok->key, $atok->secret); + // Save the access token and Twitter user info - $twitter_user = $client->verify_credentials(); + $client = new TwitterOAuthClient($atok->key, $atok->secret); + + $twitter_user = $client->verify_credentials(); + + } catch (OAuthClientException $e) { + $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', + $e->getCode(), $e->getMessage()); + $this->serverError(_('Couldn\'t link your Twitter account.')); + } $user = common_current_user(); diff --git a/lib/mail.php b/lib/mail.php index 0050ad8104..16c1b0f30a 100644 --- a/lib/mail.php +++ b/lib/mail.php @@ -645,13 +645,14 @@ function mail_twitter_bridge_removed($user) $subject = sprintf(_('Your Twitter bridge has been disabled.')); - $body = sprintf(_("Hi, %1\$s. We're sorry to inform you that your " . - 'link to Twitter has been disabled. Your Twitter credentials ' . - 'have either changed (did you recently change your Twitter ' . - 'password?) or you have otherwise revoked our access to your ' . - "Twitter account.\n\n" . - 'You can re-enable your Twitter bridge by visiting your ' . - "Twitter settings page:\n\n\t%2\$s\n\n" . + $site_name = common_config('site', 'name'); + + $body = sprintf(_('Hi, %1$s. We\'re sorry to inform you that your ' . + 'link to Twitter has been disabled. We no longer seem to have ' . + 'permission to update your Twitter status. (Did you revoke ' . + '%3$s\'s access?)' . "\n\n" . + 'You can re-enable your Twitter bridge by visiting your ' . + "Twitter settings page:\n\n\t%2\$s\n\n" . "Regards,\n%3\$s\n"), $profile->getBestName(), common_local_url('twittersettings'), @@ -679,11 +680,11 @@ function mail_facebook_app_removed($user) $site_name = common_config('site', 'name'); $subject = sprintf( - _('Your %1\$s Facebook application access has been disabled.', + _('Your %1$s Facebook application access has been disabled.', $site_name)); $body = sprintf(_("Hi, %1\$s. We're sorry to inform you that we are " . - 'unable to update your Facebook status from %2\$s, and have disabled ' . + 'unable to update your Facebook status from %2$s, and have disabled ' . 'the Facebook application for your account. This may be because ' . 'you have removed the Facebook application\'s authorization, or ' . 'have deleted your Facebook account. You can re-enable the ' . diff --git a/lib/twitter.php b/lib/twitter.php index 47af32e61f..2369ac2678 100644 --- a/lib/twitter.php +++ b/lib/twitter.php @@ -360,106 +360,74 @@ function is_twitter_bound($notice, $flink) { function broadcast_twitter($notice) { - $flink = Foreign_link::getByUserID($notice->profile_id, TWITTER_SERVICE); if (is_twitter_bound($notice, $flink)) { - $fuser = $flink->getForeignUser(); - $twitter_user = $fuser->nickname; - $twitter_password = $flink->credentials; - $uri = 'http://www.twitter.com/statuses/update.json'; + $user = $flink->getUser(); // XXX: Hack to get around PHP cURL's use of @ being a a meta character $statustxt = preg_replace('/^@/', ' @', $notice->content); - $options = array( - CURLOPT_USERPWD => "$twitter_user:$twitter_password", - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => - array( - 'status' => $statustxt, - 'source' => common_config('integration', 'source') - ), - CURLOPT_RETURNTRANSFER => true, - CURLOPT_FAILONERROR => true, - CURLOPT_HEADER => false, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_USERAGENT => "Laconica", - CURLOPT_CONNECTTIMEOUT => 120, // XXX: How long should this be? - CURLOPT_TIMEOUT => 120, + $client = new TwitterOAuthClient($flink->token, $flink->credentials); - # Twitter is strict about accepting invalid "Expect" headers - CURLOPT_HTTPHEADER => array('Expect:') - ); + $status = null; - $ch = curl_init($uri); - curl_setopt_array($ch, $options); - $data = curl_exec($ch); - $errmsg = curl_error($ch); - $errno = curl_errno($ch); + try { + $status = $client->statuses_update($statustxt); + } catch (OAuthClientCurlException $e) { - if (!empty($errmsg)) { - common_debug("cURL error ($errno): $errmsg - " . - "trying to send notice for $twitter_user.", - __FILE__); + if ($e->getMessage() == 'The requested URL returned error: 401') { - $user = $flink->getUser(); + $errmsg = sprintf('User %1$s (user id: %2$s) has an invalid ' . + 'Twitter OAuth access token.', + $user->nickname, $user->id); + common_log(LOG_WARNING, $errmsg); - if ($errmsg == 'The requested URL returned error: 401') { - common_debug(sprintf('User %s (user id: %s) ' . - 'has bad Twitter credentials!', - $user->nickname, $user->id)); + // Bad auth token! We need to delete the foreign_link + // to Twitter and inform the user. - // Bad credentials we need to delete the foreign_link - // to Twitter and inform the user. - - remove_twitter_link($flink); - - return true; - - } else { - - // Some other error happened, so we should try to - // send again later - - return false; - } - - } - - curl_close($ch); - - if (empty($data)) { - common_debug("No data returned by Twitter's " . - "API trying to send update for $twitter_user", - __FILE__); - - // XXX: Not sure this represents a failure to send, but it - // probably does - - return false; + remove_twitter_link($flink); + return true; } else { - // Twitter should return a status - $status = json_decode($data); + // Some other error happened, so we should probably + // try to send again later. - if (empty($status)) { - common_debug("Unexpected data returned by Twitter " . - " API trying to send update for $twitter_user", - __FILE__); + $errmsg = sprintf('cURL error trying to send notice to Twitter ' . + 'for user %1$s (user id: %2$s) - ' . + 'code: %3$s message: $4$s.', + $user->nickname, $user->id, + $e->getCode(), $e->getMessage()); + common_log(LOG_WARNING, $errmsg); - // XXX: Again, this could represent a failure posting - // or the Twitter API might just be behaving flakey. - // We're treating it as a failure to post. - - return false; - } + return false; } } + if (empty($status)) { + + // This could represent a failure posting, + // or the Twitter API might just be behaving flakey. + + $errmsg = sprint('No data returned by Twitter API when ' . + 'trying to send update for %1$s (user id %2$s).', + $user->nickname, $user->id); + common_log(LOG_WARNING, $errmsg); + + return false; + } + + // Notice crossed the great divide + + $msg = sprintf('Twitter bridge posted notice %s to Twitter.', + $notice->id); + common_log(LOG_INFO, $msg); + + } + return true; } @@ -480,17 +448,20 @@ function remove_twitter_link($flink) // Notify the user that her Twitter bridge is down + if (isset($user->email)) { + $result = mail_twitter_bridge_removed($user); if (!$result) { $msg = 'Unable to send email to notify ' . - "$user->nickname (user id: $user->id) " . - 'that their Twitter bridge link was ' . + "$user->nickname (user id: $user->id) " . + 'that their Twitter bridge link was ' . 'removed!'; common_log(LOG_WARNING, $msg); } + } } diff --git a/lib/twitteroauthclient.php b/lib/twitteroauthclient.php index 616fbc2134..63ffe1c7ce 100644 --- a/lib/twitteroauthclient.php +++ b/lib/twitteroauthclient.php @@ -2,6 +2,8 @@ require_once('OAuth.php'); +class OAuthClientCurlException extends Exception { } + class TwitterOAuthClient { public static $requestTokenURL = 'https://twitter.com/oauth/request_token'; @@ -54,6 +56,16 @@ class TwitterOAuthClient return $twitter_user; } + function statuses_update($status, $in_reply_to_status_id = null) + { + $url = 'https://twitter.com/statuses/update.json'; + $params = array('status' => $status, + 'in_reply_to_status_id' => $in_reply_to_status_id); + $response = $this->oAuthPost($url, $params); + $status = json_decode($response); + return $status; + } + function oAuthGet($url) { $request = OAuthRequest::from_consumer_and_token($this->consumer, @@ -91,19 +103,26 @@ class TwitterOAuthClient // Twitter is strict about accepting invalid "Expect" headers CURLOPT_HTTPHEADER => array('Expect:') - ); + ); - if (isset($params)) { - $options[CURLOPT_POST] = true; - $options[CURLOPT_POSTFIELDS] = $params; - } + if (isset($params)) { + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = $params; + } - $ch = curl_init($url); - curl_setopt_array($ch, $options); - $response = curl_exec($ch); - curl_close($ch); + $ch = curl_init($url); + curl_setopt_array($ch, $options); + $response = curl_exec($ch); - return $response; + if ($response === false) { + $msg = curl_error($ch); + $code = curl_errno($ch); + throw new OAuthClientCurlException($msg, $code); + } + + curl_close($ch); + + return $response; } } From 1f9d1772c091e1f09cc741e3e21cfe5ba7fa3560 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 00:02:07 +0000 Subject: [PATCH 064/423] Allow removal of Twitter account. Deleted dead code. --- actions/twittersettings.php | 346 ++++++------------------------------ 1 file changed, 53 insertions(+), 293 deletions(-) diff --git a/actions/twittersettings.php b/actions/twittersettings.php index acc9fb935f..7fffa0af01 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -34,8 +34,6 @@ if (!defined('LACONICA')) { require_once INSTALLDIR.'/lib/connectsettingsaction.php'; require_once INSTALLDIR.'/lib/twitter.php'; -define('SUBSCRIPTIONS', 80); - /** * Settings for Twitter integration * @@ -70,7 +68,7 @@ class TwittersettingsAction extends ConnectSettingsAction function getInstructions() { return _('Connect your Twitter account to share your updates ' . - 'with your Twitter friends and vice-versa.'); + 'with your Twitter friends and vice-versa.'); } /** @@ -104,179 +102,83 @@ class TwittersettingsAction extends ConnectSettingsAction $this->hidden('token', common_session_token()); + $this->elementStart('fieldset', array('id' => 'settings_twitter_account')); if (empty($fuser)) { - - $this->elementStart('fieldset', array('id' => 'settings_twitter_account')); $this->elementStart('ul', 'form_data'); $this->elementStart('li', array('id' => 'settings_twitter_login_button')); $this->element('a', array('href' => common_local_url('twitterauthorization')), - 'Connect my Twitter account'); - $this->elementEnd('li'); + 'Connect my Twitter account'); + $this->elementEnd('li'); $this->elementEnd('ul'); + + $this->elementEnd('fieldset'); + } else { + $this->element('legend', null, _('Twitter account')); + $this->elementStart('p', array('id' => 'form_confirmed')); + $this->element('a', array('href' => $fuser->uri), $fuser->nickname); + $this->elementEnd('p'); + $this->element('p', 'form_note', + _('Connected Twitter account')); + + $this->submit('remove', _('Remove')); + $this->elementEnd('fieldset'); - } else { + $this->elementStart('fieldset', array('id' => 'settings_twitter_preferences')); - $this->elementStart('fieldset', - array('id' => 'settings_twitter_preferences')); $this->element('legend', null, _('Preferences')); - $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->checkbox('noticesend', - _('Automatically send my notices to Twitter.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_SEND) : - true); + _('Automatically send my notices to Twitter.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_SEND) : + true); $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('replysync', - _('Send local "@" replies to Twitter.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : - true); + _('Send local "@" replies to Twitter.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : + true); $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('friendsync', - _('Subscribe to my Twitter friends here.'), - ($flink) ? - ($flink->friendsync & FOREIGN_FRIEND_RECV) : - false); + _('Subscribe to my Twitter friends here.'), + ($flink) ? + ($flink->friendsync & FOREIGN_FRIEND_RECV) : + false); $this->elementEnd('li'); if (common_config('twitterbridge','enabled')) { - $this->elementStart('li'); - $this->checkbox('noticerecv', - _('Import my Friends Timeline.'), - ($flink) ? - ($flink->noticesync & FOREIGN_NOTICE_RECV) : - false); - $this->elementEnd('li'); - - // preserve setting even if bidrection bridge toggled off - - if ($flink && ($flink->noticesync & FOREIGN_NOTICE_RECV)) { - $this->hidden('noticerecv', true, 'noticerecv'); - } - } - - $this->elementEnd('ul'); - - if ($flink) { - $this->submit('save', _('Save')); - } else { - $this->submit('add', _('Add')); - } - - $this->elementEnd('fieldset'); - } - - $this->showTwitterSubscriptions(); - - $this->elementEnd('form'); - } - - /** - * Gets some of the user's Twitter friends - * - * Gets the number of Twitter friends that are on this - * instance of Laconica. - * - * @return array array of User objects - */ - - function subscribedTwitterUsers() - { - - $current_user = common_current_user(); - - $qry = 'SELECT "user".* ' . - 'FROM subscription ' . - 'JOIN "user" ON subscription.subscribed = "user".id ' . - 'JOIN foreign_link ON foreign_link.user_id = "user".id ' . - 'WHERE subscriber = %d ' . - 'ORDER BY "user".nickname'; - - $user = new User(); - - $user->query(sprintf($qry, $current_user->id)); - - $users = array(); - - while ($user->fetch()) { - - // Don't include the user's own self-subscription - if ($user->id != $current_user->id) { - $users[] = clone($user); - } - } - - return $users; - } - - /** - * Show user's Twitter friends - * - * Gets the number of Twitter friends that are on this - * instance of Laconica, and shows their mini-avatars. - * - * @return void - */ - - function showTwitterSubscriptions() - { - - $friends = $this->subscribedTwitterUsers(); - - $friends_count = count($friends); - - if ($friends_count > 0) { - $this->elementStart('div', array('id' => 'entity_subscriptions', - 'class' => 'section')); - $this->element('h2', null, _('Twitter Friends')); - $this->elementStart('ul', 'entities users xoxo'); - - for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) { - - $other = Profile::staticGet($friends[$i]->id); - - if (!$other) { - common_log_db_error($subs, 'SELECT', __FILE__); - continue; - } - - $this->elementStart('li', 'vcard'); - $this->elementStart('a', array('title' => ($other->fullname) ? - $other->fullname : - $other->nickname, - 'href' => $other->profileurl, - 'class' => 'url')); - - $avatar = $other->getAvatar(AVATAR_MINI_SIZE); - - $avatar_url = ($avatar) ? - $avatar->displayUrl() : - Avatar::defaultImage(AVATAR_MINI_SIZE); - - $this->element('img', array('src' => $avatar_url, - 'width' => AVATAR_MINI_SIZE, - 'height' => AVATAR_MINI_SIZE, - 'class' => 'avatar photo', - 'alt' => ($other->fullname) ? - $other->fullname : - $other->nickname)); - - $this->element('span', 'fn nickname', $other->nickname); - $this->elementEnd('a'); + $this->elementStart('li'); + $this->checkbox('noticerecv', + _('Import my Friends Timeline.'), + ($flink) ? + ($flink->noticesync & FOREIGN_NOTICE_RECV) : + false); $this->elementEnd('li'); + // preserve setting even if bidrection bridge toggled off + + if ($flink && ($flink->noticesync & FOREIGN_NOTICE_RECV)) { + $this->hidden('noticerecv', true, 'noticerecv'); + } } $this->elementEnd('ul'); - $this->elementEnd('div'); + if ($flink) { + $this->submit('save', _('Save')); + } else { + $this->submit('add', _('Add')); + } + + $this->elementEnd('fieldset'); } + + $this->elementEnd('form'); } /** @@ -292,7 +194,6 @@ class TwittersettingsAction extends ConnectSettingsAction function handlePost() { - // CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { @@ -303,8 +204,6 @@ class TwittersettingsAction extends ConnectSettingsAction if ($this->arg('save')) { $this->savePreferences(); - } else if ($this->arg('add')) { - $this->addTwitterAccount(); } else if ($this->arg('remove')) { $this->removeTwitterAccount(); } else { @@ -312,82 +211,6 @@ class TwittersettingsAction extends ConnectSettingsAction } } - /** - * Associate a Twitter account with the user's account - * - * Validates post input; verifies it against Twitter; and if - * successful stores in the database. - * - * @return void - */ - - function addTwitterAccount() - { - $screen_name = $this->trimmed('twitter_username'); - $password = $this->trimmed('twitter_password'); - $noticesend = $this->boolean('noticesend'); - $noticerecv = $this->boolean('noticerecv'); - $replysync = $this->boolean('replysync'); - $friendsync = $this->boolean('friendsync'); - - if (!Validate::string($screen_name, - array('min_length' => 1, - 'max_length' => 15, - 'format' => VALIDATE_NUM.VALIDATE_ALPHA.'_'))) { - $this->showForm(_('Username must have only numbers, '. - 'upper- and lowercase letters, '. - 'and underscore (_). 15 chars max.')); - return; - } - - if (!$this->verifyCredentials($screen_name, $password)) { - $this->showForm(_('Could not verify your Twitter credentials!')); - return; - } - - $twit_user = twitter_user_info($screen_name, $password); - - if (!$twit_user) { - $this->showForm(sprintf(_('Unable to retrieve account information '. - 'For "%s" from Twitter.'), - $screen_name)); - return; - } - - if (!save_twitter_user($twit_user->id, $screen_name)) { - $this->showForm(_('Unable to save your Twitter settings!')); - return; - } - - $user = common_current_user(); - - $flink = new Foreign_link(); - - $flink->user_id = $user->id; - $flink->foreign_id = $twit_user->id; - $flink->service = TWITTER_SERVICE; - $flink->credentials = $password; - $flink->created = common_sql_now(); - - $flink->set_flags($noticesend, $noticerecv, $replysync, $friendsync); - - $flink_id = $flink->insert(); - - if (!$flink_id) { - common_log_db_error($flink, 'INSERT', __FILE__); - $this->showForm(_('Unable to save your Twitter settings!')); - return; - } - - if ($friendsync) { - save_twitter_friends($user, $twit_user->id, $screen_name, $password); - $flink->last_friendsync = common_sql_now(); - $flink->update(); - } - - $this->showForm(_('Twitter settings saved.'), true); - } - /** * Disassociate an existing Twitter account from this account * @@ -397,20 +220,11 @@ class TwittersettingsAction extends ConnectSettingsAction function removeTwitterAccount() { $user = common_current_user(); - - $flink = Foreign_link::getByUserID($user->id, 1); - - $flink_foreign_id = $this->arg('flink_foreign_id'); - - // Maybe an old tab open...? - if ($flink->foreign_id != $flink_foreign_id) { - $this->showForm(_('That is not your Twitter account.')); - return; - } + $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); $result = $flink->delete(); - if (!$result) { + if (empty($result)) { common_log_db_error($flink, 'DELETE', __FILE__); $this->serverError(_('Couldn\'t remove Twitter user.')); return; @@ -433,32 +247,16 @@ class TwittersettingsAction extends ConnectSettingsAction $replysync = $this->boolean('replysync'); $user = common_current_user(); + $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); - $flink = Foreign_link::getByUserID($user->id, 1); - - if (!$flink) { + if (empty($flink)) { common_log_db_error($flink, 'SELECT', __FILE__); $this->showForm(_('Couldn\'t save Twitter preferences.')); return; } - $twitter_id = $flink->foreign_id; - $password = $flink->credentials; - - $fuser = $flink->getForeignUser(); - - if (!$fuser) { - common_log_db_error($fuser, 'SELECT', __FILE__); - $this->showForm(_('Couldn\'t save Twitter preferences.')); - return; - } - - $screen_name = $fuser->nickname; - $original = clone($flink); - $flink->set_flags($noticesend, $noticerecv, $replysync, $friendsync); - $result = $flink->update($original); if ($result === false) { @@ -467,45 +265,7 @@ class TwittersettingsAction extends ConnectSettingsAction return; } - if ($friendsync) { - save_twitter_friends($user, $flink->foreign_id, $screen_name, $password); - } - $this->showForm(_('Twitter preferences saved.'), true); } - /** - * Verifies a username and password against Twitter's API - * - * @param string $screen_name Twitter user name - * @param string $password Twitter password - * - * @return boolean success flag - */ - - function verifyCredentials($screen_name, $password) - { - $uri = 'http://twitter.com/account/verify_credentials.json'; - - $data = get_twitter_data($uri, $screen_name, $password); - - if (!$data) { - return false; - } - - $user = json_decode($data); - - if (!$user) { - return false; - } - - $twitter_id = $user->id; - - if ($twitter_id) { - return $twitter_id; - } - - return false; - } - } From 4e9db95bcfe7818f4f937f3e29f31ea64cd73330 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Thu, 30 Jul 2009 20:38:34 +0100 Subject: [PATCH 065/423] Use -
  • >
  • +
  • >
  • Date: Thu, 30 Jul 2009 19:19:12 +0100 Subject: [PATCH 066/423] Enable 404-based rewrites for lighttpd installations in / --- index.php | 18 ++++++++++++++++++ lighttpd.conf.example | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 lighttpd.conf.example diff --git a/index.php b/index.php index a73983b595..c6776b11bb 100644 --- a/index.php +++ b/index.php @@ -107,6 +107,24 @@ function checkMirror($action_obj) function main() { + // fake HTTP redirects using lighttpd's 404 redirects + if (strpos($_SERVER['SERVER_SOFTWARE'], 'lighttpd') !== false) { + $_lighty_url = $base_url.$_SERVER['REQUEST_URI']; + $_lighty_url = @parse_url($_lighty_url); + + if ($_lighty_url['path'] != '/index.php' && $_lighty_url['path'] != '/') { + $_SERVER['QUERY_STRING'] = 'p='.substr($_lighty_url['path'], 1); + if ($_lighty_url['query']) + $_SERVER['QUERY_STRING'] .= '&'.$_lighty_url['query']; + parse_str($_lighty_url['query'], $_lighty_query); + foreach ($_lighty_query as $key => $val) { + $_GET[$key] = $_REQUEST[$key] = $val; + } + $_GET['p'] = $_REQUEST['p'] = substr($_lighty_url['path'], 1); + } + } + $_SERVER['REDIRECT_URL'] = preg_replace("/\?.+$/", "", $_SERVER['REQUEST_URI']); + // quick check for fancy URL auto-detection support in installer. if (isset($_SERVER['REDIRECT_URL']) && (preg_replace("/^\/$/","",(dirname($_SERVER['REQUEST_URI']))) . '/check-fancy') === $_SERVER['REDIRECT_URL']) { die("Fancy URL support detection succeeded. We suggest you enable this to get fancy (pretty) URLs."); diff --git a/lighttpd.conf.example b/lighttpd.conf.example new file mode 100644 index 0000000000..b8baafc9e3 --- /dev/null +++ b/lighttpd.conf.example @@ -0,0 +1,2 @@ +# Add this line to lighttpd.conf to enable pseudo-rewrites using 404s +server.error-handler-404 = "/index.php" From 961d2a812f4f463d48385fe78412a116fbfe71f3 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Thu, 30 Jul 2009 20:55:33 +0100 Subject: [PATCH 067/423] lighttpd rewrites now possible in other directories. --- index.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/index.php b/index.php index c6776b11bb..5f13064dab 100644 --- a/index.php +++ b/index.php @@ -113,14 +113,15 @@ function main() $_lighty_url = @parse_url($_lighty_url); if ($_lighty_url['path'] != '/index.php' && $_lighty_url['path'] != '/') { - $_SERVER['QUERY_STRING'] = 'p='.substr($_lighty_url['path'], 1); + $_lighty_path = preg_replace('/^'.preg_quote(common_config('site','path')).'\//', '', substr($_lighty_url['path'], 1)); + $_SERVER['QUERY_STRING'] = 'p='.$_lighty_path; if ($_lighty_url['query']) $_SERVER['QUERY_STRING'] .= '&'.$_lighty_url['query']; parse_str($_lighty_url['query'], $_lighty_query); foreach ($_lighty_query as $key => $val) { $_GET[$key] = $_REQUEST[$key] = $val; } - $_GET['p'] = $_REQUEST['p'] = substr($_lighty_url['path'], 1); + $_GET['p'] = $_REQUEST['p'] = $_lighty_path; } } $_SERVER['REDIRECT_URL'] = preg_replace("/\?.+$/", "", $_SERVER['REQUEST_URI']); From 20b254077925d3bc2642a6ff623432b3fb5bdd07 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Tue, 4 Aug 2009 01:22:40 +0100 Subject: [PATCH 068/423] Only warn when chars remaining < 0, not <= 0. --- js/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/util.js b/js/util.js index f3ed918cf2..fd30336b95 100644 --- a/js/util.js +++ b/js/util.js @@ -25,7 +25,7 @@ $(document).ready(function(){ var counter = $("#notice_text-count"); counter.text(remaining); - if (remaining <= 0) { + if (remaining < 0) { $("#form_notice").addClass("warning"); } else { $("#form_notice").removeClass("warning"); From f94ee5597d09dd46c0580ce043907ea960ace358 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 00:46:18 +0000 Subject: [PATCH 069/423] Moved some stuff to a base class --- actions/twitterauthorization.php | 2 +- lib/oauthclient.php | 111 +++++++++++++++++++++++++++++++ lib/twitteroauthclient.php | 98 ++------------------------- 3 files changed, 118 insertions(+), 93 deletions(-) create mode 100644 lib/oauthclient.php diff --git a/actions/twitterauthorization.php b/actions/twitterauthorization.php index 519427dacd..2390034cde 100644 --- a/actions/twitterauthorization.php +++ b/actions/twitterauthorization.php @@ -80,7 +80,7 @@ class TwitterauthorizationAction extends Action $_SESSION['twitter_request_token_secret'] = $req_tok->key; $auth_link = $client->getAuthorizeLink($req_tok); - + } catch (TwitterOAuthClientException $e) { $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', $e->getCode(), $e->getMessage()); diff --git a/lib/oauthclient.php b/lib/oauthclient.php new file mode 100644 index 0000000000..11de991c81 --- /dev/null +++ b/lib/oauthclient.php @@ -0,0 +1,111 @@ +sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); + $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); + $this->token = null; + + if (isset($oauth_token) && isset($oauth_token_secret)) { + $this->token = new OAuthToken($oauth_token, $oauth_token_secret); + } + } + + function getRequestToken() + { + $response = $this->oAuthGet(TwitterOAuthClient::$requestTokenURL); + parse_str($response); + $token = new OAuthToken($oauth_token, $oauth_token_secret); + return $token; + } + + function getAuthorizeLink($request_token, $oauth_callback = null) + { + $url = TwitterOAuthClient::$authorizeURL . '?oauth_token=' . + $request_token->key; + + if (isset($oauth_callback)) { + $url .= '&oauth_callback=' . urlencode($oauth_callback); + } + + return $url; + } + + function getAccessToken() + { + $response = $this->oAuthPost(TwitterOAuthClient::$accessTokenURL); + parse_str($response); + $token = new OAuthToken($oauth_token, $oauth_token_secret); + return $token; + } + + function oAuthGet($url) + { + $request = OAuthRequest::from_consumer_and_token($this->consumer, + $this->token, 'GET', $url, null); + $request->sign_request($this->sha1_method, + $this->consumer, $this->token); + + return $this->httpRequest($request->to_url()); + } + + function oAuthPost($url, $params = null) + { + $request = OAuthRequest::from_consumer_and_token($this->consumer, + $this->token, 'POST', $url, $params); + $request->sign_request($this->sha1_method, + $this->consumer, $this->token); + + return $this->httpRequest($request->get_normalized_http_url(), + $request->to_postdata()); + } + + function httpRequest($url, $params = null) + { + $options = array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true, + CURLOPT_HEADER => false, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_USERAGENT => 'Laconica', + CURLOPT_CONNECTTIMEOUT => 120, + CURLOPT_TIMEOUT => 120, + CURLOPT_HTTPAUTH => CURLAUTH_ANY, + CURLOPT_SSL_VERIFYPEER => false, + + // Twitter is strict about accepting invalid "Expect" headers + + CURLOPT_HTTPHEADER => array('Expect:') + ); + + if (isset($params)) { + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = $params; + } + + $ch = curl_init($url); + curl_setopt_array($ch, $options); + $response = curl_exec($ch); + + if ($response === false) { + $msg = curl_error($ch); + $code = curl_errno($ch); + throw new OAuthClientCurlException($msg, $code); + } + + curl_close($ch); + + return $response; + } + +} diff --git a/lib/twitteroauthclient.php b/lib/twitteroauthclient.php index 63ffe1c7ce..e1190f1675 100644 --- a/lib/twitteroauthclient.php +++ b/lib/twitteroauthclient.php @@ -1,10 +1,6 @@ sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); $consumer_key = common_config('twitter', 'consumer_key'); $consumer_secret = common_config('twitter', 'consumer_secret'); - $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); - $this->token = null; - if (isset($oauth_token) && isset($oauth_token_secret)) { - $this->token = new OAuthToken($oauth_token, $oauth_token_secret); - } + parent::__construct($consumer_key, $consumer_secret, + $oauth_token, $oauth_token_secret); } - function getRequestToken() - { - $response = $this->oAuthGet(TwitterOAuthClient::$requestTokenURL); - parse_str($response); - $token = new OAuthToken($oauth_token, $oauth_token_secret); - return $token; - } + function getAuthorizeLink($request_token) { + return parent::getAuthorizeLink($request_token, + common_local_url('twitterauthorization')); - function getAuthorizeLink($request_token) - { - // Not sure Twitter actually looks at oauth_callback - - return TwitterOAuthClient::$authorizeURL . - '?oauth_token=' . $request_token->key . '&oauth_callback=' . - urlencode(common_local_url('twitterauthorization')); - } - - function getAccessToken() - { - $response = $this->oAuthPost(TwitterOAuthClient::$accessTokenURL); - parse_str($response); - $token = new OAuthToken($oauth_token, $oauth_token_secret); - return $token; } function verify_credentials() @@ -66,63 +39,4 @@ class TwitterOAuthClient return $status; } - function oAuthGet($url) - { - $request = OAuthRequest::from_consumer_and_token($this->consumer, - $this->token, 'GET', $url, null); - $request->sign_request($this->sha1_method, - $this->consumer, $this->token); - - return $this->httpRequest($request->to_url()); - } - - function oAuthPost($url, $params = null) - { - $request = OAuthRequest::from_consumer_and_token($this->consumer, - $this->token, 'POST', $url, $params); - $request->sign_request($this->sha1_method, - $this->consumer, $this->token); - - return $this->httpRequest($request->get_normalized_http_url(), - $request->to_postdata()); - } - - function httpRequest($url, $params = null) - { - $options = array( - CURLOPT_RETURNTRANSFER => true, - CURLOPT_FAILONERROR => true, - CURLOPT_HEADER => false, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_USERAGENT => 'Laconica', - CURLOPT_CONNECTTIMEOUT => 120, - CURLOPT_TIMEOUT => 120, - CURLOPT_HTTPAUTH => CURLAUTH_ANY, - CURLOPT_SSL_VERIFYPEER => false, - - // Twitter is strict about accepting invalid "Expect" headers - - CURLOPT_HTTPHEADER => array('Expect:') - ); - - if (isset($params)) { - $options[CURLOPT_POST] = true; - $options[CURLOPT_POSTFIELDS] = $params; - } - - $ch = curl_init($url); - curl_setopt_array($ch, $options); - $response = curl_exec($ch); - - if ($response === false) { - $msg = curl_error($ch); - $code = curl_errno($ch); - throw new OAuthClientCurlException($msg, $code); - } - - curl_close($ch); - - return $response; - } - } From 2b00990d27b55644ff133355628f948ddca6df70 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Tue, 4 Aug 2009 01:58:45 +0100 Subject: [PATCH 070/423] Prepend replyto string to message, don't destroy user input! --- js/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/util.js b/js/util.js index fd30336b95..d4db8b72a9 100644 --- a/js/util.js +++ b/js/util.js @@ -257,7 +257,7 @@ function NoticeReplySet(nick,id) { if (nick.match(rgx_username)) { replyto = "@" + nick + " "; if ($("#notice_data-text").length) { - $("#notice_data-text").val(replyto); + $("#notice_data-text").val(replyto + $("#notice_data-text").val()); $("#form_notice input#notice_in-reply-to").val(id); $("#notice_data-text").focus(); return false; From fe9fc152861a0131582c4aa512870d2d01bccb57 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 02:21:18 +0000 Subject: [PATCH 071/423] Make TwitterStatusFetcher daemon work with OAuth --- lib/twitteroauthclient.php | 19 +++++++++++++++++++ scripts/twitterstatusfetcher.php | 32 +++++++++++++++----------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/lib/twitteroauthclient.php b/lib/twitteroauthclient.php index e1190f1675..aabda8d6ad 100644 --- a/lib/twitteroauthclient.php +++ b/lib/twitteroauthclient.php @@ -39,4 +39,23 @@ class TwitterOAuthClient extends OAuthClient return $status; } + function statuses_friends_timeline($since_id = null, $max_id = null, + $cnt = null, $page = null) { + + $url = 'http://twitter.com/statuses/friends_timeline.json'; + $params = array('since_id' => $since_id, + 'max_id' => $max_id, + 'count' => $cnt, + 'page' => $page); + $qry = http_build_query($params); + + if (!empty($qry)) { + $url .= "?$qry"; + } + + $response = $this->oAuthGet($url); + $statuses = json_decode($response); + return $statuses; + } + } diff --git a/scripts/twitterstatusfetcher.php b/scripts/twitterstatusfetcher.php index e1745cfc08..d9f035fa61 100755 --- a/scripts/twitterstatusfetcher.php +++ b/scripts/twitterstatusfetcher.php @@ -191,7 +191,7 @@ class TwitterStatusFetcher extends Daemon { $flink = new Foreign_link(); - $flink->service = 1; // Twitter + $flink->service = TWITTER_SERVICE; $flink->orderBy('last_noticesync'); @@ -241,35 +241,33 @@ class TwitterStatusFetcher extends Daemon function getTimeline($flink) { - if (empty($flink)) { + if (empty($flink)) { common_log(LOG_WARNING, "Can't retrieve Foreign_link for foreign ID $fid"); return; } - $fuser = $flink->getForeignUser(); - - if (empty($fuser)) { - common_log(LOG_WARNING, "Unmatched user for ID " . - $flink->user_id); - return; - } - if (defined('SCRIPT_DEBUG')) { common_debug('Trying to get timeline for Twitter user ' . - "$fuser->nickname ($flink->foreign_id)."); + $flink->foreign_id); } // XXX: Biggest remaining issue - How do we know at which status // to start importing? How many statuses? Right now I'm going // with the default last 20. - $url = 'http://twitter.com/statuses/friends_timeline.json'; + $client = new TwitterOAuthClient($flink->token, $flink->credentials); - $timeline_json = get_twitter_data($url, $fuser->nickname, - $flink->credentials); + $timeline = null; - $timeline = json_decode($timeline_json); + try { + $timeline = $client->statuses_friends_timeline(); + } catch (OAuthClientCurlException $e) { + common_log(LOG_WARNING, + 'OAuth client unable to get friends timeline for user ' . + $flink->user_id . ' - code: ' . + $e->getCode() . 'msg: ' . $e->getMessage()); + } if (empty($timeline)) { common_log(LOG_WARNING, "Empty timeline."); @@ -303,7 +301,7 @@ class TwitterStatusFetcher extends Daemon $id = $this->ensureProfile($status->user); $profile = Profile::staticGet($id); - if (!$profile) { + if (empty($profile)) { common_log(LOG_ERR, 'Problem saving notice. No associated Profile.'); return null; @@ -318,7 +316,7 @@ class TwitterStatusFetcher extends Daemon // check to see if we've already imported the status - if (!$notice) { + if (empty($notice)) { $notice = new Notice(); From 39c420b51fb57f98780d583efaaaebd79de12db9 Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Tue, 4 Aug 2009 09:22:37 +0100 Subject: [PATCH 072/423] Set focus to end of field. --- js/util.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/js/util.js b/js/util.js index d4db8b72a9..0409dc6014 100644 --- a/js/util.js +++ b/js/util.js @@ -256,10 +256,19 @@ function NoticeReplySet(nick,id) { rgx_username = /^[0-9a-zA-Z\-_.]*$/; if (nick.match(rgx_username)) { replyto = "@" + nick + " "; - if ($("#notice_data-text").length) { - $("#notice_data-text").val(replyto + $("#notice_data-text").val()); + var text = $("#notice_data-text"); + if (text.length) { + text.val(replyto + text.val()); $("#form_notice input#notice_in-reply-to").val(id); - $("#notice_data-text").focus(); + if (text.get(0).setSelectionRange) { + var len = text.val().length; + text.get(0).setSelectionRange(len,len); + text.get(0).focus(); + } else if (text.get(0).createTextRange) { + var range = text.createTextRange(); + range.collapse(false); + range.select(); + } return false; } } From 0155d02cecae565e0709a7bd0c8d1b62dd80d9bc Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Tue, 4 Aug 2009 18:45:11 +0800 Subject: [PATCH 073/423] Fixed PHP Notice "Undefined property: Profile::$value" --- lib/profilesection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/profilesection.php b/lib/profilesection.php index 9ff243fb53..d463a07b08 100644 --- a/lib/profilesection.php +++ b/lib/profilesection.php @@ -97,7 +97,7 @@ class ProfileSection extends Section $this->out->elementEnd('a'); $this->out->elementEnd('span'); $this->out->elementEnd('td'); - if ($profile->value) { + if (isset($profile->value)) { $this->out->element('td', 'value', $profile->value); } From ffa1d662a759a729151f2444bdf759749d59045e Mon Sep 17 00:00:00 2001 From: Tom Adams Date: Tue, 4 Aug 2009 16:15:36 +0100 Subject: [PATCH 074/423] Didn't test that JS in IE. Revert a little. --- js/util.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/js/util.js b/js/util.js index 0409dc6014..9d6e52b2d5 100644 --- a/js/util.js +++ b/js/util.js @@ -264,10 +264,6 @@ function NoticeReplySet(nick,id) { var len = text.val().length; text.get(0).setSelectionRange(len,len); text.get(0).focus(); - } else if (text.get(0).createTextRange) { - var range = text.createTextRange(); - range.collapse(false); - range.select(); } return false; } From 3a6e7d68fce1ef66f959071299dbe86aa91f495a Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 4 Aug 2009 15:54:02 +0000 Subject: [PATCH 075/423] Ticket 1758 Multiple replies in web interface on "profile" page appends own username --- js/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/util.js b/js/util.js index 9d6e52b2d5..ef147bef4a 100644 --- a/js/util.js +++ b/js/util.js @@ -244,7 +244,7 @@ function NoticeReply() { $('#content .notice').each(function() { var notice = $(this)[0]; $($('.notice_reply', notice)[0]).click(function() { - var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname'); + var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname.uid'); NoticeReplySet(nickname.text(), $($('.notice_id', notice)[0]).text()); return false; }); From cb2f668ff6a0d0208732837dca1f2cb7a16e814f Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 4 Aug 2009 16:24:23 +0000 Subject: [PATCH 076/423] Removed not overly significant style from div.entry-content. It helps with attachment views as well (Ticket 1761) --- theme/default/css/display.css | 3 --- theme/identica/css/display.css | 3 --- 2 files changed, 6 deletions(-) diff --git a/theme/default/css/display.css b/theme/default/css/display.css index b7c86ae07b..921a6b27b4 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -235,9 +235,6 @@ opacity:0.4; .notices li:hover div.notice-options { opacity:1; } -div.entry-content { -color:#333333; -} div.notice-options a, div.notice-options input { font-family:sans-serif; diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 6a88204953..8af5644b67 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -235,9 +235,6 @@ opacity:0.4; .notices li:hover div.notice-options { opacity:1; } -div.entry-content { -color:#333333; -} div.notice-options a, div.notice-options input { font-family:sans-serif; From 557e214ce968079362b73f36f2f2bd1bcbec61a7 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 4 Aug 2009 12:26:29 -0400 Subject: [PATCH 077/423] Refactored rgb2hex --- js/userdesign.go.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/userdesign.go.js b/js/userdesign.go.js index 4416dc8aee..c53569beab 100644 --- a/js/userdesign.go.js +++ b/js/userdesign.go.js @@ -30,11 +30,11 @@ $(document).ready(function() { /* rgb2hex written by R0bb13 */ function rgb2hex(rgb) { rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); - function hex(x) { - hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"); - return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; - } - return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); + return '#' + dec2hex(rgb[1]) + dec2hex(rgb[2]) + dec2hex(rgb[3]); + } + function dec2hex(x) { + hexDigits = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); + return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; } function UpdateColors(S) { From 0685b85d8dd7ab9629b0acbfbd7b4aae20c14103 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 17:19:05 +0000 Subject: [PATCH 078/423] Use ssl for fetching frinds_timeline from Twitter since it requires auth and is a protected resource --- lib/twitteroauthclient.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twitteroauthclient.php b/lib/twitteroauthclient.php index aabda8d6ad..c5f114fb02 100644 --- a/lib/twitteroauthclient.php +++ b/lib/twitteroauthclient.php @@ -42,7 +42,7 @@ class TwitterOAuthClient extends OAuthClient function statuses_friends_timeline($since_id = null, $max_id = null, $cnt = null, $page = null) { - $url = 'http://twitter.com/statuses/friends_timeline.json'; + $url = 'https://twitter.com/statuses/friends_timeline.json'; $params = array('since_id' => $since_id, 'max_id' => $max_id, 'count' => $cnt, From 5576917662b47ef27bf7ba3e551411c3d3b5e26c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 17:20:28 +0000 Subject: [PATCH 079/423] Use empty() for checking whether DB_DataObject returned something --- scripts/twitterstatusfetcher.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/twitterstatusfetcher.php b/scripts/twitterstatusfetcher.php index d9f035fa61..dd139417cf 100755 --- a/scripts/twitterstatusfetcher.php +++ b/scripts/twitterstatusfetcher.php @@ -356,7 +356,7 @@ class TwitterStatusFetcher extends Daemon $profileurl = 'http://twitter.com/' . $user->screen_name; $profile = Profile::staticGet('profileurl', $profileurl); - if ($profile) { + if (!empty($profile) { if (defined('SCRIPT_DEBUG')) { common_debug("Profile for $profile->nickname found."); } @@ -394,7 +394,7 @@ class TwitterStatusFetcher extends Daemon // check for remote profile $remote_pro = Remote_profile::staticGet('uri', $profileurl); - if (!$remote_pro) { + if (empty($remote_pro)) { $remote_pro = new Remote_profile(); From 43eb19910f541a3b2a083f3cd02954e30e34aa35 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 4 Aug 2009 20:49:18 +0000 Subject: [PATCH 080/423] Post to Facebook user's stream if notice has an attachment, otherwise post notice as a status update --- lib/facebookutil.php | 236 ++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 128 deletions(-) diff --git a/lib/facebookutil.php b/lib/facebookutil.php index b7688f04f0..e31a71f5eb 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -36,7 +36,7 @@ function getFacebook() $facebook = new Facebook($apikey, $secret); } - if (!$facebook) { + if (empty($facebook)) { common_log(LOG_ERR, 'Could not make new Facebook client obj!', __FILE__); } @@ -44,71 +44,37 @@ function getFacebook() return $facebook; } -function updateProfileBox($facebook, $flink, $notice) { - $fbaction = new FacebookAction($output='php://output', $indent=true, $facebook, $flink); - $fbaction->updateProfileBox($notice); -} - function isFacebookBound($notice, $flink) { if (empty($flink)) { return false; } + // Avoid a loop + + if ($notice->source == 'Facebook') { + common_log(LOG_INFO, "Skipping notice $notice->id because its " . + 'source is Facebook.'); + return false; + } + // If the user does not want to broadcast to Facebook, move along + if (!($flink->noticesync & FOREIGN_NOTICE_SEND == FOREIGN_NOTICE_SEND)) { common_log(LOG_INFO, "Skipping notice $notice->id " . 'because user has FOREIGN_NOTICE_SEND bit off.'); return false; } - $success = false; + // If it's not a reply, or if the user WANTS to send @-replies, + // then, yeah, it can go to Facebook. - // If it's not a reply, or if the user WANTS to send @-replies... if (!preg_match('/@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) || ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY)) { - - $success = true; - - // The two condition below are deal breakers: - - // Avoid a loop - if ($notice->source == 'Facebook') { - common_log(LOG_INFO, "Skipping notice $notice->id because its " . - 'source is Facebook.'); - $success = false; - } - - $facebook = getFacebook(); - $fbuid = $flink->foreign_id; - - try { - - // Check to see if the user has given the FB app status update perms - $result = $facebook->api_client-> - users_hasAppPermission('publish_stream', $fbuid); - - if ($result != 1) { - $result = $facebook->api_client-> - users_hasAppPermission('status_update', $fbuid); - } - if ($result != 1) { - $user = $flink->getUser(); - $msg = "Not sending notice $notice->id to Facebook " . - "because user $user->nickname hasn't given the " . - 'Facebook app \'status_update\' or \'publish_stream\' permission.'; - common_debug($msg); - $success = false; - } - - } catch(FacebookRestClientException $e){ - common_log(LOG_ERR, $e->getMessage()); - $success = false; - } - + return true; } - return $success; + return false; } @@ -119,88 +85,65 @@ function facebookBroadcastNotice($notice) if (isFacebookBound($notice, $flink)) { + // Okay, we're good to go, update the FB status + $status = null; $fbuid = $flink->foreign_id; - $user = $flink->getUser(); - - // Get the status 'verb' (prefix) the user has set + $attachments = $notice->attachments(); try { - $prefix = $facebook->api_client-> - data_getUserPreference(FACEBOOK_NOTICE_PREFIX, $fbuid); + + // Get the status 'verb' (prefix) the user has set + + // XXX: Does this call count against our per user FB request limit? + // If so we should consider storing verb elsewhere or not storing + + $prefix = $facebook->api_client->data_getUserPreference(FACEBOOK_NOTICE_PREFIX, + $fbuid); $status = "$prefix $notice->content"; - } catch(FacebookRestClientException $e) { - common_log(LOG_WARNING, $e->getMessage()); - common_log(LOG_WARNING, - 'Unable to get the status verb setting from Facebook ' . - "for $user->nickname (user id: $user->id)."); - } + $can_publish = $facebook->api_client->users_hasAppPermission('publish_stream', + $fbuid); - // Okay, we're good to go, update the FB status + $can_update = $facebook->api_client->users_hasAppPermission('status_update', + $fbuid); - try { - $result = $facebook->api_client-> - users_hasAppPermission('publish_stream', $fbuid); - if($result == 1){ - // authorized to use the stream api, so use it - $fbattachment = null; - $attachments = $notice->attachments(); - if($attachments){ - $fbattachment=array(); - $fbattachment['media']=array(); - //facebook only supports one attachment per item - $attachment = $attachments[0]; - $fbmedia=array(); - if(strncmp($attachment->mimetype,'image/',strlen('image/'))==0){ - $fbmedia['type']='image'; - $fbmedia['src']=$attachment->url; - $fbmedia['href']=$attachment->url; - $fbattachment['media'][]=$fbmedia; -/* Video doesn't seem to work. The notice never makes it to facebook, and no error is reported. - }else if(strncmp($attachment->mimetype,'video/',strlen('image/'))==0 || $attachment->mimetype="application/ogg"){ - $fbmedia['type']='video'; - $fbmedia['video_src']=$attachment->url; - // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 - // says that preview_img is required... but we have no value to put in it - // $fbmedia['preview_img']=$attachment->url; - if($attachment->title){ - $fbmedia['video_title']=$attachment->title; - } - $fbmedia['video_type']=$attachment->mimetype; - $fbattachment['media'][]=$fbmedia; -*/ - }else if($attachment->mimetype=='audio/mpeg'){ - $fbmedia['type']='mp3'; - $fbmedia['src']=$attachment->url; - $fbattachment['media'][]=$fbmedia; - }else if($attachment->mimetype=='application/x-shockwave-flash'){ - $fbmedia['type']='flash'; - // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 - // says that imgsrc is required... but we have no value to put in it - // $fbmedia['imgsrc']=''; - $fbmedia['swfsrc']=$attachment->url; - $fbattachment['media'][]=$fbmedia; - }else{ - $fbattachment['name']=($attachment->title?$attachment->title:$attachment->url); - $fbattachment['href']=$attachment->url; - } - } - $facebook->api_client->stream_publish($status, $fbattachment, null, null, $fbuid); - }else{ + if (!empty($attachments) && $can_publish == 1) { + $fbattachment = format_attachments($attachments); + $facebook->api_client->stream_publish($status, $fbattachment, + null, null, $fbuid); + common_log(LOG_INFO, + "Posted notice $notice->id w/attachment " . + "to Facebook user's stream (fbuid = $fbuid)."); + } elseif ($can_update == 1 || $can_publish == 1) { $facebook->api_client->users_setStatus($status, $fbuid, false, true); + common_log(LOG_INFO, + "Posted notice $notice->id to Facebook " . + "as a status update (fbuid = $fbuid)."); + } else { + $msg = "Not sending notice $notice->id to Facebook " . + "because user $user->nickname hasn't given the " . + 'Facebook app \'status_update\' or \'publish_stream\' permission.'; + common_log(LOG_WARNING, $msg); } - } catch(FacebookRestClientException $e) { + + // Finally, attempt to update the user's profile box + + if ($can_publish == 1 || $can_update == 1) { + updateProfileBox($facebook, $flink, $notice); + } + + } catch (FacebookRestClientException $e) { $code = $e->getCode(); - common_log(LOG_ERR, 'Facebook returned error code ' . - $code . ': ' . $e->getMessage()); - common_log(LOG_ERR, - 'Unable to update Facebook status for ' . - "$user->nickname (user id: $user->id)!"); + common_log(LOG_WARNING, 'Facebook returned error code ' . + $code . ': ' . $e->getMessage()); + common_log(LOG_WARNING, + 'Unable to update Facebook status for ' . + "$user->nickname (user id: $user->id)!"); if ($code == 200 || $code == 250) { @@ -209,25 +152,62 @@ function facebookBroadcastNotice($notice) // see: http://wiki.developers.facebook.com/index.php/Users.setStatus#Example_Return_XML remove_facebook_app($flink); + + } else { + + // Try sending again later. + + return false; } } - - // Now try to update the profile box - - try { - updateProfileBox($facebook, $flink, $notice); - } catch(FacebookRestClientException $e) { - common_log(LOG_ERR, 'Facebook returned error code ' . - $e->getCode() . ': ' . $e->getMessage()); - common_log(LOG_WARNING, - 'Unable to update Facebook profile box for ' . - "$user->nickname (user id: $user->id)."); - } - } return true; + +} + +function updateProfileBox($facebook, $flink, $notice) { + $fbaction = new FacebookAction($output = 'php://output', + $indent = true, $facebook, $flink); + $fbaction->updateProfileBox($notice); +} + +function format_attachments($attachments) +{ + $fbattachment = array(); + $fbattachment['media'] = array(); + + // Facebook only supports one attachment per item + + $attachment = $attachments[0]; + $fbmedia = array(); + + if (strncmp($attachment->mimetype, 'image/', strlen('image/')) == 0) { + $fbmedia['type'] = 'image'; + $fbmedia['src'] = $attachment->url; + $fbmedia['href'] = $attachment->url; + $fbattachment['media'][] = $fbmedia; + } else if ($attachment->mimetype == 'audio/mpeg') { + $fbmedia['type'] = 'mp3'; + $fbmedia['src'] = $attachment->url; + $fbattachment['media'][] = $fbmedia; + }else if ($attachment->mimetype == 'application/x-shockwave-flash') { + $fbmedia['type'] = 'flash'; + + // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 + // says that imgsrc is required... but we have no value to put in it + // $fbmedia['imgsrc']=''; + + $fbmedia['swfsrc'] = $attachment->url; + $fbattachment['media'][] = $fbmedia; + }else{ + $fbattachment['name'] = ($attachment->title ? + $attachment->title : $attachment->url); + $fbattachment['href'] = $attachment->url; + } + + return $fbattachment; } function remove_facebook_app($flink) From cd71f9cc51f77b6b8e3b11c34cb7523f36339cea Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 5 Aug 2009 00:16:12 +0000 Subject: [PATCH 081/423] Better (hopefully) database connection management for child processes --- scripts/twitterstatusfetcher.php | 33 ++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/scripts/twitterstatusfetcher.php b/scripts/twitterstatusfetcher.php index dd139417cf..67f52a3cc5 100755 --- a/scripts/twitterstatusfetcher.php +++ b/scripts/twitterstatusfetcher.php @@ -99,13 +99,6 @@ class TwitterStatusFetcher extends Daemon foreach ($flinks as $f) { - // We have to disconnect from the DB before forking so - // each sub-process will open its own connection and - // avoid stomping on the others - - $conn = &$f->getDatabaseConnection(); - $conn->disconnect(); - $pid = pcntl_fork(); if ($pid == -1) { @@ -125,7 +118,24 @@ class TwitterStatusFetcher extends Daemon } else { // Child + + // Each child ps needs its own DB connection + + // Note: DataObject::getDatabaseConnection() creates + // a new connection if there isn't one already + + global $_DB_DATAOBJECT; + $conn = &$f->getDatabaseConnection(); + $this->getTimeline($f); + + $conn->disconnect(); + + // XXX: Couldn't find a less brutal way to blow + // away a cached connection + + unset($_DB_DATAOBJECT['CONNECTIONS']); + exit(); } @@ -189,7 +199,10 @@ class TwitterStatusFetcher extends Daemon function refreshFlinks() { + global $_DB_DATAOBJECT; + $flink = new Foreign_link(); + $conn = &$flink->getDatabaseConnection(); $flink->service = TWITTER_SERVICE; @@ -215,6 +228,9 @@ class TwitterStatusFetcher extends Daemon $flink->free(); unset($flink); + $conn->disconnect(); + unset($_DB_DATAOBJECT['CONNECTIONS']); + return $flinks; } @@ -299,6 +315,7 @@ class TwitterStatusFetcher extends Daemon function saveStatus($status, $flink) { $id = $this->ensureProfile($status->user); + $profile = Profile::staticGet($id); if (empty($profile)) { @@ -356,7 +373,7 @@ class TwitterStatusFetcher extends Daemon $profileurl = 'http://twitter.com/' . $user->screen_name; $profile = Profile::staticGet('profileurl', $profileurl); - if (!empty($profile) { + if (!empty($profile)) { if (defined('SCRIPT_DEBUG')) { common_debug("Profile for $profile->nickname found."); } From 36e5d2b45f9ec240c0cecbb78afcce92e2962a49 Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Tue, 4 Aug 2009 22:11:20 -0500 Subject: [PATCH 082/423] Added correct null check. Created noisey errors on fresh install. $id is not defined, should be $this->id --- classes/Design.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/Design.php b/classes/Design.php index 43544f1c9d..b53096aa28 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -107,7 +107,7 @@ class Design extends Memcached_DataObject static function toWebColor($color) { - if (is_null($color)) { + if ($color == null) { return null; } @@ -115,7 +115,7 @@ class Design extends Memcached_DataObject return new WebColor($color); } catch (WebColorException $e) { // This shouldn't happen - common_log(LOG_ERR, "Unable to create color for design $id.", + common_log(LOG_ERR, "Unable to create color for design $this->id.", __FILE__); return null; } From 535e3bae79006dd54f6d5c4918133a05c03c43ed Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Wed, 5 Aug 2009 15:58:18 +0200 Subject: [PATCH 083/423] Fix reference to undefined variable in Design::toWebColor. --- classes/Design.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Design.php b/classes/Design.php index 43544f1c9d..5d8364be5a 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -115,7 +115,7 @@ class Design extends Memcached_DataObject return new WebColor($color); } catch (WebColorException $e) { // This shouldn't happen - common_log(LOG_ERR, "Unable to create color for design $id.", + common_log(LOG_ERR, 'Unable to create color for design '.$this->id, __FILE__); return null; } From 9b3adf789a7df54294fdafb44dc48a425490e787 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Wed, 5 Aug 2009 16:05:29 +0200 Subject: [PATCH 084/423] Argh, first commit for ages and such a stupid error. Sorry. --- classes/Design.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Design.php b/classes/Design.php index 5d8364be5a..dc1712aff3 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -115,7 +115,7 @@ class Design extends Memcached_DataObject return new WebColor($color); } catch (WebColorException $e) { // This shouldn't happen - common_log(LOG_ERR, 'Unable to create color for design '.$this->id, + common_log(LOG_ERR, "Unable to create web color for $color", __FILE__); return null; } From 44b2b6424714f82dc199fbe9780843638122e3ad Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Wed, 5 Aug 2009 16:05:29 +0200 Subject: [PATCH 085/423] Argh, first commit for ages and such a stupid error. Sorry. --- classes/Design.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Design.php b/classes/Design.php index b53096aa28..9354bfcda8 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -115,7 +115,7 @@ class Design extends Memcached_DataObject return new WebColor($color); } catch (WebColorException $e) { // This shouldn't happen - common_log(LOG_ERR, "Unable to create color for design $this->id.", + common_log(LOG_ERR, "Unable to create web color for $color", __FILE__); return null; } From c19df2dbc29fd6392a249ff5e4ea7634deb3f273 Mon Sep 17 00:00:00 2001 From: anontwit Date: Wed, 5 Aug 2009 10:50:27 -0700 Subject: [PATCH 086/423] updated IM docs with new commands --- doc-src/im | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc-src/im b/doc-src/im index da07f9fe7b..a02670a6d8 100644 --- a/doc-src/im +++ b/doc-src/im @@ -32,4 +32,15 @@ currently-implemented commands: you subscribe to. * **off**: Turn off notifications. You'll no longer receive Jabber notifications. - +* **stop**: Same as 'off' +* **quit**: Same as 'off' +* **help**: Show this help. List available Jabber/XMPP commands +* **follow <nickname>**: Subscribe to <nickname> +* **sub <nickname>**: Same as follow +* **leave <nickname>**: Subscribe to <nickname> +* **unsub <nickname>**: Same as leave +* **d <nickname> <text>**: Send direct message to <nickname> with message body <text> +* **get <nickname>**: Get last notice from <nickname> +* **get <nickname>**: Same as 'get' +* **whois <nickname>**: Get Profile info on <nickname> +* **fav <nickname>**: Add user's last notice as a favorite \ No newline at end of file From c3a522623c3a0628c33407ee01b16e189c44bba5 Mon Sep 17 00:00:00 2001 From: anontwit Date: Wed, 5 Aug 2009 10:58:30 -0700 Subject: [PATCH 087/423] fixed double 'get' type --- doc-src/im | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/im b/doc-src/im index a02670a6d8..c722a4e2cb 100644 --- a/doc-src/im +++ b/doc-src/im @@ -41,6 +41,6 @@ currently-implemented commands: * **unsub <nickname>**: Same as leave * **d <nickname> <text>**: Send direct message to <nickname> with message body <text> * **get <nickname>**: Get last notice from <nickname> -* **get <nickname>**: Same as 'get' +* **last <nickname>**: Same as 'get' * **whois <nickname>**: Get Profile info on <nickname> * **fav <nickname>**: Add user's last notice as a favorite \ No newline at end of file From e797001be4cd982ed778bda16744ab4007eb31c8 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 5 Aug 2009 16:02:47 -0400 Subject: [PATCH 088/423] add livetweeter to notice source --- db/notice_source.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/notice_source.sql b/db/notice_source.sql index 983ea91502..71fa893446 100644 --- a/db/notice_source.sql +++ b/db/notice_source.sql @@ -22,6 +22,7 @@ VALUES ('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()), ('identitwitch','IdentiTwitch','http://richfish.org/identitwitch/', now()), ('LaTwit','LaTwit','http://latwit.mac65.com/', now()), + ('livetweeter', 'livetweeter', 'http://addons.songbirdnest.com/addon/1204', now()), ('maisha', 'Maisha', 'http://maisha.grango.org/', now()), ('mbpidgin','mbpidgin','http://code.google.com/p/microblog-purple/', now()), ('Mobidentica', 'Mobidentica', 'http://www.substanceofcode.com/software/mobidentica/', now()), From 7a61b0737d00adbdaaea7e82fa3a1702286332aa Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 5 Aug 2009 16:06:15 -0400 Subject: [PATCH 089/423] update version to 0.8.1pre1 --- lib/common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/common.php b/lib/common.php index b3d3018620..8cd3ae2fc0 100644 --- a/lib/common.php +++ b/lib/common.php @@ -19,7 +19,7 @@ if (!defined('LACONICA')) { exit(1); } -define('LACONICA_VERSION', '0.8.1dev'); +define('LACONICA_VERSION', '0.8.1pre1'); define('AVATAR_PROFILE_SIZE', 96); define('AVATAR_STREAM_SIZE', 48); From 83ff1cecd39e197e108ecdaba7139b59d22dbee0 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 16:26:19 -0400 Subject: [PATCH 090/423] Use NICKNAME_FMT everywhere consistently --- actions/finishopenidlogin.php | 4 ++-- actions/profilesettings.php | 2 +- actions/updateprofile.php | 2 +- actions/userauthorization.php | 2 +- plugins/FBConnect/FBConnectAuth.php | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/actions/finishopenidlogin.php b/actions/finishopenidlogin.php index ff0b35218f..ba1e933e3e 100644 --- a/actions/finishopenidlogin.php +++ b/actions/finishopenidlogin.php @@ -217,7 +217,7 @@ class FinishopenidloginAction extends Action if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); return; } @@ -389,7 +389,7 @@ class FinishopenidloginAction extends Action { if (!Validate::string($str, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { return false; } if (!User::allowed_nickname($str)) { diff --git a/actions/profilesettings.php b/actions/profilesettings.php index fb847680b9..d8fb2c9bb1 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -189,7 +189,7 @@ class ProfilesettingsAction extends AccountSettingsAction // Some validation if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); return; } else if (!User::allowed_nickname($nickname)) { diff --git a/actions/updateprofile.php b/actions/updateprofile.php index d8b62fb090..f6cb277aa7 100644 --- a/actions/updateprofile.php +++ b/actions/updateprofile.php @@ -79,7 +79,7 @@ class UpdateprofileAction extends Action $nickname = $req->get_parameter('omb_listenee_nickname'); if ($nickname && !Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { $this->clientError(_('Nickname must have only lowercase letters and numbers and no spaces.')); return false; } diff --git a/actions/userauthorization.php b/actions/userauthorization.php index 8dc2c808d6..00903ae01a 100644 --- a/actions/userauthorization.php +++ b/actions/userauthorization.php @@ -481,7 +481,7 @@ class UserauthorizationAction extends Action $nickname = $_GET['omb_listenee_nickname']; if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { throw new OAuthException('Nickname must have only letters and numbers and no spaces.'); } $profile = $_GET['omb_listenee_profile']; diff --git a/plugins/FBConnect/FBConnectAuth.php b/plugins/FBConnect/FBConnectAuth.php index 3cf9fefc13..a3e2cdadcd 100644 --- a/plugins/FBConnect/FBConnectAuth.php +++ b/plugins/FBConnect/FBConnectAuth.php @@ -238,7 +238,7 @@ class FBConnectauthAction extends Action if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); return; } @@ -418,7 +418,7 @@ class FBConnectauthAction extends Action { if (!Validate::string($str, array('min_length' => 1, 'max_length' => 64, - 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + 'format' => NICKNAME_FMT))) { return false; } if (!User::allowed_nickname($str)) { From d77982b9b47b8b17051000cfcf3db1a8945d6279 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 17:09:19 -0400 Subject: [PATCH 091/423] added Infinite Scroll plugin --- .../InfiniteScroll/InfiniteScrollPlugin.php | 66 +++++ plugins/InfiniteScroll/ajax-loader.gif | Bin 0 -> 10819 bytes .../InfiniteScroll/jquery.infinitescroll.js | 251 ++++++++++++++++++ .../jquery.infinitescroll.min.js | 8 + plugins/InfiniteScroll/readme.txt | 6 + 5 files changed, 331 insertions(+) create mode 100644 plugins/InfiniteScroll/InfiniteScrollPlugin.php create mode 100644 plugins/InfiniteScroll/ajax-loader.gif create mode 100644 plugins/InfiniteScroll/jquery.infinitescroll.js create mode 100644 plugins/InfiniteScroll/jquery.infinitescroll.min.js create mode 100644 plugins/InfiniteScroll/readme.txt diff --git a/plugins/InfiniteScroll/InfiniteScrollPlugin.php b/plugins/InfiniteScroll/InfiniteScrollPlugin.php new file mode 100644 index 0000000000..6738dc7608 --- /dev/null +++ b/plugins/InfiniteScroll/InfiniteScrollPlugin.php @@ -0,0 +1,66 @@ +. + * + * @category Plugin + * @package Laconica + * @author Craig Andrews + * @copyright 2009 Craig Andrews http://candrews.integralblue.com + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +class InfiniteScrollPlugin extends Plugin +{ + function __construct() + { + parent::__construct(); + } + + function onEndShowScripts($action) + { + $action->element('script', + array('type' => 'text/javascript', + 'src' => common_path('plugins/InfiniteScroll/jquery.infinitescroll.min.js')), + ''); + + $loading_image = common_path('plugins/InfiniteScroll/ajax-loader.gif'); + $js_string = << +jQuery(document).ready(function($){ + $('notices_primary').infinitescroll({ + nextSelector : "li.nav_next a", + loadingImg : "$loading_image", + text : "Loading the next set of posts...", + donetext : "Congratulations, you\'ve reached the end of the Internet.", + navSelector : "div.pagination", + contentSelector : "#notices_primary", + itemSelector : "ol.notices" + }); +}); + +EOT; + $action->raw($js_string); + } +} diff --git a/plugins/InfiniteScroll/ajax-loader.gif b/plugins/InfiniteScroll/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..a576ecd5e1e9aefbb8dea6b59126dd75224e6045 GIT binary patch literal 10819 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 jscie#Rue5X9<`z0E$lxv') : $('
    '); + + box + .attr('id','infscr-page-'+props.currPage) + .addClass('infscr-pages') + .appendTo( opts.contentSelector ) + .load( path.join( props.currPage ) + ' ' + opts.itemSelector,null,function(){ + + // if we've hit the last page... + if (props.isDone){ + showDoneMsg(); + return false; + + } else { + + // if it didn't return anything + if (box.children().length == 0){ + // fake an ajaxError so we can quit. + $.event.trigger( "ajaxError", [{status:404}] ); + } + + // fadeout currently makes the 'd text ugly in IE6 + props.loadingMsg.fadeOut('normal' ); + + // smooth scroll to ease in the new content + if (opts.animate){ + var scrollTo = $(window).scrollTop() + $('#infscr-loading').height() + opts.extraScrollPx + 'px'; + $('html,body').animate({scrollTop: scrollTo}, 800,function(){ props.isDuringAjax = false; }); + } + + // pass in the new DOM element as context for the callback + callback.call( box[0] ); + + if (!opts.animate) props.isDuringAjax = false; // once the call is done, we can allow it again. + } + }); // end of load() + + + } // end of infscrSetup() + + + + + // lets get started. + + var opts = $.extend({}, $.infinitescroll.defaults, options); + var props = $.infinitescroll; // shorthand + callback = callback || function(){}; + + if (!areSelectorsValid(opts)){ return false; } + + // we doing this on an overflow:auto div? + props.container = opts.localMode ? this : document.documentElement; + + // contentSelector we'll use for our .load() + opts.contentSelector = opts.contentSelector || this; + + + // get the relative URL - everything past the domain name. + var relurl = /(.*?\/\/).*?(\/.*)/; + var path = $(opts.nextSelector).attr('href'); + + + if (!path) { debug('Navigation selector not found'); return; } + + // set the path to be a relative URL from root. + path = determinePath(path); + + + // reset scrollTop in case of page refresh: + if (opts.localMode) $(props.container)[0].scrollTop = 0; + + // distance from nav links to bottom + // computed as: height of the document + top offset of container - top offset of nav link + props.pixelsFromNavToBottom = getDocumentHeight() + + $(props.container).offset().top - + $(opts.navSelector).offset().top; + + // define loading msg + props.loadingMsg = $('
    Loading...
    '+opts.loadingText+'
    '); + // preload the image + (new Image()).src = opts.loadingImg; + + + + // set up our bindings + $(document).ajaxError(function(e,xhr,opt){ + debug('Page not found. Self-destructing...'); + + // die if we're out of pages. + if (xhr.status == 404){ + showDoneMsg(); + props.isDone = true; + $(opts.localMode ? this : window).unbind('scroll.infscr'); + } + }); + + // bind scroll handler to element (if its a local scroll) or window + $(opts.localMode ? this : window) + .bind('scroll.infscr', function(){ infscrSetup(path,opts,props,callback); } ) + .trigger('scroll.infscr'); // trigger the event, in case it's a short page + + + return this; + + } // end of $.fn.infinitescroll() + + + + // options and read-only properties object + + $.infinitescroll = { + defaults : { + debug : false, + preload : false, + nextSelector : "div.navigation a:first", + loadingImg : "http://www.infinite-scroll.com/loading.gif", + loadingText : "Loading the next set of posts...", + donetext : "Congratulations, you've reached the end of the internet.", + navSelector : "div.navigation", + contentSelector : null, // not really a selector. :) it's whatever the method was called on.. + extraScrollPx : 150, + itemSelector : "div.post", + animate : false, + localMode : false, + bufferPx : 40, + errorCallback : function(){} + }, + loadingImg : undefined, + loadingMsg : undefined, + container : undefined, + currPage : 1, + currDOMChunk : null, // defined in setup()'s load() + isDuringAjax : false, + isInvalidPage : false, + isDone : false // for when it goes all the way through the archive. + }; + + + +})(jQuery); diff --git a/plugins/InfiniteScroll/jquery.infinitescroll.min.js b/plugins/InfiniteScroll/jquery.infinitescroll.min.js new file mode 100644 index 0000000000..04c75c4566 --- /dev/null +++ b/plugins/InfiniteScroll/jquery.infinitescroll.min.js @@ -0,0 +1,8 @@ +/* +// Infinite Scroll jQuery plugin +// copyright Paul Irish, licensed GPL & MIT +// version 1.2.090804 + +// home and docs: http://www.infinite-scroll.com +*/ +(function(A){A.fn.infinitescroll=function(N,L){function E(){if(B.debug){window.console&&console.log.call(console,arguments)}}function G(P){for(var O in P){if(O.indexOf&&O.indexOf("Selector")&&A(P[O]).length===0){E("Your "+O+" found no elements.");return false}return true}}function K(O){O.match(C)?O.match(C)[2]:O;if(O.match(/^(.*?)\b2\b(.*?$)/)){O=O.match(/^(.*?)\b2\b(.*?$)/).slice(1)}else{if(O.match(/^(.*?)2(.*?$)/)){E("Trying backup next selector parse technique. Treacherous waters here, matey.");O=O.match(/^(.*?)2(.*?$)/).slice(1)}else{E("Sorry, we couldn't parse your Next (Previous Posts) URL. Verify your the css selector points to the correct A tag. If you still get this error: yell, scream, and kindly ask for help at infinite-scroll.com.");H.isInvalidPage=true}}return O}function I(){return B.localMode?(A(H.container)[0].scrollHeight&&A(H.container)[0].scrollHeight):A(document).height()}function F(Q,P){var O=I()-(Q.localMode?A(P.container).scrollTop():(A(P.container).scrollTop()||A(P.container.ownerDocument.body).scrollTop()))-A(Q.localMode?P.container:window).height();E("math:",O,P.pixelsFromNavToBottom);return(O-Q.bufferPx"):A("
    ");P.attr("id","infscr-page-"+O.currPage).addClass("infscr-pages").appendTo(Q.contentSelector).load(R.join(O.currPage)+" "+Q.itemSelector,null,function(){if(O.isDone){J();return false}else{if(P.children().length==0){A.event.trigger("ajaxError",[{status:404}])}O.loadingMsg.fadeOut("normal");if(Q.animate){var T=A(window).scrollTop()+A("#infscr-loading").height()+Q.extraScrollPx+"px";A("html,body").animate({scrollTop:T},800,function(){O.isDuringAjax=false})}S.call(P[0]);if(!Q.animate){O.isDuringAjax=false}}})}var B=A.extend({},A.infinitescroll.defaults,N);var H=A.infinitescroll;L=L||function(){};if(!G(B)){return false}H.container=B.localMode?this:document.documentElement;B.contentSelector=B.contentSelector||this;var C=/(.*?\/\/).*?(\/.*)/;var M=A(B.nextSelector).attr("href");if(!M){E("Navigation selector not found");return }M=K(M);if(B.localMode){A(H.container)[0].scrollTop=0}H.pixelsFromNavToBottom=I()+A(H.container).offset().top-A(B.navSelector).offset().top;H.loadingMsg=A('
    Loading...
    '+B.loadingText+"
    ");(new Image()).src=B.loadingImg;A(document).ajaxError(function(P,Q,O){E("Page not found. Self-destructing...");if(Q.status==404){J();H.isDone=true;A(B.localMode?this:window).unbind("scroll.infscr")}});A(B.localMode?this:window).bind("scroll.infscr",function(){D(M,B,H,L)}).trigger("scroll.infscr");return this};A.infinitescroll={defaults:{debug:false,preload:false,nextSelector:"div.navigation a:first",loadingImg:"http://www.infinite-scroll.com/loading.gif",loadingText:"Loading the next set of posts...",donetext:"Congratulations, you've reached the end of the internet.",navSelector:"div.navigation",contentSelector:null,extraScrollPx:150,itemSelector:"div.post",animate:false,localMode:false,bufferPx:40,errorCallback:function(){}},loadingImg:undefined,loadingMsg:undefined,container:undefined,currPage:1,currDOMChunk:null,isDuringAjax:false,isInvalidPage:false,isDone:false}})(jQuery); \ No newline at end of file diff --git a/plugins/InfiniteScroll/readme.txt b/plugins/InfiniteScroll/readme.txt new file mode 100644 index 0000000000..3ce3b7fd23 --- /dev/null +++ b/plugins/InfiniteScroll/readme.txt @@ -0,0 +1,6 @@ +Infinite Scroll adds the following functionality to your Laconica installation: When a user scrolls towards the bottom of the page, the next page of notices is automatically retrieved and appended. This means they never need to click "Next Page", which dramatically increases stickiness. + +Installation +============ +Add "addPlugin('InfiniteScroll');" to the bottom of your config.php +That's it! From 95ba22c5d7ffb28fa5c44a398edca86cc0f637f5 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 18:27:27 -0400 Subject: [PATCH 092/423] Switch DOCTYPE's to the XHTML 5 DOCTYPE --- install.php | 4 +--- lib/htmloutputter.php | 4 +--- plugins/FBConnect/FBC_XDReceiver.php | 4 +--- plugins/FBConnect/FBConnectPlugin.php | 4 +--- plugins/recaptcha/recaptcha.php | 4 +--- tpl/index.php | 6 ++---- 6 files changed, 7 insertions(+), 19 deletions(-) diff --git a/install.php b/install.php index 227f99789a..ea21356518 100644 --- a/install.php +++ b/install.php @@ -383,9 +383,7 @@ function runDbScript($filename, $conn, $type='mysql') ?> xml version="1.0" encoding="UTF-8" "; ?> - + Install Laconica diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 06603ac054..cba8a5f5e0 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -110,9 +110,7 @@ class HTMLOutputter extends XMLOutputter $this->extraHeaders(); - $this->startXML('html', - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + $this->startXML('html'); $language = $this->getLanguage(); diff --git a/plugins/FBConnect/FBC_XDReceiver.php b/plugins/FBConnect/FBC_XDReceiver.php index 57c98b4f14..d9677fca7b 100644 --- a/plugins/FBConnect/FBC_XDReceiver.php +++ b/plugins/FBConnect/FBC_XDReceiver.php @@ -47,9 +47,7 @@ class FBC_XDReceiverAction extends Action header('Expires:'); header('Pragma:'); - $this->startXML('html', - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + $this->startXML('html'); $language = $this->getLanguage(); diff --git a/plugins/FBConnect/FBConnectPlugin.php b/plugins/FBConnect/FBConnectPlugin.php index 6788793b25..2fb10a6758 100644 --- a/plugins/FBConnect/FBConnectPlugin.php +++ b/plugins/FBConnect/FBConnectPlugin.php @@ -82,9 +82,7 @@ class FBConnectPlugin extends Plugin $action->extraHeaders(); - $action->startXML('html', - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + $action->startXML('html'); $language = $action->getLanguage(); diff --git a/plugins/recaptcha/recaptcha.php b/plugins/recaptcha/recaptcha.php index 5ef8352d18..38a860fc75 100644 --- a/plugins/recaptcha/recaptcha.php +++ b/plugins/recaptcha/recaptcha.php @@ -65,9 +65,7 @@ class recaptcha extends Plugin $action->extraHeaders(); - $action->startXML('html', - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); + $action->startXML('html'); $action->raw(''); return false; diff --git a/tpl/index.php b/tpl/index.php index 5f1ed84394..be375e75a6 100644 --- a/tpl/index.php +++ b/tpl/index.php @@ -1,6 +1,4 @@ - + <?php echo section('title'); ?> @@ -44,4 +42,4 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    - \ No newline at end of file + From b975a6a0e5a5a7332eea4834494029c5c1238540 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 18:55:47 -0400 Subject: [PATCH 093/423] Don't start HTML responses with extraHeaders(); - - $this->startXML('html'); + if( ! substr($type,0,strlen('text/html'))=='text/html' ){ + // Browsers don't like it when xw->startDocument('1.0', 'UTF-8'); + } + if ($doc) { + $this->xw->writeDTD('html', $public, $system); + } $language = $this->getLanguage(); From feac024348e0584c84fd5392c503d912000d30bc Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 19:24:34 -0400 Subject: [PATCH 094/423] Accidentally caused the DOCTYPE to never be rendered - fix that. --- lib/htmloutputter.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 8f3b1a609c..5da1fbe148 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -113,9 +113,7 @@ class HTMLOutputter extends XMLOutputter // Browsers don't like it when xw->startDocument('1.0', 'UTF-8'); } - if ($doc) { - $this->xw->writeDTD('html', $public, $system); - } + $this->xw->writeDTD('html', $public, $system); $language = $this->getLanguage(); From 6a76addbe8bbfafd1a1dd6ed7ffbf8afebff5abe Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 19:35:42 -0400 Subject: [PATCH 095/423] Added cssLink() and script() functions to htmloutputter --- lib/htmloutputter.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 5da1fbe148..0b4c1405a8 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -339,6 +339,42 @@ class HTMLOutputter extends XMLOutputter 'title' => $title)); } + /** + * output a script (almost always javascript) tag + * + * @param string $src relative or absolute script path + * @param string $type 'type' attribute value of the tag + * + * @return void + */ + function script($src, $type='text/javascript') + { + $this->element('script', array('type' => $type, + 'src' => common_path($src) . '?version=' . LACONICA_VERSION), + ' '); + } + + /** + * output a css link + * + * @param string $relative relative path within the theme directory + * @param string $theme 'theme' that contains the stylesheet + * @param string media 'media' attribute of the tag + * + * @return void + */ + function cssLink($relative,$theme,$media) + { + if (!$theme) { + $theme = common_config('site', 'theme'); + } + + $this->element('link', array('rel' => 'stylesheet', + 'type' => 'text/css', + 'href' => theme_path($relative, $theme) . '?version=' . LACONICA_VERSION, + 'media' => $media)); + } + /** * output an HTML textarea and associated elements * From 304db1d30b4ad96f8a2ca500d224bb1609588fed Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 19:45:12 -0400 Subject: [PATCH 096/423] Use script() and cssLink() methods everywhere instead of manually writing out javascript and css each time --- actions/avatarsettings.php | 17 +++-------------- actions/grouplogo.php | 17 +++-------------- lib/action.php | 39 +++++++++----------------------------- lib/designsettings.php | 17 +++-------------- lib/facebookaction.php | 27 +++----------------------- 5 files changed, 21 insertions(+), 96 deletions(-) diff --git a/actions/avatarsettings.php b/actions/avatarsettings.php index c2bb35a395..38e3103f4a 100644 --- a/actions/avatarsettings.php +++ b/actions/avatarsettings.php @@ -382,13 +382,7 @@ class AvatarsettingsAction extends AccountSettingsAction function showStylesheets() { parent::showStylesheets(); - $jcropStyle = - common_path('theme/base/css/jquery.Jcrop.css?version='.LACONICA_VERSION); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $jcropStyle, - 'media' => 'screen, projection, tv')); + $this->cssLink('css/jquery.Jcrop.css','base','screen, projection, tv'); } /** @@ -402,13 +396,8 @@ class AvatarsettingsAction extends AccountSettingsAction parent::showScripts(); if ($this->mode == 'crop') { - $jcropPack = common_path('js/jcrop/jquery.Jcrop.pack.js'); - $jcropGo = common_path('js/jcrop/jquery.Jcrop.go.js'); - - $this->element('script', array('type' => 'text/javascript', - 'src' => $jcropPack)); - $this->element('script', array('type' => 'text/javascript', - 'src' => $jcropGo)); + $this->script('js/jcrop/jquery.Jcrop.pack.js'); + $this->script('js/jcrop/jquery.Jcrop.go.js'); } } } diff --git a/actions/grouplogo.php b/actions/grouplogo.php index 8f6158daca..5edb10cf8a 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -428,13 +428,7 @@ class GrouplogoAction extends GroupDesignAction function showStylesheets() { parent::showStylesheets(); - $jcropStyle = - common_path('theme/base/css/jquery.Jcrop.css?version='.LACONICA_VERSION); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $jcropStyle, - 'media' => 'screen, projection, tv')); + $this->cssLink('css/jquery.Jcrop.css','base','screen, projection, tv'); } /** @@ -448,13 +442,8 @@ class GrouplogoAction extends GroupDesignAction parent::showScripts(); if ($this->mode == 'crop') { - $jcropPack = common_path('js/jcrop/jquery.Jcrop.pack.js'); - $jcropGo = common_path('js/jcrop/jquery.Jcrop.go.js'); - - $this->element('script', array('type' => 'text/javascript', - 'src' => $jcropPack)); - $this->element('script', array('type' => 'text/javascript', - 'src' => $jcropGo)); + $this->script('js/jcrop/jquery.Jcrop.pack.js'); + $this->script('js/jcrop/jquery.Jcrop.go.js'); } } diff --git a/lib/action.php b/lib/action.php index a5244371a5..1c6170693f 100644 --- a/lib/action.php +++ b/lib/action.php @@ -193,21 +193,12 @@ class Action extends HTMLOutputter // lawsuit if (Event::handle('StartShowStyles', array($this))) { if (Event::handle('StartShowLaconicaStyles', array($this))) { - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/display.css', null) . '?version=' . LACONICA_VERSION, - 'media' => 'screen, projection, tv')); + $this->cssLink('css/display.css',null,'screen, projection, tv'); if (common_config('site', 'mobile')) { - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/mobile.css', 'base') . '?version=' . LACONICA_VERSION, - // TODO: "handheld" CSS for other mobile devices - 'media' => 'only screen and (max-device-width: 480px)')); // Mobile WebKit + // TODO: "handheld" CSS for other mobile devices + $this->cssLink('css/mobile.css','base','only screen and (max-device-width: 480px)'); // Mobile WebKit } - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/print.css', 'base') . '?version=' . LACONICA_VERSION, - 'media' => 'print')); + $this->cssLink('css/print.css','base','print'); Event::handle('EndShowLaconicaStyles', array($this)); } @@ -253,26 +244,14 @@ class Action extends HTMLOutputter // lawsuit { if (Event::handle('StartShowScripts', array($this))) { if (Event::handle('StartShowJQueryScripts', array($this))) { - $this->element('script', array('type' => 'text/javascript', - 'src' => common_path('js/jquery.min.js')), - ' '); - $this->element('script', array('type' => 'text/javascript', - 'src' => common_path('js/jquery.form.js')), - ' '); - - $this->element('script', array('type' => 'text/javascript', - 'src' => common_path('js/jquery.joverlay.min.js')), - ' '); - + $this->script('js/jquery.min.js'); + $this->script('js/jquery.form.js'); + $this->script('js/jquery.joverlay.min.js'); Event::handle('EndShowJQueryScripts', array($this)); } if (Event::handle('StartShowLaconicaScripts', array($this))) { - $this->element('script', array('type' => 'text/javascript', - 'src' => common_path('js/xbImportNode.js')), - ' '); - $this->element('script', array('type' => 'text/javascript', - 'src' => common_path('js/util.js?version='.LACONICA_VERSION)), - ' '); + $this->script('js/xbImportNode.js'); + $this->script('js/util.js'); // Frame-busting code to avoid clickjacking attacks. $this->element('script', array('type' => 'text/javascript'), 'if (window.top !== window.self) { window.top.location.href = window.self.location.href; }'); diff --git a/lib/designsettings.php b/lib/designsettings.php index 1b0e621669..a48ec9d227 100644 --- a/lib/designsettings.php +++ b/lib/designsettings.php @@ -311,13 +311,7 @@ class DesignSettingsAction extends AccountSettingsAction function showStylesheets() { parent::showStylesheets(); - $farbtasticStyle = - common_path('theme/base/css/farbtastic.css?version='.LACONICA_VERSION); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $farbtasticStyle, - 'media' => 'screen, projection, tv')); + $this->cssLink('css/farbtastic.css','base','screen, projection, tv'); } /** @@ -330,13 +324,8 @@ class DesignSettingsAction extends AccountSettingsAction { parent::showScripts(); - $farbtasticPack = common_path('js/farbtastic/farbtastic.js'); - $userDesignGo = common_path('js/userdesign.go.js'); - - $this->element('script', array('type' => 'text/javascript', - 'src' => $farbtasticPack)); - $this->element('script', array('type' => 'text/javascript', - 'src' => $userDesignGo)); + $this->script('js/farbtastic/farbtastic.js'); + $this->script('js/farbtastic/farbtastic.go.js'); } /** diff --git a/lib/facebookaction.php b/lib/facebookaction.php index 5be2f2fe66..ab11b613ed 100644 --- a/lib/facebookaction.php +++ b/lib/facebookaction.php @@ -95,34 +95,13 @@ class FacebookAction extends Action function showStylesheets() { - // Add a timestamp to the file so Facebook cache wont ignore our changes - $ts = filemtime(INSTALLDIR.'/theme/base/css/display.css'); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/display.css', 'base') . '?ts=' . $ts)); - - $theme = common_config('site', 'theme'); - - $ts = filemtime(INSTALLDIR. '/theme/' . $theme .'/css/display.css'); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/display.css', null) . '?ts=' . $ts)); - - $ts = filemtime(INSTALLDIR.'/theme/base/css/facebookapp.css'); - - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/facebookapp.css', 'base') . '?ts=' . $ts)); + $this->cssLink('css/display.css', 'base'); + $this->cssLink('css/facebookapp.css', 'base'); } function showScripts() { - // Add a timestamp to the file so Facebook cache wont ignore our changes - $ts = filemtime(INSTALLDIR.'/js/facebookapp.js'); - - $this->element('script', array('src' => common_path('js/facebookapp.js') . '?ts=' . $ts)); + $this->script('js/facebookapp.js'); } /** From 9a9195ecd8eea36943dbb5e46adf685aef9edc4e Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 19:54:46 -0400 Subject: [PATCH 097/423] Used script() function to write out the javascript link --- plugins/InfiniteScroll/InfiniteScrollPlugin.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/InfiniteScroll/InfiniteScrollPlugin.php b/plugins/InfiniteScroll/InfiniteScrollPlugin.php index 6738dc7608..7e942550ae 100644 --- a/plugins/InfiniteScroll/InfiniteScrollPlugin.php +++ b/plugins/InfiniteScroll/InfiniteScrollPlugin.php @@ -40,11 +40,7 @@ class InfiniteScrollPlugin extends Plugin function onEndShowScripts($action) { - $action->element('script', - array('type' => 'text/javascript', - 'src' => common_path('plugins/InfiniteScroll/jquery.infinitescroll.min.js')), - ''); - + $action->script('plugins/InfiniteScroll/jquery.infinitescroll.min.js'); $loading_image = common_path('plugins/InfiniteScroll/ajax-loader.gif'); $js_string = << From 5ba33836654e7e09098880fe9e6e9d3593f23b40 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 5 Aug 2009 20:15:00 -0400 Subject: [PATCH 098/423] Use script() to write out javascript +EOT; + $action->raw($js_string); + $action->script('plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.pack.js'); + $action->script('plugins/Autocomplete/Autocomplete.js'); + } + + function onEndShowLaconicaStyles($action) + { + $action->cssLink('plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.css'); + } + +} +?> diff --git a/plugins/Autocomplete/jquery-autocomplete/changelog.txt b/plugins/Autocomplete/jquery-autocomplete/changelog.txt new file mode 100644 index 0000000000..94cb5ccde7 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/changelog.txt @@ -0,0 +1,20 @@ +1.0.2 +----- +* Fixed missing semicolon + +1.0.1 +----- +* Fixed element creation (
      to
        and
      • to
      • ) +* Fixed ac_even class (was ac_event) +* Fixed bgiframe usage: now its really optional +* Removed the blur-on-return workaround, added a less obtrusive one only for Opera +* Fixed hold cursor keys: Opera needs keypress, everyone else keydown to scroll through result list when holding cursor key +* Updated package to jQuery 1.2.5, removing dimensions +* Fixed multiple-mustMatch: Remove only the last term when no match is found +* Fixed multiple without mustMatch: Don't select the last active when no match is found (on tab/return) +* Fixed multiple cursor position: Put cursor at end of input after selecting a value + +1.0 +--- + +* First release. \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/bg.gif b/plugins/Autocomplete/jquery-autocomplete/demo/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..846add07140d6ff8679e2d3715f6ee25a8045113 GIT binary patch literal 1175 zcmZ?wbhEHbTzEjN_<%&o zL8;P%GG&M4Dh?}D9#*bCqFQrAz4oYP-BIoOW4evU^_z|xwVW_%Jz>^%(xUyORmUmY zuG9A2ryYCGIQN}#?LX^2;jHJxb3T*L`%O6?FzrIn^a~*~E{4s#7&-e=^qkAFb1%ow zzmmA%O7g<1sf(^=EV-7o^m@*+>v=0~6s){ay!vM8np@>-Z&j|lUA_Kx?Z!Lxo9?u3 zz1O|-!KA$pXB>Py|LD`DC!eoA^J3G5S39n}*?;5h(L3)?-~V{&$>$r-zubTQ?dkg; zZ$AJ0^!@kG-+%xA{}1%>C>RX^cnB!|WC61OGw6UsKzV|J<39rudPj2S4Ze(+&%TR>H7Kv!wy+* zv*w$dGfY>+o-S*?y}iKl#9Z&~&3AWK*uJ=X`g`;J{SA&Bay}L<4-a>^YQ&wXXnA~m zf~UtkpPemFPtWkpxOe7f%k%RK0z2e+2gLPt5b(-TL@HT@io2uKoA-50xk8`|of6`};@ji~HyQw*xZ~lj4I07PiC(jT~GHA2jjsJ$%qC zAf))PMMNy|VXK7H!iQ}#at|N2D<~;G>QGTjeAKC-weV4wj^4vZ-3CUAk9$na5+C"peter@pan.de", + "Molly"=>"molly@yahoo.com", + "Forneria Marconi"=>"live@japan.jp", + "Master Sync"=>"205bw@samsung.com", + "Dr. Tech de Log"=>"g15@logitech.com", + "Don Corleone"=>"don@vegas.com", + "Mc Chick"=>"info@donalds.org", + "Donnie Darko"=>"dd@timeshift.info", + "Quake The Net"=>"webmaster@quakenet.org", + "Dr. Write"=>"write@writable.com" +); + +echo "["; +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + echo "{ name: \"$key\", to: \"$value\" }, "; + } +} +echo "]"; \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/emails.phps b/plugins/Autocomplete/jquery-autocomplete/demo/emails.phps new file mode 100644 index 0000000000..f79b10e4a8 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/emails.phps @@ -0,0 +1,23 @@ +"peter@pan.de", + "Molly"=>"molly@yahoo.com", + "Forneria Marconi"=>"live@japan.jp", + "Master Sync"=>"205bw@samsung.com", + "Dr. Tech de Log"=>"g15@logitech.com", + "Don Corleone"=>"don@vegas.com", + "Mc Chick"=>"info@donalds.org", + "Donnie Darko"=>"dd@timeshift.info", + "Quake The Net"=>"webmaster@quakenet.org", + "Dr. Write"=>"write@writable.com" +); + +echo "["; +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + echo "{ name: \"$key\", to: \"$value\" }, "; + } +} +echo "]"; \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images.php b/plugins/Autocomplete/jquery-autocomplete/demo/images.php new file mode 100644 index 0000000000..407645c064 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/images.php @@ -0,0 +1,9 @@ + diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Amsterdam Van-Gogh Museum.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Amsterdam Van-Gogh Museum.jpg new file mode 100644 index 0000000000000000000000000000000000000000..025328c7d41782ef4aab8ed8d52ef2be040dca87 GIT binary patch literal 4884 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Amsterdam.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Amsterdam.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f019bdfd36a6446d7f4a57c45d7dc373adbdaa3 GIT binary patch literal 5853 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Antwerpen Rubenshaus.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Antwerpen Rubenshaus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f5d01f716ec30eb0e77dfe7782a1114cb336d9b GIT binary patch literal 6069 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Antwerpen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Antwerpen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46f74a3d14140b0c7f10948040d7f30ecc030d05 GIT binary patch literal 3454 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 KygtcR^8O!H^S3_$ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Appenzell.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Appenzell.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1691ed954460b7641a2dd109d3a995a4dffaaf59 GIT binary patch literal 6028 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Arnhem Historisches Museum.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Arnhem Historisches Museum.jpg new file mode 100644 index 0000000000000000000000000000000000000000..276f88a3145a72baf1a31b900792e6971a970bbf GIT binary patch literal 4207 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 OM!$}?a9@Q}2mc3s8miO) literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Bled.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Bled.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdcae3184d81c61c405c48a6389e927045080ecf GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Bled_Die Burg von Bled.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Bled_Die Burg von Bled.jpg new file mode 100644 index 0000000000000000000000000000000000000000..355108409c0b59021d3bcc273a7f9cdbf4d600f2 GIT binary patch literal 6723 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Bogojina_Die Pfarrkirche.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Bogojina_Die Pfarrkirche.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e0cd509926c2eb2f2140c826f0b1ebc2575bc01 GIT binary patch literal 6144 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 W_#4EqJRSt3`2yR0!gS*P_QA-0w@T% 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 COd0wB literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/BolognaPiazzaMaggiore.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/BolognaPiazzaMaggiore.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48449cf1e518d72fd6fd908f4b0e8b32ea1a2f0b GIT binary patch literal 5394 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Bolsward Martinikerk.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Bolsward Martinikerk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6df035af41db9c65df55d54a8671ac69e8b6ac71 GIT binary patch literal 5524 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 OUChxR{WqMItp5T4fez*X literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/BordeauxND.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/BordeauxND.jpg new file mode 100644 index 0000000000000000000000000000000000000000..242ecefc3ed08e5e5db0c215c8b22218496ff5eb GIT binary patch literal 6149 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 Ya1v1LD2s^WFJacb%K-cj0O2P73uq#?zW@LL literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Bouillon.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Bouillon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72638cfd82ca9fcd32e75f400c7c4cb8eeb25774 GIT binary patch literal 6465 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 Y=2L0Q-;}gWZ~hAptl!Oz1Fk3k2jLp)7ytkO literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Gent Hotel de Ville2.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Gent Hotel de Ville2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9084f6f4711b43ca8542c10bf556418f428b6002 GIT binary patch literal 6495 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Gent.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Gent.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebbd6df49da57261eff40d1b2afc5ed827c15a4f GIT binary patch literal 3318 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/GenuabeiNacht.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/GenuabeiNacht.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2a371036245081ca8b0a423707012fa6131d693 GIT binary patch literal 3844 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 B7+nAW literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Giethoorn.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Giethoorn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6f7b0f4c2e572eb9c14d0649fd4798a27696583 GIT binary patch literal 3818 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Gnesen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Gnesen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8825a8461e1745c630a6a5bbf82b0e116e3bf89 GIT binary patch literal 5727 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 bzmu>%geMjTRY{9G9fM(Inislb&!+wh*MWui literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Gornij Grad_KATHEDRALE.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Gornij Grad_KATHEDRALE.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47cce10d3e64a1beebd75be580d7502552aa00c3 GIT binary patch literal 4697 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 SrzS4z;EW40(pTZU`t=`{Eqnz4 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Grad_Burg Grad2.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Grad_Burg Grad2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bf35ad85b9450e38caf929921e6b77e124f3166 GIT binary patch literal 6766 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%0A&GXhZ2mT-wa&UMkZ- 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Groningen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Groningen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0068a86f3bf8f9302d01c70b0cc1260492eaf256 GIT binary patch literal 5378 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/GrottenvonReclere.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/GrottenvonReclere.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74d6b3d3f357efbe9ee2e281ba40163f0921125f GIT binary patch literal 5638 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 IARIUSFIu!h{r~^~ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Guebwiller.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Guebwiller.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e31f924c467c224ca0a7c201d3a3292025d88383 GIT binary patch literal 5458 zcmbW4XIN8B*Y9^oLhpp$r3nav2+~26E+S2&tALbH1*C&i5h;f1trY1<3%!XnfzYHE z=_N#(AU#1!-stn*&zJM%oU`_|_P(zDn>924J#($u3;!Lz4AAOmXlnopP&040C{kwSUu$jJc+jQr1&hS2{X`!fy%paoX`%fV zF@wPqk}ICD8)1kXQa-h+4o1V#J$|XD&%?>cnV4Bv*#rcIt_q9Xl$NcJ|L49G#rKynSBy`uPV$L`Frwig_KIl$?^9mj3Ra_qlob1%*Y$ zpGvB0YU}D78k?Fszjk%^pnCiI$Hpfnr>4Kp%&x4W*DycUH#WES4-SuxPq4Vt-yi_| zA322k|DlJDpoa(o0Ygas=m8P=5*$nif$~Zc)895AdE&`%f&D*{{wn&v6BPdcrRcwc{;LN+3s8bVglz++15|)B@mNt*tI)ae^tmXS zyK2i66%wz@PsjG&#zFi;{<6+zqm!c~j zD$_mumhhSUa-w>E_AA*q338 z+!p15)xePovF>#3z3Ti0cmc#OB^0J zxLc+!gY=qlM3Sj6D_X?8*$57u5W*SJ^w2OxB-VGS>@28smTrA-J3abO^9$#6uSG{B z)tIuRU+S@fXRt48{XFGI)sLwhhz!%p4Yqmnouv70ta;N#exCKC0EA~!Y`~n8oIp)z z|F<03A;r;~j=8ZDACZ|MvJRI_b`c`R-L$i&Jo`54rf<&8$E^>$Op{`4?O!KT+c+6v zkaxzK=2Ikb8hBuR8xM?|P?naCCRwHbNVxw?tv1ZyWfbvnMp%@HW`oX^)~c$8aAF`# zG)WE30%i|RR0|H5K4~-7A_hcchl38n{xGGfOsQ(si#rr2Oz)TkNxUN%x(s-RE;Z zY#V-%L~Ujt&gMrS-kU&6Sr3S`Jh}o(VtKpeYpPoiQUNLvb_4k8kfiV8xjmKy_iFsaEqQ_jPbo_;wZ(`_ z>%QUFH8bj~4QD04#|N!nX+kYxUUK@OAij8jvX$RizGQCBFM&nPMgisOkz_v_O&X6o zO&n~KKrM25Xmw^iAu&qb8CmobmUlK-oXxD^HStP_`FWLOe4-9Bl2>biucjE;;Ib||XEN;` z$ISOD6Y1l_sw^Ds-@%^<6i3Ef$V^)kR-()j=!F!I}A$oor_$p6AG1J$#r-e z76(S1UYcNq`%3e=f=V?WJ}`Pof{9Ii@;hk& z=lXlPgq|f13Y>75zPTI;h?KO}c2&wqCzHu$g>aTK_{YBznk!T~d)6d5=8+@B5OmGB zBp(lyi~Cg+PS;q>ZPBc=>{48RH@|DInCN2XX*K<-Me{|obk(E$gD1@i?h3rIK?M|0 zJPXOu6v)X>~rhmLc3lp3Xhl?)PrvI1oa+b+1<3T9N{z`w~;x@Fg(y(M>E!{hND7S zSo>LTYnjzZ7p{|9O43zsA~yW^>Thqrx0j++4#e&pRrpVyG)1mqPbB`V_q)!d0%pcK zJaG2~%s|}-#)!6|ul??(=oG9p-mFH)ED{(=QWS7vet-wqok{~&Ee@6Sn!F)Ie#+*D ziQASw_5<;qZNCHXz|n%5v*=jT!G*z(TTJgAGQ#BwfD8^wt~MR5wT5wf`+7lbsW|it zQ%=#c))DUx>fRkZ5YWOIA;)cFQ+|!v{6#X6*q54`v{}?Z&o8eXo2OOG39oBeb>*=lx(Yb7cG_S2?jNqO*^-)ua&BBpqt*g~oo%87brWHW>Rvw2d7@R0NSB29 zB`YQ+8%hq^gqJz!rt)#aIdfahh3}I@lJ?{yYQ&-hDpe%SQ4AuDWL`%No49{kJ}0rx)R!**XcqcxE3inz%yn+)d*F??nj7$vF=)j< zuH>^NT@UDl+Xbp=2C|U{MAdaHc9qjB|D=Q**Vj1Af%lh9voNEah}RoJSP>G5PT)a?VyPEsOC_{9h#kE+|b=69T>3P(k zZE?pS9913=@7LCay}MtqxG`DD$DiRLLyj)xa&cn}9iPSngEZ58aJ0HU<^ zE(m+TC@ZJ(DxklOVSZjNYVby5muJ;-;(l-0ouCh|U+u0*P)+j{p&#JhbWgu9S6Ubm zWw`COTM_YARd)M)dy9#)dw~mH@_ypfcJKxf(!h4leyiSQ zPW$bXZ2w*>uV<2Ty2&;Uw59H3=BLbpeto{osO-Zl^*N4lLmq5W$8MojG`>2!XpnrP z`nvix0LTgs6)`X{zmkt})z`w=h#_A|2j9{k$?_eS))I2k8`}A~!TkdTa6nPu=ygTg z9rq|cF1A;jHjI8mBQjNm{_61S!dTk5e~LZ-Hpdx> z2arfSpl2+FJZB9EDMn98#@PkKQ*c!k7LHt$?=8|ilC?Sb1`PFuJUIeIP2F5|>c>9o z7v1?~?XxfF+cqx!S@*4aY71hnv+Bvcg#Ng>*F(ztV3y6P)^yI8cs4QY_%FqujASMy zNt?*teI@QQO%(GtTL+BO$-r5kU^3;-kg7>9WIy{JIKy|f;$Gzf3bw7(RT#?8N=@zS zwY~VosQuxrRl#Dxr@NnnV%P)`uSGH{?guw;yO1Bo8$GJD(&n$G@#0{6*{E*tvNu1& zVX@VX{(hdW?ZPLf-2B1fEKE|5?-kkE9ki@#o41g)5<61*7akxIh^B&(mfLCzRHkV2 z4mjKZjeq2nMP>^&H74~asKy{ripkVB+UqA3vD{bD+uJs(=QNd{FT1K2Yog95Kipp> zRvc;^mix^nDR0EYZI*G8&)=f!gies;c}tz|@Uch21Ni3O5aUDqxg`k`?xy{ZagMjwvSA!P!yK~o^F^Np{irKx5|N@pup==k6q z?+3}|TFc9c?}S*+Sxy*F^gE-6qX|i;ONFAv$3A%VvzYi-jZ{9klhF>nNS-I%dXpUL z9v0cq%21&wO*7W$Q3aPMEjs`FYW;yEy`j#cgRMHuw89JOU-U+t_f5Cy_O*S@=sSn# zqO`oJFXF9Q7iGLjp)qX9U!9)F&u${-?+;-FOaL@he9K|fufqV(A83cZ*Z&@Fs?K}q zMO%qhU%rgjo{=GUF?G6rMuTrtA82idWq5UT2gR@2ydkTYUz(krYkMnRab4)Wx}j7y zf;RCfiE?W97Tdy^)ttraG!}jvseX135?=jQuTyNUXdt|yDSFjgTYx;F-PJ21s`m(; zVLSVU?ZCv)iaJ0#IJqr-%Qp))W4IolZUw@8W)lkrG=Q;lf9{%EQpSjXf8!a2(dOV=d4vGTjQSQ;W zug7Bb!={;E&ii9l5u;!(Wz|P3s+@^@MLK17%k_;}wB;r+j{8=&rV~B`KH(>hFR57| z5zt^Pw=Eu+s(1ls_xm2c8xj<>pvjG>c(W={R~Ut~w6OSg^AqdWQd)_{2=^zbg9caWEJ{fs;2<7$2Q6lp_+2W)IEKNL%IIrjO76rbjTef{Ckmil3GjSafhvv*rC zBIbS@q!FucU87` zE$id@f$a8!?Io8FdZx^x9u?iaU|B=29{+Z^KIO^Ho8wjA`d0^<@4mO1%Hv0<73Vx+ zU8vUgtP23Y^aD3AiYo=aKu?=j~&au2xiSM?d_TID@F;AldENsx9q9P*kw zHElg-YOQUYs1p`ESBlRX=a;AR&TZ=Tj8MM5mFC(Uw-|QMWC5)v@Hk%ZOS8yP?||0N_QNCXcc2-_#bGh~R6T$$-- zNc;*^QuHsSe=F=EFVzY4RJV3$XZ+t|D(41{d2o9pH})v5vjw~A-f;m&F?={HXV7nM z6JZ!`46}O-w1Z!Gh>jGOm5daa2^b2`ELhnX6i%Urx%URy9-lQc#YsF@8M#8Jse%ag z*~(L6QO%uGH*_%B91d;9l|JESnR%ag4`-WAhz}4ZTR4 zb3NJ1!6_k!bM4y1g^S@MmR6gh0UNc)0R~~4x?7LjPqExh(3xf1lMu&p!zl$(Xt>OL z)f=soPaUja_Z*dfa=Bm9TZoj&Jfw@XDq$Lv3`2o2C)}xlKmLrH(wY-RDC0cO-dbfV zxBWy@Vks1xt<%PeJDaK#c|w literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Kamnik_Die Franziskaner Bibliothek.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Kamnik_Die Franziskaner Bibliothek.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1de470593c5a930fbe64b6a9753d489108b2d7ab GIT binary patch literal 6284 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ǎysFvi4+cFAwkDkVlbLM2L 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Kazimierz.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Kazimierz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62c2650743386f43b24eb1731b45b78b5f0cabc5 GIT binary patch literal 6259 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 UZ^=r|J`K{lPeiYGpB=aGAN7Tv+yDRo literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/KirchbergAltesRathaus1.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/KirchbergAltesRathaus1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f4d018c49b64db8081da1b6c7ca1cbf4835c0f9 GIT binary patch literal 4295 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

        q<2aB~GI2$2%*@?b!u(DaEeL+J~f; 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 JmbdTb{s$xdpGE)x literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/KleineMeerjungfreu.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/KleineMeerjungfreu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5b13c1938a6cc580b3ea0ffaf5f1575c9e1df4f GIT binary patch literal 2788 zcmbW1c|6qp7RP@xV=Q0mU}6{yGonP+LfPsmdXVfYTO{Hsdl*VYm@rZ3u|!FssF7tX z6)J-sdu3l@?AfxbnYq*R-22@7=e_syeVy|%6|KKGql{^y~2x#~~OT z2AQxA#A3qW)HG>eLePNweZm5&1OQO20C>SC4aRCjz>FN8)8w-haF9TQP8u2nF0ksPSTyLR3A$1pU zV83m`wiz)&5W((yL68A{bUv^(DhcY9q`?gPPEiL72<+bYNda)(P7>_9r~=2mk_I?O zQ6Nqc1zzx8*iXY$1*yFZ)Oi$OWveKv!2_}CArv>{1{on>au6H^L!e-+K_~`7A`l!1 z1d@Y;1Bpa(a`AI>u_eUI$HOloBq|~-BrJ>;lg6NTVRs1&OW-B2GB{Z|Sy7C<0s*HW zEh~$IvD>&fxdgen1#xI$G#dB6iuDfm5Q1Px*q?&_DHt5V!5)X32k;6(a2Nss=RhFY zQ?e_svU3mz3MnkBX2dCCd5%lYUsOFRzu!c zoO%?u=#i8Mlm;HWhSf6KEuahRB4~b*U-^mjC((Zg6#ah@{SEXt4{HG8L%`T;gFrzB z(03V~Jlxu&W(D#0I^yn7k9tx~GM3M3#l!)4r3oI<^(?`gK3KEjObE#JCuY10tccJPxuUW>bo;VlJf^*56&+>CKEV z-RgK8q4&8YD8X%2r4+aNsUYJ6`SN()y)HyIO_fn zQom`=lk^`-)4u)lMFyS%g>2w85lraxIyl| zt8<|W`*6%lYv(zKgvEm5tNGo*DPl{mL|eSZ(|{qn;uteVzODf~!7nplNtBp=-5puy z_5B2M<;hn$1MjvKv5cPF#w?`+J>Tf=c~39MHyO$0d!cBf`Z>n}R|Wga-JGijH?dch zCVk07yZnh7Yg} zjOM3zqFog>-~HOW?vqw?u0yC+7-}8!p##fXcbUF$sh;l27|~sOVvUkME7ASD>y<&N3F18^VHK7ydge&e%|Sz!>c&e|0+g{Y}B4 zw^Z-*#w%A=`8-}!x|8oJZ7$r`wd#*>s`=P*b7Vj?{cwJ5Bxv-Ej_d@49GMjeMV zniG>!n|HprztJ3sXD&9eAe*vm%7>!?ecDYt!>N%7r#tfk`5&mTGVSJvRxfAAj;liL zojT9q+Qm5?9-WCqXK zHQ=6G93O&yH+ZRV1?@rbN|A7WCkd%a42(Bw_I7Y0%P+ zNCgXOHCQPXZ1Y_@IBlFcI^x@2xl_l2vX<31p1v?H(kMN)9KUW!Xm}&%T;$R&m*UI+ zPPitHWNMl&Bx9&iV&bs#c?hAfo|zNYwsa50Y6pA8|$StYZF!~>U}oVMJ*?! zK8+@ohnRl|y}pJI-8R4I5SrfV!NX6tQl#m-w(NlIRhRUEvs3pKrB1C-s}<&FPY3vj zNqDV3^Sp9IoxU6NwtrA2U7Ob{9AA7zziQU~mZ;i|qCx%+0|j;SqHY+@;l6rje`n({ z7PMt1U&-t`EBQGlq9Lc=ea(8HmUk(^j>nr~F*P`pHhBRiVC>sYEih_yEE<|g>`7_~ znkf+JZ~PlZ&mO2 zoqRvHop{pL!QZ(OZk3pMm3&YVsaS-kFb8ijvzV8RH-=o+MpwPZBP;0aeWz@b4E`0Y zS9eVZh!XCr(t^Yn(lF>>_l#A4wCjeaa5^5+K+7axnYMQ#Bg>AsQPT{+4x4+>_N6vE zInr|-Wg1DTQ^|2=vYtglZTuB~=)3e^;;)n0YmOVJ4?3J|vZ-a?sE^gyq8u!)IhM|Q zqdckyw=q?8+F9p??6_ncL2b^*vtjjw6us=7DK$=>@qK6D$gdiz(yH6)($7eo;p%N7uvE`ZhGDx|G)sxg)=FI*{9B zJ|xHQ?r+D}QD>W$eR4!3nP@o1oFU07v=e6h_c-05{E4E5wB|L$jsja@JC zq%(E9Q-zUcGBK%WG~O6Sdn-WA*<7p|<&S literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/LazienkiparkWarschau.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/LazienkiparkWarschau.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0b11448309f35021a28c562b0641826aa2c8b04 GIT binary patch literal 4226 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 J5~)I({TFq%pSb`4 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/LeHavreHafen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/LeHavreHafen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9fc38d016a704843b9d5667fb1ed29b3361f8af7 GIT binary patch literal 5857 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/LeMans.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/LeMans.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d919de7da591b8f251abf7dbe8de4c2391f38e9f GIT binary patch literal 6556 zcmbVwcT^MIxAuetLT^$6f*^z~%GLK9GsB2{|t#n2Jy(n6J9L_{f(5{s3;S zK?DHa=s*DAiAOjd#CWjd!Ge##@cb`6;}MQ;N8{NWkEws#U;uav1%PF|U-5qsiD!2R zK28Aumw0B!Ljj)`j^}!O?!W$Eb^tgb!~2N=;29AB2;lwyUKfz#b9ewC7LNB(<7<)v zz$^&>KqvvA2M-|z0El1&fKFNfSfv915h?(9f@fx404NavfOHlBID-8*E3)Eq@8SF7 z>xu9IfZ2TjfUDy3@f`aA&$a+i?tmYA4}K0h0UBb!2}l5gH~<0~5SRvZvj9W_gkUfP z3?_s?AcTa3L{JK1DBh^a$Vn(}QPbU`rKY8&XS~Bi&%nY!OUum3%)-Wgm*XxS6BiGh zo#)QoyX+u*Hz*O5ikO&+ot~DSp8fyTZhAl^001Hc{m1Zk=|2V{07LM@AtoUuqXq~- zU@!p$Oo$&PJ~IR#10Xbnw0A|7iEcf$f^vA#iM>J<6LUVS>7v&gKY)u{dqe|$jYfaQbnk#YiQ~}GcYtVer{r8YiIA^=;Z9<>*xOx84&n7GAcSI zHZDFjEj=SM>uq*U$-C0`Wgp5veyXjj$22rHeQEyM-P7CGKQK5nF*!9o^J8{yeq|NA zw*G5lb8GwX==kLH><{kz0tA5nTMqvGf9RpX>mh(Zz!2!adO!p(@c`362=9s#(JDWM zT6x{#5PL;T_YhTF(?!B5u6ICh?LAJ)0GC+dI{a7Ce-!=S35xjtQuM!q{#VbXehID(D+`tg+zLhB z0Eig2m_Z#SSgR$|{KWz-QK+eLbJ!A57RGc|;4hoXxTW0S;hR1h1ldk4FDGB$1Wn!v z)=pMY1UZe^n8|o81u&o@pt`>&&&mZxOL)Mht6`gIeT5}>vf82$u!#)?$w-m)zyS-q)QZzxe^CQ3U-T-muda_EJ zpY#5P3<-r_P{yw)GT|=5sGY_ZoTUj?ue3;Pi5Xvh^XkNw@wb$LEJZE@S|_=1ud7Xj z8Y#0wBUlE1@!EdlRfAlF$z24to8it6`n%iVxU@=V=14$SIF%`L`J?N@c$v{6@OwL> z4EXv#v>rC!1aE*9f!ez#9gI#F?_0y~R!}r8BX!pJy9 z14TDVrriL_wWh;?)MdpV(Q^vD@YK+KUFCD5hu2C| z1*=*iO5M$g-%u&w=5txj^1CrCQ|*rLZ9C}ClXEnlCsZFIlS zM{geaqt`IiHCMgC*ycQgS}3CwsuAM*X&k4rs{PN_ zttF?kv1oF0xX)G}mBpofytMZO|KSzMFUOyEM5gw0m?qUCzf}|p&Ko@aabN$RX{Srw zAlS>carb4em!T_-ANy}B%WSaaOD(PJzX`W(K1^_8dh%fiGmPEVWiu&Yiwt~RS@p@8 zxvZ@F)1cI}QUvyB#IK)9*1bdYuLfOmZ=x)%6w)?CfL{N|Y`flp)<9o0l* z5(9rx(DRq_RCE1iZ+e6zd7q+q?C%;!AYe&Lniq7w^eak`6-UfmM*2N+B%8?}t1%<^ zNt%R75xTHl+_c{To4c^E7SGG$SR8Hd&z{Ci`2fmhkxzth*&TcI+s9X8W!}W)b|CvnMCxd#>%Z+g?k$FQlwHwdhEMNKJp? z&X>xz7s_SB-V^hZefc1Hp;gaq`%V3|@1mXD*;opF<4LPDzmto=ZvU@LZs`n95J;M>1;yL}(@B#JKF7>mXoNq?lHLS&t zP6x0B({Za|%v&asvDzFm>&IL}e4?~{l~g~Oy5uwBh9bnoOnI0Jm~c@(AC{Ped^4Jm zQ^dc8-U^JV(`DE}VerFF`KCU(sZaC)Qx>QzawCa+loSRl=)JnFWiDGkU`)Q}q%u@> z4CIP-vk-`1t&H$QU*7Y;mX}U>_{m>s-h=a@Q0w>Rz4GpL;osXP`lZf$t3ktVLUTOR z9>eCQ9qFG*9v6x~{?@biM4H^4-CMDx0Ma(STi>Q)-TIO`D$$$4htq)~+RzT>5BB)$ zv=zTJtJ)iMU--wxkAck$x}x8wmeU=UTeowlqE2$nRR!Eu8cpBQDR`v-sAw-Hs{~O} zo%^7zUN`AEcaB`cwt7>;M@t-t2Z;}u{sG|Op6Za3T_XO0(&ic84z_K%mib;E2fDc& z71z|hN=h;R#7}eJV#vv;zQy25GF{}P3Ds_!kClTA(_af2KlD@a9dHYr%&xMAltQbvT-6=y&y$9`$T?5 zIL2>SKKA5_vAdZtMv;{>L-_B z$4}!=WV!waq*`dSB=2{zI^plWdy0#;ExBT1(Z=tXT<>Jxhi->dh`9yxyEZf!Sf0IY zJn9u_5Y6~5(*Abiv|O*3G?naD;bWsXOV&5JUTbLTcrC2{nN9(u}f!~~cos=TF zEPiD|=&BLdL@)T+D2EmHIFL$5Mk&exSE1U}^qInnWkQ$kRm8{dy9vI1x)vE>h`K4e zBn^zIJtli7J+}BEqhnXs>5f^g!6*IJ(uEGMe$_9VO9XbQ+J=aXxqs3!dEm!87DsZV z2gwl{b>`V2upcc+5p8mOQ>%rxt_`HP$+NB>r{>_^=K37BsmzH%Kj%+}?ZlRKuTQs? zH2(^9D0R4GOJ9#!aFV^0NtLcMuw2$Xag4nqu@}oZL+iY>3(mkYYicaCL{gz(Wk&@FcbKL z>ko0eFrL`Tsw#=YvjFS*Bti{p!msKZUhK4?$DZn=W}bZClbyU)My!9UirmkrS4T@U zczu7GWZvf;uxybBhQ*sg0(5r&e-b>|!>yFiy?y9+Y=f?iv&x0G8-VodC z16#@>+Mfxx!$~&;9_MQzXxFDLt8?qy{Ey_8r%Ar3nYtYXO0Nap$>vIaeW~On(O^Wh zr7+Ei67Qp9aZj$^^{fQJnC{EvNYA$?dy(eT9^C*>r!cSrm#ntLcSoi621B;VZ>dXf zrAqtB(8m=mj;xH5Z8K}HdH7LhlC+PJsM*ddC#1$i23L5!&e)6J4W<>8+|gEgmi#z= zyrfZNg%Omr-zu~HFhck5Bme4wNo}W#Jd8_os(0aL2U_%EDN-^~Z~S|%m*=sYSfyz7 z%C88iFR=dMO!(ncp|drzv5%TN4qIh-HneNnF~?O`*D8Pct}W%8h%qHBTui;QbAQ}< z{<45UDkrv0{ce)qagisfS-E_C<4_Mkw2Nj3Kf$?lH~i!~bcox1HgC2yUn8!}J@dw{ zdp%Vbe$?VqpO6p{xFIPiOyZa@l@?W~l6Ac_;j2WSd<*A1GZb)2R%DB+E>M1PWEBgc zWC`wfgs1dSdp`IrEbO}_5eJvcd+Fh?w|zv0>&cwZG!s+TY*^Ft_L`z566v|asLj|M zHH7prpDwByr{Tz1e*TJ=u)n%Ob)p=4y$h1GxNpzCE> zcZi*1T3h|SI<796(TDW0dW#`yCfUB`MjB(w9f#7Wvi(;M)`{(0dSaoTUj6rXUga(q z_S|RGt^e@@k*rnc*CV2}K5(GgC~vy~P(#UYvx=t~T;4-V6mY&#!T;|$>xM4bBlp(f zpaiv7uf{}SoopHAW~_W8O~%XmTC4YVI%v9@8(Js)WcJXNr-FwHdJMFkA|ell(wZ26 zv->Vn9+(hW3F2VYRSF9=G2Z8vgL6>^eV(BH$G&K$L(48DdPi}c3&>OFz~IWze#w^7 zs4*!buLu~qE%Qg72u1$wu@W;AXEFZZT7k53La(iy;~EKWEKJV{e%i5h13Ky#t5qJNElHwU+IHW2YU zjCxzd_`&hW{l!`sc0DhE?*S0>%7DbX9?E%;t2?I1jZFR1Z4_ARShHwa2rrxPPcpZG z^<5Hp>w*6yu3=u7T)9}CvnfIYW@M|Yf5pWO9lc^yGHzB$Jxh?I`F zW}>37?5aYh88={T4f!3I>yyOZhuV_^J9z{l6n;6$uMl7Se{vm^<@#oaKQ~vi`5<2T z@vdEVUw1d5FP7!vhiy?>iwULJ#)R;*K+En#G0WJ3TXIAlD^3bh6Kbqej13XI%S{Ol zC!oJqyI8cv+{fS`w}6AjT?P|}n3F{Z-5hT55w5Aqu2;kE2B@dXgdNphX~`j_7B|4x zr&75qJ6E?%5BBG%tJ4QDZg7KHPDpB}jSN@p?Ia@pjHzJ#PcCx#(+%(Ms!gTJLhtWC6XS!lP3+gVA;|3M!PFkW_L^dYpf) zl>tumd;me^*^(b$-q(G->Q&NLg^{%m_lX*1+h{^dIesJfYm^y~z|crEFXPb26;G@F zz3a2cowxgW4uu*Asixhf2-l5UojvtBL?HdGy*$(=g`d9e`dFWnrOr}Z9CnF(E6z>| zUD^J=9Okz0%XBK7eIcU!y=Fu=r@XGEnSo_wA-yjeihNq_ZZcjyZxm^|$mljuME7t= zj8UMUC#imvW>Xwlv8rk8LM4$SVaVnbFX@fSA_w!+oQ~Q|VghuE9UQDkpFd=8O`1Q` zph;(GW-TIL^M4ZfQc~=7#<}JjEuT&NdagO9$DDh(M-Ge(Q;*SV%|7M70cryLYwXnJ zRVaQBysuqRgHt2Ky|D7w--Zr9St!NPafmaL1fljhalBtdJ? z*LI2i!t$TPv^ZM@^-O0CB}dtzaxj~iL~$JKt~0AUwwJ67>7jGbRvE|Dj;3#`Jj}0M zl<>OVOSTGE?+d|=1WbvI+P~8n+1!8m=W2dy&5%1c&&EJLXeo8}0;+Pji0-Mn-SZQ6 zD1~;iy#X8?*OAW&7B~@#!KkC<)KJ$XxifVBHRGks_-G8;!w)T+y1lb2XHmiO>R55F z*v3K{oVAx+Mp7-^e@$};jSO}_YMa^@`oQxxUN>{iK~ewirRXdcJkdt>wOx8rLTjH& zt7>V-(8RtlNTMM#Yi2u+z6;14cw)Sg3)w(B?z#;Xe8P&Z^Ex= z92DFZmL}Q;eCgw7M}E^E{@8O`9Z~zrMlCEXxH}Pq$b{#2Q*XV!1;ZvBkFNY|??q?a z0M5ze&N)dH=+;1ktKO=iN3r7z;`}ts-o#KD&I68y60`(Acm7{CrENvtnnS5vFN(Mp zYgCNj`dXPXJQQFlDE!{i5w%2*_T7&O%)lh>MPb%#waFf*LQ(0_e3c(qVy9l9Wfc;P za)TAe{YGei{W2XT--ZS&YMwVFAN`gQ68liJiy$7@Ha4#M;pQz?yiQ-#J4z+3D9N@ z-EbYiwr~1rYPTnA&?^f&XzWS7TtQ+v$DohoZmqH}syHzeVYepC|Am+(Tv-;(!i+f? zbCjAXpg(9YF6okNF%cJ-(3YV2Vm%~H(J4-o3Vk5kS*@nsc9@yOq0LRc?BSE&D z#dU?$-WW7E1=zSBlAdCMpb6cCvG?ijBqV=rW7Zkk%d0c=S7Tcx6ExDSnZd+WXRc&v zXUe>a-7-^prNC7_yb1`V=}$ZroSX1+ zRvXEqAA~`nC)FF>&GzULm)ht5Y-a@~<)6Jc9F}n4`&(0Aa7lhGnOm3Zc7~WJ{B1)x z-r!=fAlW08qNZ@9N;lwdF0Rg@DiG$Yqba3pEhZz&qM!5gY>2|V=!?0|ZH!@KO>0J~ z44l-6J>e8O7UF!YD^8CPQF){;>5@u1F1zcQCLE35nbdk5kNXgf zVO4Z;!HOQgB^J0)z6>rosbY4pAG2JTbmblUg(1j^~QiYMYfMgdPkWy`}D? znXGmxn`)KG$&>Qm*gY_vAA+l6F`N(r0H#2x?bb!u%so*K4MwP)RNAJewMca6kF^tM zOHQBXU>$P)X&-GVz@4FkSoyoI2|L-RZH<4p2FN4(nb1g9{Uyoc0Kgh5DK-6sLP7ll5m+d+|%OX(Ugu1$#&XJSD!WEb@O~WP#^lM z8+q6;=v)u~as4>1w6Pe*x9eC$DSu6`6L$kB?wspM#%up65Jg-<|W!?#%9cHhDG&Flec1ssSJ}5b%g} z0B5HlGJq6&;C~Q84gfF`KhI*601!vw=Q!s81OVnpI)sGtd|uZv0zeF@=SlGo&iT3K z%nbm>v;gpc8URkH{>kU{x!#HdfOG}`NT36NA(D2EbAGO!_gdiqK+X;T7oY&}p821A zUZ3j^R7kT40>BU6e{jzK)@(@gD3E%R|7KDhf+lh8e{jx2UXi%Vzj>U*&yfcL&RPLR zD!>ki0fR0BWQ-s%Bj{`f2nQ&@U~({+f}EV3f`Z}#B^?zdDHv!W)O5@YEX+&{OiWN# zZZ_y8&Pz;8?ELJUJiL6D`B>Nlg#~zpx%v2bL8N7r7bxkesOWj2Oi(EA|257!K{)^b zq5%CJq+$OK5E+=9G!7Lt4J`ve1_Fc0$iWn(DM?obk$M0*BLx$m#H|a=1`jDOd$3#& z#k`~9SE+1+8h+jukhJl9PEB)(6~@LcC?qTbzak|qBP)lLzkNqlO&r@GN|FH0g$QMyBqZ41fPD)NmO-s+o&C4$+EGjOks>apeYwPM8 z+B-VCx(PkKeZwQ8W8)K(Q`7U`7Z#V6SAMLn?GShO_78p?9{mOZ;D79p&i~C1BgqdL zIXRe|^4t%I>?sLgMsf;1i3?1(3@9IZFkikNO2wjrc~{v+%`a)V4Yl$7Omj&X z+|u8U{&$9+|Gyml$IyTLoJ|7|Fo^WpfEfX0;P`5^=#4F+y(=5z`&`(Z|6QRCdjr&8 z0Z8EI9}0L=hMM;2^Q89WBabaIRBPV?0C z$pkGE`3dvH@mbRpFT4GSsZ5Nj$EAjpsFg&h)2fO290uZd;|%b@+cb?r#V1007GB@g zU%VoyNhtOx$#XNX`n25SN0St7>Okp|8$Vn%W45E1cilQqbCBDRXH`q;EuPxMK%qqR z&9>cNMx8QIWyj00Dm{~6G5NPaPI*O+16_sQ?qzg(ODTp)pa&P^=^t9|uRIf*h)sEU zjhEtv%3J2JUo7J|__3yC&p;_ocl5(+9kY*OnT;X*+r_44QInnmt|Zs`wXlkWvJS=giwZd?y#48c-QG0?1d3;cejv|*4rn=sPzUZ zQwP7oudBVxka*r~%B3%!pgm}@a@5{ZwNqGtYhN}GCR91(Lgj%AJ6ynG1ZTgAn_71`689A{vyIh{w5!f^R zA*#xPVM@+l7fp4`ft1#A=R&2T-jabz7+k|7x;Pe^9Upg~>qEH6r~@O&4J)T@&E%jNbab6LKi$TJf~cg<7Vd~3}6MCQ4QZ;gW|`)

          eas=ySfyy#U!J1lPGc@5fJxw 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Leeuwarden Fries Museum.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Leeuwarden Fries Museum.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d93e347829cfb8dc8f70674e63ecde25dc48a72 GIT binary patch literal 6753 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 bNF^Ghq-r_!N9Grqtk8$xo04T62&2t$(h$rJtn} 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 bIQCemwlT8-I=hZrqDOG%bH9JXNk{($h4l`G literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Lelystad.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Lelystad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be794f3cd9674eb6416fb3f290692ffcb70acc66 GIT binary patch literal 2368 zcmbW1c~n!^7Kcv~#skV2kceRxWmE=Hk>XGhq^R`CD99ixgkma#2nu<$LIs`(T0l`` zDgt3DLj*!3UUw{^_x4@;+_mmK``rEQ``a5CL#BZ0 zK^Hd{fWcybD|!J$ioxDcRfAiu;-P|{68zO}1N6NL;ajE->{QT$Vjn%&YP=q*Qa3;l zrVV$$C%}QMbx^!Z9d1cClygncfny$csLv+C@OTsKmOd329HR>dEYzW^*ILNhuL41& z6*hQ872fzo7qWyz7#yMlSuAC^iDZSXjMjhyr?p{mkP;j)UI)*o5@9pCpT$vzta(K^ z@G}t>XDUNq^lVqux6f{X7ty#*iWb~7O@Ni_G$5;(2;ZX5rdroRV>A}XXhMCH_0S^1 z3VZ$o0cJnN!!2meyJ7&?=5qoJy)p{}Z~j@KsY;I(wM)YS<_1YJFS149E%9TQVy zeN&==fj$Nelb4fMQBY9P$E)M<`v0pT4>6?xU}Q0$4gA|MSey)+j)EdoQUzEH4u_S& z$)Z`JJCo3NKt@eg-C*k;IStPcdBd}sHYqtJ3PyVyy71q!7maO0qkm9@TH5P$2qqg% zH*Gevv)|^heaFsyU+;H0;OchpA4k2seSH1=PlTO3bvitP6cZbFF8+K%;*Xb7(|)>~ zo^kE^&$)T|H*OY`mi$uI;vT(__XFo1Q_5Ez^wMP&I%>BSIr~foL8MneWyx@ zpiKG^0oZ1>DZo5d2L`V5gwi$z>PBAqQ@~s!;Vi6FJ$l$ zAU@ujef2?vjHQuHbW+nr!kI^DF^{7hbw)O61a>&x& z;#)HgmutD-eRP%x==Y4S4SO+`mYEaFk@t9D7dmcMr>GD85i<3V8+O zOp}{~e!Td6aZI2FX=Kzhq2XXd->TcHWkB9-yX+4I1M_7gCJ2a>;=G;j6|D?+P0p^- z^$;``&GhE>^M28O^3<~VVBV~_L%6@vf9yRwA>NyP zkjaUwBU8H^Oa0pfhtuu*)q(8 z9DTMwm7Z9~%kv$lwEM(z)0WOs7uxc?rMjy${MI4D{cd5x?URh>O-5h6Wp}(I=f{zK z-`@#PBCz@vM5GJ#X`+#62Hl(5PRTIOMX~dm&RE1rHu%*wYsCgFN0J4fx&@XKsE?(W z=!YE3%4kE*?B327)WVvih#!wIIwdpcNU#jxG1D!=Cf7Ue?)&4Ou)1hMiz47hp^6y3 zAa{A_x96*8lb@U3s_5Q{fX05NWNxzHzT<;ryWCo~=n0lWaBtz&?Q?JZ=L`R?Utfnk zlRVn|=jtqZ#Y)XWtyoc@k=@L*2vHRO1I-hr>HHr8d` z49hx9pY+&qcfu=>LP#m`)Q#S3bpDx>*~XaL-t#{GIwmFO9Ir6D>4k63kaMe@o*1y~ z4O!85Q?3R2K8llem{26J(ygSs>ASUT>yqWXW?W;c{_|Jab2Yp}wjAX*cN-YAz}koo zYhV9j-{72cb#HrHo)YLs+TqktY46L$WT^s|OYU19QSa&rQqp#a`PUG`;dGT*ZC^QU z9GyoF4ru>)9e8kGNt$v6ttQ%r_`t%2pF&d^Pa+CTJhNL_HLp6Zhfl@UCG^nr;@tUq KO_yj5$oOCW>R0su literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Lemmer.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Lemmer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41d8996b222d5a49e5b9129ded782d9bd286d797 GIT binary patch literal 4620 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 NwLUxbhj+rm{{`QfWCZ{K literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Leper Halles aux draps.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Leper Halles aux draps.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb3138d6589225a8159f1e833fa58a59caf7f8ef GIT binary patch literal 4979 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Leuven.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Leuven.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e4d5f3b3f8aabc1482fd1497050a8ad6fe6787e GIT binary patch literal 6907 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/LuzernAltstadt.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/LuzernAltstadt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47ebd5d1e6fd03ab440cd50085d94b37380c5242 GIT binary patch literal 6673 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

          XjS8>(A7I#FV|Z%o({CN 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 mmj6{Woph!bU|$5Vtu$4;y literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/LuzernPicassoMuseum.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/LuzernPicassoMuseum.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08fbb5a0e928241098ea76da14eb9626e75d215e GIT binary patch literal 4493 zcmbW3XHb(*yT+ds3_gINBoKExAnuC`U&CbKl%F2c1;^E^L5EMXh3X2Nyi}DHx z@I#Kv5GN2wdU_;3niY-a|G$dX3VCx3M+f=0{s-5j=dPiVvB^DCTe}Aj?HwGQJiWYqeEs|%MMOqL$Hd0Pr>3Q6 zJbC);`HMHXdHHV(3X6(Ae5@c=R#n%0YHn$5Bei#Y`8qH-G(0l;?fclw?A-jq;?j@h zmGzCyt?iv%>fSyCfc+QF@%-O-SdMw1a5xN(_{#%<`u>Gwfzt`do?ulsK-_m{6O;?1 zM_ozDDQ`N7J$HKzZR61ovJ1)22(SM|`Zv-44k-NpMf4w_|M1Yp07e+(_}ai&05#x` zbiBkO4d4j$SjRvAbHk|~{&6TvN^q)QM5p`RRdE@u3EA82PejuwV=ryHenr?WgA(&< z2_Y31T0_7|6YX4T>{y(}(-U72lX%2b!ff@=hOyq+*Te+vSvS0~WOMUGR-Tva-1`DW zMHN|5ub^?wVBAl&O0{+gPL%eX2P#!<9&JwpNX4pZJHylwba!uJVDImwU$yE7Z;Ckg zuW1HylGVnlW)~X*9ICRUCV3LYtmS{+Qq(2r9J*U+1`1Li&o;1WsyOWv#(Xr`p!|t4 z_wHtY%B^=g%v`803%H5iTzY&YjSnj{#J4H7`DRY^w*_QVE*jJ; zv%8a);=Mj|I$v)}3x4QO6iw+X8?!ppP+bu9D25T}eKQV4rf(%DvmI1Db8 zjullh$p8m$$AKe{B9F)|?OZQzXDHXoLh zY@JWpMx!@M4t%K*AH`>xJ^Kz*kw=0hU)E{BESLS!8Mby@c@qt2HQ2tFx*`hw$IW@d&*em??m#MEYNZp;K*E;;TZ4E~M zf%_}Xhvc@6)i)Cok3=>258o60mFP!e z$;gK%2uU>-ORkj#$gub=9FOUI?+C64U&?)`)+8JtC;e24YL7%uEynaNZz!pqRmZ2qL-o&*d=n~Q62?qsBS!aWkB+`TcPNc{ ze%m4W^JSNs04gOi6S5l-ecOkR+$k0g-RW25uE%Y}B4ohgkzI{36Q=CS94{XCdUY zt6NXAclrp$c9Ecm5Qr4skj9dTIXc9d1ej0(LxREyi3=y^u?*FcL zqt2`yty)k^IpY3NV3ITOs%+aXf9bz|A_|&ZP2N(~KJiK|Rtt;wy6%lBE+F3%xCgv8i!AF-x;sNa6NT0it|R+|P0Q6k8e&#R zZTdTPQ{qnwRe2KI%}luf^rxmU%E&o2S-d*)mbtIs|-U((=sW)JT=EV zBt@L*6GkOY`q^%tk8xAH?b#^$*^paEg;UPY!+OT9CJcpV5P)r?a<$JuIDGIy96z)5 zO^e7l_C(Xg)8`ERT+fd6m!&#;OK=x|wY?v%FA!rH$+JH2N#dTh1l{K@ceBZ^4SGtJ zrt}K;DuBdtU)$>F_MRFCN%CU~(@#HhF*i&xD$xL?;tQ8}>vSHAC8iS|&eoa*oe}Y@ zgzq*lPle ziYz#N)-ZKYGO!Z6sHEz7=sb;3w=}d$+|QH>ue&h281=d#(REvk$WZ)-pOs*=hw`La z8`l^|2Hy4v##*#s&tUhQPPc=MH+q+huT1nD#$~lD*}swgKXM_#FGHe?*Vvyf zbonwyRvE(a4FUv{wcVIDd?uIrqk-`c$QM(ZPdJlq&+$`Kwc$Y$(o7(OO5|0G>c}ER zpi)lG{c2vOux7SQ@Su;nSE2MRvWCYA6^~OAONA95ep!WOWesnwQf%LrHbgzSD}CNl z0Q;vg8gpd0`MI=fL`M0_Wwy}#*ad%z$(L_qEH`-z*0fqW28H5cB?U7`^oo0F2NFN0 zBa13;REScId1yez@P>V(1LxLW&gE+x`DE`E;&xRtCFQUvrHYZ!9ZxaUr#eKf%ez^M z8{#ldtL4`?Sj7+pjLzIv>yn@NqHsiRhsQV2A0=T9l6F`p#(;8YMV+2$kms#eR$exX z8X|)|7qUV!9y*OMPii~G-nf#cdG73Px)-Cx zZnTzn=1Pq_HtW&CW1m&idZF^#+7X2y9mgu%EQSK~Eyl|ksClU`soY()7Y%{Ckeu&a z>6hM)wa+?>cJk@yIUj2@?a+bYlfR13E!FoXTe!dKF2L7m37cn6wf!@b?$!P~%13kB zz9>QdTHCbb*YK<#NyvNXi7xBzjyG36{kvY4f)vklg)wpQ2lqDWU~NDGgZVo!Pba$ zndGM4{yE?#QI5iPAzR>m=J$<)}2xbD1Y8S4!Ey!^bM4TYO}P_0H)0ucM8! zL>fR(`SAoPD`l5(j_x@Z+8`OCgy{)FD(w_zn+)34vnd4uY4*(`yKjPs+Nzsl^A!)3S&$Pz31V*^*MU|-|if(Q9F6*ieFv$zS_3e^uq>ELn zY2Kq(xv>1m3Kdc+cJz!7+2D&<{_# z&-Bix);^P!WRQk5?FXX=IUd;D3}Esy_wT-V#zx!w%4JCUImVZ=%Sq~6MX!e`nsrrl zT?Uc?-((ws!i#)*H*MN3t_L5T)Q}5HZmHDfOP1eok>2u`8qt6gIMwUeVOWRV#>P@M z;T;K!8luk=ad;s$Bz+5!Z-Ac>2^4^dGNl|kpVJs@i!PF%c8FgTt-_0Onq?$f-YiMF z`7T$rL&0ON^WOJd*IZ{Y#V@@ypt#6YuRTBT6sYh#oG)Frop<|pOTORPM%*5#bMi-* znxOMkjJoB6zpuKsH331by~r>Z&?E!ve8O&yZ>ZI~l(C9VoDE@ApS@uv7*cDjRs43G zxFzDYXmnBKPD5pFLmwfy-{HXp_{IE2AChcC5WkNb??SI5MOXI{4s&dmjT{Ku-?Jn##DiPna0^%KIm50_PdF)-{yvRTpOQl2y#+7 zyR^yM)-OVYGi9tw*pjr|EpRb) zN{ATB!Lv(0a=wx?l7y(AaVIk0N%h?|SHaa!o?Ky$N|WNI@QE{x)V~?oiX~>A zuS^eoCu^>8z&bG5$ujcN$s@w}qE^puaofc^-18|NO{kgk9CHp_`i^p2M4 z*=u?7Wy8VK9p(l2d%bi+l6Q-}7@OKR3JdOIWgK(uc#xS0ULplXj!qY!Ud!_$Tqnj= zseABUQfM)q04S&$i^$Y-2}_&@`b&E5jvlqPhvR@p?a%4nCML11+#^(Q#!Z{jzU+tY zR=`l%o4M1N-Cj@2ePwXrqQu%pZwuSrd+)Nc8oRyBhjI5z#NNbffMRb#|0k=_zW)o1 Ck|SyW literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Lyon.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Lyon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a3eda9d07431c561184a70c17f7d10a712d42b8 GIT binary patch literal 6609 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht St Servaasbasiliek.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht St Servaasbasiliek.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c41e1aa17b1bb7f198c6477dd9ff0763df6465e1 GIT binary patch literal 5721 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�>zp7dmm0QLGrxU zW1&l<$gu^hSzpnKSo3`5bVTR|`5D#1ncPD@MDnn_s^=xIK6g_UPoo~yhFDbY*~^Yw zDcqJC#D~ToE)Z3oVoQhKmLE};&3xw$qbLsdw%hI6uhujJX<4?n6pZaVIp36aa($;L zVDvdKB8@5PwwpvLS)|g`R??=fqb>Rj^G8h%g5f^P@8>@nFy}9|MyF?I0pi4#UnsIR<-LLsxTiQuu)@j)K#Aar4(v{lGT5GnJ0(ReHL4yjsR44F=c~W`5Dj0X}o8-Ff5sOwi@%%08o{ z?971m@po9??k-;&IP=Q?qU$SRuV zT~{V9$jsl*LFb7MD6vgklNtIY?_^a)j2zGiCiO&-fB$T9*MaULr<{us$Fp3LCRJV{ zMVFjRf)N->=9xJ>>Qz2c3nb5)5&^L*xAF1C)#W&fn{J$XPZ7SnRfpPMkFkkkAY3nBSkwL88hN{*J5f-AHr+f*}{>jA)H7n1Q zUZN^E;hye%GmlhBy-hMp^-sNQ0v3%_aJJDcNS1&~QW?0tX1Au{oQ;0`Q610mmld}6 zgZmjdNmH<7vsJ6XSON3!sn1+~d~i9=Jg$_nAKZ#_LGkc;V}(&z*HmnPd1+000c`ByZU1pD_UXO z=0iIyKKAcN4(P=fRpsnG1N1VV)(0;_*&n}r;z$T#ij-MTD=Y?G)ZQR-tRZQ^DH{cP zq2q5yZXZhCvDQlM@<{Bv(=uGCtoA!faRMw3*B;x{{fyldq5HIl+c^edfmAG+R!Ma3ubWL z-!A{wzCyXoqD{Kha}F`V_Mtpg#yp&>)7#UURN)O=8n*<`PhOH}J3LA5LwTr-olhp$ z@=4^iiO{j>)b;!9@}^%a=g1Nt2_|jV8L8Qa-S6)y@u=YNjKiXcP3)lTWH0bb=gPf*5_tT z;;q&TbbKznN*2CdJz^5TGVJ@gPKYnz9$yLv*{k(~6Qkhcw&4ZC_2?nFEMaRkVI5|w zx{Ao)D5?06YXI{6;HXT~Xb-yfR?7XjkXaPptW$azvSFNy0f>FI@292t^x86-JzB|5 zUn!egw~+~VGF+?K1$U#v&`$}f;%Hdj=_|0CWGwQSs*Y&n9**v`S{ItxFMAJYuZPnU zfqI-hVR24Xow(jDdGs&LbTk{B@j2*z8TEF`5d3N()WsXh{-Pm1c3ErwzG38nrB-h4q3F6QA#=#?Vkrh#ByKjOSWN|Io?A)tsu(G< z><*13S`dpF%go*X&P&^2t~GjS|BE>8z8=HM`#dt@*Tfs!`ubtptH*DSGpA38^vQVd z)ej5lD#xk(jH6ykS(E;<8)?G3Mp95Z0if<~TsGVHRG(Pd`}X9CElanR+oz0Q+q(uG z&P4OsGea0b(My)6mZiDmy|^rqQBtc)^c(5S)0f4H>gmWVc)CN@Vp_@IY8FYX=-pFo z8w0y2{2yd4#_tL*!F$^1^4AXcHOK0L4u>bSCXW60ydSIkw~0|D((itbHD5U_%cDv9 zGP6$eM91fcH?#j|hK>C3);ia9(T_q5B*W?rTaqs&}|`EC|UU(iY}d z_M1YZh>_N+gm5<)X)j6XrTLcxcja{?pW@a%hI0bfQdDJyib;Xviyuu!Rq`d$-B0C& z-eQ2=1lxs!ZP?X;3I-s!&X8F}%UrCLk3FE4S%giruKzhDoGKh1U;zFx46q>L9}SE! z!zLnBY%su1n#VC|M!-KM>JO;pL-ONO{$vTaPP@bYvLb9g5Iz6TLFp>YbYkl-jdwJV zbrqD4efg;lI2q!)WJ7ygUMOGy-^nm)&;uI=Pdb{vL;)Q#`2l}(o@WR0%-XuA#5K}s OlYJ`IQhxx$%={1f=V&(o literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht Walmuur.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht Walmuur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75fb0275004e0c9399cdf1fbe00b426ba6be698c GIT binary patch literal 4080 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Maastricht.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dcb6d5d1237d34a4c940c873d0d4b0edcf53e03 GIT binary patch literal 4890 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/MagiatalMaggia.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/MagiatalMaggia.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42ff384d9fc3845a54fba4fb9ae51570027d96bd GIT binary patch literal 5064 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 MyXF4`8q)NC0VpRe=l}o! literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Mailand3.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Mailand3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..863e198f2100ac19aba13310853687c6fbe4200f GIT binary patch literal 5513 zcmbW3XEFv5ueKHvoi21y2(;4xFo z@QV!oXYHa+eO?y=PC#T3Fu+e_F+c++yJ-BkKmf~mT@*L~$RO*(jPUDGba3{6*UlOM zY8c=IM1nya01-6^Obt3416~3UFqjw&h7c1ILm&_mC^-yzE~-mpq~x?zmuYFJXlM{u zS?Cd0n6A*!FmN(3v9hsquwSO<=H+7JWnpJ$1D&@)NuZQ47$qBm27zGvzv}EODB~Or z0{W-^Mj-+dpN|70gX!vE+Hu;EptcduCj_MO6`HJp1#3DLnA9| zw2kd!JA1ch?jD{PFYln2!6BhxufpTv6B3i&B)@%^k(rg9lbe@cQ2MzHUtaO0vZ|^1 zYfEcedq-z)U;n`1(D2CU)bz~k-2B4t#ifnSt?ixNz5Rnj5CHxc&iVOYMCUXA#Y270 zLqtprCWc<{fQUTL158Z}VHYK#QP753y3lgmcmcbt7@J#pcK*R>`s~sVv@fUnW%;JuYHA zrTN>Cbq2irsJrSB@MrXVVwR3jyo&qXr=cz0#m6UUN4xb?8n*-oLe>9c#vYT3U|*Z6 z8XQ{S&zD!>l?}}Mi>u*F4idO@2VKNgXe$!oz~KC~R)4TdqlYhyUj%{*rrascTwX8_ zm#H#7HW>KuxR3*st|f8rBU4joeAGxfs?Ac352wj~?2Z%P!8aH6ky?e)bt(5@9Rt-EFR;nbO%G4@rtStcj<8RQZWWsPi@5Ez6lX z=zAvbfz~o?(v4k*{2o(GvtG~IJJL+lESfBjQO?h9-B+G15xCQ=I-&@K2 zXl;7g;GMCLY!+shJ$Ak4WPE)DEQMgWBi~?S=OpBWR%}Hdl&UacF?%g6L+NInoeTcI zs5639Qb=06;BOkuafW^V>?8K5I&O=gkG3zm^96S>M!|JC|&azyeX$caL44s1sb^zZP5O# z+;88o46~*_-1qMu-LEp7)n>X!m`+YVk_~%2XUz?OS)3(tFBeXxs zc*nWueUDu2VHtFiTGo(c*_nG|cBA&w-EgmD+1Jf`&u4~vM~@Za7UilV2JZY!cu^MV zz93c^KkOvLlCu7z0`u*@^cj$pQyccIm}*}fBT}Q_c5B;j&ENXBSBnp3(PVRcF{)i) zmU5J3SE^2Q*?}oVn0969%ggH>fpWCVU9!8y#mlqKqn>Tv6tNpubw1VNYme?}Q45i+ z)LC3t_VEi)>$3mdOLO1Te%>+GmJjhGgl_vWYY~k2ISQKh$5hatxxdi)QDs@Ind&K; zOr7j#Q{XG^RB&;VK%SIlnb*QqRPqX|@1zBmJ54UyC9ToOVcqtL7MFb)?>tpz5gfm z4)$`8a4FxWV+vH!HXgm(7@--Wcj>0nWE(a80y8PWO|yK1C-h^U!^?-sd&;s}(>4C? zW@muD#*L**QpjFQFM2NPQAJB#2snBgy?_l#@#sz%6J^eH^yR#AXD)!|MIsRmnIc(>jzH`SZl#X4B}b_g)xxY`Q4_m@1Wwbtx%Kf969I>!v+3Wy@}i zy$m+o%6Z$z&2#?4f%P{QlAHb1cf&V@O}O!c`Q_>`whD>~>#m@^+>`id|D9ao?wSnl zFQST}_B;w5I}3Q*5lo1q`d976-9w!$4L;@6!%5FpsYTMv_&#TJwooge89H?C{r!jx`j>d&t%~}E0Lavp^>$|A& zd_TzdSkjy_EZvkvB!}sUd4VzwiW2tb}a+hInm)oM@HyZrC(NvP2rFxJ? zL;rhIDw}anDg|au8J9l9pP&!LkbNjzXk#-QWl*%;MJn%-<~vkNkyvOt&|%-zXny&0 zaP(P)zuX35NrBYCIFDLII#we~g%{g~O!UK<)A$coeYKiKh6xe(utzNc8!PcbDXL+! zE?A$1$opTtL|*I&q)|F7KP@lcoO>tvx{(uz(=w}J*lAJzG+_PQ-j&^JIO_qb2GI^> ztRjn%T70)r4E^RNoJ*FpoBy=8tHA#rd1Ygp^bc?Ih?Vqy_b?u7!3eHO^h_ohWsZwl z#+SRp%W|A{;;#p0)j2<23gOP^65TEeS-Q5?EHr>iocb--{@mpZAfhYg-A|v*o0P#w>7*4CQP9|I8`NvDJ_mvx3!-aCUv4_0v+XOu@G^Pm#Sjd_g74Zzjkq ze1?*KO!O*_kfu(l^lwE58M)kLui_`v&&NG&fp3fMuI_2r?nkSBsu_ABLbb_pXFhXP zFuO~d)yS`@HaP2Zlh!x1fc5(o-T=AX&b^(&Ra}I+dg3u3UrB#aR+-9hl4uU+^4>`O zu6;+3AP)OSyB~Vk5yxn?IDk3a$@i5N>#!;q|0qcvJdTTs4LTK1n}U8(cSMcy!kiv_ zn@MVr=G;J_K0NMT-yTh^tG|-}tkd!SXIOufYZiEW*1+9iMwT!6Du0qRhfb+~ik$?UK$35xv^mP0gs#!^JHu_c3jhC%H3iv#h(J1g7{kq~*z12ZlH*e0` zK~2m{+~}QmV%@80ay3)6`89_K8zs{W(-KD=)!%OK&j6W93H+7h!FLvAJoBcpN;P2{ zk;Gjpazc-m>nWY*94`0HetK@)S8O%2!Ek6T=7}ZOV8^(|BN4a0>6EwYG^#!~*jYqaRHl zs!#Y5V5-k2hZvDw&ZuJ3E(*;dl#e{fDy!VKZ3yEIx{sNKG5fD;Ri`=I z?`ikeASXW}hJ>l|beJM3QXR&jY9mh`8nmR9xhE#!Hd4Os(hz+h*l$Y7g&cADTJ=3P z!-mxL6^91cpYUbv=T47sqO80|`xZFo*o>8>c4lyt7TfIWZ<r3DsrhmR@V+Ry5S42*|}_G*f19Dr#Q7Z8x%>D&LsRhqAHU-s44# zkMB3Jk~-+`s$Y(9cK7IPF`hMvkv2OZ;Q36$c||uU4N7aH5K#-OGyDT z{+H7PZXyz2_XWHMD@|-!3MNZ8vVEnE-3MLrZq5ozS^Dr>zT7MDcbsGb$z+W!c<8c< zCH7h+AAKG&j`Cy`QUY;NYzz$)Jih5jHX81~x{oP^ngvRP1hZ}qXhwvPD0!z`>G zq5F11FI>!oESL_=wY5m7#ED$ZF4%wIYtUJsN}+D;Jvr#;@Jw&Jr0Jo(HO5)Ln#Cki zu8(drTK2wG<<8DW7Rn8ZpCsz(cC>-jL5|n_7v(9p2;R9mztmep#+BIKqv;zPiv{ls>~Ow8H%?r#%sI^4FH7^Yd`m$ivF4BXKyxQx zIjshQG#cD-DG=I?%`^H5E3X(iuEmj#y^s44G{iYa5D&&3%iE||s|vsIZQ|M-3(QMi zLyjAb?t4wWEySmq8M5o%&l29H_NO$N_WqJSh_G`9imxOD} zW9fub8Gb)aRaQl9CL0OSg7#*%5)V7As%VXq`{9V0uS1Ur?MI=z& z#`(gqFm$r(tuJksCRugNwS7DEg@sN<3=gkAEDVLRu}+W6?h;kia_=~p(z6fnV5jEa zPKQ2jFv*27Mzdn9ttyC8>^O9)<<%$Mt`6E*z5h&07_1$ChL}tP+0rh>eQ7&vH4_~P zTiq`9VTKqDTbkcG?LH+t-}AVm2R=SNhQi&Mt!QE_r`cuj_T+}SfLKSj7!R)rj zbGTa>?cUYF5FXz*d6*l9ybhOeY{m&syTTD*8kKpe?7{6zKYSiWbi%&b`BiBYflRKS z2#nO2r|(Cd0Y+t&Wr2e}uv^t8NGaZ}pA(IdiB7F7(i|1wk$EDM(!pH3Q5v}kEU#kmKQS}v{XfR_ z_sASCX{!A(5oL^CKdl*fT*qX%9DCQDtPhqE>P1Gx;th&I&BO=w`}EDD>~$i%Gy4U1 z7^`PIo%!%d1CQ>|@>|9**MP_MZPGn6F>e$HR?B`1KkKpdX46Bd73OaN4P+K^QSzAO z2ajcpelA7ND-oEKlt!3{;FGNW^*HqaOog}n!1tRi*WMaf6$GQ<)&P~%WE{kj$4G@e zYYEF0NG{VVkk_XrfvbGS{pjf&z!t4h>pfrY7^fjTD$mcD|1Dp==?^DWLFo&;3a6C* zt^RgMjs6wts;)Th0$zSNQ=;!_;xNX*sBC=~C)6?#Ia)^4Vr6aOR>dzKvvbQneG7_`dXAYT}BZ#Sz-upwRc`2J>14@|BbDRCIgD0q%n?0MJU$ z$eq{|Lbs!X;`fV$oaoWLcobE9uGvk+qSdJI5gi{(W0uy6wPV?w{p)55S&I$`{Ev<= zZzxcPbmVRIc&CBHkvKmJ<(YeatoJIy`#OcQ+jY6iXFq%Han@@ax)Fqma>;n+d=v1` z#VnXyM-HDMa;I~(1IYXx*n_kZN=)44Y>^KR4Me8-VviMe^$)VJ^HkL+cBRM02d6oe zdlE9MG#GKx*;JvIK6Qp%n85cGX=cOoIMa!yCZ4VGTZWXNJ2zYdj5>PP*m}zXO1@o- zw?TWTFh$)qlW*8AP{%dmA|4BwqLW4^91reM9l*2}s)|fs8IqfY@U96l_ zW5?EfjU$5X*90?S$@#%I8P^uHng+3H)Fdn`L7_S+_$k;`1-&nlUsglYq$_u=fq#775nxVxkB zNc!iJ2rYfn+|Hmgph#eeP@-@K$i3OjT)BTSOup3JZ3ahHj*7-w$MEA^`z%#xf;UI( z@-OLQ0ez8BnQ<4TS5KCDiok%vsr!z|FzyUkh&$Ew3;%WMB{HX>C}7DdWbP|A=&q;R zFBrGR216$aF66-E!3BrI%7$i%OC=w)thy+O^AW<>`zKEcbC5#{$L~<07 zA%kR)IKm)d2+r($-|pEz`)7CSp1O7WsjBXJ`rO-nZWE>nOW=~O7D5X^NFcz8cmV<) zLLx28Ph&&|Km}0&1prp00Pqu^UsD2LPqgF2b~_OVGyn{e10YA#N5uAXdH|-m0PrN@ z#Z&-%BF4WXT2>|i`elgy5v@HVF^-m~mx%d103^x*&=?Fr_%#4t@B%=`4!~7TB2M&) zND<>x0bq#+;F>A`S|R{!3jv@@%n?!mAj=SdRx<$NGyzE01K?1RIL=)FWYYlXECGPs z4S)oj|Fp91#2WtrAT%8Ss<*_rMF7wQ;+QMM{&$G=1VDgv7z8Yhk^n+GV4?yEAdwVu z1&}a7NSPpnIq(9Ilai8=l9H2=k&%;=Q&7@VQ4-}6Egd!epEoZNi;0#^iBID|!o_(gdI1o$DuG)f9eMk*>sekd~(%Kv{ALO0|C01$G>zlAt~ z{}u=dDH*XGDry?qOMnDIN=iaTN=~ej7#T+N0Wv0XW&s%uip$0iDX;jl$VQ~SrxLtX z-2pWj-50v<@FbF&hLw$-gHu>U^s1P+oV>yfMJ46icQm!Mbr8DuOwG(K?psP2)+Y+QUodd92FtnAnSa8d+_J*==cP8dIkZc|4D~<{~vsqhC4Ji|VgLBCQ*!tJxuiR}{a26}cP494lmI_(sw*;BP zlG#Z8o0T}6gwlJ;JVkcH5SpPr9_L!2x-I8&#<-%^eU3-wpBgy$)1KdKE0{j6DmTRS zVVTe7M7!y^7p#B-)v#kh0L!jHpGXWU6Om)B4=(frZeOdsT4sxUAV~QdZ7_+P`gWoW>)>0Z zjBouix{VRogh~_$Ve@}a)ZyN&bP<4z101s;g%`;`wzb>A5`X~G6}?LUsDFO5Si~{L z=fQaV9SPt$(Swy+#$NBSh1Veu?BIBjl--Z>Q%47k7;)SDqd%(k30NtdrJXndyhGvD zQwSiwhybE9SE}GEUIdUTNB}FY_`%BgaQGVEtXvCx=U0d`bVWAQ2&+u@*7UjJ$js_0 z0q~T5z*VnUK5%efB7iw60?3*jUUDkxU*|d_fOdssSPu6#!$NG+sGW$KFs^VZ$!L}D zPbaaO+7jN+Y8=8o$bqgR)!SP2}0uH&_Fjbj8dGJ61OH0k? zYID)Y4Jh?2JnTZ3mPOe{-~LF?HO)3c#Uowk%{9(%1w~Hkox)gXlcveITnPZ)>Vf%) zi#mQ+offX-G4%vGJ?zCDQcVDAqlc7>`#TGtGY~ZHo1N%%gr#G`Pew7ze+oDpf8aLHR z1#Pnk9i-RS&cmbp%S2-EQ`wJ(WcD&6G_o3^)mwd)0d1UwzuD>>uZ3 zVeLlNU#5zx+|g90X^+@8w3=fxF-q_akfNnRv^hV~k^Im^zg|&Z>vS4tgxB6OtMXTT zsABY6tt;hw)0;5c^a-yi-82W|IuouVKzHU<{Pzn>#4$ZWgG}Z!EPu<+EYwciXgww` z%+NfVj@xBeHMAMoAz#wuHqGX_WN&Xz<3#6>9e`HJcmJlG7Ha7W4n)jMuluEI+A`!6U_2)~2py z!DS>@h3H;zk4LoV=PBi3EUOlsDO^&QCmweU~=rk59#1g`fiu>wT zUgnHjU*U3d>S+zvfy8ppb_U?>`Fh*tQL%9Mt82};sg)p(<97fZk{w?Vkl==M6gKxfhY*pI7;6)E=&^<{NT1xB& zENQiusD+mJG!iB(+;5g<#wHd8I85)beX`XlW!02fUcLFel{Ei>`(Zv!P>!|A9WnM- z&yoh<&psb4MQr7@eQ4d#OSZjkCNm8ANz<*R-mx=&c(h|JRyGu`wJZdYl?{JHsY>bT zJ4OKG1y)aIeFIoFdp1WmO+xQBTc*Q>A%dywYnR7T`X?zdq$`tZDnakl{G2`LYfuw` z4cqM&T)veyb3d&IzzYZd?^WHGf_=Ajc$9YZvFmUD{`&H)bin~3`J2;F#_u`xcbR0s zzBk)EADsDcujND7TSfW7iV(&w6r+c7{oCRN8=Mv{z zd#z+y%814aueq#eD*NK)XWYVh-k6L@>}B*hhW`YSjv_v02@ZUx_{v1q_a z3KPJKy9gRB@YsD z{AR(tc?Q0L0Qil)4i?YGE(Y2tXK5weU0DEATs!a49_c&O6i5IyY32j>X<3#cB$D6Y*{f za(f|)la3^*5 z1;wg8q!&Wv_aklc&59IrN7-zL4=1=pf4Z&14*m9XUjKTQYn;T-T=Y!7OlR{_q;jx@ zDc6f<#shMNrz!Q}&<*^hN{G5MN$2%Olnp<0s=xe7rnhM#6UHW`3w|x=wg&wtriZLu z8M&t(ww{UA?_Kz>a>y?-MhA0T7uToM$x`quv6f9%vdI~(jf8oa#*j1hM$r^}I;_Ce z4KoCO3p{4fAb`B`9CVD%M%+#BiliS=sqPi2>}M&_wQsey5mla9ZZ?s_Kd|Tu*Bod} zEO+(v?X|+BFH?)`>K-6vctVo z2AE%GI9Fp^&a8^7<&UdMbE!?|eX6+OVBxP_&Kga7+0htY-?OnKH80Dg5$KyP4;d!q znk&`f(Y_6e-;o05yBBmB0s^L2xfKlMx2D<{Ym;0kho4B?byBol{6bm`L+ao{TxY#L z$FJFR%T_@8L*{=5^^X)U$oAJX${tlD6 z)3d{CrDi#tiU#aWeR(wT^5;3iwKEw zlYSWSi2%fx!l?=1(JT(GTRY}${}$h${vBE~sGGPJa9RUvef1{JB_)yXl}pMp->U5^ zpZ++P;Xs)g^-c7hf;GX{ZFv)ijL)Up=tlSb-YAY3K4w0AgxFcusi|mLLVM>TYTtR$OpY$#htvy zGxMqTH-GqIRKg`(7t~jSGj1kp9VYb%b66Zpux)%)%~Sfo{R?OQU~T1-;J#tBnO$-M`b z7K40zq0X#n*t>Q$=Qm}){$^uX<9(QjJ!9;w&c0RTR3|G33(2S7HmOJud`KmZAh!(S z_8r(up5C(#=f>8RBnY-7PyR9said{zG74)6vBB(Xi4=|GpC7^V(&7 ze(s0aL z>J38On!32{yxhX!Bh@-0^^JyAe&}+hyawC$>%q3Q*sqsa*h^=-#)xg=A z={Z88&nYVC)l- z#-7KFFEqHir&8DXI{8_$VGB{LhPDs?f!Hhh6Up3EHxeN5)It8!g(GQb#2c zfa?_$cBp%&_F3vnOUIw!0q!Kx|7d`3&0;1Kn}UHHo8d4k5x#N}y4EK^;9Sm;G&iqr z|D;0n)32&pB@~&P--C-=Xp|)7>z<NVwhtF;23~8}DJzeoX&6+v zAs*~+59eHnb~a$3`;{rOR+wzjwZI=H*{kEV+MMjRW>oltGmBg zA8$Fh#<|q>^Zr21-+GaYLnNF0IlnfpOFX85%{YbG9B|?(=l!5^TYO*_jf3T zI``SpVO4g=!gX|IZNI1F-W!bb>)os0o^4dgpj+H#?tS^@ecEJllK_tE?jvjDWc%Me zJIIKbibnl|x?|6(IhWteSQJ7480}TB%MYs2*J_6*8XF@Ky!X33i!^AX`gvmyQ28Qc z_4o16A+r)#fopM`po=!$ix@i%p7OaiPWKb|%z<#LA6Kl-;GX`+`}@)cDuE~#b>n#6 z%w0YjDIU*~>?iA2jBeyT7g0PpEV+#+XEKwtHGGDn<90U?0tyDcN2p-pe;b~3VRoA{ zcWl=CKriuSqy0sNDgND5D??_c_Oq||KIWy`MLb}_qXS#Qm2v4*R&aTzI>#o+Rq|R< z)$7U17IT^Vdl=C|ZFnDw#dcLztgiiGui6mX>6-cVx&#--Qe2+xQv|fTf0*fKgqEq} zJJL@dGqy=o>VrnJ#ieiCON~vT%Mk?+Y--VS3mr7{!!a3IH?g@Pf5my&5yJfqnTV%; zbqMyK%GeaEkxcm~rd5bCJx-n9Z*!$NPG2)?hfk0(bCqYg=HC4kNu@PwdAa#P}Of|p>poxMsv=Jep-d}P~@E_kk855qNn$wHW|)e2c#Ric;5du z8f}w3mx{nls+^U^&X+N_3 z*PHxj#!7Usm`6 zM~TEZX=QgPvL05j{bTl*dx7^xHg0F>cjXGb+n#6AM=c}qigf$L%YCK*ZeB_7EwI=m0r2}dG%kqa#Na;oikf16q<{C9K4 z;*nz){p70Mq14BgL%eyv+G2QMU3dl_{FSC~DoNjj69~GsIbqD>+o9V9?GG4Zj~z6s z`?!<(%zPb6p64D;vGwAp5KbyLVs+Sjm2^0JDLjjU{$?l>I@bNr{VM7A*bWI%bOxR! zD|5>(NfSI9xey})DL4}=i=tq87RUyCzpxgi3t!gRvdi2YH=-o2Fr8`WFJk|N91;;^ mXDa#&{9iF{cKJoYsw|K}ob@s$KSoq`?nr*ZSQ8)#Gyeh3i}0HO literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/MilanoCastelloSforzesco.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/MilanoCastelloSforzesco.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b430de52069b4b5af86c24e9fbde79f002698f7c GIT binary patch literal 4143 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 je5;+(&yrMPqM!BVKNap&ReP$tn z8hZ@dYN?kK)4K!1QJc7C!VGoW+VQQF196W+8vF+^#9L(t8R0?`mkZP$5y-Y;w>Uv7 zB_kN>XNnea@VBN^i+h}OUm`Itj8F0+%x{gA^PoeLY$ z$-R<;ICm(ciB!9k*i9zkw3l((@k>GNx|UALOTCXJMgyqYM*$?br}^d!7#1ljBHLNgl3%-DD88VF)-g*P%v=h z<)w?NFA0;GKi`D9M+Pj^pv@j}QDtx3AMU9A$Vf(%w9RFbd9}i!T!)mkwVd${2jQVd z@2p)c>s%T*=+6xYlRlF5Ij6@Nc^qN&uW>hB>xU=|&F(z|EG++R@Ea-Md+gmzYGl*= z1=wqDXepEN(=XRM4P0j(G^eseXq@@Lc-_^r&oB|Ev7_h0?X|QW9u(=_ZBAxiSc8p__JZM_xwueWv#3*SiuKN3Ty(oz%M>zjw@G$P_WP8H zV;8-*o>Hy5DjG{ZKgeqjpjco^+6pqxV0Uf77r))Fuqt1WS=5QPO33WEjSj?V(PuIC z{o%YD>Pflujt$jaE_={z)hh<(6b@s>+I(>{88H}_{Vv&H>2!0^NHftVFaX}Z9&u-> zp(QyQzv)gEKp7k)QdS5z^wuS^tVb_}bq2J#p7YhZJWYjtxLLebxa>52Qzn;!nt|zf zB#9}hek$uTvaTeT@XSm8`hARqF2!eL+6)dq@hjK{Cl;0yOOmd2;&d>vhs;4NqCz;&5MvPXvRihbiMsD3PlqI);mHg;HN4D zf!+@e5$kE#>C?NpQBQHp7Mtf=jwhkz$Qty156owfHG3|HX)mnHTGB5cV z4RuH0PuOkZ{wO|j)Bjp*VLY10g&g;x+_vv*%^kN1bR5M@#b_fp{dkcR$-2a#8kw|Fr>|5<|2x?4TSs+zxv6cdsgWDKx#Kj1xQMT6-t06wr@{bEY(Y|&) zIOWzPxwdbtEOuNsV_t$$GPYn`2@#CwS-jr}D|`D1ff#F0&6o{kWvBX@Q@Ya<3T7w_ n71E5~+IA;869qS0&p-6uX*WN5`20t2S*B4kE$ShkrDOjEWRYOJ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/MilazzoBurg.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/MilazzoBurg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01226a323549f9f316d90bea59762a1f464ae16d GIT binary patch literal 3506 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/ObervellachBurgFalkenstein.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/ObervellachBurgFalkenstein.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d502ff48393f4245d116d8a1976844f7131e4ed7 GIT binary patch literal 5777 zcmbVQcT^M2yIx2j^d_N72N42@G((MoQY?TVAYGb(2vP(>la5I50#XFTNH5Zn-n%rV zi9l$f2%%$Qxbc49`JMacz4zVo>@)MuJ9FllvOBvMGZ#w$!(DYPb%2DF1h6Guzy*PX zG>DsrikSoeT!{!Gf`SNMA}*5x02`72qLPRpVm^Y%?nF%e&4U0S9RdJLM8C?v2qUr! zm{?8=0C*zv5}`zl3nFq2G4`+DpBDg*sEK|G0C+?W0AfV{-*gTQF-8~wA_a*)24b63 z05C%d0AM-*=q5sf1pq==0ic};09Kd*K$0E+bcxJy6#(+Z03hWu035LW!zx_FSP^1< zVtbOJ0AQvJ0D^aj@kEZiNn~39_+(G)dpB_m+5tui;1v)9BH;%}8A(8lBp35Q7(fOB zfk7ZLFc?fmMn(>yrGOBPftrSr_7Vg0B_;+YCMYX6JCx-z3lkHE0LNt>UOs+4W_BTA zL0(~QK0aO&Vl@akgr0(eo)^jlh4TJi?V_6`9{@e~9oCT0tJaCmfla(Z_Dn*;#;BZqkZN6`P!!${Oa3I>C~kiU9JNWF;wF@nkXu9Gv} zdI+&{yTmUQOu?+0m{-+7DIl%454Cn5r(zM5Sr)?nmGs|={&#{x{$GmzBj`VRF6ICl z5D9VFfEWP;fRl)V3FuC_@HQvG*XBxMXbZmTipToGKsdugf?puI0DqOE>?i)@0_f8? z(`zvMnO~`1=6L}qw_(Q#%*(~*fnzoofPegc;c$Z4LVlwl*5G%VvA!cD?os@t%&gMG zS2~x#-2I5oqG!S~ajj8kjW@@j_6A~etauTPH?m^HR38D}wyfQayX_@o#NWy{rMQrb zTMq2ZQo7?GxYpQ*izYBXR?b%#ge9x+x9+MSmZ%BL^bD40f(ioLa{*9^agTG^L5Cz- z{5A0Y_5`49S;yS{=mHq>Aoi@{Opo3nE;DN5B@gSJB8#CXBTdN1B?QlLU5Ajy2fkhp zOgzC$&KJPfJD#3BXCYhU-^^mMv``;k9rK<50u*^YBvC9`V=BB3~WOX|LgJ^Too0sY;tI@D1jI;a6y z$2|&LUku6k$)+Ey$^NeBO3bxF5U`}ro5XLFnLGk4O_2oc>ClPLI^5@J7*X^Q<|^hw zS28c51;~RJ-YMx%x#@<8KE}q0&}7gp=nsXnBT@|=J6%PT7Ns5lwn&m8elc<-b}tEu^~oA@W59VK=3c~X=Bw^P_YDq5^oP*l)it^EoM`|e!R znXz4WB7Z6Y14=yF)fX;u^pevvJ4}qyYoCTwOZ|G|hjwu%)1=wh6Rr4;Sk@n|bTA%Z)(=t#RbWl zF39$k>XC!Q(}vv#I0s>pDg!G^wVOjT9InZ6wYev$V~fnIjcol&23Mn2{1xP}t*8sY z{DJR2#zJ|2JQO+hP~gkQmavzliyO~Xn4#x?aHgZ8Tu za!6eVNlT;L>R+%EELRPkJ3qW-EX!M{zE4`DXatF1zX1H;<&Wmxp>ns?~Ek0Fau6~d52a~P48tOp z&!hMxct=C|x`q5FjK|CnZtun}LxZu>wEUc_ay1;0UR*afsXidvoQ^i+OQ6|RhFHEZ z!Jr-v-Y`j6ws+1rAx}iV3%F+$akSP>!jr|Lmbqz&R}vgyALBs`YY5bl`4{FRN6PZG zY%&rH9;WJ#dE~B{pCn@aEKC)><5uMP;q6I)N3W*vK7UE(>JL=WugY!4`Mz3%cTKB| z@h;C=+Tvc8j6B=Wh&p6VbM2GCIxMP%^`YQ<1P7hEcU?*pqL(_)fY0azM z45bQ3N(Zz)^qoIgd*<3=R-HIA_?qM78gjP$K5`nc`L8vKhiKTSnHBF$P^aUV9vDui zunT2(Tuwr6V|r9iz4U-whlBpz`YRDw@^|b%PCgh2E}<98sOR~YWT#tyHHeWAJgM?k z9aCn@v;=nTL2U3*#9eo4h62w+p05V`JGV$>bWs$ycqECBsnGzHEr(Uw%YL~z@6niG zlip%q>Vzn#AzOd-;dZxy5jofzgqOR;NYBZQS1bx`(G?lmw-Q!b(qC3wI#V?zFgdjh)z)Xl*g$tf-xF8iOBLuQ^n4y? zH80jy^ZJdefgtQT!_fds`cdrp`H(X~x;y z!5Zm1NPU$*lO;!mxG$YlY|R-%B2Jhsf4k^MO{{pMhjUCbRs!%aDMQ{8Qn ztpWsnooY0k(^nFn;@CUFwfigCsi>QD?(xFFr9B$@w+$poC>QBCxa=VQ)_(81!Wq-8 zrrUB@lK~N_&I~=~;5dA2-~JEGqBVacj>+QyAqU9;xjjI8w{$KWN(y_U5 zFP!Zo<~98EuxW=ht|2!8ZaW=~|eHL=~!MB`vGZNA6Hi^+Ce2?HoFY z9@eLQ0~Bh00Xzm*~O^V}&11SvkZM=+3g)9j1D(ZXg9(IoaS`>OLc$h8EIw z*)eYwVCus`q3p0;WZ!zAz_*6j`xwN${^lIVp4>xxQtvS1ble7zqzww7hZMRXt$RC9 zZ<2E+7Y@DPwce6S2MNN3Q_-I~%6&7!L~2KCI6CioyKQ=1$E(#P&At!5QsXN3hNhz4 zbvsAh*DxX*{jRw&xS{p6b#)1aSqMG5vdR~~@9DFPU2Y#tEzM)|?Huzm7oF$^&w4&<{2jjb>{u3Ja{qB`Ig>L~;a_VtWL))ad9W10{}& z99Q0nER-6FGSj-u^hd<9Z9+Q9iNM1M&d3sU?PFv?6xcY_yKB)cp6$H#t z$aX~MEk8S7%YDa^5JE0J!(CG- zST7-*xq0d}`6ov3j?1T5Rp`F)m~; zEb^fslREdJZ0b7!%7au$MFsJlEs8nXE@=>Gj0+U=x%+9MXb3+Pnxnuyvt*QOlKE^C zQ(#awTCa1bdMZBEN3k@L3YC`kRch@fmlP!z&ci(Wv&o!e_1&#{hC433u8&>X%~nY@ zc^Nb}4lx$qFKE}wvI~3avQK8hlcIo^f)AUcqC=cmm?q3qzqVqfkeUVp0e`J=~$U!<;b-t8u_%#wt~ zKbKG@v)l4Lsal~`K|iG1Ykld{{~QdiPXh>>VqFKQMa=arhI#V=myQ&%8~3?T>5qMw$(h$TC#Q6!^YSoz#r@)T21z!_AM@wa;yOJ| zEU(GRgZQ#vr@rMe>+mPOufBy22h{6-;DU4)@NNVQr1w(`4PWtVUd4& z&!_aGeeja2pmvy~OLm}6neVeL?;QE6%F3zI!Uy~?uaF-mHo1~{b2}RDx_)l`dlo61 z0T%g1kbWSlIuL20OmrUjfUpdf&&^5++soqeR zoAojHK7m}+bE8cm{}(t7e-3Wpv!ROZ=gw=U!NAPUrfw-?#lx(lqw?o=&t5($d^l@1 zLD|CZzvf(Qau)Ji3sw7A8!DA68RIIQ6yR|*;+bg~QG@G^AW)}=rWhhWH1iVj49q#N z3cjNPS;|$y?-lD;ec_XB5?e6-aKbcq@7Xxi%EfLo=5jK8aCJkhwTiarIL!{uxL4WXt|nvAyBx@J z@M*K{^J?|b{iwyY?9zGlj2A?nbVNXJu^)q@);RvWSgK(fdA?slYW=V>50>N+ zB%S4ZRGRVSfkXyvPYr!=!}=Zer)F6+hrv^SU=wMKBgRMa%kVpOX&ZI%%#Sr}#7oR& z-m3YD7SIlB2__$nZMj*PufPUsv$fX=l9fZvw(k>E#yRTl*}8ir$ZumNDxc%crEV$d zvyk5A)eN)s4U!_KN96iObsh*OepF;0Y)qE8X_=?An#C=BPAV$d=so>m9aAd#0ar`JBF-q;jm%^{4=q?04pzO<2I-HN%DMND6JhY6GmiVOV{;;`@NZ4&Z%{-^3%936Oc7(OcBK6dKM;r04tJC=W9k-Drp znN!4JiXWv7M}sft+Ds;!A0NzZ>Fd}jG3Hh+e>`O1_3U5h(6Ip7=KM4{L>HOfS;-KS znO&`nnv)mD7ky1&eJ}8SHH&=dXw*Z8+R(GeUHMxZZz`14L#_KWW-dK(jip|S;!97w zBWFlVf?w!B2O6$q;HY#9rM0x4v}D>LTLZ67bOyl%#y=;(J1|q+zDD*RkaszeD@~2* zX4+QHYYd`!;*ACY5O}eQ!oERV!7~n8xo9WsbMa--o<;oH0_9|U7?iQsXJ(Yp18IlFwvTegSO!h zEC=JOOfP^jA$&%I3 z+lI&L3^q^c%?zJG2yEM?kXXB*zFSWM&(`GIZ2q|BzyD@NwyDzTcJ7mUx-mmMx@<(f zdK3^bPe7v9w7-LvMifu(eiIX-^W>5BE10n}tl+ z7}L-RvZV?O{Z`A&?w9peBa}}^S^g9gg}e68SRnp07Uf901_wDb*K~d0x_+5lna66~ znNCFwkNqs}eV)Pn`}1yDo;KUJ+bE8Q((y$J{n=hJyyXF|PTM;FPR*x(rz+15e*0J6 zS=-^YZCSsZ8~dgmr>#6K-QNf%bm`^=qhh=?dzza+ HU(Eg&JNLF3 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/OdenseeAndersen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/OdenseeAndersen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f131b76087a08ebebf533001bb913786fd2f7285 GIT binary patch literal 4513 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Olimje_Kirche und Apotheke in Olimje.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Olimje_Kirche und Apotheke in Olimje.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16ea33fb346e9c929ac968f821a85b9c72c8f231 GIT binary patch literal 7792 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 WkHhNsOV#UL=?NXreO;ovng0U_I*exk literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Olomouc.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Olomouc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9a7641f35c206a576fcfb5876821e700c5d7791 GIT binary patch literal 5608 zcmbVvby!qwxBebx=pPkaEnL?05JU9-o*!iG%UZxEeA*dUlOe22onI{(E`8+>VNF5e;c<_ z#@5IK0Nd>U;FkX@W`nKgJ~k)uZ;SOKeXv~nAKdcDOe}Z*x1GWATf7GWH{Adw0gwVX zf-maK*az6!Ug?n zV2l0N0O5ck*m4L6iHIox91s|c0|Db=tHeGThRp#GN?a-qv4?ony4LudUNquSuZjq` zlxsiHKASk;may@TCM2SxXJBOF;pO8O5R{aX{!2zyPUVrRn!1Lj)^k0514AQY6I(lb z2S+Do7aw0g|A4@t;F#FB_=J~d0$#qUIDMHt8Zv*YHn$5>*?+5 zA3zNbef~N*H9a#sH@~pD_G5ixb8CBN7kzkieDdcMb9N2_!2ig>-v65(N~|6n2m}nl zztsc63BUqO3BlzM!=rkri*M~k%_$y5K%@MssP+>fm&CIJS{v^PB06r#RUY)Mq<<;; zp9zZoKPmc;p#SK(SpZ1DAnb1grUaCL3y~zDj2XXuwR;r9_OAY1X`FGHHkl2Pn(GdT zg1>aT8Nyn7e3Q4UX(Zh6m07hRk(Tc$S9-nyxg=txjs^ZVP**sRtR!$ z-SMhiyZ%z?%SBld#s#{NvsP&&z$$dL6Z+zMtZ7uS&_Zac%V8N7&X0akUbTQ}HLZ0x-mOIx{?lViqDSNRVPrdT|X5dTzARN!16mj=B01X7riOW535qt6AyFvW z?Q3d`b&2LG@06bxV>N4dAOcedPER*NaskU$uG+_UGXZ@KM$OWGh^9hHLWVA~yG_fKWpwY{g`^ zNA1XUaI3FfWz+848Qj+vG|gZ~sn=oY--aLEs9^lLC23S0xcau=J$6adT!XOca7$3* zdxz5cglWh&G3@>RZ1YG_>yZj5YM7!EgV<@Lg>QM(maal+=XRHvCZ!ni#lM+wcZV<> zM(93sS&%9#flLnIt>JyT+C?LAcQd{R8Y*9-9G&bMC`;txo^p935DzNtlW6pJBM$F4&-80BvBE}mW=m@w77a?0G<*=_Q zIpv!S%yRG>z?2PY9D%Bi_?47bRCfcwjBbGMv{Iqy-?%{mN&VR+XuL4F{k|@KPR;@) z|IWQB*AaP@t2iZ?2i^UtrWtF2R{Ir=GASc0FGZVWJCMtTsX%14QspW+z(6d?GTiZe^5^qxW(ternNlV@ibIMcwv`{E9+0| z0D$C12lVWFtSP1bZuFhzF(=yLI$Sd7Qy*3)`f1q}^XkYJT_XrLeOoj_W^g8#hEZB= zMJh6HS3B~!J9d#od2)Y2Mni4WrnmF(a;3{_jEC3FjZJqx{Vjz3qt$?On~s2$_PuLX z^!3}7s(RYdyjgLLJ!a%k8~w%mqm)ShlNGe3)-YvU=8NSwE>YuANfm2U2?ByJiFTgE zcLP0hTU=7lpXJGCIX2&6P7x< z^xx=CyW70cH7++z;1sQjUYat(LwyQQwtG5d?sJX7b>0^&p&|!z&LQN4NgBPP+?ml4gEeDu zIg?9)eGMb&M6bnlhhmfIYpp#MYviMu}w)w*V=GtR<;HaJW-G zR}-($`P_NWe^v$3oXcR;^)|d}6ZVei>;_oNLn-x{8&l&w5_>_QwtDe;Z^!b1Axf!{ ziH-Eqq+?e27t)=lUF?y?RHO=lEhx=6Z~))3ryl-fD)p7`Ugf>qf_%fAqlKF4%-j`x z4&M8<$Gq)hINui8$W*L;d$6o4TP6K8I?C+cS*{6$Uh=SV9^}m9bvnCOsEDKQa;tJ) zcxBn18JZSjmeo4~|9pqq`Wp(7&QWSddrh{SGSb4Dk!td(=FF8wE{B^Y8Vd)A?Cg(s zn>&=Fe?1FirzKt2jz>L3)gsP1o>cS(r=!Y*vcoEO!!1z?RT&c`OcqG@&;vYO&K$wN zBqA9|-?4f!Cmr8U4IceG#FzTlqy57VkQkKw57 z*=UM_q;3@B1c9^;0>R+M5VGVNmxX~Sm%P+tdg6^$gXQ&+ZY+kOlJgY^ewlo8S_&?&ur))3FnLhw6hrFz%QZvQMv%pX`IRnmSqqg2bW@ z!7ucI1e=F$`4J(VX00X?^|cA0jtT01Z|8tnoJF@Zd{Xyy}Cj<=z>d&&7g>b<}X}r!HBzD5o?ZCqo ziU&i-h^mLPHIh}WcxBConluwqU*Mvi%&r8ZWSWD*K- z<7?h7v}MdChjRe3EGc_1wCQhx)!15Yj=5&jrk^7Nn@|vj!F) zH8lU!ae>+>&vbv&9n)6krVKLt<+F#f_!Wqlf%6wto5O2Ck{7e%9owpn)#*iwcCDVH zRfEIaf%0L$0ukHhOW!d*+FvD~ghS#biG8-5s{npm;WqKz3yO6>`ooWRyLa~%(h|zT zy1Gx9)QW9p++u}&tj4wa6F=n^)bnl%Pi+BSXn9hQA*&;jtQwYRYeMvldh$<9@DV>_p_1;P+lS zUhqtYWjk5vCVRK*nmTuLdB`ZlIfW`r8|tGk2TA8c0`zQsTqcyf#kHxvu~{fFEy?6I z4lc!O#d3+*H7dgEvHQH!?LIH8>LBKNI}<9Uh|Z{gsQ2kjUdv*t)U&TcaO>#~>5LWC z@s{YeSjc5QArX6PzZbOE95PodQx$o%$;q5f^V+%bLXyABk9xZoFGd@I4&$~3{<5)W zt|Eu^`I zcCE&=qcGVX6c+Qw!yKwvMRPANw zDSoEq?*uQnKXE|m{^etK1TpBB|4=E`As1~*qOL6Vlz5L|w8Y*6&iw*9zx3RTno5IV z;Es3e;w){cb(vG1T(vaS@`L=`$X3!#MF1c4U>ld`Dn8k9b?^Px<8~(zJ4T6WSn66THx4%<;8xa*ck{;`^7{ z#V`J15Q_M_ar^|NF=Hb$?HIm;xcq@rov!BYAolts=U)*%#3GMn90havAc8AoVoQyw z8V%0^1YD&*N*?^m$Rm5ZDvQ`m4=ae6EXhB6cp3yN=#t3h3IC0qfhJX}ogsZ6SqhL+ zuH=+w0poSU+;3Q(@o*@+DVv-6*n$E;b0=i1lG4QPJmo3(Y?80MpiI)_jd5suU z{Yl^`gBZ@4Sch_1oz}3z7kp6N6>p;L96^O#e`2GcwG;$K)%ozlw!#S&&`lk)-C|Os zrEA3BpK<(2L_CVIi&rS$9E0v)kL?Y}OI}&SSM~Mx*BwrFGEF8mcT@E3Ha>^hJN~~O z#pM6@D6Jn12f7*zf1a#CnL|BiE>-L+odg`cXI8D+3!m;aEpf}@h|9qhLT2ank5B_j z$%XU>Z~KIykEi@-<9Dg)|Bfw`pc36yAgFkw>B1XSn0&z2w-Al zj%Zb++7p)ycPK5t?9>pBx$MfaYu+bc*-kwC&G#nddRN+G$GHA_a_LSo?*j3ThJt*) zq2z+yp-8!vB9X?S#_u&^PqTfHFk=&}ZzdO`S=L~4f5c=X5_R5^edjs|DbRLRwwbGC z=!b%y#nj{B>hLH41t z!XWTNDbB}2=<4mjyD_g~*YL-0IzEvuFzT`9%dCg%kA!kumG1jNg_O~zHKp6SG=`LL zjc+Ht!D4I$Ay$9xGQEZ}{$PDQTTD#DlHMV#rRQv{E&77I0Tl&7H z^~*ZP+T~HP!XFFu?2Qd19L-7msGN<4n9YH(0oi@bZ0F9ok9MiI2|6S!pjJF zw^9-Oqzed)&`a0KCZ_q~wfTr(>x?N&wXrq7M8uq&a-w=Yu|PO|$Vc|9Sf303!&rFZ zjs@<)4<`%WTI2U=+HhNgH^Uc|-r<%#NT)(bLT}v@naq(E|J83+amW3ZlRe0khLfiy zls`6DPZo)Vxb3x)p?T`#bhdQ0us^EWx+W2*25hU7-6$8`fjy?OeS#8U)^^R+_IleM zwWZ7*y;!eLEe++@&F10*K*upn(ezL)Oo!%Y2d0HV_*{tffUgSe}# z4n?lR8=$V?Dp$Dq=Uz%-d8y0XB`5*kNjA)~GqL+vs1c@loTZ}q-kCq6c_vk%( z3_{E|e($^9f4)DyvhRBCZs+W~pR>+d=iZB%#w-C88mbRf0UTT$zzTZ-m}?x|Lv9E$ z7cKzYKoN^roPTKx5CG(3?Hkn@{ta&In^*@K0IcBy zz!Dw+5dK@=_&0GR3jmyh0pJJLr}#H+?3>t4u9zHKA6vr*TYn21ztK1TP5eCtwihC- z#*V$gKQ=bzLxrt%3p)mzyU{m(F)h}{KJNxMcJUo-9h!e>RxSXzL5C)G4LSfyLckJ; z1>xKUa4B&>lsK3;DoYrvaqqS;$WwN3BcrpgygKWRJ63L|5w3u_P$J^nbo3029QQc6xOv3HVG@#3(#j81RMpfUYCO|@uBUHcXau)< zX>DU`XYcOe>E-R?>lYRt@jCKNRCH4EyOh+l_aD-8^YRM{i;7E1t7~deb@dI6OMeaPja! zc;Fj8IJn+efGF|s*@OwGl(fMwT&eGhgb>o)Pt2+6Bw`oUIi$688zH_86Z&=8xSR+09*=0^A25^t^`roU2`;}s>ez6zSda!a=E_K z@#W3RpFH=Yst_<}d;PpjHP&hPL2gT(0=>_N;Gz7WgYKZKCt8qbe|5hd&g-ip3_xuv z$Y0!4(RUReRH0lWClGxyef4MsH1$;BY+d0zJyTW*nGsZ!efc|k`PnIPOzCx-vca^M zjkk&`H*(jed>I3@+g;O&Af!8)7P2qV?aMlcqNe(%$B@b8nal{ZtZ=Ef!AnI~fV0-&=4YHhA)N8Gfa3*mOKjX%RZ}Jg#`& zPCE2F$(U3+AO?!CvsKjXNL-i|QE~{2pl4vO<;h_mVhvwIj^w$|(p`BZ43{^m>Ap&hB`O{%*#wr6QXZkrrax(N5~i~fk8DT%-L zF^$)Ye?cw1uSMHL;R|^*?5F%lIkMZ4X4GjuZv4fY>y&xDonZ?lGqod7FQaD4>YV|Z z{05Ptw1!+<0&Vq!EyNV>Mtf{hCkD8stgn}b=gS(Gj{yc~(8zfZN^Q#x?orsPIXTds zPWsL1(HcE713hG2e|e%div4H3z0Y>-=5deDU~Oe6Y+kYt;#vmjPM<=jW#`TPv`16j zdzi%)i(oU;@b3`b3f%D1FVh)`o7q(9*-FTD5cIfgZxp((@LH+%8dXA@uhk_2lU|w{ zTqG`RN7Xe(2WbA;nDBa&@HPu z#hrw`*5b11 zM###_d(_t1WCnznw@kKf_dOcuIFvmvt${ix;=I>e$A z^D(`iOq~c z!2)|}(CntX#0)AoKb(Y$@B`RJ`~=*=UaP{`NX^??{7#Sc{0tkjo5s4LSp^&3 zW(}l5e>s6@tEnxaWO_$J0tWj^ykI+{G(ei0Fa#f7X@Dl5(yC;Q->c03}_ktumz z>`kFnYzqCI_n&$L)EwN6Pj>Vt>neYCGWm%K_ZF=^dyV&!zETRFk@dcxX*4;BXCP;M z8`djGZEU#fUYjmglC&dCj-RNc^G$;45k*+2?%p*Y$T&;(s4mH~>|<4_*&zCDja+w! zpd?WI9K<6$B%d|W<-_}Y>@$1P?(>$oRj`|YI(GwkniM-8C^7brWu3p>sxdjONvT}8 zmtNfnVUqgZcnFn{V`&~Snb7pG`w%Hy^5jwCFP$?_wK4PR{XDV~8)t7v$#e#9S{EM$ zso~vT-mRn2HtWC1D#fGaD#1z){$E(Sd4xA4SXmVRoR~k3Pg&ID5z;oL_}G?X4!N>C z3TXRqdH+03qY1)S?pS#U+?(XHiOo0}3qw-1aPUh*9uX$-lI_q0SqD&#A zdhRyQq)sNJ&}%=Daz|69P{E>1r3Wq5cx98jT@&*vGQz5Vz5#42H(c=SXfjzas&*Rr z`{Rh6w*y`xg+w1K9*p?UQRf+ZI}6<_{>3+{ImJfbIX+~X!Uo<^0?N3WU>JRkZw8)>x_O0)RtIE59$O4CqLU*TV;V=$I`|)3u|p~Ethhii10dUzHF_r`8i7XKn;56;_bP5{P)Q#n=e7puqJ5el;QZa(YvSR z+zQPK70f|A7k!V%mRm-gDso%+_?;}|4WEAQ3`=uUv$!AYKH1FKJa!9l zD3^-GPut+cA2#w97~pOTN@{thWK8B7S&B6Dlt+$Uvu!;y%s-Q;d;o1YW?Q)TAX3&* zvU4duWzD>HxUXMd&6)7rXyZ;4vO0}=?(0df@~Q<$K9+ph%&>g!A$f#YoaP8JKWlPd z)vM$0H=YucB+0LQji+W48;f>`TZ{6S8b5zsd)=GQudpESgA|R?Zu9jP-X#-MPS2uL zIx$Pu+DmDta~g;Mt}_ZGisbaZ%j6a%*IW*0cz#N#PVU29@*TLK9sYZ0NN2% z@~*PJkd0JSBJF&U?GT@-R$2V9x|v!lC)ss{w|_6?@hiuu*@LhTil=z!HJdtnW*KeI z)}%YU!ju~oN?NTyl%oT^sg_Fu9-J1GZjsU z74li*r?0dUSU4isQ@7V{FSDtvL8|*=Sz29ukS131+}rbZ)5lT2$g&G~=IjNbNxdh& z{9YTdxwwv;r&0`C-K*u^3N;5I7@%H!Q1#&XXqwiDpqQOS3Ly@M-K_^Nl|q7P>NQtt zWhrxKZ0m28*r&^-=D9;TNc3GZ-%9Q5&>T-MWn3Prc%() zN>XIJpaV;SfdJm&yr?jQ?sd@A?>M_&LA~z*prx#|<>FIVq;~XQq{8~z_Es)i*onZQ zu@omL*00`KqUD^{z0?_DDzeXY#@ue(8qMApP#O!~G_{hKKMKeUHlFc_2_Am;Dke2n zkQtcHEsE(jr*xvU3VU+6tE%e#_w(NM^Gu_L;z#oj1tl;5p8NU?d-_-)*{%_3;_ELO zbHWyb+~X557KcJlN#Nq!5aKqn9cfsB_ewV9wsTQ6Vc}Ry;}6KYo zg;{0@nuHR&hx|{Is))I>Ifw81SfjTq#J(bFkxb+w>(8xpW}L!f;q;Pwy;7wt0*61- zT+rS|u*^c$#G2djKkclNRwapr?*-x1lBt*KJFzDHMYhc4uwNfkC1gzx?>@g5cQ3BX z{3EB;@q5+$C`AVRU{D#}AGr7~pR8qLQ-(HjzEQhpm+)|LfF^YVO!Dx)o4)MQWpsVf zx#o#Bcp$4+mMQRfUwkjyT%)zn$N#4mw9tdxnfeK%nAHc^)j|lfh@0!vxsNe>DuqJo zM+E$QL@0yTav_&9{X^jO2YJw12^}ps`>!&R4Nj}KpFa|+4l9qdychp%Ro+vCoYvv)^ccfuKQ!Nr>dEzU~k-Ydhj^9#mXflL$P436w4_u^+q783n%bxF`g zfgz6M)e4p(j0O0VudpMYdqUj< zA%-5luR8oLYKH-A6)TEwJ)I&CC3_sh>agY}8lOkM(qJ^DRX3(VVa)moK)$ovfL)-Zlra^TR$W9L;jrg_4V*&5MPt=zC_ z?=q*jB?qQ4+_mrUKfmJDWcG9qUA@pZP1dumw{!9|uUYJxJBVn5je7<-_ZgApy>u^< z`>d@D4M`a&bCP*WzAPn&P(UXgkrsu^)6H#D+ov8seB~$xJ2q-`8RadRr6(hsWVR1I z4}pU>n5FlTbgScxk+HH8%OCkgCXG|$kJq!UiGa_FaH#tv@^*~25t|`bGmB@Aulr(* zsrtjaxil~J2(_DV`@oW%iSZL9pU-)CAGx~NgduR=am-AyQf3H94RVI~lOj<=B^7a+s{#JicQ zZPY^%clLevKf)0RcK(U{#QdTGkrIpkd^Z{oDTW;$1Ub2#1Y^1kG86m6`xszmlJ}L{3T0-8jVsPO;l9Uiel|xHiih{o{l$Il*=t@udR6AD zw}0W$mu2t+^j1}a`Z(UTPtN}3b0-t7=DD18a~gT(9eKK@`tuOSyoUu_VNf3_F7A3CsoYxVXBT1adV=k>nTo*WQ$3Un z;jA^`+0I}OlZS*G59jAqn+$V&N*jz5>eK`*ab~q-tss6MSK{LeXJ!zLqE}K`f|VM( z1SNJf(alm)oNvE)%hX&|nd}#F&(RlE&G~qLNlk@-#pHN)X4n>rQJwXPu+09!V8y=g zWTJ_4iDr?9^|}+z;)Cuc6YKR!ypNtt?&1*<7fOhF?E9=uWs;Nbw9|+M5o}%49^t=B z?}@0HCpslvk*R3ZMLWUv;Neq149-*b~0%ba?{fBRefLzlbFUzc!Hh$_4Z>oKRi*=$cq}BG z6~_4q5*ILN5Xf_w&%%kK&>F2N)0&00^i*AVIC5Sxug86V{m=$Qc5*-(7k9k&yA$vp z1|Ol8h&V@c8{!QzUr@cg6-%WFR?4>jOM?C0XDIX=!R|28$ERYg?>wALHx7FyGB5K!Xa&xsAkyZWmmEyzX{nXHyw0DuJGoy|Lk6mV~*zq_It4Qe(u zNm{S=%V7F_fn3cwL8T_=UP-o+p&9R0h<8CncZ)RBJX78Lg&a6+G)6{Jm%IA*w;|DCAR`MAd^FYlL}umS4g7F>lKqD)PEiA5 zAeZ=7dCQV(g!$t``J+wT)&~FEqd@O0+qrOlk5Iq|5X!EIfuV+fx`P`%AE;HyjTRZBl$wihrRj3)vB_w#5-Pv!)DUifY z^lO8FT$MI?sF79y)29OXAO^60R8gnGgaJ-QGBCjEMq3;+Z}MULmof#C1%|yp>AO6W P;rKM#ivJTJn3?|qM-_e& literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/OrleansMaisonJeannedArc.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/OrleansMaisonJeannedArc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..220ad08fa74b8faa8f008935d968c20952bac1e5 GIT binary patch literal 5458 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/OrleansParcFloraldelaSource.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/OrleansParcFloraldelaSource.jpg new file mode 100644 index 0000000000000000000000000000000000000000..171e56de8adbe1aab791342ea969b71c69350fc5 GIT binary patch literal 5731 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 IIaiba0!i|kA^-pY literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/OstiaAntica.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/OstiaAntica.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b505ec7fd3c1b396ff03223aa4eb15bbc10a1981 GIT binary patch literal 5433 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Posen.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Posen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..791c46f2a514024f52b5d571637b7420f5f43482 GIT binary patch literal 4390 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Postojna.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Postojna.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec2a6be8f476981213bfba83dc2486214f14ead8 GIT binary patch literal 4047 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Prag Altstaedter Ring.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Prag Altstaedter Ring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f13fd367cb98906943506d0723bdcc9766f5515 GIT binary patch literal 6487 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Prag Waldsteinpalais.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Prag Waldsteinpalais.jpg new file mode 100644 index 0000000000000000000000000000000000000000..718b4e8d9a6ed70bbd11b3c5ef52d72900b062b5 GIT binary patch literal 5051 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 literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/RouenNotreDame.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/RouenNotreDame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e08453425ebb19a51ca9655ed3e5f054f9612f2 GIT binary patch literal 4442 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 Vzs-U~6WNUiz4LPuy$u;d{{=yVBQ5{{ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/Salzbergwerk Bex.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/Salzbergwerk Bex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29bdfe029196f731894e387ae2376ba0d6cbf773 GIT binary patch literal 5258 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 awF6yMj!_pvnD{TmIpx>@ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/SalzburgResidenz.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/SalzburgResidenz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eca7e6022287bd8ba6fc823bf7cdf0ca41cffff0 GIT binary patch literal 5495 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 suvIaixl>h($ literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/images/WienMusikverein.jpg b/plugins/Autocomplete/jquery-autocomplete/demo/images/WienMusikverein.jpg new file mode 100644 index 0000000000000000000000000000000000000000..477bafceb6d8ba1f55db7f5533cc417899886e30 GIT binary patch literal 7119 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 + + + +jQuery Autocomplete Plugin + + + + + + + + + + + + + + + + +

          jQuery Autocomplete Plugin Demo

          + +
          + +
          +

          + + + + + + +

          +

          + + + + (Current month is excluded from list) +

          +

          + + + +

          +

          + + + +

          +

          + + +

          +

          + + + +

          +

          + + + +

          +

          + + + +

          +

          + + +

          +

          + + + +

          +

          + + + +

          +

          + + +

          + + +
          + +

          + Click here for an autocomplete inside a thickbox window. (this should work even if it is beyond the fold) +

          + + + + + + PHP script used to for remote autocomplete + +

          Result:

            + +
            + + + + diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/indicator.gif b/plugins/Autocomplete/jquery-autocomplete/demo/indicator.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/json.html b/plugins/Autocomplete/jquery-autocomplete/demo/json.html new file mode 100644 index 0000000000..9ed974faf6 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/json.html @@ -0,0 +1,68 @@ + + + + +jQuery Autocomplete Plugin + + + + + + + + + + + + + + + + +

            jQuery Autocomplete Plugin Demo

            + +
            + +
            +

            + + +

            + + +
            + + Server-side script creating the JSON data + +
            + + + + diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/localdata.js b/plugins/Autocomplete/jquery-autocomplete/demo/localdata.js new file mode 100644 index 0000000000..6015f7c822 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/localdata.js @@ -0,0 +1,216 @@ +var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; +var emails = [ + { name: "Peter Pan", to: "peter@pan.de" }, + { name: "Molly", to: "molly@yahoo.com" }, + { name: "Forneria Marconi", to: "live@japan.jp" }, + { name: "Master Sync", to: "205bw@samsung.com" }, + { name: "Dr. Tech de Log", to: "g15@logitech.com" }, + { name: "Don Corleone", to: "don@vegas.com" }, + { name: "Mc Chick", to: "info@donalds.org" }, + { name: "Donnie Darko", to: "dd@timeshift.info" }, + { name: "Quake The Net", to: "webmaster@quakenet.org" }, + { name: "Dr. Write", to: "write@writable.com" } +]; +var cities = [ + "Aberdeen", "Ada", "Adamsville", "Addyston", "Adelphi", "Adena", "Adrian", "Akron", + "Albany", "Alexandria", "Alger", "Alledonia", "Alliance", "Alpha", "Alvada", + "Alvordton", "Amanda", "Amelia", "Amesville", "Amherst", "Amlin", "Amsden", + "Amsterdam", "Andover", "Anna", "Ansonia", "Antwerp", "Apple Creek", "Arcadia", + "Arcanum", "Archbold", "Arlington", "Ashland", "Ashley", "Ashtabula", "Ashville", + "Athens", "Attica", "Atwater", "Augusta", "Aurora", "Austinburg", "Ava", "Avon", + "Avon Lake", "Bainbridge", "Bakersville", "Baltic", "Baltimore", "Bannock", + "Barberton", "Barlow", "Barnesville", "Bartlett", "Barton", "Bascom", "Batavia", + "Bath", "Bay Village", "Beach City", "Beachwood", "Beallsville", "Beaver", + "Beaverdam", "Bedford", "Bellaire", "Bellbrook", "Belle Center", "Belle Valley", + "Bellefontaine", "Bellevue", "Bellville", "Belmont", "Belmore", "Beloit", "Belpre", + "Benton Ridge", "Bentonville", "Berea", "Bergholz", "Berkey", "Berlin", + "Berlin Center", "Berlin Heights", "Bethel", "Bethesda", "Bettsville", "Beverly", + "Bidwell", "Big Prairie", "Birmingham", "Blacklick", "Bladensburg", "Blaine", + "Blakeslee", "Blanchester", "Blissfield", "Bloomdale", "Bloomingburg", + "Bloomingdale", "Bloomville", "Blue Creek", "Blue Rock", "Bluffton", + "Bolivar", "Botkins", "Bourneville", "Bowerston", "Bowersville", + "Bowling Green", "Bradford", "Bradner", "Brady Lake", "Brecksville", + "Bremen", "Brewster", "Brice", "Bridgeport", "Brilliant", "Brinkhaven", + "Bristolville", "Broadview Heights", "Broadway", "Brookfield", "Brookpark", + "Brookville", "Brownsville", "Brunswick", "Bryan", "Buchtel", "Buckeye Lake", + "Buckland", "Bucyrus", "Buffalo", "Buford", "Burbank", "Burghill", "Burgoon", + "Burkettsville", "Burton", "Butler", "Byesville", "Cable", "Cadiz", "Cairo", + "Caldwell", "Caledonia", "Cambridge", "Camden", "Cameron", "Camp Dennison", + "Campbell", "Canal Fulton", "Canal Winchester", "Canfield", "Canton", "Carbon Hill", + "Carbondale", "Cardington", "Carey", "Carroll", "Carrollton", "Casstown", + "Castalia", "Catawba", "Cecil", "Cedarville", "Celina", "Centerburg", + "Chagrin Falls", "Chandlersville", "Chardon", "Charm", "Chatfield", "Chauncey", + "Cherry Fork", "Chesapeake", "Cheshire", "Chester", "Chesterhill", "Chesterland", + "Chesterville", "Chickasaw", "Chillicothe", "Chilo", "Chippewa Lake", + "Christiansburg", "Cincinnati", "Circleville", "Clarington", "Clarksburg", + "Clarksville", "Clay Center", "Clayton", "Cleveland", "Cleves", "Clifton", + "Clinton", "Cloverdale", "Clyde", "Coal Run", "Coalton", "Coldwater", "Colerain", + "College Corner", "Collins", "Collinsville", "Colton", "Columbia Station", + "Columbiana", "Columbus", "Columbus Grove", "Commercial Point", "Conesville", + "Conneaut", "Conover", "Continental", "Convoy", "Coolville", "Corning", "Cortland", + "Coshocton", "Covington", "Creola", "Crestline", "Creston", "Crooksville", + "Croton", "Crown City", "Cuba", "Cumberland", "Curtice", "Custar", "Cutler", + "Cuyahoga Falls", "Cygnet", "Cynthiana", "Dalton", "Damascus", "Danville", + "Dayton", "De Graff", "Decatur", "Deerfield", "Deersville", "Defiance", + "Delaware", "Dellroy", "Delphos", "Delta", "Dennison", "Derby", "Derwent", + "Deshler", "Dexter City", "Diamond", "Dillonvale", "Dola", "Donnelsville", + "Dorset", "Dover", "Doylestown", "Dresden", "Dublin", "Dunbridge", "Duncan Falls", + "Dundee", "Dunkirk", "Dupont", "East Claridon", "East Fultonham", + "East Liberty", "East Liverpool", "East Palestine", "East Rochester", + "East Sparta", "East Springfield", "Eastlake", "Eaton", "Edgerton", "Edison", + "Edon", "Eldorado", "Elgin", "Elkton", "Ellsworth", "Elmore", "Elyria", + "Empire", "Englewood", "Enon", "Etna", "Euclid", "Evansport", "Fairborn", + "Fairfield", "Fairpoint", "Fairview", "Farmdale", "Farmer", "Farmersville", + "Fayette", "Fayetteville", "Feesburg", "Felicity", "Findlay", "Flat Rock", + "Fleming", "Fletcher", "Flushing", "Forest", "Fort Jennings", "Fort Loramie", + "Fort Recovery", "Fostoria", "Fowler", "Frankfort", "Franklin", + "Franklin Furnace", "Frazeysburg", "Fredericksburg", "Fredericktown", + "Freeport", "Fremont", "Fresno", "Friendship", "Fulton", "Fultonham", + "Galena", "Galion", "Gallipolis", "Galloway", "Gambier", "Garrettsville", + "Gates Mills", "Geneva", "Genoa", "Georgetown", "Germantown", "Gettysburg", + "Gibsonburg", "Girard", "Glandorf", "Glencoe", "Glenford", "Glenmont", + "Glouster", "Gnadenhutten", "Gomer", "Goshen", "Grafton", "Grand Rapids", + "Grand River", "Granville", "Gratiot", "Gratis", "Graysville", "Graytown", + "Green", "Green Camp", "Green Springs", "Greenfield", "Greenford", + "Greentown", "Greenville", "Greenwich", "Grelton", "Grove City", + "Groveport", "Grover Hill", "Guysville", "Gypsum", "Hallsville", + "Hamden", "Hamersville", "Hamilton", "Hamler", "Hammondsville", + "Hannibal", "Hanoverton", "Harbor View", "Harlem Springs", "Harpster", + "Harrisburg", "Harrison", "Harrisville", "Harrod", "Hartford", "Hartville", + "Harveysburg", "Haskins", "Haverhill", "Haviland", "Haydenville", "Hayesville", + "Heath", "Hebron", "Helena", "Hicksville", "Higginsport", "Highland", "Hilliard", + "Hillsboro", "Hinckley", "Hiram", "Hockingport", "Holgate", "Holland", + "Hollansburg", "Holloway", "Holmesville", "Homer", "Homerville", "Homeworth", + "Hooven", "Hopedale", "Hopewell", "Houston", "Howard", "Hoytville", "Hubbard", + "Hudson", "Huntsburg", "Huntsville", "Huron", "Iberia", "Independence", + "Irondale", "Ironton", "Irwin", "Isle Saint George", "Jackson", "Jackson Center", + "Jacksontown", "Jacksonville", "Jacobsburg", "Jamestown", "Jasper", + "Jefferson", "Jeffersonville", "Jenera", "Jeromesville", "Jerry City", + "Jerusalem", "Jewell", "Jewett", "Johnstown", "Junction City", "Kalida", + "Kansas", "Keene", "Kelleys Island", "Kensington", "Kent", "Kenton", + "Kerr", "Kettlersville", "Kidron", "Kilbourne", "Killbuck", "Kimbolton", + "Kings Mills", "Kingston", "Kingsville", "Kinsman", "Kipling", "Kipton", + "Kirby", "Kirkersville", "Kitts Hill", "Kunkle", "La Rue", "Lacarne", + "Lafayette", "Lafferty", "Lagrange", "Laings", "Lake Milton", "Lakemore", + "Lakeside Marblehead", "Lakeview", "Lakeville", "Lakewood", "Lancaster", + "Langsville", "Lansing", "Latham", "Latty", "Laura", "Laurelville", + "Leavittsburg", "Lebanon", "Lees Creek", "Leesburg", "Leesville", + "Leetonia", "Leipsic", "Lemoyne", "Lewis Center", "Lewisburg", + "Lewistown", "Lewisville", "Liberty Center", "Lima", "Limaville", + "Lindsey", "Lisbon", "Litchfield", "Lithopolis", "Little Hocking", + "Lockbourne", "Lodi", "Logan", "London", "Londonderry", + "Long Bottom", "Lorain", "Lore City", "Loudonville", "Louisville", + "Loveland", "Lowell", "Lowellville", "Lower Salem", "Lucas", + "Lucasville", "Luckey", "Ludlow Falls", "Lynchburg", "Lynx", + "Lyons", "Macedonia", "Macksburg", "Madison", "Magnetic Springs", + "Magnolia", "Maineville", "Malaga", "Malinta", "Malta", "Malvern", + "Manchester", "Mansfield", "Mantua", "Maple Heights", "Maplewood", + "Marathon", "Marengo", "Maria Stein", "Marietta", "Marion", + "Mark Center", "Marshallville", "Martel", "Martin", "Martins Ferry", + "Martinsburg", "Martinsville", "Marysville", "Mason", "Massillon", + "Masury", "Maumee", "Maximo", "Maynard", "Mc Arthur", "Mc Clure", + "Mc Comb", "Mc Connelsville", "Mc Cutchenville", "Mc Dermott", + "Mc Donald", "Mc Guffey", "Mechanicsburg", "Mechanicstown", + "Medina", "Medway", "Melmore", "Melrose", "Mendon", "Mentor", + "Mesopotamia", "Metamora", "Miamisburg", "Miamitown", "Miamiville", + "Middle Bass", "Middle Point", "Middlebranch", "Middleburg", + "Middlefield", "Middleport", "Middletown", "Midland", "Midvale", + "Milan", "Milford", "Milford Center", "Millbury", "Milledgeville", + "Miller City", "Millersburg", "Millersport", "Millfield", + "Milton Center", "Mineral City", "Mineral Ridge", "Minerva", + "Minford", "Mingo", "Mingo Junction", "Minster", "Mogadore", + "Monclova", "Monroe", "Monroeville", "Montezuma", "Montpelier", + "Montville", "Morral", "Morristown", "Morrow", "Moscow", + "Mount Blanchard", "Mount Cory", "Mount Eaton", "Mount Gilead", + "Mount Hope", "Mount Liberty", "Mount Orab", "Mount Perry", + "Mount Pleasant", "Mount Saint Joseph", "Mount Sterling", + "Mount Vernon", "Mount Victory", "Mowrystown", "Moxahala", + "Munroe Falls", "Murray City", "Nankin", "Napoleon", "Nashport", + "Nashville", "Navarre", "Neapolis", "Neffs", "Negley", + "Nelsonville", "Nevada", "Neville", "New Albany", "New Athens", + "New Bavaria", "New Bloomington", "New Bremen", "New Carlisle", + "New Concord", "New Hampshire", "New Haven", "New Holland", + "New Knoxville", "New Lebanon", "New Lexington", "New London", + "New Madison", "New Marshfield", "New Matamoras", "New Middletown", + "New Paris", "New Philadelphia", "New Plymouth", "New Richmond", + "New Riegel", "New Rumley", "New Springfield", "New Straitsville", + "New Vienna", "New Washington", "New Waterford", "New Weston", + "Newark", "Newbury", "Newcomerstown", "Newport", "Newton Falls", + "Newtonsville", "Ney", "Niles", "North Baltimore", "North Bend", + "North Benton", "North Bloomfield", "North Fairfield", + "North Georgetown", "North Hampton", "North Jackson", + "North Kingsville", "North Lawrence", "North Lewisburg", + "North Lima", "North Olmsted", "North Ridgeville", "North Robinson", + "North Royalton", "North Star", "Northfield", "Northwood", "Norwalk", + "Norwich", "Nova", "Novelty", "Oak Harbor", "Oak Hill", "Oakwood", + "Oberlin", "Oceola", "Ohio City", "Okeana", "Okolona", "Old Fort", + "Old Washington", "Olmsted Falls", "Ontario", "Orangeville", + "Oregon", "Oregonia", "Orient", "Orrville", "Orwell", "Osgood", + "Ostrander", "Ottawa", "Ottoville", "Otway", "Overpeck", + "Owensville", "Oxford", "Painesville", "Palestine", "Pandora", + "Paris", "Parkman", "Pataskala", "Patriot", "Paulding", "Payne", + "Pedro", "Peebles", "Pemberton", "Pemberville", "Peninsula", + "Perry", "Perrysburg", "Perrysville", "Petersburg", "Pettisville", + "Phillipsburg", "Philo", "Pickerington", "Piedmont", "Pierpont", + "Piketon", "Piney Fork", "Pioneer", "Piqua", "Pitsburg", + "Plain City", "Plainfield", "Pleasant City", "Pleasant Hill", + "Pleasant Plain", "Pleasantville", "Plymouth", "Polk", + "Pomeroy", "Port Clinton", "Port Jefferson", "Port Washington", + "Port William", "Portage", "Portland", "Portsmouth", "Potsdam", + "Powell", "Powhatan Point", "Proctorville", "Prospect", "Put in Bay", + "Quaker City", "Quincy", "Racine", "Radnor", "Randolph", "Rarden", + "Ravenna", "Rawson", "Ray", "Rayland", "Raymond", "Reedsville", + "Reesville", "Reno", "Republic", "Reynoldsburg", "Richfield", + "Richmond", "Richmond Dale", "Richwood", "Ridgeville Corners", + "Ridgeway", "Rio Grande", "Ripley", "Risingsun", "Rittman", + "Robertsville", "Rock Camp", "Rock Creek", "Rockbridge", "Rockford", + "Rocky Ridge", "Rocky River", "Rogers", "Rome", "Rootstown", "Roseville", + "Rosewood", "Ross", "Rossburg", "Rossford", "Roundhead", "Rudolph", + "Rushsylvania", "Rushville", "Russells Point", "Russellville", "Russia", + "Rutland", "Sabina", "Saint Clairsville", "Saint Henry", "Saint Johns", + "Saint Louisville", "Saint Marys", "Saint Paris", "Salem", "Salesville", + "Salineville", "Sandusky", "Sandyville", "Sarahsville", "Sardinia", + "Sardis", "Savannah", "Scio", "Scioto Furnace", "Scott", "Scottown", + "Seaman", "Sebring", "Sedalia", "Senecaville", "Seven Mile", "Seville", + "Shade", "Shadyside", "Shandon", "Sharon Center", "Sharpsburg", + "Shauck", "Shawnee", "Sheffield Lake", "Shelby", "Sherrodsville", + "Sherwood", "Shiloh", "Short Creek", "Shreve", "Sidney", "Sinking Spring", + "Smithfield", "Smithville", "Solon", "Somerdale", "Somerset", + "Somerville", "South Bloomingville", "South Charleston", "South Lebanon", + "South Point", "South Salem", "South Solon", "South Vienna", + "South Webster", "Southington", "Sparta", "Spencer", "Spencerville", + "Spring Valley", "Springboro", "Springfield", "Stafford", "Sterling", + "Steubenville", "Stewart", "Stillwater", "Stockdale", "Stockport", + "Stone Creek", "Stony Ridge", "Stout", "Stoutsville", "Stow", "Strasburg", + "Stratton", "Streetsboro", "Strongsville", "Struthers", "Stryker", + "Sugar Grove", "Sugarcreek", "Sullivan", "Sulphur Springs", "Summerfield", + "Summit Station", "Summitville", "Sunbury", "Swanton", "Sycamore", + "Sycamore Valley", "Sylvania", "Syracuse", "Tallmadge", "Tarlton", + "Terrace Park", "The Plains", "Thompson", "Thornville", "Thurman", + "Thurston", "Tiffin", "Tiltonsville", "Tipp City", "Tippecanoe", "Tiro", + "Toledo", "Tontogany", "Torch", "Toronto", "Tremont City", "Trenton", + "Trimble", "Trinway", "Troy", "Tuppers Plains", "Tuscarawas", "Twinsburg", + "Uhrichsville", "Union City", "Union Furnace", "Unionport", "Uniontown", + "Unionville", "Unionville Center", "Uniopolis", "Upper Sandusky", "Urbana", + "Utica", "Valley City", "Van Buren", "Van Wert", "Vandalia", "Vanlue", + "Vaughnsville", "Venedocia", "Vermilion", "Verona", "Versailles", + "Vickery", "Vienna", "Vincent", "Vinton", "Wadsworth", "Wakefield", + "Wakeman", "Walbridge", "Waldo", "Walhonding", "Walnut Creek", "Wapakoneta", + "Warnock", "Warren", "Warsaw", "Washington Court House", + "Washingtonville", "Waterford", "Waterloo", "Watertown", "Waterville", + "Wauseon", "Waverly", "Wayland", "Wayne", "Waynesburg", "Waynesfield", + "Waynesville", "Wellington", "Wellston", "Wellsville", "West Alexandria", + "West Chester", "West Elkton", "West Farmington", "West Jefferson", + "West Lafayette", "West Liberty", "West Manchester", "West Mansfield", + "West Millgrove", "West Milton", "West Point", "West Portsmouth", + "West Rushville", "West Salem", "West Union", "West Unity", "Westerville", + "Westfield Center", "Westlake", "Weston", "Westville", "Wharton", + "Wheelersburg", "Whipple", "White Cottage", "Whitehouse", "Wickliffe", + "Wilberforce", "Wilkesville", "Willard", "Williamsburg", "Williamsfield", + "Williamsport", "Williamstown", "Williston", "Willoughby", "Willow Wood", + "Willshire", "Wilmington", "Wilmot", "Winchester", "Windham", "Windsor", + "Winesburg", "Wingett Run", "Winona", "Wolf Run", "Woodsfield", + "Woodstock", "Woodville", "Wooster", "Wren", "Xenia", "Yellow Springs", + "Yorkshire", "Yorkville", "Youngstown", "Zaleski", "Zanesfield", "Zanesville", + "Zoar" +]; \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/main.css b/plugins/Autocomplete/jquery-autocomplete/demo/main.css new file mode 100644 index 0000000000..b502a8a1af --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/main.css @@ -0,0 +1,53 @@ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0} +table{border-collapse:collapse;border-spacing:0} +fieldset,img{border:0} +address,caption,cite,code,dfn,th,var{font-style:normal;font-weight:normal} +ol,ul{list-style:none} +caption,th{text-align:left} +h1,h2,h3,h4,h5,h6{font-size:100%;font-style:normal;font-weight:normal} +q:before,q:after{content:''} +body{font:13px arial,helvetica,clean,sans-serif;font-size:small;} +select,input,textarea{font:99% arial,helvetica,clean,sans-serif} +pre,code{font:115% monospace;font-size:100%} +body * {line-height:1.22em} +body { + color: #202020; +} + +h1 { + color: #fff; + background: #06b; + padding: 10px; + font-size: 200%; +} + +h2 { + color: #000; + font-size: 150%; + padding: 10px 0; +} + +h3 { + color: #000; + font-size: 120%; + padding: 10px 0; +} + +ul { + list-style: disc inside; + margin-left: 1em; +} + +#content { + padding: 10px; +} + +label { + float: left; + width: 12em; +} +input[type=text] { width: 15em; } + +#banner { padding: 15px; background-color: #06b; color: white; font-size: large; border-bottom: 1px solid #ccc; + background: url(bg.gif) repeat-x; text-align: center } +#banner a { color: white; } \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/search.php b/plugins/Autocomplete/jquery-autocomplete/demo/search.php new file mode 100644 index 0000000000..03c0c0eab1 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/search.php @@ -0,0 +1,578 @@ +Bittern
            "=>"Botaurus stellaris", +"Little Grebe"=>"Tachybaptus ruficollis", +"Black-necked Grebe"=>"Podiceps nigricollis", +"Little Bittern"=>"Ixobrychus minutus", +"Black-crowned Night Heron"=>"Nycticorax nycticorax", +"Purple Heron"=>"Ardea purpurea", +"White Stork"=>"Ciconia ciconia", +"Spoonbill"=>"Platalea leucorodia", +"Red-crested Pochard"=>"Netta rufina", +"Common Eider"=>"Somateria mollissima", +"Red Kite"=>"Milvus milvus", +"Hen Harrier"=>"Circus cyaneus", +"Montagu`s Harrier"=>"Circus pygargus", +"Black Grouse"=>"Tetrao tetrix", +"Grey Partridge"=>"Perdix perdix", +"Spotted Crake"=>"Porzana porzana", +"Corncrake"=>"Crex crex", +"Common Crane"=>"Grus grus", +"Avocet"=>"Recurvirostra avosetta", +"Stone Curlew"=>"Burhinus oedicnemus", +"Common Ringed Plover"=>"Charadrius hiaticula", +"Kentish Plover"=>"Charadrius alexandrinus", +"Ruff"=>"Philomachus pugnax", +"Common Snipe"=>"Gallinago gallinago", +"Black-tailed Godwit"=>"Limosa limosa", +"Common Redshank"=>"Tringa totanus", +"Sandwich Tern"=>"Sterna sandvicensis", +"Common Tern"=>"Sterna hirundo", +"Arctic Tern"=>"Sterna paradisaea", +"Little Tern"=>"Sternula albifrons", +"Black Tern"=>"Chlidonias niger", +"Barn Owl"=>"Tyto alba", +"Little Owl"=>"Athene noctua", +"Short-eared Owl"=>"Asio flammeus", +"European Nightjar"=>"Caprimulgus europaeus", +"Common Kingfisher"=>"Alcedo atthis", +"Eurasian Hoopoe"=>"Upupa epops", +"Eurasian Wryneck"=>"Jynx torquilla", +"European Green Woodpecker"=>"Picus viridis", +"Crested Lark"=>"Galerida cristata", +"White-headed Duck"=>"Oxyura leucocephala", +"Pale-bellied Brent Goose"=>"Branta hrota", +"Tawny Pipit"=>"Anthus campestris", +"Whinchat"=>"Saxicola rubetra", +"European Stonechat"=>"Saxicola rubicola", +"Northern Wheatear"=>"Oenanthe oenanthe", +"Savi`s Warbler"=>"Locustella luscinioides", +"Sedge Warbler"=>"Acrocephalus schoenobaenus", +"Great Reed Warbler"=>"Acrocephalus arundinaceus", +"Bearded Reedling"=>"Panurus biarmicus", +"Red-backed Shrike"=>"Lanius collurio", +"Great Grey Shrike"=>"Lanius excubitor", +"Woodchat Shrike"=>"Lanius senator", +"Common Raven"=>"Corvus corax", +"Yellowhammer"=>"Emberiza citrinella", +"Ortolan Bunting"=>"Emberiza hortulana", +"Corn Bunting"=>"Emberiza calandra", +"Great Cormorant"=>"Phalacrocorax carbo", +"Hawfinch"=>"Coccothraustes coccothraustes", +"Common Shelduck"=>"Tadorna tadorna", +"Bluethroat"=>"Luscinia svecica", +"Grey Heron"=>"Ardea cinerea", +"Barn Swallow"=>"Hirundo rustica", +"Hooded Crow"=>"Corvus cornix", +"Dunlin"=>"Calidris alpina", +"Eurasian Pied Flycatcher"=>"Ficedula hypoleuca", +"Eurasian Nuthatch"=>"Sitta europaea", +"Short-toed Tree Creeper"=>"Certhia brachydactyla", +"Wood Lark"=>"Lullula arborea", +"Tree Pipit"=>"Anthus trivialis", +"Eurasian Hobby"=>"Falco subbuteo", +"Marsh Warbler"=>"Acrocephalus palustris", +"Wood Sandpiper"=>"Tringa glareola", +"Tawny Owl"=>"Strix aluco", +"Lesser Whitethroat"=>"Sylvia curruca", +"Barnacle Goose"=>"Branta leucopsis", +"Common Goldeneye"=>"Bucephala clangula", +"Western Marsh Harrier"=>"Circus aeruginosus", +"Common Buzzard"=>"Buteo buteo", +"Sanderling"=>"Calidris alba", +"Little Gull"=>"Larus minutus", +"Eurasian Magpie"=>"Pica pica", +"Willow Warbler"=>"Phylloscopus trochilus", +"Wood Warbler"=>"Phylloscopus sibilatrix", +"Great Crested Grebe"=>"Podiceps cristatus", +"Eurasian Jay"=>"Garrulus glandarius", +"Common Redstart"=>"Phoenicurus phoenicurus", +"Blue-headed Wagtail"=>"Motacilla flava", +"Common Swift"=>"Apus apus", +"Marsh Tit"=>"Poecile palustris", +"Goldcrest"=>"Regulus regulus", +"European Golden Plover"=>"Pluvialis apricaria", +"Eurasian Bullfinch"=>"Pyrrhula pyrrhula", +"Common Whitethroat"=>"Sylvia communis", +"Meadow Pipit"=>"Anthus pratensis", +"Greylag Goose"=>"Anser anser", +"Spotted Flycatcher"=>"Muscicapa striata", +"European Greenfinch"=>"Carduelis chloris", +"Common Greenshank"=>"Tringa nebularia", +"Great Spotted Woodpecker"=>"Dendrocopos major", +"Greater Canada Goose"=>"Branta canadensis", +"Mistle Thrush"=>"Turdus viscivorus", +"Great Black-backed Gull"=>"Larus marinus", +"Goosander"=>"Mergus merganser", +"Great Egret"=>"Casmerodius albus", +"Northern Goshawk"=>"Accipiter gentilis", +"Dunnock"=>"Prunella modularis", +"Stock Dove"=>"Columba oenas", +"Common Wood Pigeon"=>"Columba palumbus", +"Eurasian Woodcock"=>"Scolopax rusticola", +"House Sparrow"=>"Passer domesticus", +"Common House Martin"=>"Delichon urbicum", +"Red Knot"=>"Calidris canutus", +"Western Jackdaw"=>"Corvus monedula", +"Brambling"=>"Fringilla montifringilla", +"Northern Lapwing"=>"Vanellus vanellus", +"European Reed Warbler"=>"Acrocephalus scirpaceus", +"Lesser Black-backed Gull"=>"Larus fuscus", +"Little Egret"=>"Egretta garzetta", +"Little Stint"=>"Calidris minuta", +"Common Linnet"=>"Carduelis cannabina", +"Mute Swan"=>"Cygnus olor", +"Common Cuckoo"=>"Cuculus canorus", +"Black-headed Gull"=>"Larus ridibundus", +"Greater White-fronted Goose"=>"Anser albifrons", +"Great Tit"=>"Parus major", +"Redwing"=>"Turdus iliacus", +"Gadwall"=>"Anas strepera", +"Fieldfare"=>"Turdus pilaris", +"Tufted Duck"=>"Aythya fuligula", +"Crested Tit"=>"Lophophanes cristatus", +"Willow Tit"=>"Poecile montanus", +"Eurasian Coot"=>"Fulica atra", +"Common Blackbird"=>"Turdus merula", +"Smew"=>"Mergus albellus", +"Common Sandpiper"=>"Actitis hypoleucos", +"Sand Martin"=>"Riparia riparia", +"Purple Sandpiper"=>"Calidris maritima", +"Northern Pintail"=>"Anas acuta", +"Blue Tit"=>"Cyanistes caeruleus", +"European Goldfinch"=>"Carduelis carduelis", +"Eurasian Whimbrel"=>"Numenius phaeopus", +"Common Reed Bunting"=>"Emberiza schoeniclus", +"Eurasian Tree Sparrow"=>"Passer montanus", +"Rook"=>"Corvus frugilegus", +"European Robin"=>"Erithacus rubecula", +"Bar-tailed Godwit"=>"Limosa lapponica", +"Dark-bellied Brent Goose"=>"Branta bernicla", +"Eurasian Oystercatcher"=>"Haematopus ostralegus", +"Eurasian Siskin"=>"Carduelis spinus", +"Northern Shoveler"=>"Anas clypeata", +"Eurasian Wigeon"=>"Anas penelope", +"Eurasian Sparrow Hawk"=>"Accipiter nisus", +"Icterine Warbler"=>"Hippolais icterina", +"Common Starling"=>"Sturnus vulgaris", +"Long-tailed Tit"=>"Aegithalos caudatus", +"Ruddy Turnstone"=>"Arenaria interpres", +"Mew Gull"=>"Larus canus", +"Common Pochard"=>"Aythya ferina", +"Common Chiffchaff"=>"Phylloscopus collybita", +"Greater Scaup"=>"Aythya marila", +"Common Kestrel"=>"Falco tinnunculus", +"Garden Warbler"=>"Sylvia borin", +"Eurasian Collared Dove"=>"Streptopelia decaocto", +"Eurasian Skylark"=>"Alauda arvensis", +"Common Chaffinch"=>"Fringilla coelebs", +"Common Moorhen"=>"Gallinula chloropus", +"Water Pipit"=>"Anthus spinoletta", +"Mallard"=>"Anas platyrhynchos", +"Winter Wren"=>"Troglodytes troglodytes", +"Common Teal"=>"Anas crecca", +"Green Sandpiper"=>"Tringa ochropus", +"White Wagtail"=>"Motacilla alba", +"Eurasian Curlew"=>"Numenius arquata", +"Song Thrush"=>"Turdus philomelos", +"European Herring Gull"=>"Larus argentatus", +"Grey Plover"=>"Pluvialis squatarola", +"Carrion Crow"=>"Corvus corone", +"Coal Tit"=>"Periparus ater", +"Spotted Redshank"=>"Tringa erythropus", +"Blackcap"=>"Sylvia atricapilla", +"Egyptian Vulture"=>"Neophron percnopterus", +"Razorbill"=>"Alca torda", +"Alpine Swift"=>"Apus melba", +"Long-legged Buzzard"=>"Buteo rufinus", +"Audouin`s Gull"=>"Larus audouinii", +"Balearic Shearwater"=>"Puffinus mauretanicus", +"Upland Sandpiper"=>"Bartramia longicauda", +"Greater Spotted Eagle"=>"Aquila clanga", +"Ring Ouzel"=>"Turdus torquatus", +"Yellow-browed Warbler"=>"Phylloscopus inornatus", +"Blue Rock Thrush"=>"Monticola solitarius", +"Buff-breasted Sandpiper"=>"Tryngites subruficollis", +"Jack Snipe"=>"Lymnocryptes minimus", +"White-rumped Sandpiper"=>"Calidris fuscicollis", +"Ruddy Shelduck"=>"Tadorna ferruginea", +"Cetti's Warbler"=>"Cettia cetti", +"Citrine Wagtail"=>"Motacilla citreola", +"Roseate Tern"=>"Sterna dougallii", +"Black-legged Kittiwake"=>"Rissa tridactyla", +"Pygmy Cormorant"=>"Phalacrocorax pygmeus", +"Booted Eagle"=>"Aquila pennata", +"Lesser White-fronted Goose"=>"Anser erythropus", +"Little Bunting"=>"Emberiza pusilla", +"Eleonora's Falcon"=>"Falco eleonorae", +"European Serin"=>"Serinus serinus", +"Twite"=>"Carduelis flavirostris", +"Yellow-legged Gull"=>"Larus michahellis", +"Gyr Falcon"=>"Falco rusticolus", +"Greenish Warbler"=>"Phylloscopus trochiloides", +"Red-necked Phalarope"=>"Phalaropus lobatus", +"Mealy Redpoll"=>"Carduelis flammea", +"Glaucous Gull"=>"Larus hyperboreus", +"Great Skua"=>"Stercorarius skua", +"Great Bustard"=>"Otis tarda", +"Velvet Scoter"=>"Melanitta fusca", +"Pine Grosbeak"=>"Pinicola enucleator", +"House Crow"=>"Corvus splendens", +"Hume`s Leaf Warbler"=>"Phylloscopus humei", +"Great Northern Loon"=>"Gavia immer", +"Long-tailed Duck"=>"Clangula hyemalis", +"Lapland Longspur"=>"Calcarius lapponicus", +"Northern Gannet"=>"Morus bassanus", +"Eastern Imperial Eagle"=>"Aquila heliaca", +"Little Auk"=>"Alle alle", +"Lesser Spotted Woodpecker"=>"Dendrocopos minor", +"Iceland Gull"=>"Larus glaucoides", +"Parasitic Jaeger"=>"Stercorarius parasiticus", +"Bewick`s Swan"=>"Cygnus bewickii", +"Little Bustard"=>"Tetrax tetrax", +"Little Crake"=>"Porzana parva", +"Baillon`s Crake"=>"Porzana pusilla", +"Long-tailed Jaeger"=>"Stercorarius longicaudus", +"King Eider"=>"Somateria spectabilis", +"Greater Short-toed Lark"=>"Calandrella brachydactyla", +"Houbara Bustard"=>"Chlamydotis undulata", +"Curlew Sandpiper"=>"Calidris ferruginea", +"Common Crossbill"=>"Loxia curvirostra", +"European Shag"=>"Phalacrocorax aristotelis", +"Horned Grebe"=>"Podiceps auritus", +"Common Quail"=>"Coturnix coturnix", +"Bearded Vulture"=>"Gypaetus barbatus", +"Lanner Falcon"=>"Falco biarmicus", +"Middle Spotted Woodpecker"=>"Dendrocopos medius", +"Pomarine Jaeger"=>"Stercorarius pomarinus", +"Red-breasted Merganser"=>"Mergus serrator", +"Eurasian Black Vulture"=>"Aegypius monachus", +"Eurasian Dotterel"=>"Charadrius morinellus", +"Common Nightingale"=>"Luscinia megarhynchos", +"Northern willow warbler"=>"Phylloscopus trochilus acredula", +"Manx Shearwater"=>"Puffinus puffinus", +"Northern Fulmar"=>"Fulmarus glacialis", +"Eurasian Eagle Owl"=>"Bubo bubo", +"Orphean Warbler"=>"Sylvia hortensis", +"Melodious Warbler"=>"Hippolais polyglotta", +"Pallas's Leaf Warbler"=>"Phylloscopus proregulus", +"Atlantic Puffin"=>"Fratercula arctica", +"Black-throated Loon"=>"Gavia arctica", +"Bohemian Waxwing"=>"Bombycilla garrulus", +"Marsh Sandpiper"=>"Tringa stagnatilis", +"Great Snipe"=>"Gallinago media", +"Squacco Heron"=>"Ardeola ralloides", +"Long-eared Owl"=>"Asio otus", +"Caspian Tern"=>"Hydroprogne caspia", +"Red-breasted Goose"=>"Branta ruficollis", +"Red-throated Loon"=>"Gavia stellata", +"Common Rosefinch"=>"Carpodacus erythrinus", +"Red-footed Falcon"=>"Falco vespertinus", +"Ross's Goose"=>"Anser rossii", +"Red Phalarope"=>"Phalaropus fulicarius", +"Pied Wagtail"=>"Motacilla yarrellii", +"Rose-coloured Starling"=>"Sturnus roseus", +"Rough-legged Buzzard"=>"Buteo lagopus", +"Saker Falcon"=>"Falco cherrug", +"European Roller"=>"Coracias garrulus", +"Short-toed Eagle"=>"Circaetus gallicus", +"Peregrine Falcon"=>"Falco peregrinus", +"Merlin"=>"Falco columbarius", +"Snow Goose"=>"Anser caerulescens", +"Snowy Owl"=>"Bubo scandiacus", +"Snow Bunting"=>"Plectrophenax nivalis", +"Common Grasshopper Warbler"=>"Locustella naevia", +"Golden Eagle"=>"Aquila chrysaetos", +"Black-winged Stilt"=>"Himantopus himantopus", +"Steppe Eagle"=>"Aquila nipalensis", +"Pallid Harrier"=>"Circus macrourus", +"European Storm-petrel"=>"Hydrobates pelagicus", +"Horned Lark"=>"Eremophila alpestris", +"Eurasian Treecreeper"=>"Certhia familiaris", +"Taiga Bean Goose"=>"Anser fabalis", +"Temminck`s Stint"=>"Calidris temminckii", +"Terek Sandpiper"=>"Xenus cinereus", +"Tundra Bean Goose"=>"Anser serrirostris", +"European Turtle Dove"=>"Streptopelia turtur", +"Leach`s Storm-petrel"=>"Oceanodroma leucorhoa", +"Eurasian Griffon Vulture"=>"Gyps fulvus", +"Paddyfield Warbler"=>"Acrocephalus agricola", +"Osprey"=>"Pandion haliaetus", +"Firecrest"=>"Regulus ignicapilla", +"Water Rail"=>"Rallus aquaticus", +"European Honey Buzzard"=>"Pernis apivorus", +"Eurasian Golden Oriole"=>"Oriolus oriolus", +"Whooper Swan"=>"Cygnus cygnus", +"Two-barred Crossbill"=>"Loxia leucoptera", +"White-tailed Eagle"=>"Haliaeetus albicilla", +"Atlantic Murre"=>"Uria aalge", +"Garganey"=>"Anas querquedula", +"Black Redstart"=>"Phoenicurus ochruros", +"Common Scoter"=>"Melanitta nigra", +"Rock Pipit"=>"Anthus petrosus", +"Lesser Spotted Eagle"=>"Aquila pomarina", +"Cattle Egret"=>"Bubulcus ibis", +"White-winged Black Tern"=>"Chlidonias leucopterus", +"Black Stork"=>"Ciconia nigra", +"Mediterranean Gull"=>"Larus melanocephalus", +"Black Kite"=>"Milvus migrans", +"Yellow Wagtail"=>"Motacilla flavissima", +"Red-necked Grebe"=>"Podiceps grisegena", +"Gull-billed Tern"=>"Gelochelidon nilotica", +"Pectoral Sandpiper"=>"Calidris melanotos", +"Barred Warbler"=>"Sylvia nisoria", +"Red-throated Pipit"=>"Anthus cervinus", +"Grey Wagtail"=>"Motacilla cinerea", +"Richard`s Pipit"=>"Anthus richardi", +"Black Woodpecker"=>"Dryocopus martius", +"Little Ringed Plover"=>"Charadrius dubius", +"Whiskered Tern"=>"Chlidonias hybrida", +"Lesser Redpoll"=>"Carduelis cabaret", +"Pallas' Bunting"=>"Emberiza pallasi", +"Ferruginous Duck"=>"Aythya nyroca", +"Whistling Swan"=>"Cygnus columbianus", +"Black Brant"=>"Branta nigricans", +"Marbled Teal"=>"Marmaronetta angustirostris", +"Canvasback"=>"Aythya valisineria", +"Redhead"=>"Aythya americana", +"Lesser Scaup"=>"Aythya affinis", +"Steller`s Eider"=>"Polysticta stelleri", +"Spectacled Eider"=>"Somateria fischeri", +"Harlequin Duck"=>"Histronicus histrionicus", +"Black Scoter"=>"Melanitta americana", +"Surf Scoter"=>"Melanitta perspicillata", +"Barrow`s Goldeneye"=>"Bucephala islandica", +"Falcated Duck"=>"Anas falcata", +"American Wigeon"=>"Anas americana", +"Blue-winged Teal"=>"Anas discors", +"American Black Duck"=>"Anas rubripes", +"Baikal Teal"=>"Anas formosa", +"Green-Winged Teal"=>"Anas carolinensis", +"Hazel Grouse"=>"Bonasa bonasia", +"Rock Partridge"=>"Alectoris graeca", +"Red-legged Partridge"=>"Alectoris rufa", +"Yellow-billed Loon"=>"Gavia adamsii", +"Cory`s Shearwater"=>"Calonectris borealis", +"Madeiran Storm-Petrel"=>"Oceanodroma castro", +"Great White Pelican"=>"Pelecanus onocrotalus", +"Dalmatian Pelican"=>"Pelecanus crispus", +"American Bittern"=>"Botaurus lentiginosus", +"Glossy Ibis"=>"Plegadis falcinellus", +"Spanish Imperial Eagle"=>"Aquila adalberti", +"Lesser Kestrel"=>"Falco naumanni", +"Houbara Bustard"=>"Chlamydotis undulata", +"Crab-Plover"=>"Dromas ardeola", +"Cream-coloured Courser"=>"Cursorius cursor", +"Collared Pratincole"=>"Glareola pratincola", +"Black-winged Pratincole"=>"Glareola nordmanni", +"Killdeer"=>"Charadrius vociferus", +"Lesser Sand Plover"=>"Charadrius mongolus", +"Greater Sand Plover"=>"Charadrius leschenaultii", +"Caspian Plover"=>"Charadrius asiaticus", +"American Golden Plover"=>"Pluvialis dominica", +"Pacific Golden Plover"=>"Pluvialis fulva", +"Sharp-tailed Sandpiper"=>"Calidris acuminata", +"Broad-billed Sandpiper"=>"Limicola falcinellus", +"Spoon-Billed Sandpiper"=>"Eurynorhynchus pygmaeus", +"Short-Billed Dowitcher"=>"Limnodromus griseus", +"Long-billed Dowitcher"=>"Limnodromus scolopaceus", +"Hudsonian Godwit"=>"Limosa haemastica", +"Little Curlew"=>"Numenius minutus", +"Lesser Yellowlegs"=>"Tringa flavipes", +"Wilson`s Phalarope"=>"Phalaropus tricolor", +"Pallas`s Gull"=>"Larus ichthyaetus", +"Laughing Gull"=>"Larus atricilla", +"Franklin`s Gull"=>"Larus pipixcan", +"Bonaparte`s Gull"=>"Larus philadelphia", +"Ring-billed Gull"=>"Larus delawarensis", +"American Herring Gull"=>"Larus smithsonianus", +"Caspian Gull"=>"Larus cachinnans", +"Ivory Gull"=>"Pagophila eburnea", +"Royal Tern"=>"Sterna maxima", +"Brünnich`s Murre"=>"Uria lomvia", +"Crested Auklet"=>"Aethia cristatella", +"Parakeet Auklet"=>"Cyclorrhynchus psittacula", +"Tufted Puffin"=>"Lunda cirrhata", +"Laughing Dove"=>"Streptopelia senegalensis", +"Great Spotted Cuckoo"=>"Clamator glandarius", +"Great Grey Owl"=>"Strix nebulosa", +"Tengmalm`s Owl"=>"Aegolius funereus", +"Red-Necked Nightjar"=>"Caprimulgus ruficollis", +"Chimney Swift"=>"Chaetura pelagica", +"Green Bea-Eater"=>"Merops orientalis", +"Grey-headed Woodpecker"=>"Picus canus", +"Lesser Short-Toed Lark"=>"Calandrella rufescens", +"Eurasian Crag Martin"=>"Hirundo rupestris", +"Red-rumped Swallow"=>"Cecropis daurica", +"Blyth`s Pipit"=>"Anthus godlewskii", +"Pechora Pipit"=>"Anthus gustavi", +"Grey-headed Wagtail"=>"Motacilla thunbergi", +"Yellow-Headed Wagtail"=>"Motacilla lutea", +"White-throated Dipper"=>"Cinclus cinclus", +"Rufous-Tailed Scrub Robin"=>"Cercotrichas galactotes", +"Thrush Nightingale"=>"Luscinia luscinia", +"White-throated Robin"=>"Irania gutturalis", +"Caspian Stonechat"=>"Saxicola maura variegata", +"Western Black-eared Wheatear"=>"Oenanthe hispanica", +"Rufous-tailed Rock Thrush"=>"Monticola saxatilis", +"Red-throated Thrush/Black-throated"=>"Turdus ruficollis", +"American Robin"=>"Turdus migratorius", +"Zitting Cisticola"=>"Cisticola juncidis", +"Lanceolated Warbler"=>"Locustella lanceolata", +"River Warbler"=>"Locustella fluviatilis", +"Blyth`s Reed Warbler"=>"Acrocephalus dumetorum", +"Caspian Reed Warbler"=>"Acrocephalus fuscus", +"Aquatic Warbler"=>"Acrocephalus paludicola", +"Booted Warbler"=>"Acrocephalus caligatus", +"Marmora's Warbler"=>"Sylvia sarda", +"Dartford Warbler"=>"Sylvia undata", +"Subalpine Warbler"=>"Sylvia cantillans", +"Ménétries's Warbler"=>"Sylvia mystacea", +"Rüppel's Warbler"=>"Sylvia rueppelli", +"Asian Desert Warbler"=>"Sylvia nana", +"Western Orphean Warbler"=>"Sylvia hortensis hortensis", +"Arctic Warbler"=>"Phylloscopus borealis", +"Radde`s Warbler"=>"Phylloscopus schwarzi", +"Western Bonelli`s Warbler"=>"Phylloscopus bonelli", +"Red-breasted Flycatcher"=>"Ficedula parva", +"Eurasian Penduline Tit"=>"Remiz pendulinus", +"Daurian Shrike"=>"Lanius isabellinus", +"Long-Tailed Shrike"=>"Lanius schach", +"Lesser Grey Shrike"=>"Lanius minor", +"Southern Grey Shrike"=>"Lanius meridionalis", +"Masked Shrike"=>"Lanius nubicus", +"Spotted Nutcracker"=>"Nucifraga caryocatactes", +"Daurian Jackdaw"=>"Corvus dauuricus", +"Purple-Backed Starling"=>"Sturnus sturninus", +"Red-Fronted Serin"=>"Serinus pusillus", +"Arctic Redpoll"=>"Carduelis hornemanni", +"Scottish Crossbill"=>"Loxia scotica", +"Parrot Crossbill"=>"Loxia pytyopsittacus", +"Black-faced Bunting"=>"Emberiza spodocephala", +"Pink-footed Goose"=>"Anser brachyrhynchus", +"Black-winged Kite"=>"Elanus caeruleus", +"European Bee-eater"=>"Merops apiaster", +"Sabine`s Gull"=>"Larus sabini", +"Sooty Shearwater"=>"Puffinus griseus", +"Lesser Canada Goose"=>"Branta hutchinsii", +"Ring-necked Duck"=>"Aythya collaris", +"Greater Flamingo"=>"Phoenicopterus roseus", +"Iberian Chiffchaff"=>"Phylloscopus ibericus", +"Ashy-headed Wagtail"=>"Motacilla cinereocapilla", +"Stilt Sandpiper"=>"Calidris himantopus", +"Siberian Stonechat"=>"Saxicola maurus", +"Greater Yellowlegs"=>"Tringa melanoleuca", +"Forster`s Tern"=>"Sterna forsteri", +"Dusky Warbler"=>"Phylloscopus fuscatus", +"Cirl Bunting"=>"Emberiza cirlus", +"Olive-backed Pipit"=>"Anthus hodgsoni", +"Sociable Lapwing"=>"Vanellus gregarius", +"Spotted Sandpiper"=>"Actitis macularius", +"Baird`s Sandpiper"=>"Calidris bairdii", +"Rustic Bunting"=>"Emberiza rustica", +"Yellow-browed Bunting"=>"Emberiza chrysophrys", +"Great Shearwater"=>"Puffinus gravis", +"Bonelli`s Eagle"=>"Aquila fasciata", +"Calandra Lark"=>"Melanocorypha calandra", +"Sardinian Warbler"=>"Sylvia melanocephala", +"Ross's Gull"=>"Larus roseus", +"Yellow-Breasted Bunting"=>"Emberiza aureola", +"Pine Bunting"=>"Emberiza leucocephalos", +"Black Guillemot"=>"Cepphus grylle", +"Pied-billed Grebe"=>"Podilymbus podiceps", +"Soft-plumaged Petrel"=>"Pterodroma mollis", +"Bulwer's Petrel"=>"Bulweria bulwerii", +"White-Faced Storm-Petrel"=>"Pelagodroma marina", +"Pallas’s Fish Eagle"=>"Haliaeetus leucoryphus", +"Sandhill Crane"=>"Grus canadensis", +"Macqueen’s Bustard"=>"Chlamydotis macqueenii", +"White-tailed Lapwing"=>"Vanellus leucurus", +"Great Knot"=>"Calidris tenuirostris", +"Semipalmated Sandpiper"=>"Calidris pusilla", +"Red-necked Stint"=>"Calidris ruficollis", +"Slender-billed Curlew"=>"Numenius tenuirostris", +"Bridled Tern"=>"Onychoprion anaethetus", +"Pallas’s Sandgrouse"=>"Syrrhaptes paradoxus", +"European Scops Owl"=>"Otus scops", +"Northern Hawk Owl"=>"Surnia ulula", +"White-Throated Needletail"=>"Hirundapus caudacutus", +"Belted Kingfisher"=>"Ceryle alcyon", +"Blue-cheeked Bee-eater"=>"Merops persicus", +"Black-headed Wagtail"=>"Motacilla feldegg", +"Northern Mockingbird"=>"Mimus polyglottos", +"Alpine Accentor"=>"Prunella collaris", +"Red-flanked Bluetail"=>"Tarsiger cyanurus", +"Isabelline Wheatear"=>"Oenanthe isabellina", +"Pied Wheatear"=>"Oenanthe pleschanka", +"Eastern Black-eared Wheatear"=>"Oenanthe melanoleuca", +"Desert Wheatear"=>"Oenanthe deserti", +"White`s Thrush"=>"Zoothera aurea", +"Siberian Thrush"=>"Zoothera sibirica", +"Eyebrowed Thrush"=>"Turdus obscurus", +"Dusky Thrush"=>"Turdus eunomus", +"Black-throated Thrush"=>"Turdus atrogularis", +"Pallas`s Grasshopper Warbler"=>"Locustella certhiola", +"Spectacled Warbler"=>"Sylvia conspicillata", +"Two-barred Warbler"=>"Phylloscopus plumbeitarsus", +"Eastern Bonelli’s Warbler"=>"Phylloscopus orientalis", +"Collared Flycatcher"=>"Ficedula albicollis", +"Wallcreeper"=>"Tichodroma muraria", +"Turkestan Shrike"=>"Lanius phoenicuroides", +"Steppe Grey Shrike"=>"Lanius pallidirostris", +"Spanish Sparrow"=>"Passer hispaniolensis", +"Red-eyed Vireo"=>"Vireo olivaceus", +"Myrtle Warbler"=>"Dendroica coronata", +"White-crowned Sparrow"=>"Zonotrichia leucophrys", +"White-throated Sparrow"=>"Zonotrichia albicollis", +"Cretzschmar`s Bunting"=>"Emberiza caesia", +"Chestnut Bunting"=>"Emberiza rutila", +"Red-headed Bunting"=>"Emberiza bruniceps", +"Black-headed Bunting"=>"Emberiza melanocephala", +"Indigo Bunting"=>"Passerina cyanea", +"Balearic Woodchat Shrike"=>"Lanius senator badius", +"Demoiselle Crane"=>"Grus virgo", +"Chough"=>"Pyrrhocorax pyrrhocorax", +"Red-Billed Chough"=>"Pyrrhocorax graculus", +"Elegant Tern"=>"Sterna elegans", +"Chukar"=>"Alectoris chukar", +"Yellow-Billed Cuckoo"=>"Coccyzus americanus", +"American Sandwich Tern"=>"Sterna sandvicensis acuflavida", +"Olive-Tree Warbler"=>"Hippolais olivetorum", +"Eastern Olivaceous Warbler"=>"Acrocephalus pallidus", +"Indian Cormorant"=>"Phalacrocorax fuscicollis", +"Spur-Winged Lapwing"=>"Vanellus spinosus", +"Yelkouan Shearwater"=>"Puffinus yelkouan", +"Trumpeter Finch"=>"Bucanetes githagineus", +"Red Grouse"=>"Lagopus scoticus", +"Rock Ptarmigan"=>"Lagopus mutus", +"Long-Tailed Cormorant"=>"Phalacrocorax africanus", +"Double-crested Cormorant"=>"Phalacrocorax auritus", +"Magnificent Frigatebird"=>"Fregata magnificens", +"Naumann's Thrush"=>"Turdus naumanni", +"Oriental Pratincole"=>"Glareola maldivarum", +"Bufflehead"=>"Bucephala albeola", +"Snowfinch"=>"Montifrigilla nivalis", +"Ural owl"=>"Strix uralensis", +"Spanish Wagtail"=>"Motacilla iberiae", +"Song Sparrow"=>"Melospiza melodia", +"Rock Bunting"=>"Emberiza cia", +"Siberian Rubythroat"=>"Luscinia calliope", +"Pallid Swift"=>"Apus pallidus", +"Eurasian Pygmy Owl"=>"Glaucidium passerinum", +"Madeira Little Shearwater"=>"Puffinus baroli", +"House Finch"=>"Carpodacus mexicanus", +"Green Heron"=>"Butorides virescens", +"Solitary Sandpiper"=>"Tringa solitaria", +"Heuglin's Gull"=>"Larus heuglini" +); + +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + echo "$key|$value\n"; + } +} + +?> \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/demo/search.phps b/plugins/Autocomplete/jquery-autocomplete/demo/search.phps new file mode 100644 index 0000000000..03c0c0eab1 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/demo/search.phps @@ -0,0 +1,578 @@ +Bittern"=>"Botaurus stellaris", +"Little Grebe"=>"Tachybaptus ruficollis", +"Black-necked Grebe"=>"Podiceps nigricollis", +"Little Bittern"=>"Ixobrychus minutus", +"Black-crowned Night Heron"=>"Nycticorax nycticorax", +"Purple Heron"=>"Ardea purpurea", +"White Stork"=>"Ciconia ciconia", +"Spoonbill"=>"Platalea leucorodia", +"Red-crested Pochard"=>"Netta rufina", +"Common Eider"=>"Somateria mollissima", +"Red Kite"=>"Milvus milvus", +"Hen Harrier"=>"Circus cyaneus", +"Montagu`s Harrier"=>"Circus pygargus", +"Black Grouse"=>"Tetrao tetrix", +"Grey Partridge"=>"Perdix perdix", +"Spotted Crake"=>"Porzana porzana", +"Corncrake"=>"Crex crex", +"Common Crane"=>"Grus grus", +"Avocet"=>"Recurvirostra avosetta", +"Stone Curlew"=>"Burhinus oedicnemus", +"Common Ringed Plover"=>"Charadrius hiaticula", +"Kentish Plover"=>"Charadrius alexandrinus", +"Ruff"=>"Philomachus pugnax", +"Common Snipe"=>"Gallinago gallinago", +"Black-tailed Godwit"=>"Limosa limosa", +"Common Redshank"=>"Tringa totanus", +"Sandwich Tern"=>"Sterna sandvicensis", +"Common Tern"=>"Sterna hirundo", +"Arctic Tern"=>"Sterna paradisaea", +"Little Tern"=>"Sternula albifrons", +"Black Tern"=>"Chlidonias niger", +"Barn Owl"=>"Tyto alba", +"Little Owl"=>"Athene noctua", +"Short-eared Owl"=>"Asio flammeus", +"European Nightjar"=>"Caprimulgus europaeus", +"Common Kingfisher"=>"Alcedo atthis", +"Eurasian Hoopoe"=>"Upupa epops", +"Eurasian Wryneck"=>"Jynx torquilla", +"European Green Woodpecker"=>"Picus viridis", +"Crested Lark"=>"Galerida cristata", +"White-headed Duck"=>"Oxyura leucocephala", +"Pale-bellied Brent Goose"=>"Branta hrota", +"Tawny Pipit"=>"Anthus campestris", +"Whinchat"=>"Saxicola rubetra", +"European Stonechat"=>"Saxicola rubicola", +"Northern Wheatear"=>"Oenanthe oenanthe", +"Savi`s Warbler"=>"Locustella luscinioides", +"Sedge Warbler"=>"Acrocephalus schoenobaenus", +"Great Reed Warbler"=>"Acrocephalus arundinaceus", +"Bearded Reedling"=>"Panurus biarmicus", +"Red-backed Shrike"=>"Lanius collurio", +"Great Grey Shrike"=>"Lanius excubitor", +"Woodchat Shrike"=>"Lanius senator", +"Common Raven"=>"Corvus corax", +"Yellowhammer"=>"Emberiza citrinella", +"Ortolan Bunting"=>"Emberiza hortulana", +"Corn Bunting"=>"Emberiza calandra", +"Great Cormorant"=>"Phalacrocorax carbo", +"Hawfinch"=>"Coccothraustes coccothraustes", +"Common Shelduck"=>"Tadorna tadorna", +"Bluethroat"=>"Luscinia svecica", +"Grey Heron"=>"Ardea cinerea", +"Barn Swallow"=>"Hirundo rustica", +"Hooded Crow"=>"Corvus cornix", +"Dunlin"=>"Calidris alpina", +"Eurasian Pied Flycatcher"=>"Ficedula hypoleuca", +"Eurasian Nuthatch"=>"Sitta europaea", +"Short-toed Tree Creeper"=>"Certhia brachydactyla", +"Wood Lark"=>"Lullula arborea", +"Tree Pipit"=>"Anthus trivialis", +"Eurasian Hobby"=>"Falco subbuteo", +"Marsh Warbler"=>"Acrocephalus palustris", +"Wood Sandpiper"=>"Tringa glareola", +"Tawny Owl"=>"Strix aluco", +"Lesser Whitethroat"=>"Sylvia curruca", +"Barnacle Goose"=>"Branta leucopsis", +"Common Goldeneye"=>"Bucephala clangula", +"Western Marsh Harrier"=>"Circus aeruginosus", +"Common Buzzard"=>"Buteo buteo", +"Sanderling"=>"Calidris alba", +"Little Gull"=>"Larus minutus", +"Eurasian Magpie"=>"Pica pica", +"Willow Warbler"=>"Phylloscopus trochilus", +"Wood Warbler"=>"Phylloscopus sibilatrix", +"Great Crested Grebe"=>"Podiceps cristatus", +"Eurasian Jay"=>"Garrulus glandarius", +"Common Redstart"=>"Phoenicurus phoenicurus", +"Blue-headed Wagtail"=>"Motacilla flava", +"Common Swift"=>"Apus apus", +"Marsh Tit"=>"Poecile palustris", +"Goldcrest"=>"Regulus regulus", +"European Golden Plover"=>"Pluvialis apricaria", +"Eurasian Bullfinch"=>"Pyrrhula pyrrhula", +"Common Whitethroat"=>"Sylvia communis", +"Meadow Pipit"=>"Anthus pratensis", +"Greylag Goose"=>"Anser anser", +"Spotted Flycatcher"=>"Muscicapa striata", +"European Greenfinch"=>"Carduelis chloris", +"Common Greenshank"=>"Tringa nebularia", +"Great Spotted Woodpecker"=>"Dendrocopos major", +"Greater Canada Goose"=>"Branta canadensis", +"Mistle Thrush"=>"Turdus viscivorus", +"Great Black-backed Gull"=>"Larus marinus", +"Goosander"=>"Mergus merganser", +"Great Egret"=>"Casmerodius albus", +"Northern Goshawk"=>"Accipiter gentilis", +"Dunnock"=>"Prunella modularis", +"Stock Dove"=>"Columba oenas", +"Common Wood Pigeon"=>"Columba palumbus", +"Eurasian Woodcock"=>"Scolopax rusticola", +"House Sparrow"=>"Passer domesticus", +"Common House Martin"=>"Delichon urbicum", +"Red Knot"=>"Calidris canutus", +"Western Jackdaw"=>"Corvus monedula", +"Brambling"=>"Fringilla montifringilla", +"Northern Lapwing"=>"Vanellus vanellus", +"European Reed Warbler"=>"Acrocephalus scirpaceus", +"Lesser Black-backed Gull"=>"Larus fuscus", +"Little Egret"=>"Egretta garzetta", +"Little Stint"=>"Calidris minuta", +"Common Linnet"=>"Carduelis cannabina", +"Mute Swan"=>"Cygnus olor", +"Common Cuckoo"=>"Cuculus canorus", +"Black-headed Gull"=>"Larus ridibundus", +"Greater White-fronted Goose"=>"Anser albifrons", +"Great Tit"=>"Parus major", +"Redwing"=>"Turdus iliacus", +"Gadwall"=>"Anas strepera", +"Fieldfare"=>"Turdus pilaris", +"Tufted Duck"=>"Aythya fuligula", +"Crested Tit"=>"Lophophanes cristatus", +"Willow Tit"=>"Poecile montanus", +"Eurasian Coot"=>"Fulica atra", +"Common Blackbird"=>"Turdus merula", +"Smew"=>"Mergus albellus", +"Common Sandpiper"=>"Actitis hypoleucos", +"Sand Martin"=>"Riparia riparia", +"Purple Sandpiper"=>"Calidris maritima", +"Northern Pintail"=>"Anas acuta", +"Blue Tit"=>"Cyanistes caeruleus", +"European Goldfinch"=>"Carduelis carduelis", +"Eurasian Whimbrel"=>"Numenius phaeopus", +"Common Reed Bunting"=>"Emberiza schoeniclus", +"Eurasian Tree Sparrow"=>"Passer montanus", +"Rook"=>"Corvus frugilegus", +"European Robin"=>"Erithacus rubecula", +"Bar-tailed Godwit"=>"Limosa lapponica", +"Dark-bellied Brent Goose"=>"Branta bernicla", +"Eurasian Oystercatcher"=>"Haematopus ostralegus", +"Eurasian Siskin"=>"Carduelis spinus", +"Northern Shoveler"=>"Anas clypeata", +"Eurasian Wigeon"=>"Anas penelope", +"Eurasian Sparrow Hawk"=>"Accipiter nisus", +"Icterine Warbler"=>"Hippolais icterina", +"Common Starling"=>"Sturnus vulgaris", +"Long-tailed Tit"=>"Aegithalos caudatus", +"Ruddy Turnstone"=>"Arenaria interpres", +"Mew Gull"=>"Larus canus", +"Common Pochard"=>"Aythya ferina", +"Common Chiffchaff"=>"Phylloscopus collybita", +"Greater Scaup"=>"Aythya marila", +"Common Kestrel"=>"Falco tinnunculus", +"Garden Warbler"=>"Sylvia borin", +"Eurasian Collared Dove"=>"Streptopelia decaocto", +"Eurasian Skylark"=>"Alauda arvensis", +"Common Chaffinch"=>"Fringilla coelebs", +"Common Moorhen"=>"Gallinula chloropus", +"Water Pipit"=>"Anthus spinoletta", +"Mallard"=>"Anas platyrhynchos", +"Winter Wren"=>"Troglodytes troglodytes", +"Common Teal"=>"Anas crecca", +"Green Sandpiper"=>"Tringa ochropus", +"White Wagtail"=>"Motacilla alba", +"Eurasian Curlew"=>"Numenius arquata", +"Song Thrush"=>"Turdus philomelos", +"European Herring Gull"=>"Larus argentatus", +"Grey Plover"=>"Pluvialis squatarola", +"Carrion Crow"=>"Corvus corone", +"Coal Tit"=>"Periparus ater", +"Spotted Redshank"=>"Tringa erythropus", +"Blackcap"=>"Sylvia atricapilla", +"Egyptian Vulture"=>"Neophron percnopterus", +"Razorbill"=>"Alca torda", +"Alpine Swift"=>"Apus melba", +"Long-legged Buzzard"=>"Buteo rufinus", +"Audouin`s Gull"=>"Larus audouinii", +"Balearic Shearwater"=>"Puffinus mauretanicus", +"Upland Sandpiper"=>"Bartramia longicauda", +"Greater Spotted Eagle"=>"Aquila clanga", +"Ring Ouzel"=>"Turdus torquatus", +"Yellow-browed Warbler"=>"Phylloscopus inornatus", +"Blue Rock Thrush"=>"Monticola solitarius", +"Buff-breasted Sandpiper"=>"Tryngites subruficollis", +"Jack Snipe"=>"Lymnocryptes minimus", +"White-rumped Sandpiper"=>"Calidris fuscicollis", +"Ruddy Shelduck"=>"Tadorna ferruginea", +"Cetti's Warbler"=>"Cettia cetti", +"Citrine Wagtail"=>"Motacilla citreola", +"Roseate Tern"=>"Sterna dougallii", +"Black-legged Kittiwake"=>"Rissa tridactyla", +"Pygmy Cormorant"=>"Phalacrocorax pygmeus", +"Booted Eagle"=>"Aquila pennata", +"Lesser White-fronted Goose"=>"Anser erythropus", +"Little Bunting"=>"Emberiza pusilla", +"Eleonora's Falcon"=>"Falco eleonorae", +"European Serin"=>"Serinus serinus", +"Twite"=>"Carduelis flavirostris", +"Yellow-legged Gull"=>"Larus michahellis", +"Gyr Falcon"=>"Falco rusticolus", +"Greenish Warbler"=>"Phylloscopus trochiloides", +"Red-necked Phalarope"=>"Phalaropus lobatus", +"Mealy Redpoll"=>"Carduelis flammea", +"Glaucous Gull"=>"Larus hyperboreus", +"Great Skua"=>"Stercorarius skua", +"Great Bustard"=>"Otis tarda", +"Velvet Scoter"=>"Melanitta fusca", +"Pine Grosbeak"=>"Pinicola enucleator", +"House Crow"=>"Corvus splendens", +"Hume`s Leaf Warbler"=>"Phylloscopus humei", +"Great Northern Loon"=>"Gavia immer", +"Long-tailed Duck"=>"Clangula hyemalis", +"Lapland Longspur"=>"Calcarius lapponicus", +"Northern Gannet"=>"Morus bassanus", +"Eastern Imperial Eagle"=>"Aquila heliaca", +"Little Auk"=>"Alle alle", +"Lesser Spotted Woodpecker"=>"Dendrocopos minor", +"Iceland Gull"=>"Larus glaucoides", +"Parasitic Jaeger"=>"Stercorarius parasiticus", +"Bewick`s Swan"=>"Cygnus bewickii", +"Little Bustard"=>"Tetrax tetrax", +"Little Crake"=>"Porzana parva", +"Baillon`s Crake"=>"Porzana pusilla", +"Long-tailed Jaeger"=>"Stercorarius longicaudus", +"King Eider"=>"Somateria spectabilis", +"Greater Short-toed Lark"=>"Calandrella brachydactyla", +"Houbara Bustard"=>"Chlamydotis undulata", +"Curlew Sandpiper"=>"Calidris ferruginea", +"Common Crossbill"=>"Loxia curvirostra", +"European Shag"=>"Phalacrocorax aristotelis", +"Horned Grebe"=>"Podiceps auritus", +"Common Quail"=>"Coturnix coturnix", +"Bearded Vulture"=>"Gypaetus barbatus", +"Lanner Falcon"=>"Falco biarmicus", +"Middle Spotted Woodpecker"=>"Dendrocopos medius", +"Pomarine Jaeger"=>"Stercorarius pomarinus", +"Red-breasted Merganser"=>"Mergus serrator", +"Eurasian Black Vulture"=>"Aegypius monachus", +"Eurasian Dotterel"=>"Charadrius morinellus", +"Common Nightingale"=>"Luscinia megarhynchos", +"Northern willow warbler"=>"Phylloscopus trochilus acredula", +"Manx Shearwater"=>"Puffinus puffinus", +"Northern Fulmar"=>"Fulmarus glacialis", +"Eurasian Eagle Owl"=>"Bubo bubo", +"Orphean Warbler"=>"Sylvia hortensis", +"Melodious Warbler"=>"Hippolais polyglotta", +"Pallas's Leaf Warbler"=>"Phylloscopus proregulus", +"Atlantic Puffin"=>"Fratercula arctica", +"Black-throated Loon"=>"Gavia arctica", +"Bohemian Waxwing"=>"Bombycilla garrulus", +"Marsh Sandpiper"=>"Tringa stagnatilis", +"Great Snipe"=>"Gallinago media", +"Squacco Heron"=>"Ardeola ralloides", +"Long-eared Owl"=>"Asio otus", +"Caspian Tern"=>"Hydroprogne caspia", +"Red-breasted Goose"=>"Branta ruficollis", +"Red-throated Loon"=>"Gavia stellata", +"Common Rosefinch"=>"Carpodacus erythrinus", +"Red-footed Falcon"=>"Falco vespertinus", +"Ross's Goose"=>"Anser rossii", +"Red Phalarope"=>"Phalaropus fulicarius", +"Pied Wagtail"=>"Motacilla yarrellii", +"Rose-coloured Starling"=>"Sturnus roseus", +"Rough-legged Buzzard"=>"Buteo lagopus", +"Saker Falcon"=>"Falco cherrug", +"European Roller"=>"Coracias garrulus", +"Short-toed Eagle"=>"Circaetus gallicus", +"Peregrine Falcon"=>"Falco peregrinus", +"Merlin"=>"Falco columbarius", +"Snow Goose"=>"Anser caerulescens", +"Snowy Owl"=>"Bubo scandiacus", +"Snow Bunting"=>"Plectrophenax nivalis", +"Common Grasshopper Warbler"=>"Locustella naevia", +"Golden Eagle"=>"Aquila chrysaetos", +"Black-winged Stilt"=>"Himantopus himantopus", +"Steppe Eagle"=>"Aquila nipalensis", +"Pallid Harrier"=>"Circus macrourus", +"European Storm-petrel"=>"Hydrobates pelagicus", +"Horned Lark"=>"Eremophila alpestris", +"Eurasian Treecreeper"=>"Certhia familiaris", +"Taiga Bean Goose"=>"Anser fabalis", +"Temminck`s Stint"=>"Calidris temminckii", +"Terek Sandpiper"=>"Xenus cinereus", +"Tundra Bean Goose"=>"Anser serrirostris", +"European Turtle Dove"=>"Streptopelia turtur", +"Leach`s Storm-petrel"=>"Oceanodroma leucorhoa", +"Eurasian Griffon Vulture"=>"Gyps fulvus", +"Paddyfield Warbler"=>"Acrocephalus agricola", +"Osprey"=>"Pandion haliaetus", +"Firecrest"=>"Regulus ignicapilla", +"Water Rail"=>"Rallus aquaticus", +"European Honey Buzzard"=>"Pernis apivorus", +"Eurasian Golden Oriole"=>"Oriolus oriolus", +"Whooper Swan"=>"Cygnus cygnus", +"Two-barred Crossbill"=>"Loxia leucoptera", +"White-tailed Eagle"=>"Haliaeetus albicilla", +"Atlantic Murre"=>"Uria aalge", +"Garganey"=>"Anas querquedula", +"Black Redstart"=>"Phoenicurus ochruros", +"Common Scoter"=>"Melanitta nigra", +"Rock Pipit"=>"Anthus petrosus", +"Lesser Spotted Eagle"=>"Aquila pomarina", +"Cattle Egret"=>"Bubulcus ibis", +"White-winged Black Tern"=>"Chlidonias leucopterus", +"Black Stork"=>"Ciconia nigra", +"Mediterranean Gull"=>"Larus melanocephalus", +"Black Kite"=>"Milvus migrans", +"Yellow Wagtail"=>"Motacilla flavissima", +"Red-necked Grebe"=>"Podiceps grisegena", +"Gull-billed Tern"=>"Gelochelidon nilotica", +"Pectoral Sandpiper"=>"Calidris melanotos", +"Barred Warbler"=>"Sylvia nisoria", +"Red-throated Pipit"=>"Anthus cervinus", +"Grey Wagtail"=>"Motacilla cinerea", +"Richard`s Pipit"=>"Anthus richardi", +"Black Woodpecker"=>"Dryocopus martius", +"Little Ringed Plover"=>"Charadrius dubius", +"Whiskered Tern"=>"Chlidonias hybrida", +"Lesser Redpoll"=>"Carduelis cabaret", +"Pallas' Bunting"=>"Emberiza pallasi", +"Ferruginous Duck"=>"Aythya nyroca", +"Whistling Swan"=>"Cygnus columbianus", +"Black Brant"=>"Branta nigricans", +"Marbled Teal"=>"Marmaronetta angustirostris", +"Canvasback"=>"Aythya valisineria", +"Redhead"=>"Aythya americana", +"Lesser Scaup"=>"Aythya affinis", +"Steller`s Eider"=>"Polysticta stelleri", +"Spectacled Eider"=>"Somateria fischeri", +"Harlequin Duck"=>"Histronicus histrionicus", +"Black Scoter"=>"Melanitta americana", +"Surf Scoter"=>"Melanitta perspicillata", +"Barrow`s Goldeneye"=>"Bucephala islandica", +"Falcated Duck"=>"Anas falcata", +"American Wigeon"=>"Anas americana", +"Blue-winged Teal"=>"Anas discors", +"American Black Duck"=>"Anas rubripes", +"Baikal Teal"=>"Anas formosa", +"Green-Winged Teal"=>"Anas carolinensis", +"Hazel Grouse"=>"Bonasa bonasia", +"Rock Partridge"=>"Alectoris graeca", +"Red-legged Partridge"=>"Alectoris rufa", +"Yellow-billed Loon"=>"Gavia adamsii", +"Cory`s Shearwater"=>"Calonectris borealis", +"Madeiran Storm-Petrel"=>"Oceanodroma castro", +"Great White Pelican"=>"Pelecanus onocrotalus", +"Dalmatian Pelican"=>"Pelecanus crispus", +"American Bittern"=>"Botaurus lentiginosus", +"Glossy Ibis"=>"Plegadis falcinellus", +"Spanish Imperial Eagle"=>"Aquila adalberti", +"Lesser Kestrel"=>"Falco naumanni", +"Houbara Bustard"=>"Chlamydotis undulata", +"Crab-Plover"=>"Dromas ardeola", +"Cream-coloured Courser"=>"Cursorius cursor", +"Collared Pratincole"=>"Glareola pratincola", +"Black-winged Pratincole"=>"Glareola nordmanni", +"Killdeer"=>"Charadrius vociferus", +"Lesser Sand Plover"=>"Charadrius mongolus", +"Greater Sand Plover"=>"Charadrius leschenaultii", +"Caspian Plover"=>"Charadrius asiaticus", +"American Golden Plover"=>"Pluvialis dominica", +"Pacific Golden Plover"=>"Pluvialis fulva", +"Sharp-tailed Sandpiper"=>"Calidris acuminata", +"Broad-billed Sandpiper"=>"Limicola falcinellus", +"Spoon-Billed Sandpiper"=>"Eurynorhynchus pygmaeus", +"Short-Billed Dowitcher"=>"Limnodromus griseus", +"Long-billed Dowitcher"=>"Limnodromus scolopaceus", +"Hudsonian Godwit"=>"Limosa haemastica", +"Little Curlew"=>"Numenius minutus", +"Lesser Yellowlegs"=>"Tringa flavipes", +"Wilson`s Phalarope"=>"Phalaropus tricolor", +"Pallas`s Gull"=>"Larus ichthyaetus", +"Laughing Gull"=>"Larus atricilla", +"Franklin`s Gull"=>"Larus pipixcan", +"Bonaparte`s Gull"=>"Larus philadelphia", +"Ring-billed Gull"=>"Larus delawarensis", +"American Herring Gull"=>"Larus smithsonianus", +"Caspian Gull"=>"Larus cachinnans", +"Ivory Gull"=>"Pagophila eburnea", +"Royal Tern"=>"Sterna maxima", +"Brünnich`s Murre"=>"Uria lomvia", +"Crested Auklet"=>"Aethia cristatella", +"Parakeet Auklet"=>"Cyclorrhynchus psittacula", +"Tufted Puffin"=>"Lunda cirrhata", +"Laughing Dove"=>"Streptopelia senegalensis", +"Great Spotted Cuckoo"=>"Clamator glandarius", +"Great Grey Owl"=>"Strix nebulosa", +"Tengmalm`s Owl"=>"Aegolius funereus", +"Red-Necked Nightjar"=>"Caprimulgus ruficollis", +"Chimney Swift"=>"Chaetura pelagica", +"Green Bea-Eater"=>"Merops orientalis", +"Grey-headed Woodpecker"=>"Picus canus", +"Lesser Short-Toed Lark"=>"Calandrella rufescens", +"Eurasian Crag Martin"=>"Hirundo rupestris", +"Red-rumped Swallow"=>"Cecropis daurica", +"Blyth`s Pipit"=>"Anthus godlewskii", +"Pechora Pipit"=>"Anthus gustavi", +"Grey-headed Wagtail"=>"Motacilla thunbergi", +"Yellow-Headed Wagtail"=>"Motacilla lutea", +"White-throated Dipper"=>"Cinclus cinclus", +"Rufous-Tailed Scrub Robin"=>"Cercotrichas galactotes", +"Thrush Nightingale"=>"Luscinia luscinia", +"White-throated Robin"=>"Irania gutturalis", +"Caspian Stonechat"=>"Saxicola maura variegata", +"Western Black-eared Wheatear"=>"Oenanthe hispanica", +"Rufous-tailed Rock Thrush"=>"Monticola saxatilis", +"Red-throated Thrush/Black-throated"=>"Turdus ruficollis", +"American Robin"=>"Turdus migratorius", +"Zitting Cisticola"=>"Cisticola juncidis", +"Lanceolated Warbler"=>"Locustella lanceolata", +"River Warbler"=>"Locustella fluviatilis", +"Blyth`s Reed Warbler"=>"Acrocephalus dumetorum", +"Caspian Reed Warbler"=>"Acrocephalus fuscus", +"Aquatic Warbler"=>"Acrocephalus paludicola", +"Booted Warbler"=>"Acrocephalus caligatus", +"Marmora's Warbler"=>"Sylvia sarda", +"Dartford Warbler"=>"Sylvia undata", +"Subalpine Warbler"=>"Sylvia cantillans", +"Ménétries's Warbler"=>"Sylvia mystacea", +"Rüppel's Warbler"=>"Sylvia rueppelli", +"Asian Desert Warbler"=>"Sylvia nana", +"Western Orphean Warbler"=>"Sylvia hortensis hortensis", +"Arctic Warbler"=>"Phylloscopus borealis", +"Radde`s Warbler"=>"Phylloscopus schwarzi", +"Western Bonelli`s Warbler"=>"Phylloscopus bonelli", +"Red-breasted Flycatcher"=>"Ficedula parva", +"Eurasian Penduline Tit"=>"Remiz pendulinus", +"Daurian Shrike"=>"Lanius isabellinus", +"Long-Tailed Shrike"=>"Lanius schach", +"Lesser Grey Shrike"=>"Lanius minor", +"Southern Grey Shrike"=>"Lanius meridionalis", +"Masked Shrike"=>"Lanius nubicus", +"Spotted Nutcracker"=>"Nucifraga caryocatactes", +"Daurian Jackdaw"=>"Corvus dauuricus", +"Purple-Backed Starling"=>"Sturnus sturninus", +"Red-Fronted Serin"=>"Serinus pusillus", +"Arctic Redpoll"=>"Carduelis hornemanni", +"Scottish Crossbill"=>"Loxia scotica", +"Parrot Crossbill"=>"Loxia pytyopsittacus", +"Black-faced Bunting"=>"Emberiza spodocephala", +"Pink-footed Goose"=>"Anser brachyrhynchus", +"Black-winged Kite"=>"Elanus caeruleus", +"European Bee-eater"=>"Merops apiaster", +"Sabine`s Gull"=>"Larus sabini", +"Sooty Shearwater"=>"Puffinus griseus", +"Lesser Canada Goose"=>"Branta hutchinsii", +"Ring-necked Duck"=>"Aythya collaris", +"Greater Flamingo"=>"Phoenicopterus roseus", +"Iberian Chiffchaff"=>"Phylloscopus ibericus", +"Ashy-headed Wagtail"=>"Motacilla cinereocapilla", +"Stilt Sandpiper"=>"Calidris himantopus", +"Siberian Stonechat"=>"Saxicola maurus", +"Greater Yellowlegs"=>"Tringa melanoleuca", +"Forster`s Tern"=>"Sterna forsteri", +"Dusky Warbler"=>"Phylloscopus fuscatus", +"Cirl Bunting"=>"Emberiza cirlus", +"Olive-backed Pipit"=>"Anthus hodgsoni", +"Sociable Lapwing"=>"Vanellus gregarius", +"Spotted Sandpiper"=>"Actitis macularius", +"Baird`s Sandpiper"=>"Calidris bairdii", +"Rustic Bunting"=>"Emberiza rustica", +"Yellow-browed Bunting"=>"Emberiza chrysophrys", +"Great Shearwater"=>"Puffinus gravis", +"Bonelli`s Eagle"=>"Aquila fasciata", +"Calandra Lark"=>"Melanocorypha calandra", +"Sardinian Warbler"=>"Sylvia melanocephala", +"Ross's Gull"=>"Larus roseus", +"Yellow-Breasted Bunting"=>"Emberiza aureola", +"Pine Bunting"=>"Emberiza leucocephalos", +"Black Guillemot"=>"Cepphus grylle", +"Pied-billed Grebe"=>"Podilymbus podiceps", +"Soft-plumaged Petrel"=>"Pterodroma mollis", +"Bulwer's Petrel"=>"Bulweria bulwerii", +"White-Faced Storm-Petrel"=>"Pelagodroma marina", +"Pallas’s Fish Eagle"=>"Haliaeetus leucoryphus", +"Sandhill Crane"=>"Grus canadensis", +"Macqueen’s Bustard"=>"Chlamydotis macqueenii", +"White-tailed Lapwing"=>"Vanellus leucurus", +"Great Knot"=>"Calidris tenuirostris", +"Semipalmated Sandpiper"=>"Calidris pusilla", +"Red-necked Stint"=>"Calidris ruficollis", +"Slender-billed Curlew"=>"Numenius tenuirostris", +"Bridled Tern"=>"Onychoprion anaethetus", +"Pallas’s Sandgrouse"=>"Syrrhaptes paradoxus", +"European Scops Owl"=>"Otus scops", +"Northern Hawk Owl"=>"Surnia ulula", +"White-Throated Needletail"=>"Hirundapus caudacutus", +"Belted Kingfisher"=>"Ceryle alcyon", +"Blue-cheeked Bee-eater"=>"Merops persicus", +"Black-headed Wagtail"=>"Motacilla feldegg", +"Northern Mockingbird"=>"Mimus polyglottos", +"Alpine Accentor"=>"Prunella collaris", +"Red-flanked Bluetail"=>"Tarsiger cyanurus", +"Isabelline Wheatear"=>"Oenanthe isabellina", +"Pied Wheatear"=>"Oenanthe pleschanka", +"Eastern Black-eared Wheatear"=>"Oenanthe melanoleuca", +"Desert Wheatear"=>"Oenanthe deserti", +"White`s Thrush"=>"Zoothera aurea", +"Siberian Thrush"=>"Zoothera sibirica", +"Eyebrowed Thrush"=>"Turdus obscurus", +"Dusky Thrush"=>"Turdus eunomus", +"Black-throated Thrush"=>"Turdus atrogularis", +"Pallas`s Grasshopper Warbler"=>"Locustella certhiola", +"Spectacled Warbler"=>"Sylvia conspicillata", +"Two-barred Warbler"=>"Phylloscopus plumbeitarsus", +"Eastern Bonelli’s Warbler"=>"Phylloscopus orientalis", +"Collared Flycatcher"=>"Ficedula albicollis", +"Wallcreeper"=>"Tichodroma muraria", +"Turkestan Shrike"=>"Lanius phoenicuroides", +"Steppe Grey Shrike"=>"Lanius pallidirostris", +"Spanish Sparrow"=>"Passer hispaniolensis", +"Red-eyed Vireo"=>"Vireo olivaceus", +"Myrtle Warbler"=>"Dendroica coronata", +"White-crowned Sparrow"=>"Zonotrichia leucophrys", +"White-throated Sparrow"=>"Zonotrichia albicollis", +"Cretzschmar`s Bunting"=>"Emberiza caesia", +"Chestnut Bunting"=>"Emberiza rutila", +"Red-headed Bunting"=>"Emberiza bruniceps", +"Black-headed Bunting"=>"Emberiza melanocephala", +"Indigo Bunting"=>"Passerina cyanea", +"Balearic Woodchat Shrike"=>"Lanius senator badius", +"Demoiselle Crane"=>"Grus virgo", +"Chough"=>"Pyrrhocorax pyrrhocorax", +"Red-Billed Chough"=>"Pyrrhocorax graculus", +"Elegant Tern"=>"Sterna elegans", +"Chukar"=>"Alectoris chukar", +"Yellow-Billed Cuckoo"=>"Coccyzus americanus", +"American Sandwich Tern"=>"Sterna sandvicensis acuflavida", +"Olive-Tree Warbler"=>"Hippolais olivetorum", +"Eastern Olivaceous Warbler"=>"Acrocephalus pallidus", +"Indian Cormorant"=>"Phalacrocorax fuscicollis", +"Spur-Winged Lapwing"=>"Vanellus spinosus", +"Yelkouan Shearwater"=>"Puffinus yelkouan", +"Trumpeter Finch"=>"Bucanetes githagineus", +"Red Grouse"=>"Lagopus scoticus", +"Rock Ptarmigan"=>"Lagopus mutus", +"Long-Tailed Cormorant"=>"Phalacrocorax africanus", +"Double-crested Cormorant"=>"Phalacrocorax auritus", +"Magnificent Frigatebird"=>"Fregata magnificens", +"Naumann's Thrush"=>"Turdus naumanni", +"Oriental Pratincole"=>"Glareola maldivarum", +"Bufflehead"=>"Bucephala albeola", +"Snowfinch"=>"Montifrigilla nivalis", +"Ural owl"=>"Strix uralensis", +"Spanish Wagtail"=>"Motacilla iberiae", +"Song Sparrow"=>"Melospiza melodia", +"Rock Bunting"=>"Emberiza cia", +"Siberian Rubythroat"=>"Luscinia calliope", +"Pallid Swift"=>"Apus pallidus", +"Eurasian Pygmy Owl"=>"Glaucidium passerinum", +"Madeira Little Shearwater"=>"Puffinus baroli", +"House Finch"=>"Carpodacus mexicanus", +"Green Heron"=>"Butorides virescens", +"Solitary Sandpiper"=>"Tringa solitaria", +"Heuglin's Gull"=>"Larus heuglini" +); + +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + echo "$key|$value\n"; + } +} + +?> \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.css b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.css new file mode 100644 index 0000000000..91b6228337 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.css @@ -0,0 +1,48 @@ +.ac_results { + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: default; + display: block; + /* + if width will be 100% horizontal scrollbar will apear + when scroll mode will be used + */ + /*width: 100%;*/ + font: menu; + font-size: 12px; + /* + it is very important, if line-height not setted or setted + in relative units scroll will be broken in firefox + */ + line-height: 16px; + overflow: hidden; +} + +.ac_loading { + background: white url('indicator.gif') right center no-repeat; +} + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #0A246A; + color: white; +} diff --git a/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.js b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.js new file mode 100644 index 0000000000..5ad9178f86 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.js @@ -0,0 +1,759 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ + * + */ + +;(function($) { + +$.fn.extend({ + autocomplete: function(urlOrData, options) { + var isUrl = typeof urlOrData == "string"; + options = $.extend({}, $.Autocompleter.defaults, { + url: isUrl ? urlOrData : null, + data: isUrl ? null : urlOrData, + delay: isUrl ? $.Autocompleter.defaults.delay : 10, + max: options && !options.scroll ? 10 : 150 + }, options); + + // if highlight is set to false, replace it with a do-nothing function + options.highlight = options.highlight || function(value) { return value; }; + + // if the formatMatch option is not specified, then use formatItem for backwards compatibility + options.formatMatch = options.formatMatch || options.formatItem; + + return this.each(function() { + new $.Autocompleter(this, options); + }); + }, + result: function(handler) { + return this.bind("result", handler); + }, + search: function(handler) { + return this.trigger("search", [handler]); + }, + flushCache: function() { + return this.trigger("flushCache"); + }, + setOptions: function(options){ + return this.trigger("setOptions", [options]); + }, + unautocomplete: function() { + return this.trigger("unautocomplete"); + } +}); + +$.Autocompleter = function(input, options) { + + var KEY = { + UP: 38, + DOWN: 40, + DEL: 46, + TAB: 9, + RETURN: 13, + ESC: 27, + COMMA: 188, + PAGEUP: 33, + PAGEDOWN: 34, + BACKSPACE: 8 + }; + + // Create $ object for input element + var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); + + var timeout; + var previousValue = ""; + var cache = $.Autocompleter.Cache(options); + var hasFocus = 0; + var lastKeyPressCode; + var config = { + mouseDownOnSelect: false + }; + var select = $.Autocompleter.Select(options, input, selectCurrent, config); + + var blockSubmit; + + // prevent form submit in opera when selecting with return key + $.browser.opera && $(input.form).bind("submit.autocomplete", function() { + if (blockSubmit) { + blockSubmit = false; + return false; + } + }); + + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all + $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { + // track last key pressed + lastKeyPressCode = event.keyCode; + switch(event.keyCode) { + + case KEY.UP: + event.preventDefault(); + if ( select.visible() ) { + select.prev(); + } else { + onChange(0, true); + } + break; + + case KEY.DOWN: + event.preventDefault(); + if ( select.visible() ) { + select.next(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEUP: + event.preventDefault(); + if ( select.visible() ) { + select.pageUp(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEDOWN: + event.preventDefault(); + if ( select.visible() ) { + select.pageDown(); + } else { + onChange(0, true); + } + break; + + // matches also semicolon + case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: + case KEY.TAB: + case KEY.RETURN: + if( selectCurrent() ) { + // stop default to prevent a form submit, Opera needs special handling + event.preventDefault(); + blockSubmit = true; + return false; + } + break; + + case KEY.ESC: + select.hide(); + break; + + default: + clearTimeout(timeout); + timeout = setTimeout(onChange, options.delay); + break; + } + }).focus(function(){ + // track whether the field has focus, we shouldn't process any + // results if the field no longer has focus + hasFocus++; + }).blur(function() { + hasFocus = 0; + if (!config.mouseDownOnSelect) { + hideResults(); + } + }).click(function() { + // show select when clicking in a focused field + if ( hasFocus++ > 1 && !select.visible() ) { + onChange(0, true); + } + }).bind("search", function() { + // TODO why not just specifying both arguments? + var fn = (arguments.length > 1) ? arguments[1] : null; + function findValueCallback(q, data) { + var result; + if( data && data.length ) { + for (var i=0; i < data.length; i++) { + if( data[i].result.toLowerCase() == q.toLowerCase() ) { + result = data[i]; + break; + } + } + } + if( typeof fn == "function" ) fn(result); + else $input.trigger("result", result && [result.data, result.value]); + } + $.each(trimWords($input.val()), function(i, value) { + request(value, findValueCallback, findValueCallback); + }); + }).bind("flushCache", function() { + cache.flush(); + }).bind("setOptions", function() { + $.extend(options, arguments[1]); + // if we've updated the data, repopulate + if ( "data" in arguments[1] ) + cache.populate(); + }).bind("unautocomplete", function() { + select.unbind(); + $input.unbind(); + $(input.form).unbind(".autocomplete"); + }); + + + function selectCurrent() { + var selected = select.selected(); + if( !selected ) + return false; + + var v = selected.result; + previousValue = v; + + if ( options.multiple ) { + var words = trimWords($input.val()); + if ( words.length > 1 ) { + v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; + } + v += options.multipleSeparator; + } + + $input.val(v); + hideResultsNow(); + $input.trigger("result", [selected.data, selected.value]); + return true; + } + + function onChange(crap, skipPrevCheck) { + if( lastKeyPressCode == KEY.DEL ) { + select.hide(); + return; + } + + var currentValue = $input.val(); + + if ( !skipPrevCheck && currentValue == previousValue ) + return; + + previousValue = currentValue; + + currentValue = lastWord(currentValue); + if ( currentValue.length >= options.minChars) { + $input.addClass(options.loadingClass); + if (!options.matchCase) + currentValue = currentValue.toLowerCase(); + request(currentValue, receiveData, hideResultsNow); + } else { + stopLoading(); + select.hide(); + } + }; + + function trimWords(value) { + if ( !value ) { + return [""]; + } + var words = value.split( options.multipleSeparator ); + var result = []; + $.each(words, function(i, value) { + if ( $.trim(value) ) + result[i] = $.trim(value); + }); + return result; + } + + function lastWord(value) { + if ( !options.multiple ) + return value; + var words = trimWords(value); + return words[words.length - 1]; + } + + // fills in the input box w/the first match (assumed to be the best match) + // q: the term entered + // sValue: the first matching result + function autoFill(q, sValue){ + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + // if the last user key pressed was backspace, don't autofill + if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); + // select the portion of the value not typed by the user (so the next character will erase) + $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); + } + }; + + function hideResults() { + clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + var wasVisible = select.visible(); + select.hide(); + clearTimeout(timeout); + stopLoading(); + if (options.mustMatch) { + // call search and run callback + $input.search( + function (result){ + // if no value found, clear the input box + if( !result ) { + if (options.multiple) { + var words = trimWords($input.val()).slice(0, -1); + $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); + } + else + $input.val( "" ); + } + } + ); + } + if (wasVisible) + // position cursor at end of input field + $.Autocompleter.Selection(input, input.value.length, input.value.length); + }; + + function receiveData(q, data) { + if ( data && data.length && hasFocus ) { + stopLoading(); + select.display(data, q); + autoFill(q, data[0].value); + select.show(); + } else { + hideResultsNow(); + } + }; + + function request(term, success, failure) { + if (!options.matchCase) + term = term.toLowerCase(); + var data = cache.load(term); + // recieve the cached data + if (data && data.length) { + success(term, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + + var extraParams = { + timestamp: +new Date() + }; + $.each(options.extraParams, function(key, param) { + extraParams[key] = typeof param == "function" ? param() : param; + }); + + $.ajax({ + // try to leverage ajaxQueue plugin to abort previous requests + mode: "abort", + // limit abortion to this input + port: "autocomplete" + input.name, + dataType: options.dataType, + url: options.url, + data: $.extend({ + q: lastWord(term), + limit: options.max + }, extraParams), + success: function(data) { + var parsed = options.parse && options.parse(data) || parse(data); + cache.add(term, parsed); + success(term, parsed); + } + }); + } else { + // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match + select.emptyList(); + failure(term); + } + }; + + function parse(data) { + var parsed = []; + var rows = data.split("\n"); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + row = row.split("|"); + parsed[parsed.length] = { + data: row, + value: row[0], + result: options.formatResult && options.formatResult(row, row[0]) || row[0] + }; + } + } + return parsed; + }; + + function stopLoading() { + $input.removeClass(options.loadingClass); + }; + +}; + +$.Autocompleter.defaults = { + inputClass: "ac_input", + resultsClass: "ac_results", + loadingClass: "ac_loading", + minChars: 1, + delay: 400, + matchCase: false, + matchSubset: true, + matchContains: false, + cacheLength: 10, + max: 100, + mustMatch: false, + extraParams: {}, + selectFirst: true, + formatItem: function(row) { return row[0]; }, + formatMatch: null, + autoFill: false, + width: 0, + multiple: false, + multipleSeparator: ", ", + highlight: function(value, term) { + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); + }, + scroll: true, + scrollHeight: 180 +}; + +$.Autocompleter.Cache = function(options) { + + var data = {}; + var length = 0; + + function matchSubset(s, sub) { + if (!options.matchCase) + s = s.toLowerCase(); + var i = s.indexOf(sub); + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + function add(q, value) { + if (length > options.cacheLength){ + flush(); + } + if (!data[q]){ + length++; + } + data[q] = value; + } + + function populate(){ + if( !options.data ) return false; + // track the matches + var stMatchSets = {}, + nullData = 0; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( !options.url ) options.cacheLength = 1; + + // track all options for minChars = 0 + stMatchSets[""] = []; + + // loop through the array and create a lookup structure + for ( var i = 0, ol = options.data.length; i < ol; i++ ) { + var rawValue = options.data[i]; + // if rawValue is a string, make an array otherwise just reference the array + rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; + + var value = options.formatMatch(rawValue, i+1, options.data.length); + if ( value === false ) + continue; + + var firstChar = value.charAt(0).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[firstChar] ) + stMatchSets[firstChar] = []; + + // if the match is a string + var row = { + value: value, + data: rawValue, + result: options.formatResult && options.formatResult(rawValue) || value + }; + + // push the current match into the set list + stMatchSets[firstChar].push(row); + + // keep track of minChars zero items + if ( nullData++ < options.max ) { + stMatchSets[""].push(row); + } + }; + + // add the data items to the cache + $.each(stMatchSets, function(i, value) { + // increase the cache size + options.cacheLength++; + // add to the cache + add(i, value); + }); + } + + // populate any existing data + setTimeout(populate, 25); + + function flush(){ + data = {}; + length = 0; + } + + return { + flush: flush, + add: add, + populate: populate, + load: function(q) { + if (!options.cacheLength || !length) + return null; + /* + * if dealing w/local data and matchContains than we must make sure + * to loop through all the data collections looking for matches + */ + if( !options.url && options.matchContains ){ + // track all matches + var csub = []; + // loop through all the data grids for matches + for( var k in data ){ + // don't search through the stMatchSets[""] (minChars: 0) cache + // this prevents duplicates + if( k.length > 0 ){ + var c = data[k]; + $.each(c, function(i, x) { + // if we've got a match, add it to the array + if (matchSubset(x.value, q)) { + csub.push(x); + } + }); + } + } + return csub; + } else + // if the exact item exists, use it + if (data[q]){ + return data[q]; + } else + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var c = data[q.substr(0, i)]; + if (c) { + var csub = []; + $.each(c, function(i, x) { + if (matchSubset(x.value, q)) { + csub[csub.length] = x; + } + }); + return csub; + } + } + } + return null; + } + }; +}; + +$.Autocompleter.Select = function (options, input, select, config) { + var CLASSES = { + ACTIVE: "ac_over" + }; + + var listItems, + active = -1, + data, + term = "", + needsInit = true, + element, + list; + + // Create results + function init() { + if (!needsInit) + return; + element = $("
            ") + .hide() + .addClass(options.resultsClass) + .css("position", "absolute") + .appendTo(document.body); + + list = $("
              ").appendTo(element).mouseover( function(event) { + if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { + active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); + $(target(event)).addClass(CLASSES.ACTIVE); + } + }).click(function(event) { + $(target(event)).addClass(CLASSES.ACTIVE); + select(); + // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus + input.focus(); + return false; + }).mousedown(function() { + config.mouseDownOnSelect = true; + }).mouseup(function() { + config.mouseDownOnSelect = false; + }); + + if( options.width > 0 ) + element.css("width", options.width); + + needsInit = false; + } + + function target(event) { + var element = event.target; + while(element && element.tagName != "LI") + element = element.parentNode; + // more fun with IE, sometimes event.target is empty, just ignore it then + if(!element) + return []; + return element; + } + + function moveSelect(step) { + listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); + movePosition(step); + var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); + if(options.scroll) { + var offset = 0; + listItems.slice(0, active).each(function() { + offset += this.offsetHeight; + }); + if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { + list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); + } else if(offset < list.scrollTop()) { + list.scrollTop(offset); + } + } + }; + + function movePosition(step) { + active += step; + if (active < 0) { + active = listItems.size() - 1; + } else if (active >= listItems.size()) { + active = 0; + } + } + + function limitNumberOfItems(available) { + return options.max && options.max < available + ? options.max + : available; + } + + function fillList() { + list.empty(); + var max = limitNumberOfItems(data.length); + for (var i=0; i < max; i++) { + if (!data[i]) + continue; + var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); + if ( formatted === false ) + continue; + var li = $("
            • ").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; + $.data(li, "ac_data", data[i]); + } + listItems = list.find("li"); + if ( options.selectFirst ) { + listItems.slice(0, 1).addClass(CLASSES.ACTIVE); + active = 0; + } + // apply bgiframe if available + if ( $.fn.bgiframe ) + list.bgiframe(); + } + + return { + display: function(d, q) { + init(); + data = d; + term = q; + fillList(); + }, + next: function() { + moveSelect(1); + }, + prev: function() { + moveSelect(-1); + }, + pageUp: function() { + if (active != 0 && active - 8 < 0) { + moveSelect( -active ); + } else { + moveSelect(-8); + } + }, + pageDown: function() { + if (active != listItems.size() - 1 && active + 8 > listItems.size()) { + moveSelect( listItems.size() - 1 - active ); + } else { + moveSelect(8); + } + }, + hide: function() { + element && element.hide(); + listItems && listItems.removeClass(CLASSES.ACTIVE); + active = -1; + }, + visible : function() { + return element && element.is(":visible"); + }, + current: function() { + return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); + }, + show: function() { + var offset = $(input).offset(); + element.css({ + width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), + top: offset.top + input.offsetHeight, + left: offset.left + }).show(); + if(options.scroll) { + list.scrollTop(0); + list.css({ + maxHeight: options.scrollHeight, + overflow: 'auto' + }); + + if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { + var listHeight = 0; + listItems.each(function() { + listHeight += this.offsetHeight; + }); + var scrollbarsVisible = listHeight > options.scrollHeight; + list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); + if (!scrollbarsVisible) { + // IE doesn't recalculate width when scrollbar disappears + listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); + } + } + + } + }, + selected: function() { + var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); + return selected && selected.length && $.data(selected[0], "ac_data"); + }, + emptyList: function (){ + list && list.empty(); + }, + unbind: function() { + element && element.remove(); + } + }; +}; + +$.Autocompleter.Selection = function(field, start, end) { + if( field.createTextRange ){ + var selRange = field.createTextRange(); + selRange.collapse(true); + selRange.moveStart("character", start); + selRange.moveEnd("character", end); + selRange.select(); + } else if( field.setSelectionRange ){ + field.setSelectionRange(start, end); + } else { + if( field.selectionStart ){ + field.selectionStart = start; + field.selectionEnd = end; + } + } + field.focus(); +}; + +})(jQuery); \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.min.js b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.min.js new file mode 100644 index 0000000000..c9ddfb2200 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.min.js @@ -0,0 +1,15 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ + * + */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i1){v=words.slice(0,words.length-1).join(options.multipleSeparator)+options.multipleSeparator+v;}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&¤tValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value){return[""];}var words=value.split(options.multipleSeparator);var result=[];$.each(words,function(i,value){if($.trim(value))result[i]=$.trim(value);});return result;}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$.Autocompleter.Selection(input,previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else +$input.val("");}});}if(wasVisible)$.Autocompleter.Selection(input,input.value.length,input.value.length);};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"$1");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else +if(data[q]){return data[q];}else +if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("
              ").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("
                ").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.Autocompleter.Selection=function(field,start,end){if(field.createTextRange){var selRange=field.createTextRange();selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}else if(field.setSelectionRange){field.setSelectionRange(start,end);}else{if(field.selectionStart){field.selectionStart=start;field.selectionEnd=end;}}field.focus();};})(jQuery); \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.pack.js b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.pack.js new file mode 100644 index 0000000000..271014a2b7 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/jquery.autocomplete.pack.js @@ -0,0 +1,13 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ + * + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.31.1o({12:3(b,d){5 c=Y b=="1w";d=$.1o({},$.D.1L,{11:c?b:14,w:c?14:b,1D:c?$.D.1L.1D:10,Z:d&&!d.1x?10:3U},d);d.1t=d.1t||3(a){6 a};d.1q=d.1q||d.1K;6 I.K(3(){1E $.D(I,d)})},M:3(a){6 I.X("M",a)},1y:3(a){6 I.15("1y",[a])},20:3(){6 I.15("20")},1Y:3(a){6 I.15("1Y",[a])},1X:3(){6 I.15("1X")}});$.D=3(o,r){5 t={2N:38,2I:40,2D:46,2x:9,2v:13,2q:27,2d:3x,2j:33,2o:34,2e:8};5 u=$(o).3f("12","3c").P(r.24);5 p;5 m="";5 n=$.D.2W(r);5 s=0;5 k;5 h={1z:B};5 l=$.D.2Q(r,o,1U,h);5 j;$.1T.2L&&$(o.2K).X("3S.12",3(){4(j){j=B;6 B}});u.X(($.1T.2L?"3Q":"3N")+".12",3(a){k=a.2F;3L(a.2F){Q t.2N:a.1d();4(l.L()){l.2y()}A{W(0,C)}N;Q t.2I:a.1d();4(l.L()){l.2u()}A{W(0,C)}N;Q t.2j:a.1d();4(l.L()){l.2t()}A{W(0,C)}N;Q t.2o:a.1d();4(l.L()){l.2s()}A{W(0,C)}N;Q r.19&&$.1p(r.R)==","&&t.2d:Q t.2x:Q t.2v:4(1U()){a.1d();j=C;6 B}N;Q t.2q:l.U();N;3A:1I(p);p=1H(W,r.1D);N}}).1G(3(){s++}).3v(3(){s=0;4(!h.1z){2k()}}).2i(3(){4(s++>1&&!l.L()){W(0,C)}}).X("1y",3(){5 c=(1n.7>1)?1n[1]:14;3 23(q,a){5 b;4(a&&a.7){16(5 i=0;i1){v=a.17(0,a.7-1).2Z(r.R)+r.R+v}v+=r.R}u.J(v);1l();u.15("M",[b.w,b.H]);6 C}3 W(b,c){4(k==t.2D){l.U();6}5 a=u.J();4(!c&&a==m)6;m=a;a=1k(a);4(a.7>=r.22){u.P(r.21);4(!r.1C)a=a.O();1R(a,2V,1l)}A{1B();l.U()}};3 1g(b){4(!b){6[""]}5 d=b.1Z(r.R);5 c=[];$.K(d,3(i,a){4($.1p(a))c[i]=$.1p(a)});6 c}3 1k(a){4(!r.19)6 a;5 b=1g(a);6 b[b.7-1]}3 1A(q,a){4(r.1A&&(1k(u.J()).O()==q.O())&&k!=t.2e){u.J(u.J()+a.48(1k(m).7));$.D.1N(o,m.7,m.7+a.7)}};3 2k(){1I(p);p=1H(1l,47)};3 1l(){5 c=l.L();l.U();1I(p);1B();4(r.2U){u.1y(3(a){4(!a){4(r.19){5 b=1g(u.J()).17(0,-1);u.J(b.2Z(r.R)+(b.7?r.R:""))}A u.J("")}})}4(c)$.D.1N(o,o.H.7,o.H.7)};3 2V(q,a){4(a&&a.7&&s){1B();l.2T(a,q);1A(q,a[0].H);l.1W()}A{1l()}};3 1R(f,d,g){4(!r.1C)f=f.O();5 e=n.2S(f);4(e&&e.7){d(f,e)}A 4((Y r.11=="1w")&&(r.11.7>0)){5 c={45:+1E 44()};$.K(r.2R,3(a,b){c[a]=Y b=="3"?b():b});$.43({42:"41",3Z:"12"+o.3Y,2M:r.2M,11:r.11,w:$.1o({q:1k(f),3X:r.Z},c),3W:3(a){5 b=r.1r&&r.1r(a)||1r(a);n.1h(f,b);d(f,b)}})}A{l.2J();g(f)}};3 1r(c){5 d=[];5 b=c.1Z("\\n");16(5 i=0;i]*)("+a.2C(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/2A,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","2A"),"<2z>$1")},1x:C,1s:3I};$.D.2W=3(g){5 h={};5 j=0;3 1a(s,a){4(!g.1C)s=s.O();5 i=s.3H(a);4(i==-1)6 B;6 i==0||g.1V};3 1h(q,a){4(j>g.1j){18()}4(!h[q]){j++}h[q]=a}3 1f(){4(!g.w)6 B;5 f={},2w=0;4(!g.11)g.1j=1;f[""]=[];16(5 i=0,30=g.w.7;i<30;i++){5 c=g.w[i];c=(Y c=="1w")?[c]:c;5 d=g.1q(c,i+1,g.w.7);4(d===B)1P;5 e=d.3G(0).O();4(!f[e])f[e]=[];5 b={H:d,w:c,M:g.1v&&g.1v(c)||d};f[e].1O(b);4(2w++0){5 c=h[k];$.K(c,3(i,x){4(1a(x.H,q)){a.1O(x)}})}}6 a}A 4(h[q]){6 h[q]}A 4(g.1a){16(5 i=q.7-1;i>=g.22;i--){5 c=h[q.3F(0,i)];4(c){5 a=[];$.K(c,3(i,x){4(1a(x.H,q)){a[a.7]=x}});6 a}}}6 14}}};$.D.2Q=3(e,g,f,k){5 h={G:"3E"};5 j,y=-1,w,1m="",1M=C,F,z;3 2r(){4(!1M)6;F=$("<3D/>").U().P(e.2H).T("3C","3B").1J(2p.2n);z=$("<3z/>").1J(F).3y(3(a){4(V(a).2m&&V(a).2m.3w()==\'2l\'){y=$("1F",z).1e(h.G).3u(V(a));$(V(a)).P(h.G)}}).2i(3(a){$(V(a)).P(h.G);f();g.1G();6 B}).3t(3(){k.1z=C}).3s(3(){k.1z=B});4(e.E>0)F.T("E",e.E);1M=B}3 V(a){5 b=a.V;3r(b&&b.3q!="2l")b=b.3p;4(!b)6[];6 b}3 S(b){j.17(y,y+1).1e(h.G);2h(b);5 a=j.17(y,y+1).P(h.G);4(e.1x){5 c=0;j.17(0,y).K(3(){c+=I.1i});4((c+a[0].1i-z.1c())>z[0].3o){z.1c(c+a[0].1i-z.3n())}A 4(c=j.1b()){y=0}}3 2g(a){6 e.Z&&e.Z").3m(e.1t(a,1m)).P(i%2==0?"3l":"3k").1J(z)[0];$.w(c,"2c",w[i])}j=z.3j("1F");4(e.1S){j.17(0,1).P(h.G);y=0}4($.31.2b)z.2b()}6{2T:3(d,q){2r();w=d;1m=q;2f()},2u:3(){S(1)},2y:3(){S(-1)},2t:3(){4(y!=0&&y-8<0){S(-y)}A{S(-8)}},2s:3(){4(y!=j.1b()-1&&y+8>j.1b()){S(j.1b()-1-y)}A{S(8)}},U:3(){F&&F.U();j&&j.1e(h.G);y=-1},L:3(){6 F&&F.3i(":L")},3h:3(){6 I.L()&&(j.2a("."+h.G)[0]||e.1S&&j[0])},1W:3(){5 a=$(g).3g();F.T({E:Y e.E=="1w"||e.E>0?e.E:$(g).E(),2E:a.2E+g.1i,1Q:a.1Q}).1W();4(e.1x){z.1c(0);z.T({29:e.1s,3e:\'3d\'});4($.1T.3b&&Y 2p.2n.3T.29==="3a"){5 c=0;j.K(3(){c+=I.1i});5 b=c>e.1s;z.T(\'3V\',b?e.1s:c);4(!b){j.E(z.E()-28(j.T("32-1Q"))-28(j.T("32-39")))}}}},26:3(){5 a=j&&j.2a("."+h.G).1e(h.G);6 a&&a.7&&$.w(a[0],"2c")},2J:3(){z&&z.2B()},1u:3(){F&&F.37()}}};$.D.1N=3(b,a,c){4(b.2O){5 d=b.2O();d.36(C);d.35("2P",a);d.4c("2P",c);d.4b()}A 4(b.2Y){b.2Y(a,c)}A{4(b.2X){b.2X=a;b.4a=c}}b.1G()}})(49);',62,261,'|||function|if|var|return|length|||||||||||||||||||||||||data||active|list|else|false|true|Autocompleter|width|element|ACTIVE|value|this|val|each|visible|result|break|toLowerCase|addClass|case|multipleSeparator|moveSelect|css|hide|target|onChange|bind|typeof|max||url|autocomplete||null|trigger|for|slice|flush|multiple|matchSubset|size|scrollTop|preventDefault|removeClass|populate|trimWords|add|offsetHeight|cacheLength|lastWord|hideResultsNow|term|arguments|extend|trim|formatMatch|parse|scrollHeight|highlight|unbind|formatResult|string|scroll|search|mouseDownOnSelect|autoFill|stopLoading|matchCase|delay|new|li|focus|setTimeout|clearTimeout|appendTo|formatItem|defaults|needsInit|Selection|push|continue|left|request|selectFirst|browser|selectCurrent|matchContains|show|unautocomplete|setOptions|split|flushCache|loadingClass|minChars|findValueCallback|inputClass||selected||parseInt|maxHeight|filter|bgiframe|ac_data|COMMA|BACKSPACE|fillList|limitNumberOfItems|movePosition|click|PAGEUP|hideResults|LI|nodeName|body|PAGEDOWN|document|ESC|init|pageDown|pageUp|next|RETURN|nullData|TAB|prev|strong|gi|empty|replace|DEL|top|keyCode|in|resultsClass|DOWN|emptyList|form|opera|dataType|UP|createTextRange|character|Select|extraParams|load|display|mustMatch|receiveData|Cache|selectionStart|setSelectionRange|join|ol|fn|padding|||moveStart|collapse|remove||right|undefined|msie|off|auto|overflow|attr|offset|current|is|find|ac_odd|ac_even|html|innerHeight|clientHeight|parentNode|tagName|while|mouseup|mousedown|index|blur|toUpperCase|188|mouseover|ul|default|absolute|position|div|ac_over|substr|charAt|indexOf|180|RegExp|100|switch|400|keydown|ac_loading|ac_results|keypress|ac_input|submit|style|150|height|success|limit|name|port||abort|mode|ajax|Date|timestamp||200|substring|jQuery|selectionEnd|select|moveEnd'.split('|'),0,{})) \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/lib/jquery.ajaxQueue.js b/plugins/Autocomplete/jquery-autocomplete/lib/jquery.ajaxQueue.js new file mode 100644 index 0000000000..bdd2e4f827 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/lib/jquery.ajaxQueue.js @@ -0,0 +1,116 @@ +/** + * Ajax Queue Plugin + * + * Homepage: http://jquery.com/plugins/project/ajaxqueue + * Documentation: http://docs.jquery.com/AjaxQueue + */ + +/** + + +
                  + + */ +/* + * Queued Ajax requests. + * A new Ajax request won't be started until the previous queued + * request has finished. + */ + +/* + * Synced Ajax requests. + * The Ajax request will happen as soon as you call this method, but + * the callbacks (success/error/complete) won't fire until all previous + * synced requests have been completed. + */ + + +(function($) { + + var ajax = $.ajax; + + var pendingRequests = {}; + + var synced = []; + var syncedData = []; + + $.ajax = function(settings) { + // create settings for compatibility with ajaxSetup + settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings)); + + var port = settings.port; + + switch(settings.mode) { + case "abort": + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return pendingRequests[port] = ajax.apply(this, arguments); + case "queue": + var _old = settings.complete; + settings.complete = function(){ + if ( _old ) + _old.apply( this, arguments ); + jQuery([ajax]).dequeue("ajax" + port );; + }; + + jQuery([ ajax ]).queue("ajax" + port, function(){ + ajax( settings ); + }); + return; + case "sync": + var pos = synced.length; + + synced[ pos ] = { + error: settings.error, + success: settings.success, + complete: settings.complete, + done: false + }; + + syncedData[ pos ] = { + error: [], + success: [], + complete: [] + }; + + settings.error = function(){ syncedData[ pos ].error = arguments; }; + settings.success = function(){ syncedData[ pos ].success = arguments; }; + settings.complete = function(){ + syncedData[ pos ].complete = arguments; + synced[ pos ].done = true; + + if ( pos == 0 || !synced[ pos-1 ] ) + for ( var i = pos; i < synced.length && synced[i].done; i++ ) { + if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error ); + if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success ); + if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete ); + + synced[i] = null; + syncedData[i] = null; + } + }; + } + return ajax.apply(this, arguments); + }; + +})(jQuery); \ No newline at end of file diff --git a/plugins/Autocomplete/jquery-autocomplete/lib/jquery.bgiframe.min.js b/plugins/Autocomplete/jquery-autocomplete/lib/jquery.bgiframe.min.js new file mode 100644 index 0000000000..7faef4b335 --- /dev/null +++ b/plugins/Autocomplete/jquery-autocomplete/lib/jquery.bgiframe.min.js @@ -0,0 +1,10 @@ +/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $ + * $Rev: 2447 $ + * + * Version 2.1.1 + */ +(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='