From 7818b9dc1cb32e776edf37d8819c6f1d7a13453f Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Mon, 18 Nov 2013 17:40:32 +0000 Subject: [PATCH] removed CRLF eol in many files --- example/SimpleWebServer/application.e | 88 ++-- .../request/head_request_handler.e | 230 ++++----- .../request/post_request_handler.e | 106 ++--- .../demo1/jquery.scrollTo-1.4.2/changes.txt | 180 +++---- .../jquery.scrollTo-min.js | 20 +- .../jquery.scrollTo-1.4.2/jquery.scrollTo.js | 428 ++++++++--------- .../SimpleWebServer/webroot/demo1/script.js | 22 +- .../SimpleWebServer/webroot/demo1/styles.css | 438 +++++++++--------- .../webroot/demo1/template.html | 278 +++++------ .../SimpleWebServer/webroot/demo2/demo.html | 86 ++-- .../SimpleWebServer/webroot/demo2/script.js | 240 +++++----- .../SimpleWebServer/webroot/demo2/styles.css | 296 ++++++------ .../webroot/example/html/contentpage.html | 304 ++++++------ .../webroot/example/html/css/styles.css | 320 ++++++------- .../webroot/example/html/index.html | 392 ++++++++-------- .../webroot/example/readme.html | 172 +++---- .../SimpleWebServer/webroot/html/images.html | 18 +- .../SimpleWebServer/webroot/html/simple.html | 20 +- .../webroot/html5/dataset.html | 196 ++++---- library/http_constants.e | 298 ++++++------ library/http_encoding_facilities.e | 120 ++--- library/http_server.e | 112 ++--- library/request/http_request_handler.e | 236 +++++----- library/response/http_response.e | 294 ++++++------ library/shared_uri_contents_types.e | 36 +- library/tcp_stream_socket.e | 164 +++---- library/uri_contents_types.e | 182 ++++---- nino.rc | 1 - readme.txt | 76 +-- 29 files changed, 2676 insertions(+), 2677 deletions(-) delete mode 100644 nino.rc diff --git a/example/SimpleWebServer/application.e b/example/SimpleWebServer/application.e index 51666fd4..16426905 100644 --- a/example/SimpleWebServer/application.e +++ b/example/SimpleWebServer/application.e @@ -1,44 +1,44 @@ -note - description : "nino application root class" - date : "$Date$" - revision : "$Revision$" - -class - APPLICATION - -inherit - ARGUMENTS - - HTTP_SERVER_SHARED_CONFIGURATION - -create - make - -feature {NONE} -- Initialization - - make - -- Run application. - local - l_server : HTTP_SERVER - l_cfg: HTTP_SERVER_CONFIGURATION - l_http_handler : HTTP_HANDLER - do - create l_cfg.make - l_cfg.http_server_port := 9_000 - l_cfg.document_root := default_document_root - set_server_configuration (l_cfg) - debug ("nino") - l_cfg.set_is_verbose (True) - end - - create l_server.make (l_cfg) - create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server) - l_server.setup (l_http_handler) - end - -feature -- Access - - default_document_root: STRING = "webroot" - -end - +note + description : "nino application root class" + date : "$Date$" + revision : "$Revision$" + +class + APPLICATION + +inherit + ARGUMENTS + + HTTP_SERVER_SHARED_CONFIGURATION + +create + make + +feature {NONE} -- Initialization + + make + -- Run application. + local + l_server : HTTP_SERVER + l_cfg: HTTP_SERVER_CONFIGURATION + l_http_handler : HTTP_HANDLER + do + create l_cfg.make + l_cfg.http_server_port := 9_000 + l_cfg.document_root := default_document_root + set_server_configuration (l_cfg) + debug ("nino") + l_cfg.set_is_verbose (True) + end + + create l_server.make (l_cfg) + create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server) + l_server.setup (l_http_handler) + end + +feature -- Access + + default_document_root: STRING = "webroot" + +end + diff --git a/example/SimpleWebServer/request/head_request_handler.e b/example/SimpleWebServer/request/head_request_handler.e index bf0cdd54..772d121a 100644 --- a/example/SimpleWebServer/request/head_request_handler.e +++ b/example/SimpleWebServer/request/head_request_handler.e @@ -1,115 +1,115 @@ -note - description: "Summary description for {HEAD_REQUEST_HANDLER}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - HEAD_REQUEST_HANDLER - -inherit - - SHARED_DOCUMENT_ROOT - - SHARED_URI_CONTENTS_TYPES - - HTTP_REQUEST_HANDLER - - HTTP_CONSTANTS - -feature - - - process - -- process the request and create an answer - local - fname: STRING - f: RAW_FILE - ctype, extension: STRING - do - fname := document_root_cell.item.twin - fname.append (request_uri) - debug - print ("URI name: " + fname ) - end - create f.make (fname) - create answer.make - if f.exists then - extension := ct_table.extension (request_uri) - ctype := ct_table.content_types.item (extension) - -- TODO: This code could be improved to avoid string - -- comparisons - if ctype = Void then - process_default - answer.set_content_type ("text/html") - else - if ctype.is_equal ("text/html") then - process_text_file (f) - else - process_raw_file (f) - end - answer.set_content_type (ctype) - end - else - answer.set_status_code (not_found) - answer.set_reason_phrase (not_found_message) - answer.set_reply_text ("Not found on this server%N%R") - end - end - - process_default - -- - local - html : STRING - do - answer.set_reply_text ("") - html := " Micro HTTPD " + - " " + - " " + - "

Welcome to Micro HTTPD!

"+ - "

Default page " + - - "

" + - " " + - " " - answer.append_reply_text (html) - end - - - process_text_file (f: FILE) - -- send a text file reply - require - valid_f: f /= Void - do - f.open_read - from - answer.set_reply_text ("") - f.read_line - until f.end_of_file - loop - answer.append_reply_text (f.last_string) - answer.append_reply_text (crlf) - f.read_line - end - f.close - end - - process_raw_file (f: FILE) - -- send a raw file reply - require - valid_f: f /= Void - do - -- this is not quite right.... - f.open_read - from - answer.set_reply_text ("") - until f.end_of_file - loop - f.read_stream (1024) - answer.append_reply_text (f.last_string) - end - f.close - end - - -end +note + description: "Summary description for {HEAD_REQUEST_HANDLER}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + HEAD_REQUEST_HANDLER + +inherit + + SHARED_DOCUMENT_ROOT + + SHARED_URI_CONTENTS_TYPES + + HTTP_REQUEST_HANDLER + + HTTP_CONSTANTS + +feature + + + process + -- process the request and create an answer + local + fname: STRING + f: RAW_FILE + ctype, extension: STRING + do + fname := document_root_cell.item.twin + fname.append (request_uri) + debug + print ("URI name: " + fname ) + end + create f.make (fname) + create answer.make + if f.exists then + extension := ct_table.extension (request_uri) + ctype := ct_table.content_types.item (extension) + -- TODO: This code could be improved to avoid string + -- comparisons + if ctype = Void then + process_default + answer.set_content_type ("text/html") + else + if ctype.is_equal ("text/html") then + process_text_file (f) + else + process_raw_file (f) + end + answer.set_content_type (ctype) + end + else + answer.set_status_code (not_found) + answer.set_reason_phrase (not_found_message) + answer.set_reply_text ("Not found on this server%N%R") + end + end + + process_default + -- + local + html : STRING + do + answer.set_reply_text ("") + html := " Micro HTTPD " + + " " + + " " + + "

Welcome to Micro HTTPD!

"+ + "

Default page " + + + "

" + + " " + + " " + answer.append_reply_text (html) + end + + + process_text_file (f: FILE) + -- send a text file reply + require + valid_f: f /= Void + do + f.open_read + from + answer.set_reply_text ("") + f.read_line + until f.end_of_file + loop + answer.append_reply_text (f.last_string) + answer.append_reply_text (crlf) + f.read_line + end + f.close + end + + process_raw_file (f: FILE) + -- send a raw file reply + require + valid_f: f /= Void + do + -- this is not quite right.... + f.open_read + from + answer.set_reply_text ("") + until f.end_of_file + loop + f.read_stream (1024) + answer.append_reply_text (f.last_string) + end + f.close + end + + +end diff --git a/example/SimpleWebServer/request/post_request_handler.e b/example/SimpleWebServer/request/post_request_handler.e index 478660eb..ef130e8d 100644 --- a/example/SimpleWebServer/request/post_request_handler.e +++ b/example/SimpleWebServer/request/post_request_handler.e @@ -1,53 +1,53 @@ -note - description: "Summary description for {POST_REQUEST_HANDLER}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - POST_REQUEST_HANDLER - -inherit - GET_REQUEST_HANDLER - redefine - process - end - -create - make - -feature -- Execution - - process - -- process the request and create an answer - local - l_data: STRING - s: detachable STRING - n: INTEGER - sock: like socket - do - from - n := 1_024 - sock := socket - if sock.socket_ok then - sock.read_stream_thread_aware (n) - s := sock.last_string - else - s := Void - end - create l_data.make_empty - until - s = Void or else s.count < n - loop - l_data.append_string (s) - if sock.socket_ok then - sock.read_stream_thread_aware (n) - s := sock.last_string - else - s := Void - end - end - Precursor - end - -end +note + description: "Summary description for {POST_REQUEST_HANDLER}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + POST_REQUEST_HANDLER + +inherit + GET_REQUEST_HANDLER + redefine + process + end + +create + make + +feature -- Execution + + process + -- process the request and create an answer + local + l_data: STRING + s: detachable STRING + n: INTEGER + sock: like socket + do + from + n := 1_024 + sock := socket + if sock.socket_ok then + sock.read_stream_thread_aware (n) + s := sock.last_string + else + s := Void + end + create l_data.make_empty + until + s = Void or else s.count < n + loop + l_data.append_string (s) + if sock.socket_ok then + sock.read_stream_thread_aware (n) + s := sock.last_string + else + s := Void + end + end + Precursor + end + +end diff --git a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/changes.txt b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/changes.txt index 4b2933f6..06459d60 100644 --- a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/changes.txt +++ b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/changes.txt @@ -1,91 +1,91 @@ -1.4.2 -[Feature] -- The plugin support percentages as target ('50%' or {top:'50%', left:'45%'}) -- Exposed the max() calculation as $.scrollTo.max -[Enhancement] -- Renamed $.fn.scrollable to $.fn._scrollable to avoid conflicts with other plugins -[Fix] -- Fixing max calculations for regular DOM elements - -1.4.1 -[Feature] -- The target can be 'max' to scroll to the end while keeping it elegant. -[Enhancement] -- Default duration is 0 for jquery +1.3. Means sync animation -- The plugin works on all major browsers, on compat & quirks modes, including iframes. -- In addition to window/document, if html or body are received, the plugin will choose the right one. -[Fix] -- The plugin accepts floating numbers, Thanks Ramin -- Using jQuery.nodeName where neccessary so that this works on xml+xhtml -- The max() internal function wasn't completely accurrate, now it is 98% (except for IE on quirks mode and it's not too noticeable). - -1.4 -[Fix] -- Fixed the problem when scrolling the window to absolute positioned elements on Safari. -- Fixed the problem on Opera 9.5 when scrolling the window. That it always scrolls to 0. -[Feature] -- Added the settings object as 2nd argument to the onAfter callback. -- The 3rd argument of scrollTo can be just a function and it's used as the onAfter. -- Added full support for iframes (even max scroll calculation). -- Instead of $.scrollTo, $(window).scrollTo() and $(document).scrollTo() can be used. -- Added $().scrollable() that returns the real element to scroll, f.e: $(window).scrollable() == [body|html], works for iframes. -[Enhancement] -- Cleaned the code a bit, specially the comments - -1.3.3 -[Change] -- Changed the licensing from GPL to GPL+MIT. - -1.3.2 -[Enhancement] -- Small improvements to make the code shorter. -[Change] -- Removed the last argument received by onAfter as it was the same as the 'this' but jqueryfied. - -1.3.1 -[Feature] -- Exposed $.scrollTo.window() to get the element that needs to be animated, to scroll the window. -- Added option 'over'. -[Enhancement] -- Made the code as short as possible. -[Change] -- Changed the arguments received by onAfter - -1.3 -[Enhancement] -- Added semicolon to the start, for safe file concatenation -- Added a limit check, values below 0 or over the maximum are fixed. -- Now it should work faster, only one of html or body go through all the processing, instead of both for all browsers. -[Fix] -- Fixed the behavior for Opera, which seemed to react to both changes on and . -- The border is also reduced, when 'margin' is set to true. -[Change] -- The option speed has been renamed to duration. -[Feature] -- The duration can be specified with a number as 2nd argument, and the rest of the settings as the third ( like $().animate ) -- Remade the demo - -1.2.4 -[Enhancement] -- The target can be in the form of { top:x, left:y } allowing different position for each axis. -[Feature] -- The option 'offset' has been added, to scroll behind or past the target. Can be a number(both axes) or { top:x, left:y }. - -1.2.3 -[Feature] -- Exposed the defaults. -[Enhancement] -- Made the callback functions receive more parameters. - -1.2.2 -[Fix] -- Fixed a bug, I didn't have to add the scrolled amount if it was body or html. - -1.2 -[Change] -- The option 'onafter' is now called 'onAfter'. -[Feature] -- Two axes can be scrolled together, this is set with the option 'axis'. -- In case 2 axes are chosen, the scrolling can be queued: one scrolls, and then the other. -- There's an intermediary event, 'onAfterFirst' called in case the axes are queued, after the first ends. +1.4.2 +[Feature] +- The plugin support percentages as target ('50%' or {top:'50%', left:'45%'}) +- Exposed the max() calculation as $.scrollTo.max +[Enhancement] +- Renamed $.fn.scrollable to $.fn._scrollable to avoid conflicts with other plugins +[Fix] +- Fixing max calculations for regular DOM elements + +1.4.1 +[Feature] +- The target can be 'max' to scroll to the end while keeping it elegant. +[Enhancement] +- Default duration is 0 for jquery +1.3. Means sync animation +- The plugin works on all major browsers, on compat & quirks modes, including iframes. +- In addition to window/document, if html or body are received, the plugin will choose the right one. +[Fix] +- The plugin accepts floating numbers, Thanks Ramin +- Using jQuery.nodeName where neccessary so that this works on xml+xhtml +- The max() internal function wasn't completely accurrate, now it is 98% (except for IE on quirks mode and it's not too noticeable). + +1.4 +[Fix] +- Fixed the problem when scrolling the window to absolute positioned elements on Safari. +- Fixed the problem on Opera 9.5 when scrolling the window. That it always scrolls to 0. +[Feature] +- Added the settings object as 2nd argument to the onAfter callback. +- The 3rd argument of scrollTo can be just a function and it's used as the onAfter. +- Added full support for iframes (even max scroll calculation). +- Instead of $.scrollTo, $(window).scrollTo() and $(document).scrollTo() can be used. +- Added $().scrollable() that returns the real element to scroll, f.e: $(window).scrollable() == [body|html], works for iframes. +[Enhancement] +- Cleaned the code a bit, specially the comments + +1.3.3 +[Change] +- Changed the licensing from GPL to GPL+MIT. + +1.3.2 +[Enhancement] +- Small improvements to make the code shorter. +[Change] +- Removed the last argument received by onAfter as it was the same as the 'this' but jqueryfied. + +1.3.1 +[Feature] +- Exposed $.scrollTo.window() to get the element that needs to be animated, to scroll the window. +- Added option 'over'. +[Enhancement] +- Made the code as short as possible. +[Change] +- Changed the arguments received by onAfter + +1.3 +[Enhancement] +- Added semicolon to the start, for safe file concatenation +- Added a limit check, values below 0 or over the maximum are fixed. +- Now it should work faster, only one of html or body go through all the processing, instead of both for all browsers. +[Fix] +- Fixed the behavior for Opera, which seemed to react to both changes on and . +- The border is also reduced, when 'margin' is set to true. +[Change] +- The option speed has been renamed to duration. +[Feature] +- The duration can be specified with a number as 2nd argument, and the rest of the settings as the third ( like $().animate ) +- Remade the demo + +1.2.4 +[Enhancement] +- The target can be in the form of { top:x, left:y } allowing different position for each axis. +[Feature] +- The option 'offset' has been added, to scroll behind or past the target. Can be a number(both axes) or { top:x, left:y }. + +1.2.3 +[Feature] +- Exposed the defaults. +[Enhancement] +- Made the callback functions receive more parameters. + +1.2.2 +[Fix] +- Fixed a bug, I didn't have to add the scrolled amount if it was body or html. + +1.2 +[Change] +- The option 'onafter' is now called 'onAfter'. +[Feature] +- Two axes can be scrolled together, this is set with the option 'axis'. +- In case 2 axes are chosen, the scrolling can be queued: one scrolls, and then the other. +- There's an intermediary event, 'onAfterFirst' called in case the axes are queued, after the first ends. - If the option 'margin' is set to true, the plugin will take in account, the margin of the target(no use if target is a value). \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo-min.js b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo-min.js index 73a33418..5e787781 100644 --- a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo-min.js +++ b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo-min.js @@ -1,11 +1,11 @@ -/** - * jQuery.ScrollTo - Easy element scrolling using jQuery. - * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com - * Dual licensed under MIT and GPL. - * Date: 5/25/2009 - * @author Ariel Flesler - * @version 1.4.2 - * - * http://flesler.blogspot.com/2007/10/jqueryscrollto.html - */ +/** + * jQuery.ScrollTo - Easy element scrolling using jQuery. + * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 5/25/2009 + * @author Ariel Flesler + * @version 1.4.2 + * + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + */ ;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo.js b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo.js index eec31e19..753e62c4 100644 --- a/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo.js +++ b/example/SimpleWebServer/webroot/demo1/jquery.scrollTo-1.4.2/jquery.scrollTo.js @@ -1,215 +1,215 @@ -/** - * jQuery.ScrollTo - * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com - * Dual licensed under MIT and GPL. - * Date: 5/25/2009 - * - * @projectDescription Easy element scrolling using jQuery. - * http://flesler.blogspot.com/2007/10/jqueryscrollto.html - * Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP. - * - * @author Ariel Flesler - * @version 1.4.2 - * - * @id jQuery.scrollTo - * @id jQuery.fn.scrollTo - * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. - * The different options for target are: - * - A number position (will be applied to all axes). - * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes - * - A jQuery/DOM element ( logically, child of the element to scroll ) - * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) - * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. -* - A percentage of the container's dimension/s, for example: 50% to go to the middle. - * - The string 'max' for go-to-end. - * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. - * @param {Object,Function} settings Optional set of settings or the onAfter callback. - * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. - * @option {Number} duration The OVERALL length of the animation. - * @option {String} easing The easing method for the animation. - * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. - * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. - * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. - * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. - * @option {Function} onAfter Function to be called after the scrolling ends. - * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. - * @return {jQuery} Returns the same jQuery object, for chaining. - * - * @desc Scroll to a fixed position - * @example $('div').scrollTo( 340 ); - * - * @desc Scroll relatively to the actual position - * @example $('div').scrollTo( '+=340px', { axis:'y' } ); - * - * @dec Scroll using a selector (relative to the scrolled element) - * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); - * - * @ Scroll to a DOM element (same for jQuery object) - * @example var second_child = document.getElementById('container').firstChild.nextSibling; - * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ - * alert('scrolled!!'); - * }}); - * - * @desc Scroll on both axes, to different values - * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); - */ -;(function( $ ){ - - var $scrollTo = $.scrollTo = function( target, duration, settings ){ - $(window).scrollTo( target, duration, settings ); - }; - - $scrollTo.defaults = { - axis:'xy', - duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1 - }; - - // Returns the element that needs to be animated to scroll the window. - // Kept for backwards compatibility (specially for localScroll & serialScroll) - $scrollTo.window = function( scope ){ - return $(window)._scrollable(); - }; - - // Hack, hack, hack :) - // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) - $.fn._scrollable = function(){ - return this.map(function(){ - var elem = this, - isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; - - if( !isWin ) - return elem; - - var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; - - return $.browser.safari || doc.compatMode == 'BackCompat' ? - doc.body : - doc.documentElement; - }); - }; - - $.fn.scrollTo = function( target, duration, settings ){ - if( typeof duration == 'object' ){ - settings = duration; - duration = 0; - } - if( typeof settings == 'function' ) - settings = { onAfter:settings }; - - if( target == 'max' ) - target = 9e9; - - settings = $.extend( {}, $scrollTo.defaults, settings ); - // Speed is still recognized for backwards compatibility - duration = duration || settings.speed || settings.duration; - // Make sure the settings are given right - settings.queue = settings.queue && settings.axis.length > 1; - - if( settings.queue ) - // Let's keep the overall duration - duration /= 2; - settings.offset = both( settings.offset ); - settings.over = both( settings.over ); - - return this._scrollable().each(function(){ - var elem = this, - $elem = $(elem), - targ = target, toff, attr = {}, - win = $elem.is('html,body'); - - switch( typeof targ ){ - // A number will pass the regex - case 'number': - case 'string': - if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ - targ = both( targ ); - // We are done - break; - } - // Relative selector, no break! - targ = $(targ,this); - case 'object': - // DOMElement / jQuery - if( targ.is || targ.style ) - // Get the real position of the target - toff = (targ = $(targ)).offset(); - } - $.each( settings.axis.split(''), function( i, axis ){ - var Pos = axis == 'x' ? 'Left' : 'Top', - pos = Pos.toLowerCase(), - key = 'scroll' + Pos, - old = elem[key], - max = $scrollTo.max(elem, axis); - - if( toff ){// jQuery / DOMElement - attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); - - // If it's a dom element, reduce the margin - if( settings.margin ){ - attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; - attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; - } - - attr[key] += settings.offset[pos] || 0; - - if( settings.over[pos] ) - // Scroll to a fraction of its width/height - attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; - }else{ - var val = targ[pos]; - // Handle percentage values - attr[key] = val.slice && val.slice(-1) == '%' ? - parseFloat(val) / 100 * max - : val; - } - - // Number or 'number' - if( /^\d+$/.test(attr[key]) ) - // Check the limits - attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); - - // Queueing axes - if( !i && settings.queue ){ - // Don't waste time animating, if there's no need. - if( old != attr[key] ) - // Intermediate animation - animate( settings.onAfterFirst ); - // Don't animate this axis again in the next iteration. - delete attr[key]; - } - }); - - animate( settings.onAfter ); - - function animate( callback ){ - $elem.animate( attr, duration, settings.easing, callback && function(){ - callback.call(this, target, settings); - }); - }; - - }).end(); - }; - - // Max scrolling position, works on quirks mode - // It only fails (not too badly) on IE, quirks mode. - $scrollTo.max = function( elem, axis ){ - var Dim = axis == 'x' ? 'Width' : 'Height', - scroll = 'scroll'+Dim; - - if( !$(elem).is('html,body') ) - return elem[scroll] - $(elem)[Dim.toLowerCase()](); - - var size = 'client' + Dim, - html = elem.ownerDocument.documentElement, - body = elem.ownerDocument.body; - - return Math.max( html[scroll], body[scroll] ) - - Math.min( html[size] , body[size] ); - - }; - - function both( val ){ - return typeof val == 'object' ? val : { top:val, left:val }; - }; - +/** + * jQuery.ScrollTo + * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 5/25/2009 + * + * @projectDescription Easy element scrolling using jQuery. + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP. + * + * @author Ariel Flesler + * @version 1.4.2 + * + * @id jQuery.scrollTo + * @id jQuery.fn.scrollTo + * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. + * The different options for target are: + * - A number position (will be applied to all axes). + * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes + * - A jQuery/DOM element ( logically, child of the element to scroll ) + * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) + * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. +* - A percentage of the container's dimension/s, for example: 50% to go to the middle. + * - The string 'max' for go-to-end. + * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. + * @param {Object,Function} settings Optional set of settings or the onAfter callback. + * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. + * @option {Number} duration The OVERALL length of the animation. + * @option {String} easing The easing method for the animation. + * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. + * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. + * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. + * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. + * @option {Function} onAfter Function to be called after the scrolling ends. + * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. + * @return {jQuery} Returns the same jQuery object, for chaining. + * + * @desc Scroll to a fixed position + * @example $('div').scrollTo( 340 ); + * + * @desc Scroll relatively to the actual position + * @example $('div').scrollTo( '+=340px', { axis:'y' } ); + * + * @dec Scroll using a selector (relative to the scrolled element) + * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); + * + * @ Scroll to a DOM element (same for jQuery object) + * @example var second_child = document.getElementById('container').firstChild.nextSibling; + * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ + * alert('scrolled!!'); + * }}); + * + * @desc Scroll on both axes, to different values + * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); + */ +;(function( $ ){ + + var $scrollTo = $.scrollTo = function( target, duration, settings ){ + $(window).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1 + }; + + // Returns the element that needs to be animated to scroll the window. + // Kept for backwards compatibility (specially for localScroll & serialScroll) + $scrollTo.window = function( scope ){ + return $(window)._scrollable(); + }; + + // Hack, hack, hack :) + // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) + $.fn._scrollable = function(){ + return this.map(function(){ + var elem = this, + isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; + + if( !isWin ) + return elem; + + var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; + + return $.browser.safari || doc.compatMode == 'BackCompat' ? + doc.body : + doc.documentElement; + }); + }; + + $.fn.scrollTo = function( target, duration, settings ){ + if( typeof duration == 'object' ){ + settings = duration; + duration = 0; + } + if( typeof settings == 'function' ) + settings = { onAfter:settings }; + + if( target == 'max' ) + target = 9e9; + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.speed || settings.duration; + // Make sure the settings are given right + settings.queue = settings.queue && settings.axis.length > 1; + + if( settings.queue ) + // Let's keep the overall duration + duration /= 2; + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this._scrollable().each(function(){ + var elem = this, + $elem = $(elem), + targ = target, toff, attr = {}, + win = $elem.is('html,body'); + + switch( typeof targ ){ + // A number will pass the regex + case 'number': + case 'string': + if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ + targ = both( targ ); + // We are done + break; + } + // Relative selector, no break! + targ = $(targ,this); + case 'object': + // DOMElement / jQuery + if( targ.is || targ.style ) + // Get the real position of the target + toff = (targ = $(targ)).offset(); + } + $.each( settings.axis.split(''), function( i, axis ){ + var Pos = axis == 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + old = elem[key], + max = $scrollTo.max(elem, axis); + + if( toff ){// jQuery / DOMElement + attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); + + // If it's a dom element, reduce the margin + if( settings.margin ){ + attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; + attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; + } + + attr[key] += settings.offset[pos] || 0; + + if( settings.over[pos] ) + // Scroll to a fraction of its width/height + attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; + }else{ + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice(-1) == '%' ? + parseFloat(val) / 100 * max + : val; + } + + // Number or 'number' + if( /^\d+$/.test(attr[key]) ) + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + + // Queueing axes + if( !i && settings.queue ){ + // Don't waste time animating, if there's no need. + if( old != attr[key] ) + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + delete attr[key]; + } + }); + + animate( settings.onAfter ); + + function animate( callback ){ + $elem.animate( attr, duration, settings.easing, callback && function(){ + callback.call(this, target, settings); + }); + }; + + }).end(); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function( elem, axis ){ + var Dim = axis == 'x' ? 'Width' : 'Height', + scroll = 'scroll'+Dim; + + if( !$(elem).is('html,body') ) + return elem[scroll] - $(elem)[Dim.toLowerCase()](); + + var size = 'client' + Dim, + html = elem.ownerDocument.documentElement, + body = elem.ownerDocument.body; + + return Math.max( html[scroll], body[scroll] ) + - Math.min( html[size] , body[size] ); + + }; + + function both( val ){ + return typeof val == 'object' ? val : { top:val, left:val }; + }; + })( jQuery ); \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/demo1/script.js b/example/SimpleWebServer/webroot/demo1/script.js index 55571713..62d1b396 100644 --- a/example/SimpleWebServer/webroot/demo1/script.js +++ b/example/SimpleWebServer/webroot/demo1/script.js @@ -1,12 +1,12 @@ -$(document).ready(function(){ - /* This code is executed after the DOM has been completely loaded */ - - $('nav a,footer a.up').click(function(e){ - - // If a link has been clicked, scroll the page to the link's hash target: - - $.scrollTo( this.hash || 0, 1500); - e.preventDefault(); - }); - +$(document).ready(function(){ + /* This code is executed after the DOM has been completely loaded */ + + $('nav a,footer a.up').click(function(e){ + + // If a link has been clicked, scroll the page to the link's hash target: + + $.scrollTo( this.hash || 0, 1500); + e.preventDefault(); + }); + }); \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/demo1/styles.css b/example/SimpleWebServer/webroot/demo1/styles.css index ee4db145..0e0ee702 100644 --- a/example/SimpleWebServer/webroot/demo1/styles.css +++ b/example/SimpleWebServer/webroot/demo1/styles.css @@ -1,219 +1,219 @@ -*{ - /* Universal reset: */ - margin:0; - padding:0; -} - -header,footer, -article,section, -hgroup,nav, -figure{ - /* Giving a display value to the HTML5 rendered elements: */ - display:block; -} - -body{ - /* Setting the default text color, size, page background and a font stack: */ - font-size:0.825em; - color:#fcfcfc; - background-color:#355664; - font-family:Arial, Helvetica, sans-serif; -} - -/* Hyperlink Styles: */ - -a, a:visited { - color:#0196e3; - text-decoration:none; - outline:none; -} - -a:hover{ - text-decoration:underline; -} - -a img{ - border:none; -} - -/* Headings: */ - -h1,h2,h3{ - font-family:"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; - text-shadow:0 1px 1px black; -} - -h1{ - /* The logo text */ - font-size:3.5em; - padding:0.5em 0 0; - text-transform:uppercase; -} - -h3{ - /* The slogan text */ - font-family:forte,"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; - font-size:2em; - font-weight:normal; - margin:0 0 1em; -} - - -h2{ - font-size:2.2em; - font-weight:normal; - letter-spacing:0.01em; - text-transform:uppercase; -} - -p{ - line-height:1.5em; - padding-bottom:1em; -} - -.line{ - /* The dividing line: */ - height:1px; - background-color:#24404c; - border-bottom:1px solid #416371; - margin:1em 0; - overflow:hidden; -} - -article .line{ - /* The dividing line inside of the article is darker: */ - background-color:#15242a; - border-bottom-color:#204656; - margin:1.3em 0; -} - -footer .line{ - margin:2em 0; -} - -nav{ - background:url(img/gradient_light.jpg) repeat-x 50% 50% #f8f8f8; - padding:0 5px; - position:absolute; - right:0; - top:4em; - - border:1px solid #FCFCFC; - - -moz-box-shadow:0 1px 1px #333333; - -webkit-box-shadow:0 1px 1px #333333; - box-shadow:0 1px 1px #333333; -} - -/* The clearfix hack to clear the floats: */ - -.clear:after{ - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} - -/* The navigation styling: */ - -nav ul li{ - display:inline; -} - -nav ul li a, -nav ul li a:visited{ - color:#565656; - display:block; - float:left; - font-size:1.25em; - font-weight:bold; - margin:5px 2px; - padding:7px 10px 4px; - text-shadow:0 1px 1px white; - text-transform:uppercase; -} - -nav ul li a:hover{ - text-decoration:none; - background-color:#f0f0f0; -} - -nav, article, nav ul li a,figure{ - /* Applying CSS3 rounded corners: */ - -moz-border-radius:10px; - -webkit-border-radius:10px; - border-radius:10px; -} - -/* Article styles: */ - -#page{ - width:960px; - margin:0 auto; - position:relative; -} - -article{ - background-color:#213E4A; - margin:3em 0; - padding:20px; - - text-shadow:0 2px 0 black; -} - -figure{ - border:3px solid #142830; - float:right; - height:300px; - margin-left:15px; - overflow:hidden; - width:500px; -} - -figure:hover{ - -moz-box-shadow:0 0 2px #4D7788; - -webkit-box-shadow:0 0 2px #4D7788; - box-shadow:0 0 2px #4D7788; -} - -figure img{ - margin-left:-60px; -} - -/* Footer styling: */ - -footer{ - margin-bottom:30px; - text-align:center; - font-size:0.825em; -} - - -footer p{ - margin-bottom:-2.5em; - position:relative; -} - -footer a,footer a:visited{ - color:#cccccc; - background-color:#213e4a; - display:block; - padding:2px 4px; - z-index:100; - position:relative; -} - -footer a:hover{ - text-decoration:none; - background-color:#142830; -} - -footer a.by{ - float:left; - -} - -footer a.up{ - float:right; -} +*{ + /* Universal reset: */ + margin:0; + padding:0; +} + +header,footer, +article,section, +hgroup,nav, +figure{ + /* Giving a display value to the HTML5 rendered elements: */ + display:block; +} + +body{ + /* Setting the default text color, size, page background and a font stack: */ + font-size:0.825em; + color:#fcfcfc; + background-color:#355664; + font-family:Arial, Helvetica, sans-serif; +} + +/* Hyperlink Styles: */ + +a, a:visited { + color:#0196e3; + text-decoration:none; + outline:none; +} + +a:hover{ + text-decoration:underline; +} + +a img{ + border:none; +} + +/* Headings: */ + +h1,h2,h3{ + font-family:"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; + text-shadow:0 1px 1px black; +} + +h1{ + /* The logo text */ + font-size:3.5em; + padding:0.5em 0 0; + text-transform:uppercase; +} + +h3{ + /* The slogan text */ + font-family:forte,"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; + font-size:2em; + font-weight:normal; + margin:0 0 1em; +} + + +h2{ + font-size:2.2em; + font-weight:normal; + letter-spacing:0.01em; + text-transform:uppercase; +} + +p{ + line-height:1.5em; + padding-bottom:1em; +} + +.line{ + /* The dividing line: */ + height:1px; + background-color:#24404c; + border-bottom:1px solid #416371; + margin:1em 0; + overflow:hidden; +} + +article .line{ + /* The dividing line inside of the article is darker: */ + background-color:#15242a; + border-bottom-color:#204656; + margin:1.3em 0; +} + +footer .line{ + margin:2em 0; +} + +nav{ + background:url(img/gradient_light.jpg) repeat-x 50% 50% #f8f8f8; + padding:0 5px; + position:absolute; + right:0; + top:4em; + + border:1px solid #FCFCFC; + + -moz-box-shadow:0 1px 1px #333333; + -webkit-box-shadow:0 1px 1px #333333; + box-shadow:0 1px 1px #333333; +} + +/* The clearfix hack to clear the floats: */ + +.clear:after{ + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* The navigation styling: */ + +nav ul li{ + display:inline; +} + +nav ul li a, +nav ul li a:visited{ + color:#565656; + display:block; + float:left; + font-size:1.25em; + font-weight:bold; + margin:5px 2px; + padding:7px 10px 4px; + text-shadow:0 1px 1px white; + text-transform:uppercase; +} + +nav ul li a:hover{ + text-decoration:none; + background-color:#f0f0f0; +} + +nav, article, nav ul li a,figure{ + /* Applying CSS3 rounded corners: */ + -moz-border-radius:10px; + -webkit-border-radius:10px; + border-radius:10px; +} + +/* Article styles: */ + +#page{ + width:960px; + margin:0 auto; + position:relative; +} + +article{ + background-color:#213E4A; + margin:3em 0; + padding:20px; + + text-shadow:0 2px 0 black; +} + +figure{ + border:3px solid #142830; + float:right; + height:300px; + margin-left:15px; + overflow:hidden; + width:500px; +} + +figure:hover{ + -moz-box-shadow:0 0 2px #4D7788; + -webkit-box-shadow:0 0 2px #4D7788; + box-shadow:0 0 2px #4D7788; +} + +figure img{ + margin-left:-60px; +} + +/* Footer styling: */ + +footer{ + margin-bottom:30px; + text-align:center; + font-size:0.825em; +} + + +footer p{ + margin-bottom:-2.5em; + position:relative; +} + +footer a,footer a:visited{ + color:#cccccc; + background-color:#213e4a; + display:block; + padding:2px 4px; + z-index:100; + position:relative; +} + +footer a:hover{ + text-decoration:none; + background-color:#142830; +} + +footer a.by{ + float:left; + +} + +footer a.up{ + float:right; +} diff --git a/example/SimpleWebServer/webroot/demo1/template.html b/example/SimpleWebServer/webroot/demo1/template.html index cde688dc..63f1f5d7 100644 --- a/example/SimpleWebServer/webroot/demo1/template.html +++ b/example/SimpleWebServer/webroot/demo1/template.html @@ -1,139 +1,139 @@ - - - - - - - Coding A CSS3 & HTML5 One Page Template | Tutorialzine demo - - - - - - - - - - - -
- -
- -
-

Your Logo

-

and a fancy slogan

-
- - - -
- -
- - - -
- -
-

Photoshoot Effect

- -
- -
- -
- -
- -

In this tutorial, we are creating a photo shoot effect with our just-released PhotoShoot jQuery plug-in. With it you can convert a regular div on the page into a photo shooting stage simulating a camera-like feel.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

-
-
- - - - - - -
- -
-

Sweet AJAX Tabs

- -
- -
-
- -
- -

Here we are making sweet AJAX-powered tabs with CSS3 and the newly released version 1.4 of jQuery.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

-
-
- - - - - -
- -
-

Halftone Navigation Menu

- -
- -
-
- -
- -

Today we are making a CSS3 & jQuery halftone-style navigation menu, which will allow you to display animated halftone-style shapes in accordance with the navigation links, and will provide a simple editor for creating additional shapes as well.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

-
-
- - - - -
- - - -
- - - - - - - - + + + + + + + Coding A CSS3 & HTML5 One Page Template | Tutorialzine demo + + + + + + + + + + + +
+ +
+ +
+

Your Logo

+

and a fancy slogan

+
+ + + +
+ +
+ + + +
+ +
+

Photoshoot Effect

+ +
+ +
+ +
+ +
+ +

In this tutorial, we are creating a photo shoot effect with our just-released PhotoShoot jQuery plug-in. With it you can convert a regular div on the page into a photo shooting stage simulating a camera-like feel.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

+
+
+ + + + + + +
+ +
+

Sweet AJAX Tabs

+ +
+ +
+
+ +
+ +

Here we are making sweet AJAX-powered tabs with CSS3 and the newly released version 1.4 of jQuery.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

+
+
+ + + + + +
+ +
+

Halftone Navigation Menu

+ +
+ +
+
+ +
+ +

Today we are making a CSS3 & jQuery halftone-style navigation menu, which will allow you to display animated halftone-style shapes in accordance with the navigation links, and will provide a simple editor for creating additional shapes as well.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer luctus quam quis nibh fringilla sit amet consectetur lectus malesuada. Sed nec libero erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mi nisi, rhoncus ut vestibulum ac, sollicitudin quis lorem. Duis felis dui, vulputate nec adipiscing nec, interdum vel tortor. Sed gravida, erat nec rutrum tincidunt, metus mauris imperdiet nunc, et elementum tortor nunc at eros. Donec malesuada congue molestie. Suspendisse potenti. Vestibulum cursus congue sem et feugiat. Morbi quis elit odio.

+
+
+ + + + +
+ + + +
+ + + + + + + + diff --git a/example/SimpleWebServer/webroot/demo2/demo.html b/example/SimpleWebServer/webroot/demo2/demo.html index fa7a7881..38112636 100644 --- a/example/SimpleWebServer/webroot/demo2/demo.html +++ b/example/SimpleWebServer/webroot/demo2/demo.html @@ -1,43 +1,43 @@ - - - - -Halftone Navigation Menu With jQuery & CSS3 | Tutorialzine demo - - - - - - - - - - - -

Halftone Navigation Menu With jQuery & CSS3

-

View the original tutorial »

- - -
- - - -
- -
-
- -

This is a tutorialzine demo. View the original tutorial, or download the source files.

- - - - + + + + +Halftone Navigation Menu With jQuery & CSS3 | Tutorialzine demo + + + + + + + + + + + +

Halftone Navigation Menu With jQuery & CSS3

+

View the original tutorial »

+ + +
+ + + +
+ +
+
+ +

This is a tutorialzine demo. View the original tutorial, or download the source files.

+ + + + diff --git a/example/SimpleWebServer/webroot/demo2/script.js b/example/SimpleWebServer/webroot/demo2/script.js index 7cd3fbe5..150302f2 100644 --- a/example/SimpleWebServer/webroot/demo2/script.js +++ b/example/SimpleWebServer/webroot/demo2/script.js @@ -1,121 +1,121 @@ -/* Set serviceMode to true to create your own shapes: */ -var serviceMode = false; - -$(document).ready(function(){ - /* This code is executed after the DOM has been completely loaded */ - - var str=[]; - var perRow = 16; - - /* Generating the dot divs: */ - - for(var i=0;i<192;i++) - { - str.push('
'); - } - - /* Joining the array into a string and adding it to the inner html of the stage div: */ - - $('#stage').html(str.join('')); - - /* Using the hover method: */ - - $('#navigation li a').hover(function(e){ - - /* serviceDraw is a cut-out version of the draw function, used for shape editing and composing: */ - - if(serviceMode) - serviceDraw($(this).attr('class')); - else - draw($(this).attr('class')); - }, function(e){ - - }); - - /* Caching the dot divs into a variable for performance: */ - dots = $('.dot'); - - if(serviceMode) - { - /* If we are in service mode, show borders around the dot divs, add the export link, and listen for clicks: */ - - dots.css({ - border:'1px solid black', - width:dots.eq(0).width()-2, - height:dots.eq(0).height()-2, - cursor:'pointer' - }) - - $('
').css({ - position:'absolute', - bottom:-20, - right:0 - }).html('[Export Shape]').appendTo('#stage'); - - dots.click(function(){ - $(this).toggleClass('active'); - }); - } - -}); - -var shapes={ - - /* Each shape is described by an array of points. You can add your own shapes here, - just don't forget to add a coma after each array, except for the last one */ - - house:[22,37,38,39,52,53,54,55,56,67,68,69,70,71,72,73,82,83,84,85,86,87,88,89,90,99,100,104,105,115,116,120,121,131,132,136,137,147,148,150,151,152,153,163,164,166,167,168,169], - wrench:[22,23,24,25,26,27,38,39,40,41,42,43,54,55,58,59,70,71,86,87,88,89,101,102,103,104,105,116,117,118,131,132,133,146,147,148,163], - envelope:[34,35,36,37,38,39,40,41,42,43,44,50,51,52,58,59,60,66,68,69,73,74,76,82,85,86,88,89,92,98,102,103,104,108,114,119,124,130,140,146,147,148,149,150,151,152,153,154,155,156], - info:[22,23,38,39,69,70,71,86,87,102,103,118,119,134,135,150,151,166,167,168] -} - -var stopCounter = 0; -var dots; - -function draw(shape) -{ - /* This function draws a shape from the shapes object */ - - stopCounter++; - var currentCounter = stopCounter; - - dots.removeClass('active').css('opacity',0); - - $.each(shapes[shape],function(i,j){ - setTimeout(function(){ - - /* If a different shape animaton has been started during the showing of the current one, exit the function */ - if(currentCounter!=stopCounter) return false; - - dots.eq(j).addClass('active').fadeTo('slow',0.4); - - /* The fade animation is scheduled for 10*i millisecond in the future: */ - },10*i); - - }); -} - -function serviceDraw(shape) -{ - /* A cut out version of the draw function, used in service mode */ - - dots.removeClass('active'); - - $.each(shapes[shape],function(i,j){ - dots.eq(j).addClass('active'); - }); -} - -function outputString() -{ - /* Outputs the positions of the active dot divs as a comma-separated string: */ - - var str=[]; - $('.dot.active').each(function(){ - - str.push(this.id.replace('d-','')); - }) - - prompt('Insert this string as an array in the shapes object',str.join(',')); +/* Set serviceMode to true to create your own shapes: */ +var serviceMode = false; + +$(document).ready(function(){ + /* This code is executed after the DOM has been completely loaded */ + + var str=[]; + var perRow = 16; + + /* Generating the dot divs: */ + + for(var i=0;i<192;i++) + { + str.push('
'); + } + + /* Joining the array into a string and adding it to the inner html of the stage div: */ + + $('#stage').html(str.join('')); + + /* Using the hover method: */ + + $('#navigation li a').hover(function(e){ + + /* serviceDraw is a cut-out version of the draw function, used for shape editing and composing: */ + + if(serviceMode) + serviceDraw($(this).attr('class')); + else + draw($(this).attr('class')); + }, function(e){ + + }); + + /* Caching the dot divs into a variable for performance: */ + dots = $('.dot'); + + if(serviceMode) + { + /* If we are in service mode, show borders around the dot divs, add the export link, and listen for clicks: */ + + dots.css({ + border:'1px solid black', + width:dots.eq(0).width()-2, + height:dots.eq(0).height()-2, + cursor:'pointer' + }) + + $('
').css({ + position:'absolute', + bottom:-20, + right:0 + }).html('[Export Shape]').appendTo('#stage'); + + dots.click(function(){ + $(this).toggleClass('active'); + }); + } + +}); + +var shapes={ + + /* Each shape is described by an array of points. You can add your own shapes here, + just don't forget to add a coma after each array, except for the last one */ + + house:[22,37,38,39,52,53,54,55,56,67,68,69,70,71,72,73,82,83,84,85,86,87,88,89,90,99,100,104,105,115,116,120,121,131,132,136,137,147,148,150,151,152,153,163,164,166,167,168,169], + wrench:[22,23,24,25,26,27,38,39,40,41,42,43,54,55,58,59,70,71,86,87,88,89,101,102,103,104,105,116,117,118,131,132,133,146,147,148,163], + envelope:[34,35,36,37,38,39,40,41,42,43,44,50,51,52,58,59,60,66,68,69,73,74,76,82,85,86,88,89,92,98,102,103,104,108,114,119,124,130,140,146,147,148,149,150,151,152,153,154,155,156], + info:[22,23,38,39,69,70,71,86,87,102,103,118,119,134,135,150,151,166,167,168] +} + +var stopCounter = 0; +var dots; + +function draw(shape) +{ + /* This function draws a shape from the shapes object */ + + stopCounter++; + var currentCounter = stopCounter; + + dots.removeClass('active').css('opacity',0); + + $.each(shapes[shape],function(i,j){ + setTimeout(function(){ + + /* If a different shape animaton has been started during the showing of the current one, exit the function */ + if(currentCounter!=stopCounter) return false; + + dots.eq(j).addClass('active').fadeTo('slow',0.4); + + /* The fade animation is scheduled for 10*i millisecond in the future: */ + },10*i); + + }); +} + +function serviceDraw(shape) +{ + /* A cut out version of the draw function, used in service mode */ + + dots.removeClass('active'); + + $.each(shapes[shape],function(i,j){ + dots.eq(j).addClass('active'); + }); +} + +function outputString() +{ + /* Outputs the positions of the active dot divs as a comma-separated string: */ + + var str=[]; + $('.dot.active').each(function(){ + + str.push(this.id.replace('d-','')); + }) + + prompt('Insert this string as an array in the shapes object',str.join(',')); } \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/demo2/styles.css b/example/SimpleWebServer/webroot/demo2/styles.css index 73897265..e0882dd2 100644 --- a/example/SimpleWebServer/webroot/demo2/styles.css +++ b/example/SimpleWebServer/webroot/demo2/styles.css @@ -1,148 +1,148 @@ -body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{ - /* Simple page reset */ - margin:0; - padding:0; -} - -body{ - /* Setting default text color, background and a font stack */ - color:#cccccc; - font-size:0.825em; - background: url(img/background.jpg) no-repeat center top #252525; - font-family:Arial, Helvetica, sans-serif; -} - -.menuUL li{ - /* This will arrange the LI-s next to each other */ - display:inline; -} - -.menuUL li a,.menuUL li a:visited{ - /* Styling the hyperlinks of the menu as buttons */ - - float:left; - font-weight:bold; - background:url(img/button_bg.jpg) repeat-x center bottom #666666; - - /* display:block allows for additinal CSS rules to take effect, such as paddings: */ - display:block; - border:1px solid #4D4D4D; - color:#CCCCCC; - border-top-color:#565656; - - padding:4px 6px; - margin:4px 5px; - height:16px; - - - /* Setting a CSS3 box shadow around the button */ - - -moz-box-shadow:0 0 1px black; - -webkit-box-shadow:0 0 1px black; - box-shadow:0 0 1px black; - - /* CSS3 text shadow */ - text-shadow:0 1px black; -} - -.menuUL li a:hover{ - /* On hover show the top, lighter, part of the background: */ - background-position:center top; - text-decoration:none; -} - -#navigation{ - /* The navigation menu bar: */ - background:#222222; - border:1px solid #111111; - float:left; - padding:5px 10px; -} - -#navigation,.menuUL li a{ - /* CSS3 rounded corners for both the navigation bar and the buttons: */ - -moz-border-radius:4px; - -webkit-border-radius:4px; - -khtml-border-radius:4px; - border-radius:4px; -} - -#stage{ - /* The stage contains the individual divs that comprise the halftone icon: */ - height:300px; - position:absolute; - right:50px; - top:20px; - width:400px; -} - -.dot{ - /* The stage contains 192 .dot divs: */ - float:left; - height:25px; - width:25px; -} - -.dot.active{ - /* When assigned the active class, the div shows a background image of a dot: */ - background:url(img/dot.png) no-repeat center center; -} - -.clear{ - /* Old-school clear fix hack to clear the floats: */ - clear:both; -} - -#main{ - margin:0 auto; - position:relative; - width:900px; -} - -/* The styles below are only necessary for the demo page */ - -h1{ - background:#222222; - border-bottom:1px solid black; - font-size:1.5em; - font-weight:normal; - margin-bottom:15px; - padding:15px; - text-align:center; -} - -h2 { - font-size:0.9em; - font-weight:normal; - padding-right:40px; - position:relative; - right:0; - text-align:right; - text-transform:uppercase; - top:-48px; -} - -a, a:visited { - color:#0196e3; - text-decoration:none; - outline:none; -} - -a:hover{ - text-decoration:underline; -} - -p.tutInfo{ - /* The tutorial info on the bottom of the page */ - padding:10px 0; - text-align:center; - position:absolute; - bottom:0px; - background:#222222; - border-top:1px solid black; - width:100%; -} - -h1,h2,p.tutInfo{ - font-family:"Myriad Pro",Arial,Helvetica,sans-serif; -} +body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{ + /* Simple page reset */ + margin:0; + padding:0; +} + +body{ + /* Setting default text color, background and a font stack */ + color:#cccccc; + font-size:0.825em; + background: url(img/background.jpg) no-repeat center top #252525; + font-family:Arial, Helvetica, sans-serif; +} + +.menuUL li{ + /* This will arrange the LI-s next to each other */ + display:inline; +} + +.menuUL li a,.menuUL li a:visited{ + /* Styling the hyperlinks of the menu as buttons */ + + float:left; + font-weight:bold; + background:url(img/button_bg.jpg) repeat-x center bottom #666666; + + /* display:block allows for additinal CSS rules to take effect, such as paddings: */ + display:block; + border:1px solid #4D4D4D; + color:#CCCCCC; + border-top-color:#565656; + + padding:4px 6px; + margin:4px 5px; + height:16px; + + + /* Setting a CSS3 box shadow around the button */ + + -moz-box-shadow:0 0 1px black; + -webkit-box-shadow:0 0 1px black; + box-shadow:0 0 1px black; + + /* CSS3 text shadow */ + text-shadow:0 1px black; +} + +.menuUL li a:hover{ + /* On hover show the top, lighter, part of the background: */ + background-position:center top; + text-decoration:none; +} + +#navigation{ + /* The navigation menu bar: */ + background:#222222; + border:1px solid #111111; + float:left; + padding:5px 10px; +} + +#navigation,.menuUL li a{ + /* CSS3 rounded corners for both the navigation bar and the buttons: */ + -moz-border-radius:4px; + -webkit-border-radius:4px; + -khtml-border-radius:4px; + border-radius:4px; +} + +#stage{ + /* The stage contains the individual divs that comprise the halftone icon: */ + height:300px; + position:absolute; + right:50px; + top:20px; + width:400px; +} + +.dot{ + /* The stage contains 192 .dot divs: */ + float:left; + height:25px; + width:25px; +} + +.dot.active{ + /* When assigned the active class, the div shows a background image of a dot: */ + background:url(img/dot.png) no-repeat center center; +} + +.clear{ + /* Old-school clear fix hack to clear the floats: */ + clear:both; +} + +#main{ + margin:0 auto; + position:relative; + width:900px; +} + +/* The styles below are only necessary for the demo page */ + +h1{ + background:#222222; + border-bottom:1px solid black; + font-size:1.5em; + font-weight:normal; + margin-bottom:15px; + padding:15px; + text-align:center; +} + +h2 { + font-size:0.9em; + font-weight:normal; + padding-right:40px; + position:relative; + right:0; + text-align:right; + text-transform:uppercase; + top:-48px; +} + +a, a:visited { + color:#0196e3; + text-decoration:none; + outline:none; +} + +a:hover{ + text-decoration:underline; +} + +p.tutInfo{ + /* The tutorial info on the bottom of the page */ + padding:10px 0; + text-align:center; + position:absolute; + bottom:0px; + background:#222222; + border-top:1px solid black; + width:100%; +} + +h1,h2,p.tutInfo{ + font-family:"Myriad Pro",Arial,Helvetica,sans-serif; +} diff --git a/example/SimpleWebServer/webroot/example/html/contentpage.html b/example/SimpleWebServer/webroot/example/html/contentpage.html index efc4f6e0..3b82eda3 100644 --- a/example/SimpleWebServer/webroot/example/html/contentpage.html +++ b/example/SimpleWebServer/webroot/example/html/contentpage.html @@ -1,153 +1,153 @@ - - - -Business Co. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- SEPTEMBER 29, 2009 -
- - - - -
-
Content Page
HOME | ABOUT US | SERVICES | SOLUTIONS | SUPPORT | CONTACTS
- Copyright © Your Company Name
- Design by Templates Box. Create a free website. -
- - + + + +Business Co. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ SEPTEMBER 29, 2009 +
+ + + + +
+
Content Page
HOME | ABOUT US | SERVICES | SOLUTIONS | SUPPORT | CONTACTS
+ Copyright © Your Company Name
+ Design by Templates Box. Create a free website. +
+ + \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/example/html/css/styles.css b/example/SimpleWebServer/webroot/example/html/css/styles.css index ae53ecae..3607601c 100644 --- a/example/SimpleWebServer/webroot/example/html/css/styles.css +++ b/example/SimpleWebServer/webroot/example/html/css/styles.css @@ -1,160 +1,160 @@ -body{ - padding:0px; - margin:0px; - background:#c7c7c7; - color:#848484; - font:10px/14px Tahoma, sans-serif; -} - -div, p, ul, h2, h3, h4, img, form{padding:0px; margin:0px;} -ul{list-style-type:none;} - -.clear{ -clear:both; -} - -.frame { - border: 1px solid #D5E6E0; -} - -.text1 { - font: 11px/14px "Trebuchet MS", Arial, Helvetica, sans-serif; - color:#000; - font-weight:bold; -} -.text2 { - font: 11px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; -} -.text3 { - font: 10px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; -} - -.text4 { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#052578; - font-weight:bold; -} -.text5 { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#052578; - font-weight:bold; -} - - -a:link { - font: 11px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; - text-decoration:none; -} - -a:visited{ - font: 11px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; - text-decoration:none; -} - -a:hover { - font: 11px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; - text-decoration:underline; -} - -a.a:link { - font: 10px/14px Tahoma, Geneva, sans-serif; - color:#19a1cb; - font-weight:normal; - text-decoration:underline; -} - -a.a:visited{ - font: 10px/14px Tahoma, Geneva, sans-serif; - color:#19a1cb; - font-weight:normal; - text-decoration:underline; -} - -a.a:hover { - font: 10px/14px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; - text-decoration:none; -} - -a.b:link { - font: 10px/18px Tahoma, Geneva, sans-serif; - color:#848484; - font-weight:normal; - text-decoration:underline; -} - -a.b:visited{ - font: 10px/18px Tahoma, Geneva, sans-serif; - color:#848484; - font-weight:normal; - text-decoration:underline; -} - -a.b:hover { - font: 10px/18px Tahoma, Geneva, sans-serif; - color:#000; - font-weight:normal; - text-decoration:none; -} - -a.c:link { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:none; -} - -a.c:visited{ - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:none; -} - -a.c:hover { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:underline; -} - -a.d:link { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:none; -} - -a.d:visited{ - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:none; -} - -a.d:hover { - font: 10px/12px Tahoma, Geneva, sans-serif; - color:#FFF; - font-weight:normal; - text-decoration:underline; -} - -input, textarea, select{ -border:#fff 1px solid; -background-color:#d6e6e0; -font:10px/12px Tahoma, sans-serif; color:#000; -} -a.adv:link {text-decoration: none; font-weight:bold; color:#000;} -a.adv:hover {text-decoration: none; font-weight:bold; color:#000;} -a.adv:visited {text-decoration: none; font-weight:bold; color:#000;} +body{ + padding:0px; + margin:0px; + background:#c7c7c7; + color:#848484; + font:10px/14px Tahoma, sans-serif; +} + +div, p, ul, h2, h3, h4, img, form{padding:0px; margin:0px;} +ul{list-style-type:none;} + +.clear{ +clear:both; +} + +.frame { + border: 1px solid #D5E6E0; +} + +.text1 { + font: 11px/14px "Trebuchet MS", Arial, Helvetica, sans-serif; + color:#000; + font-weight:bold; +} +.text2 { + font: 11px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; +} +.text3 { + font: 10px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; +} + +.text4 { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#052578; + font-weight:bold; +} +.text5 { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#052578; + font-weight:bold; +} + + +a:link { + font: 11px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; + text-decoration:none; +} + +a:visited{ + font: 11px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; + text-decoration:none; +} + +a:hover { + font: 11px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; + text-decoration:underline; +} + +a.a:link { + font: 10px/14px Tahoma, Geneva, sans-serif; + color:#19a1cb; + font-weight:normal; + text-decoration:underline; +} + +a.a:visited{ + font: 10px/14px Tahoma, Geneva, sans-serif; + color:#19a1cb; + font-weight:normal; + text-decoration:underline; +} + +a.a:hover { + font: 10px/14px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; + text-decoration:none; +} + +a.b:link { + font: 10px/18px Tahoma, Geneva, sans-serif; + color:#848484; + font-weight:normal; + text-decoration:underline; +} + +a.b:visited{ + font: 10px/18px Tahoma, Geneva, sans-serif; + color:#848484; + font-weight:normal; + text-decoration:underline; +} + +a.b:hover { + font: 10px/18px Tahoma, Geneva, sans-serif; + color:#000; + font-weight:normal; + text-decoration:none; +} + +a.c:link { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:none; +} + +a.c:visited{ + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:none; +} + +a.c:hover { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:underline; +} + +a.d:link { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:none; +} + +a.d:visited{ + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:none; +} + +a.d:hover { + font: 10px/12px Tahoma, Geneva, sans-serif; + color:#FFF; + font-weight:normal; + text-decoration:underline; +} + +input, textarea, select{ +border:#fff 1px solid; +background-color:#d6e6e0; +font:10px/12px Tahoma, sans-serif; color:#000; +} +a.adv:link {text-decoration: none; font-weight:bold; color:#000;} +a.adv:hover {text-decoration: none; font-weight:bold; color:#000;} +a.adv:visited {text-decoration: none; font-weight:bold; color:#000;} diff --git a/example/SimpleWebServer/webroot/example/html/index.html b/example/SimpleWebServer/webroot/example/html/index.html index ee237b52..1a6274e9 100644 --- a/example/SimpleWebServer/webroot/example/html/index.html +++ b/example/SimpleWebServer/webroot/example/html/index.html @@ -1,197 +1,197 @@ - - - -Business Co. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- SEPTEMBER 29, 2009 -
- - - - -
-
- -
- Lorem ipsum dolor sit amet, consectetuer
-Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis
-

September 29 -

-

Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui

September 28 -
- Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui
-
-
- Lorem ipsum dolor sit amet, consectetuer
- Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis
- Morbi volutpat leo in ligula. Inter vel
- magna. sagittis. Fusce elit ligula,
- sodales sit amet, tincid unt in, Fusce
- interdum. Sed laoreet. Aenean. Sed
-laoreet. magna. sagittis. Fusce elit
- Morbi volutpat leo in ligula. Inter vel magna. sagittis. Fusce elit ligula, sodales
- sit amet, tincid unt in, Fusce interdum. Sed laoreet. Aenean. Sed laoreet.
HOME | ABOUT US | SERVICES | SOLUTIONS | SUPPORT | CONTACTS
- Copyright © Your Company Name
- Design by Templates Box. Create a free website. -
- - + + + +Business Co. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ SEPTEMBER 29, 2009 +
+ + + + +
+
+ +
+ Lorem ipsum dolor sit amet, consectetuer
+Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis
+

September 29 +

+

Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui

September 28 +
+ Integer in ante. Sed posuere ligula rhoncus erat. Fusce urna dui
+
+
+ Lorem ipsum dolor sit amet, consectetuer
+ Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis
+ Morbi volutpat leo in ligula. Inter vel
+ magna. sagittis. Fusce elit ligula,
+ sodales sit amet, tincid unt in, Fusce
+ interdum. Sed laoreet. Aenean. Sed
+laoreet. magna. sagittis. Fusce elit
+ Morbi volutpat leo in ligula. Inter vel magna. sagittis. Fusce elit ligula, sodales
+ sit amet, tincid unt in, Fusce interdum. Sed laoreet. Aenean. Sed laoreet.
HOME | ABOUT US | SERVICES | SOLUTIONS | SUPPORT | CONTACTS
+ Copyright © Your Company Name
+ Design by Templates Box. Create a free website. +
+ + \ No newline at end of file diff --git a/example/SimpleWebServer/webroot/example/readme.html b/example/SimpleWebServer/webroot/example/readme.html index 4e6cf8f0..f6a428bf 100644 --- a/example/SimpleWebServer/webroot/example/readme.html +++ b/example/SimpleWebServer/webroot/example/readme.html @@ -1,86 +1,86 @@ - - - -TemplatesBox.com | Terms of Use - - - - - - - - - - - - - - - - - -
TemplatesBox - | Terms of Use
- - - - -
-

By - downloading a template from TemplatesBox.com you agree to the following - Terms of Use: -

Our - web templates may be used for your own and/or your clients' websites, - but you may not sell/offer for free our templates in any sort of collection, - such as distributing to a third party via CD, diskette, or letting others - to download off your websites etc.
-
- Link back to www.templatesbox.com is required and always appreciated. - Also, please visit the
-
Link - Us section.
-
- The templates are offered "as is" without warranty of any kind, - either expressed or implied. TemplatesBox.com will not be liable for any - damage or loss of data whatsoever due to downloading or using a template. - In no event shall TemplatesBox.com be liable for any damages including, - but not limited to, direct, indirect, special, incidental or consequential - damages or other losses arising out of the use of or inability to use - the templates and/or information from TemplatesBox.com.
-
- TemplatesBox.com team reserves the right to change or modify these terms - with no prior notice.

-
-
Featured - Partners
- - - - -
-

Premium Website - Templates
- Over 9000 High-end Website templates, Flash intros and Logo templates.
-
-
Free - Photos, Free Stock Photography
-
1000's of FREE high quality stock -Photos!
-
-
Webmaster Resources & -Directory
-
A large web directory with webmaster -resources.
-
-
Photovations.com
-
Online Photo Sharing. Free Image -Hosting

-
-
- - + + + +TemplatesBox.com | Terms of Use + + + + + + + + + + + + + + + + + +
TemplatesBox + | Terms of Use
+ + + + +
+

By + downloading a template from TemplatesBox.com you agree to the following + Terms of Use: +

Our + web templates may be used for your own and/or your clients' websites, + but you may not sell/offer for free our templates in any sort of collection, + such as distributing to a third party via CD, diskette, or letting others + to download off your websites etc.
+
+ Link back to www.templatesbox.com is required and always appreciated. + Also, please visit the
+
Link + Us section.
+
+ The templates are offered "as is" without warranty of any kind, + either expressed or implied. TemplatesBox.com will not be liable for any + damage or loss of data whatsoever due to downloading or using a template. + In no event shall TemplatesBox.com be liable for any damages including, + but not limited to, direct, indirect, special, incidental or consequential + damages or other losses arising out of the use of or inability to use + the templates and/or information from TemplatesBox.com.
+
+ TemplatesBox.com team reserves the right to change or modify these terms + with no prior notice.

+
+
Featured + Partners
+ + + + +
+

Premium Website + Templates
+ Over 9000 High-end Website templates, Flash intros and Logo templates.
+
+
Free + Photos, Free Stock Photography
+
1000's of FREE high quality stock +Photos!
+
+
Webmaster Resources & +Directory
+
A large web directory with webmaster +resources.
+
+
Photovations.com
+
Online Photo Sharing. Free Image +Hosting

+
+
+ + diff --git a/example/SimpleWebServer/webroot/html/images.html b/example/SimpleWebServer/webroot/html/images.html index 032d3175..99ceb851 100644 --- a/example/SimpleWebServer/webroot/html/images.html +++ b/example/SimpleWebServer/webroot/html/images.html @@ -1,9 +1,9 @@ - - - -

Norwegian Mountain Trip

-Pulpit rock - - - - + + + +

Norwegian Mountain Trip

+Pulpit rock + + + + diff --git a/example/SimpleWebServer/webroot/html/simple.html b/example/SimpleWebServer/webroot/html/simple.html index f61058f3..15894d06 100644 --- a/example/SimpleWebServer/webroot/html/simple.html +++ b/example/SimpleWebServer/webroot/html/simple.html @@ -1,10 +1,10 @@ - - - -

My First Heading

- -

My first paragraph.

- - - - + + + +

My First Heading

+ +

My first paragraph.

+ + + + diff --git a/example/SimpleWebServer/webroot/html5/dataset.html b/example/SimpleWebServer/webroot/html5/dataset.html index b4db4c29..cb94ab98 100644 --- a/example/SimpleWebServer/webroot/html5/dataset.html +++ b/example/SimpleWebServer/webroot/html5/dataset.html @@ -1,99 +1,99 @@ - - - - - -HTML5 Demo: data-* - - - -
-
-

data-*

-
- -
-
-

The data-[name] attribute on elements can now be accessed directly via the DOM using element.dataset.[attr].

-

Try openning the Web Console and editing element.dataset directly:
element.dataset.foo = 'bar';

-
-

Not connected

-
-
This element has data
- - - -
-
[click buttons above to show element html]
-
- - -
-Fork me on GitHub - - - - + + + + + +HTML5 Demo: data-* + + + +
+
+

data-*

+
+ +
+
+

The data-[name] attribute on elements can now be accessed directly via the DOM using element.dataset.[attr].

+

Try openning the Web Console and editing element.dataset directly:
element.dataset.foo = 'bar';

+
+

Not connected

+
+
This element has data
+ + + +
+
[click buttons above to show element html]
+
+ + +
+Fork me on GitHub + + + + \ No newline at end of file diff --git a/library/http_constants.e b/library/http_constants.e index 15b53088..c3cc1b0c 100644 --- a/library/http_constants.e +++ b/library/http_constants.e @@ -1,149 +1,149 @@ -note - description: "Summary description for {HTTP_CONSTANTS}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - HTTP_CONSTANTS - -feature - - http_version_1_1: STRING = "HTTP/1.1" - http_version_1_0: STRING = "HTTP/1.0" - crlf: STRING = "%/13/%/10/" - -feature -- Status codes - - -- 1xx Informational -Request received, continuing process - Continue : STRING = "100" - Switching_Protocols : STRING = "101" - - - -- 2xx Success - The action was successfully received, understood, and accepted - Ok: STRING = "200" - Created : STRING = "201" - Accepted : STRING = "202" - Non_Authoritative_Information : STRING = "203" - No_Content : STRING = "204" - Reset_Content : STRING = "205" - Parcial_Content : STRING = "206" - - - -- 3xx Redirection - Further Action must be taken in order to complete the request - Multiple_Choices : STRING = "300" - Moved_Permanently: STRING = "301" - Found : STRING = "302" - See_Other : STRING = "303" - Not_Modified : STRING = "304" - Use_Proxy : STRING = "305" - Temporary_Redirect : STRING = "307" - - - --4xx Client Error - The request contains bad syntax or cannot be fulfilled - Bad_Request : STRING = "400" - Unauthorized : STRING = "401" - Payment_Required : STRING = "402" - Forbidden : STRING = "403" - Not_Found : STRING = "404" - Method_Not_Allowed : STRING = "405" - Not_Acceptable : STRING = "406" - Proxy_Authentication_Required : STRING = "407" - Request_Time_out : STRING = "408" - Conflict : STRING = "409" - Gone : STRING = "410" - Length_Required : STRING = "411" - Precondition_Failed : STRING = "412" - Request_Entity_Too_Large : STRING = "413" - Request_URI_Too_Large : STRING = "414" - Unsupported_Media_Type : STRING = "415" - Requested_range_not_satisfiable : STRING = "416" - Expectation_Failed : STRING = "417" - - - --5xx Server Error - The server failed to fulfill an apparently valid request - server_error: STRING = "500" - Internal_Server_Error : STRING = "500" - Not_Implemented : STRING = "501" - Bad_Gateway : STRING = "502" - Service_Unavailable : STRING = "503" - Gateway_Time_out : STRING = "504" - HTTP_Version_not_supported : STRING = "505" - - - -- messages - ok_message: STRING = "OK" - continue_message : STRING = "Continue" - not_found_message: STRING = "URI not found" - not_implemented_message: STRING = "Not Implemented" - -feature -- content types - - text_html: STRING = "text/html" - -feature -- General Header Fields - - -- There are a few header fields which have general applicability for both request and response messages, - -- but which do not apply to the entity being transferred. - -- These header fields apply only to the message being transmitted. - - Cache_control : STRING = "Cache-Control" - Connection : STRING = "Connection" - Date : STRING = "Date" - Pragma : STRING = "PRAGMA" - Trailer : STRING = "Trailer" - Transfer_encoding : STRING = "Transfer-Encoding" - Upgrade : STRING = "Upgrade" - Via : STRING = "Via" - Warning : STRING = "Warning" - - -feature -- Request Header - Accept : STRING = "Accept" - Accept_charset : STRING = "Accept-Charset" - Accept_encoding : STRING = "Accept-Encoding" - Accept_language : STRING = "Accept-Language" - Authorization : STRING = "Authorization" - Expect : STRING = "Expect" - From_header : STRING = "From" - Host : STRING = "Host" - If_match : STRING = "If-Match" - If_modified_since : STRING = "If-Modified-Since" - If_none_match : STRING = "If-None-Match" - If_range : STRING = "If-Range" - If_unmodified_since : STRING = "If-Unmodified-Since" - Max_forwards : STRING = "Max-Forwards" - Proxy_authorization : STRING = "Proxy-Authorization" - Range : STRING = "Range" - Referer : STRING = "Referrer" - TE : STRING = "TE" - User_agent : STRING = "User-Agent" - - -feature -- Entity Header - - Allow : STRING = "Allow" - Content_encoding : STRING = "Content-Encoding" - Content_language : STRING = "Content-Language" - Content_length : STRING = "Content-Length" - Content_location : STRING = "Content-Location" - Content_MD5 : STRING = "Content-MD5" - Content_range : STRING = "Content-Range" - Content_type : STRING = "Content-Type" - Expires : STRING = "Expires" - Last_modified : STRING = "Last-Modified" - - -feature -- Http Method - Options : STRING = "OPTIONS" - Get : STRING = "GET" - Head : STRING = "HEAD" - Post : STRING = "POST" - Put : STRING = "PUT" - Delete : STRING = "DELETE" - Trace : STRING = "TRACE" - Connect : STRING = "CONNECT" -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +note + description: "Summary description for {HTTP_CONSTANTS}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + HTTP_CONSTANTS + +feature + + http_version_1_1: STRING = "HTTP/1.1" + http_version_1_0: STRING = "HTTP/1.0" + crlf: STRING = "%/13/%/10/" + +feature -- Status codes + + -- 1xx Informational -Request received, continuing process + Continue : STRING = "100" + Switching_Protocols : STRING = "101" + + + -- 2xx Success - The action was successfully received, understood, and accepted + Ok: STRING = "200" + Created : STRING = "201" + Accepted : STRING = "202" + Non_Authoritative_Information : STRING = "203" + No_Content : STRING = "204" + Reset_Content : STRING = "205" + Parcial_Content : STRING = "206" + + + -- 3xx Redirection - Further Action must be taken in order to complete the request + Multiple_Choices : STRING = "300" + Moved_Permanently: STRING = "301" + Found : STRING = "302" + See_Other : STRING = "303" + Not_Modified : STRING = "304" + Use_Proxy : STRING = "305" + Temporary_Redirect : STRING = "307" + + + --4xx Client Error - The request contains bad syntax or cannot be fulfilled + Bad_Request : STRING = "400" + Unauthorized : STRING = "401" + Payment_Required : STRING = "402" + Forbidden : STRING = "403" + Not_Found : STRING = "404" + Method_Not_Allowed : STRING = "405" + Not_Acceptable : STRING = "406" + Proxy_Authentication_Required : STRING = "407" + Request_Time_out : STRING = "408" + Conflict : STRING = "409" + Gone : STRING = "410" + Length_Required : STRING = "411" + Precondition_Failed : STRING = "412" + Request_Entity_Too_Large : STRING = "413" + Request_URI_Too_Large : STRING = "414" + Unsupported_Media_Type : STRING = "415" + Requested_range_not_satisfiable : STRING = "416" + Expectation_Failed : STRING = "417" + + + --5xx Server Error - The server failed to fulfill an apparently valid request + server_error: STRING = "500" + Internal_Server_Error : STRING = "500" + Not_Implemented : STRING = "501" + Bad_Gateway : STRING = "502" + Service_Unavailable : STRING = "503" + Gateway_Time_out : STRING = "504" + HTTP_Version_not_supported : STRING = "505" + + + -- messages + ok_message: STRING = "OK" + continue_message : STRING = "Continue" + not_found_message: STRING = "URI not found" + not_implemented_message: STRING = "Not Implemented" + +feature -- content types + + text_html: STRING = "text/html" + +feature -- General Header Fields + + -- There are a few header fields which have general applicability for both request and response messages, + -- but which do not apply to the entity being transferred. + -- These header fields apply only to the message being transmitted. + + Cache_control : STRING = "Cache-Control" + Connection : STRING = "Connection" + Date : STRING = "Date" + Pragma : STRING = "PRAGMA" + Trailer : STRING = "Trailer" + Transfer_encoding : STRING = "Transfer-Encoding" + Upgrade : STRING = "Upgrade" + Via : STRING = "Via" + Warning : STRING = "Warning" + + +feature -- Request Header + Accept : STRING = "Accept" + Accept_charset : STRING = "Accept-Charset" + Accept_encoding : STRING = "Accept-Encoding" + Accept_language : STRING = "Accept-Language" + Authorization : STRING = "Authorization" + Expect : STRING = "Expect" + From_header : STRING = "From" + Host : STRING = "Host" + If_match : STRING = "If-Match" + If_modified_since : STRING = "If-Modified-Since" + If_none_match : STRING = "If-None-Match" + If_range : STRING = "If-Range" + If_unmodified_since : STRING = "If-Unmodified-Since" + Max_forwards : STRING = "Max-Forwards" + Proxy_authorization : STRING = "Proxy-Authorization" + Range : STRING = "Range" + Referer : STRING = "Referrer" + TE : STRING = "TE" + User_agent : STRING = "User-Agent" + + +feature -- Entity Header + + Allow : STRING = "Allow" + Content_encoding : STRING = "Content-Encoding" + Content_language : STRING = "Content-Language" + Content_length : STRING = "Content-Length" + Content_location : STRING = "Content-Location" + Content_MD5 : STRING = "Content-MD5" + Content_range : STRING = "Content-Range" + Content_type : STRING = "Content-Type" + Expires : STRING = "Expires" + Last_modified : STRING = "Last-Modified" + + +feature -- Http Method + Options : STRING = "OPTIONS" + Get : STRING = "GET" + Head : STRING = "HEAD" + Post : STRING = "POST" + Put : STRING = "PUT" + Delete : STRING = "DELETE" + Trace : STRING = "TRACE" + Connect : STRING = "CONNECT" +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/http_encoding_facilities.e b/library/http_encoding_facilities.e index 81bc94ec..0b53cd12 100644 --- a/library/http_encoding_facilities.e +++ b/library/http_encoding_facilities.e @@ -1,60 +1,60 @@ -note - description: "[ - Provides features to encode and decode messages - ]" - legal: "See notice at end of class." - status: "Community Preview 1.0" - date: "$Date: 2009-09-01 19:15:37 -0300 (mar 01 de sep de 2009) $" - revision: "$Revision: 80577 $" - -class - HTTP_ENCODING_FACILITIES - -create - make - -feature -- Initialization - - make - do - end - -feature -- Conversion - - encode_natural(a_i: NATURAL; a_is_fragmented: BOOLEAN): NATURAL - -- Leftshift of the natural (don't use numbers >= 2^31) and subsequent append of the flag bit. - -- Use decode_natural and decode_flag for decoding. - require - no_too_big: a_i < 2147483648 - do - Result := (a_i |<< 1) + a_is_fragmented.to_integer.as_natural_32 - end - - change_flag(a_i: NATURAL; a_new_flag: BOOLEAN): NATURAL - -- Changes the flag to "new_flag" and doesn't change the encoded natural. - do - Result := (a_i & 0xFFFFFFFE) + a_new_flag.to_integer.as_natural_32 - end - - decode_natural_and_flag (a_i: NATURAL): TUPLE [NATURAL, BOOLEAN] - -- Convenience feature which combines both decodings (natural and flag) - do - Result := [decode_natural (a_i), decode_flag (a_i)] - end - - decode_natural (a_i: NATURAL): NATURAL - -- The natural that was encoded in {ENCODING_FACILITIES}.encode_natural. - do - Result := (a_i |>> 1) - end - - decode_flag (a_i: NATURAL): BOOLEAN - --`Result': the flag that was encoded in encode_natural - do - Result := (a_i.bit_and (1) = 1) - end - -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +note + description: "[ + Provides features to encode and decode messages + ]" + legal: "See notice at end of class." + status: "Community Preview 1.0" + date: "$Date: 2009-09-01 19:15:37 -0300 (mar 01 de sep de 2009) $" + revision: "$Revision: 80577 $" + +class + HTTP_ENCODING_FACILITIES + +create + make + +feature -- Initialization + + make + do + end + +feature -- Conversion + + encode_natural(a_i: NATURAL; a_is_fragmented: BOOLEAN): NATURAL + -- Leftshift of the natural (don't use numbers >= 2^31) and subsequent append of the flag bit. + -- Use decode_natural and decode_flag for decoding. + require + no_too_big: a_i < 2147483648 + do + Result := (a_i |<< 1) + a_is_fragmented.to_integer.as_natural_32 + end + + change_flag(a_i: NATURAL; a_new_flag: BOOLEAN): NATURAL + -- Changes the flag to "new_flag" and doesn't change the encoded natural. + do + Result := (a_i & 0xFFFFFFFE) + a_new_flag.to_integer.as_natural_32 + end + + decode_natural_and_flag (a_i: NATURAL): TUPLE [NATURAL, BOOLEAN] + -- Convenience feature which combines both decodings (natural and flag) + do + Result := [decode_natural (a_i), decode_flag (a_i)] + end + + decode_natural (a_i: NATURAL): NATURAL + -- The natural that was encoded in {ENCODING_FACILITIES}.encode_natural. + do + Result := (a_i |>> 1) + end + + decode_flag (a_i: NATURAL): BOOLEAN + --`Result': the flag that was encoded in encode_natural + do + Result := (a_i.bit_and (1) = 1) + end + +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/http_server.e b/library/http_server.e index 26fb0df0..d7fae176 100644 --- a/library/http_server.e +++ b/library/http_server.e @@ -1,56 +1,56 @@ -note - description: "Summary description for {HTTP_SERVER}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - HTTP_SERVER - -create - make - -feature -- Initialization - - make (cfg: like configuration) - do - configuration := cfg - end - - setup (a_http_handler: HTTP_HANDLER) - require - a_http_handler_valid: a_http_handler /= Void - do - if configuration.is_verbose then - log ("%N%N%N") - log ("Starting Web Application Server (port="+ configuration.http_server_port.out +"):%N") - end - stop_requested := False - a_http_handler.execute - end - - shutdown_server - do - stop_requested := True - end - -feature -- Access - - configuration: HTTP_SERVER_CONFIGURATION - -- Configuration of the server - - stop_requested: BOOLEAN - -- Stops the server - -feature -- Output - - log (a_message: READABLE_STRING_8) - -- Log `a_message' - do - io.put_string (a_message) - end - -;note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +note + description: "Summary description for {HTTP_SERVER}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + HTTP_SERVER + +create + make + +feature -- Initialization + + make (cfg: like configuration) + do + configuration := cfg + end + + setup (a_http_handler: HTTP_HANDLER) + require + a_http_handler_valid: a_http_handler /= Void + do + if configuration.is_verbose then + log ("%N%N%N") + log ("Starting Web Application Server (port="+ configuration.http_server_port.out +"):%N") + end + stop_requested := False + a_http_handler.execute + end + + shutdown_server + do + stop_requested := True + end + +feature -- Access + + configuration: HTTP_SERVER_CONFIGURATION + -- Configuration of the server + + stop_requested: BOOLEAN + -- Stops the server + +feature -- Output + + log (a_message: READABLE_STRING_8) + -- Log `a_message' + do + io.put_string (a_message) + end + +;note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/request/http_request_handler.e b/library/request/http_request_handler.e index 8c2121c9..6d25c029 100644 --- a/library/request/http_request_handler.e +++ b/library/request/http_request_handler.e @@ -1,118 +1,118 @@ -deferred class HTTP_REQUEST_HANDLER - -inherit - ANY - redefine - default_create - end - -feature {NONE} -- Initialization - - default_create - do - Precursor - create request_uri.make_empty - create script_name.make_empty - create query_string.make_empty - create answer - create headers.make (0) - end - -feature -- Access - - request_uri: STRING - -- requested url - - script_name: STRING - -- Script name - - query_string: STRING - -- Query string - - data: detachable STRING - -- the entire request message - - headers : HASH_TABLE [STRING, STRING] - -- Provides access to the request's HTTP headers, for example: - -- headers["Content-Type"] is "text/plain" - - answer: HTTP_RESPONSE - -- reply to this request - -feature -- Execution - - process - -- process the request and create an answer - require - valid_uri: request_uri /= Void - deferred - end - -feature -- Recycle - - reset - -- reinit the fields - do - request_uri.wipe_out - script_name.wipe_out - query_string.wipe_out - data := Void - answer.reset - end - -feature -- Element change - - set_uri (new_uri: STRING) - -- set new URI - require - valid_uri: new_uri /= Void - local - p: INTEGER - do - request_uri := new_uri - p := new_uri.index_of ('?', 1) - if p > 0 then - script_name := new_uri.substring (1, p - 1) - query_string := new_uri.substring (p + 1, new_uri.count) - else - script_name := new_uri.string - query_string := "" - end - end - - set_data (new_data: STRING) - -- set new data - do - data := new_data - end - - set_headers ( a_header : HASH_TABLE [STRING, STRING] ) - do - headers := a_header - end - -feature {NONE} -- Implementation - - real_filename (fn: STRING): STRING - -- Real filename from url-path `fn' - --| Find a better design for this piece of code - --| Eventually in a spec/$ISE_PLATFORM/ specific cluster - do - if {PLATFORM}.is_windows then - create Result.make_from_string (fn) - Result.replace_substring_all ("/", "\") - if Result[Result.count] = '\' then - Result.remove_tail (1) - end - else - Result := fn - if Result[Result.count] = '/' then - Result := Result.substring (1, Result.count - 1) - end - end - end - -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +deferred class HTTP_REQUEST_HANDLER + +inherit + ANY + redefine + default_create + end + +feature {NONE} -- Initialization + + default_create + do + Precursor + create request_uri.make_empty + create script_name.make_empty + create query_string.make_empty + create answer + create headers.make (0) + end + +feature -- Access + + request_uri: STRING + -- requested url + + script_name: STRING + -- Script name + + query_string: STRING + -- Query string + + data: detachable STRING + -- the entire request message + + headers : HASH_TABLE [STRING, STRING] + -- Provides access to the request's HTTP headers, for example: + -- headers["Content-Type"] is "text/plain" + + answer: HTTP_RESPONSE + -- reply to this request + +feature -- Execution + + process + -- process the request and create an answer + require + valid_uri: request_uri /= Void + deferred + end + +feature -- Recycle + + reset + -- reinit the fields + do + request_uri.wipe_out + script_name.wipe_out + query_string.wipe_out + data := Void + answer.reset + end + +feature -- Element change + + set_uri (new_uri: STRING) + -- set new URI + require + valid_uri: new_uri /= Void + local + p: INTEGER + do + request_uri := new_uri + p := new_uri.index_of ('?', 1) + if p > 0 then + script_name := new_uri.substring (1, p - 1) + query_string := new_uri.substring (p + 1, new_uri.count) + else + script_name := new_uri.string + query_string := "" + end + end + + set_data (new_data: STRING) + -- set new data + do + data := new_data + end + + set_headers ( a_header : HASH_TABLE [STRING, STRING] ) + do + headers := a_header + end + +feature {NONE} -- Implementation + + real_filename (fn: STRING): STRING + -- Real filename from url-path `fn' + --| Find a better design for this piece of code + --| Eventually in a spec/$ISE_PLATFORM/ specific cluster + do + if {PLATFORM}.is_windows then + create Result.make_from_string (fn) + Result.replace_substring_all ("/", "\") + if Result[Result.count] = '\' then + Result.remove_tail (1) + end + else + Result := fn + if Result[Result.count] = '/' then + Result := Result.substring (1, Result.count - 1) + end + end + end + +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/response/http_response.e b/library/response/http_response.e index eba6ee17..5860d6ec 100644 --- a/library/response/http_response.e +++ b/library/response/http_response.e @@ -1,147 +1,147 @@ - -class HTTP_RESPONSE - -inherit - HTTP_CONSTANTS - redefine - default_create - end - -create - default_create - -feature -- creation - - default_create - do - Precursor - set_defaults - end - - set_defaults - -- Set default values for the reply - do - status_code := ok - create content_length_data.make_empty - reason_phrase := ok_message - content_type_data := text_html - set_reply_text (Void) - end - -feature -- Recycle - - reset - do - set_defaults - end - -feature -- response header fields - - status_code: STRING - -- status - - content_length_data : STRING - -- length - - reason_phrase: STRING - -- message, if any - - content_type_data: STRING - -- type of content in this reply (eg. text/html) - -feature -- Element change - - set_content_length (new_content_length: INTEGER) - require - positive_or_zero: new_content_length >= 0 - do - content_length_data := new_content_length.out - end - - set_status_code (new_status_code: STRING) - require - not_void: new_status_code /= Void - do - status_code := new_status_code - end - - set_reason_phrase (new_reason_phrase: STRING) - require - not_void: new_reason_phrase /= Void - do - reason_phrase := new_reason_phrase - end - - set_content_type (new_content_type: STRING) - require - not_void: new_content_type /= Void - do - content_type_data := new_content_type - end - -feature -- Access: send reply - - reply_header: STRING - -- header - do - Result := http_version_1_1.twin - Result.extend (' ') - Result.append (status_code) - Result.extend (' ') - Result.append (reason_phrase) - Result.append (crlf) - Result.append ({HTTP_SERVER_CONFIGURATION}.Server_details) - Result.append (crlf) - Result.append (Content_type + ": ") - Result.append (content_type_data) - Result.append (crlf) - Result.append (Content_length + ": ") - Result.append (content_length_data) - Result.append (crlf) - Result.append (crlf) - -- TODO: could add the size of data being sent here and - -- then keep the connection alive - end - - reply_header_continue: STRING - -- header - do - Result := http_version_1_1.twin - Result.extend (' ') - Result.append (status_code) - Result.extend (' ') - Result.append (continue_message) - Result.append (crlf) - Result.append (crlf) - -- TODO: could add the size of data being sent here and - -- then keep the connection alive - end - - reply_text: STRING - -- reply text - -feature -- Change element: send reply - - set_reply_text (new_text: detachable STRING) - -- text could be Void - do - if new_text = Void then - create reply_text.make_empty - else - reply_text := new_text - end - end - - append_reply_text (more_text: STRING) - -- add more text to the reply - require - reply_text /= Void - more_text /= Void - do - reply_text.append (more_text) - end - -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end + +class HTTP_RESPONSE + +inherit + HTTP_CONSTANTS + redefine + default_create + end + +create + default_create + +feature -- creation + + default_create + do + Precursor + set_defaults + end + + set_defaults + -- Set default values for the reply + do + status_code := ok + create content_length_data.make_empty + reason_phrase := ok_message + content_type_data := text_html + set_reply_text (Void) + end + +feature -- Recycle + + reset + do + set_defaults + end + +feature -- response header fields + + status_code: STRING + -- status + + content_length_data : STRING + -- length + + reason_phrase: STRING + -- message, if any + + content_type_data: STRING + -- type of content in this reply (eg. text/html) + +feature -- Element change + + set_content_length (new_content_length: INTEGER) + require + positive_or_zero: new_content_length >= 0 + do + content_length_data := new_content_length.out + end + + set_status_code (new_status_code: STRING) + require + not_void: new_status_code /= Void + do + status_code := new_status_code + end + + set_reason_phrase (new_reason_phrase: STRING) + require + not_void: new_reason_phrase /= Void + do + reason_phrase := new_reason_phrase + end + + set_content_type (new_content_type: STRING) + require + not_void: new_content_type /= Void + do + content_type_data := new_content_type + end + +feature -- Access: send reply + + reply_header: STRING + -- header + do + Result := http_version_1_1.twin + Result.extend (' ') + Result.append (status_code) + Result.extend (' ') + Result.append (reason_phrase) + Result.append (crlf) + Result.append ({HTTP_SERVER_CONFIGURATION}.Server_details) + Result.append (crlf) + Result.append (Content_type + ": ") + Result.append (content_type_data) + Result.append (crlf) + Result.append (Content_length + ": ") + Result.append (content_length_data) + Result.append (crlf) + Result.append (crlf) + -- TODO: could add the size of data being sent here and + -- then keep the connection alive + end + + reply_header_continue: STRING + -- header + do + Result := http_version_1_1.twin + Result.extend (' ') + Result.append (status_code) + Result.extend (' ') + Result.append (continue_message) + Result.append (crlf) + Result.append (crlf) + -- TODO: could add the size of data being sent here and + -- then keep the connection alive + end + + reply_text: STRING + -- reply text + +feature -- Change element: send reply + + set_reply_text (new_text: detachable STRING) + -- text could be Void + do + if new_text = Void then + create reply_text.make_empty + else + reply_text := new_text + end + end + + append_reply_text (more_text: STRING) + -- add more text to the reply + require + reply_text /= Void + more_text /= Void + do + reply_text.append (more_text) + end + +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/shared_uri_contents_types.e b/library/shared_uri_contents_types.e index 1909737b..787737d0 100644 --- a/library/shared_uri_contents_types.e +++ b/library/shared_uri_contents_types.e @@ -1,18 +1,18 @@ -note - description: "Summary description for {SHARED_URI_CONTENTS_TYPES}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - SHARED_URI_CONTENTS_TYPES -feature - - ct_table: URI_CONTENTS_TYPES - once - create Result.make - end -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +note + description: "Summary description for {SHARED_URI_CONTENTS_TYPES}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + SHARED_URI_CONTENTS_TYPES +feature + + ct_table: URI_CONTENTS_TYPES + once + create Result.make + end +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/tcp_stream_socket.e b/library/tcp_stream_socket.e index 5c3ccf07..bf48a991 100644 --- a/library/tcp_stream_socket.e +++ b/library/tcp_stream_socket.e @@ -1,82 +1,82 @@ -note - description: "Summary description for {TCP_STREAM_SOCKET}." - date: "$Date$" - revision: "$Revision$" - -class - TCP_STREAM_SOCKET - -inherit - NETWORK_STREAM_SOCKET - redefine - make - end - -create - make_server_by_address_and_port, - make_server_by_port - -create {NETWORK_STREAM_SOCKET} - make_from_descriptor_and_address - -feature {NONE} -- Initialization - - make - -- Create a network stream socket. - do - Precursor - set_reuse_address - end - - make_server_by_address_and_port (an_address: INET_ADDRESS; a_port: INTEGER) - -- Create server socket on `an_address' and `a_port'. - require - valid_port: a_port >= 0 - do - make - create address.make_from_address_and_port (an_address, a_port) - bind - end - -feature -- Basic operation - - send_message (a_msg: STRING) - local - a_package : PACKET - a_data : MANAGED_POINTER - c_string : C_STRING - do - create c_string.make (a_msg) - create a_data.make_from_pointer (c_string.item, a_msg.count + 1) - create a_package.make_from_managed_pointer (a_data) - send (a_package, 1) - end - -feature -- Output - - put_readable_string_8 (s: READABLE_STRING_8) - -- Write readable string `s' to socket. - local - ext: C_STRING - do - create ext.make (s) - put_managed_pointer (ext.managed_data, 0, s.count) - end - -feature -- Status report - - try_ready_for_reading: BOOLEAN - -- Is data available for reading from the socket right now? - require - socket_exists: exists - local - retval: INTEGER - do - retval := c_select_poll_with_timeout (descriptor, True, 0) - Result := (retval > 0) - end - -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +note + description: "Summary description for {TCP_STREAM_SOCKET}." + date: "$Date$" + revision: "$Revision$" + +class + TCP_STREAM_SOCKET + +inherit + NETWORK_STREAM_SOCKET + redefine + make + end + +create + make_server_by_address_and_port, + make_server_by_port + +create {NETWORK_STREAM_SOCKET} + make_from_descriptor_and_address + +feature {NONE} -- Initialization + + make + -- Create a network stream socket. + do + Precursor + set_reuse_address + end + + make_server_by_address_and_port (an_address: INET_ADDRESS; a_port: INTEGER) + -- Create server socket on `an_address' and `a_port'. + require + valid_port: a_port >= 0 + do + make + create address.make_from_address_and_port (an_address, a_port) + bind + end + +feature -- Basic operation + + send_message (a_msg: STRING) + local + a_package : PACKET + a_data : MANAGED_POINTER + c_string : C_STRING + do + create c_string.make (a_msg) + create a_data.make_from_pointer (c_string.item, a_msg.count + 1) + create a_package.make_from_managed_pointer (a_data) + send (a_package, 1) + end + +feature -- Output + + put_readable_string_8 (s: READABLE_STRING_8) + -- Write readable string `s' to socket. + local + ext: C_STRING + do + create ext.make (s) + put_managed_pointer (ext.managed_data, 0, s.count) + end + +feature -- Status report + + try_ready_for_reading: BOOLEAN + -- Is data available for reading from the socket right now? + require + socket_exists: exists + local + retval: INTEGER + do + retval := c_select_poll_with_timeout (descriptor, True, 0) + Result := (retval > 0) + end + +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/uri_contents_types.e b/library/uri_contents_types.e index 9c60b3dc..9cc59856 100644 --- a/library/uri_contents_types.e +++ b/library/uri_contents_types.e @@ -1,91 +1,91 @@ -class URI_CONTENTS_TYPES - -create - - make - - -feature - - content_types: HASH_TABLE [STRING, STRING] - - extension (uri: STRING): STRING - -- extract extendion from a URI - local - i: INTEGER - do - -- going from the end find the position of the "." - from - i := uri.count - until - i = 0 or else uri.item (i) = '.' - loop - i := i - 1 - end - Result := uri.substring (i+1, uri.count) - end - -feature {NONE} - - make - do - create content_types.make (30) - content_types.put ("text/html", "html") - content_types.put ("text/html", "htm") - content_types.put ("image/gif", "gif") - content_types.put ("image/jpeg", "jpeg") - content_types.put ("image/png", "jpg") - content_types.put ("image/png", "png") - end - - - -feature -- Access: Encoding - - urlencode (s: STRING): STRING - -- URL encode `s' - do - Result := s.string - Result.replace_substring_all ("#", "%%23") - Result.replace_substring_all (" ", "%%20") - Result.replace_substring_all ("%T", "%%09") - Result.replace_substring_all ("%N", "%%0A") - Result.replace_substring_all ("/", "%%2F") - Result.replace_substring_all ("&", "%%26") - Result.replace_substring_all ("<", "%%3C") - Result.replace_substring_all ("=", "%%3D") - Result.replace_substring_all (">", "%%3E") - Result.replace_substring_all ("%"", "%%22") - Result.replace_substring_all ("%'", "%%27") - end - - urldecode (s: STRING): STRING - -- URL decode `s' - do - Result := s.string - Result.replace_substring_all ("%%23", "#") - Result.replace_substring_all ("%%20", " ") - Result.replace_substring_all ("%%09", "%T") - Result.replace_substring_all ("%%0A", "%N") - Result.replace_substring_all ("%%2F", "/") - Result.replace_substring_all ("%%26", "&") - Result.replace_substring_all ("%%3C", "<") - Result.replace_substring_all ("%%3D", "=") - Result.replace_substring_all ("%%3E", ">") - Result.replace_substring_all ("%%22", "%"") - Result.replace_substring_all ("%%27", "%'") - end - - stripslashes (s: STRING): STRING - do - Result := s.string - Result.replace_substring_all ("\%"", "%"") - Result.replace_substring_all ("\'", "'") - Result.replace_substring_all ("\/", "/") - Result.replace_substring_all ("\\", "\") - end - -note - copyright: "2011-2011, Javier Velilla and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" -end +class URI_CONTENTS_TYPES + +create + + make + + +feature + + content_types: HASH_TABLE [STRING, STRING] + + extension (uri: STRING): STRING + -- extract extendion from a URI + local + i: INTEGER + do + -- going from the end find the position of the "." + from + i := uri.count + until + i = 0 or else uri.item (i) = '.' + loop + i := i - 1 + end + Result := uri.substring (i+1, uri.count) + end + +feature {NONE} + + make + do + create content_types.make (30) + content_types.put ("text/html", "html") + content_types.put ("text/html", "htm") + content_types.put ("image/gif", "gif") + content_types.put ("image/jpeg", "jpeg") + content_types.put ("image/png", "jpg") + content_types.put ("image/png", "png") + end + + + +feature -- Access: Encoding + + urlencode (s: STRING): STRING + -- URL encode `s' + do + Result := s.string + Result.replace_substring_all ("#", "%%23") + Result.replace_substring_all (" ", "%%20") + Result.replace_substring_all ("%T", "%%09") + Result.replace_substring_all ("%N", "%%0A") + Result.replace_substring_all ("/", "%%2F") + Result.replace_substring_all ("&", "%%26") + Result.replace_substring_all ("<", "%%3C") + Result.replace_substring_all ("=", "%%3D") + Result.replace_substring_all (">", "%%3E") + Result.replace_substring_all ("%"", "%%22") + Result.replace_substring_all ("%'", "%%27") + end + + urldecode (s: STRING): STRING + -- URL decode `s' + do + Result := s.string + Result.replace_substring_all ("%%23", "#") + Result.replace_substring_all ("%%20", " ") + Result.replace_substring_all ("%%09", "%T") + Result.replace_substring_all ("%%0A", "%N") + Result.replace_substring_all ("%%2F", "/") + Result.replace_substring_all ("%%26", "&") + Result.replace_substring_all ("%%3C", "<") + Result.replace_substring_all ("%%3D", "=") + Result.replace_substring_all ("%%3E", ">") + Result.replace_substring_all ("%%22", "%"") + Result.replace_substring_all ("%%27", "%'") + end + + stripslashes (s: STRING): STRING + do + Result := s.string + Result.replace_substring_all ("\%"", "%"") + Result.replace_substring_all ("\'", "'") + Result.replace_substring_all ("\/", "/") + Result.replace_substring_all ("\\", "\") + end + +note + copyright: "2011-2011, Javier Velilla and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/nino.rc b/nino.rc deleted file mode 100644 index d3f5a12f..00000000 --- a/nino.rc +++ /dev/null @@ -1 +0,0 @@ - diff --git a/readme.txt b/readme.txt index 14e7c33f..c2ea2eb5 100644 --- a/readme.txt +++ b/readme.txt @@ -1,38 +1,38 @@ -Eiffel Nino HTTPD -================= -Eiffel Nino is and HTTPD server. It's a work in progress, so maybe it will be refactored. -The goal of is to provide a simple web server for development (like Java, Python and Ruby provide) -The code is based on Xebra and Emu Web Server. - - -Goal -======== -HTTPD server for development, support for HTTP 1.1. - - - - -Testing -======= -To test the HTTPD server, you could run the [example https://github.com/jvelilla/EiffelWebNino/tree/master/example/SimpleWebServer] -The server work fine in Windows and Linux. - -Run the server and point your browser to one of the following URIs - -1) http://localhost:9000/post/index.html -2) http://localhost:9000/demo1/template.html -3) http://localhost:9000/demo2/demo.html -4) http://localhost:9000/example/html/index.html -5) http://localhost:9000/html/simple.html -6) http://localhost:9000/html/images.html -7) http://localhost:9000/html/images.html -8) http://localhost:9000/html5/dataset.html - -Known Issues -============ - - - - - - +Eiffel Nino HTTPD +================= +Eiffel Nino is and HTTPD server. It's a work in progress, so maybe it will be refactored. +The goal of is to provide a simple web server for development (like Java, Python and Ruby provide) +The code is based on Xebra and Emu Web Server. + + +Goal +======== +HTTPD server for development, support for HTTP 1.1. + + + + +Testing +======= +To test the HTTPD server, you could run the [example https://github.com/jvelilla/EiffelWebNino/tree/master/example/SimpleWebServer] +The server work fine in Windows and Linux. + +Run the server and point your browser to one of the following URIs + +1) http://localhost:9000/post/index.html +2) http://localhost:9000/demo1/template.html +3) http://localhost:9000/demo2/demo.html +4) http://localhost:9000/example/html/index.html +5) http://localhost:9000/html/simple.html +6) http://localhost:9000/html/images.html +7) http://localhost:9000/html/images.html +8) http://localhost:9000/html5/dataset.html + +Known Issues +============ + + + + + +