Merge branch 'master' of github.com:EiffelWebFramework/EWF into widget_integration

This commit is contained in:
2014-07-07 10:30:42 +02:00
318 changed files with 14865 additions and 10865 deletions

142
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,142 @@
# Contributing to this project
Please take a moment to review this document in order to make the contribution
process easy and effective for everyone involved.
Following these guidelines helps to communicate that you respect the time of
the developers managing and developing this open source project. In return,
they should reciprocate that respect in addressing your issue or assessing
patches and features.
## Using the issue tracker
The issue tracker is the preferred channel for [bug reports](#bugs),
[features requests](#features) and [submitting pull
requests](#pull-requests), but please respect the following restrictions:
* Please **do not** use the issue tracker for personal support requests (use
[Stack Overflow](http://stackoverflow.com) or IRC).
* Please **do not** derail or troll issues. Keep the discussion on topic and
respect the opinions of others.
<a name="bugs"></a>
## Bug reports
A bug is a _demonstrable problem_ that is caused by the code in the repository.
Good bug reports are extremely helpful - thank you!
Guidelines for bug reports:
1. **Use the GitHub issue search** &mdash; check if the issue has already been
reported.
2. **Check if the issue has been fixed** &mdash; try to reproduce it using the
latest `master` or development branch in the repository.
3. **Isolate the problem** &mdash; ideally create a [reduced test
case](http://css-tricks.com/6263-reduced-test-cases/) and a live example.
A good bug report shouldn't leave others needing to chase you up for more
information. Please try to be as detailed as possible in your report. What is
your environment? What steps will reproduce the issue? What browser(s) and OS
experience the problem? What would you expect to be the outcome? All these
details will help people to fix any potential bugs.
Example:
> Short and descriptive example bug report title
>
> A summary of the issue and the browser/OS environment in which it occurs. If
> suitable, include the steps required to reproduce the bug.
>
> 1. This is the first step
> 2. This is the second step
> 3. Further steps, etc.
>
> `<url>` - a link to the reduced test case
>
> Any other information you want to share that is relevant to the issue being
> reported. This might include the lines of code that you have identified as
> causing the bug, and potential solutions (and your opinions on their
> merits).
<a name="features"></a>
## Feature requests
Feature requests are welcome. But take a moment to find out whether your idea
fits with the scope and aims of the project. It's up to *you* to make a strong
case to convince the project's developers of the merits of this feature. Please
provide as much detail and context as possible.
<a name="pull-requests"></a>
## Pull requests
Good pull requests - patches, improvements, new features - are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits.
**Please ask first** before embarking on any significant pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project.
Please adhere to the coding conventions used throughout a project (indentation,
accurate comments, etc.) and any other requirements (such as test coverage).
Adhering to the following this process is the best way to get your work
included in the project:
1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
and configure the remotes:
```bash
# Clone your fork of the repo into the current directory
git clone https://github.com/<your-username>/<repo-name>
# Navigate to the newly cloned directory
cd <repo-name>
# Assign the original repo to a remote called "upstream"
git remote add upstream https://github.com/<upstream-owner>/<repo-name>
```
2. If you cloned a while ago, get the latest changes from upstream:
```bash
git checkout <dev-branch>
git pull upstream <dev-branch>
```
3. Create a new topic branch (off the main project development branch) to
contain your feature, change, or fix:
```bash
git checkout -b <topic-branch-name>
```
4. Commit your changes in logical chunks. Please adhere to these [git commit
message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
or your code is unlikely be merged into the main project. Use Git's
[interactive rebase](https://help.github.com/articles/interactive-rebase)
feature to tidy up your commits before making them public.
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
git pull [--rebase] upstream <dev-branch>
```
6. Push your topic branch up to your fork:
```bash
git push origin <topic-branch-name>
```
7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
with a clear title and description.
**IMPORTANT**: By submitting a patch, you agree to allow the project owner to
license your work under the same license as that used by the project.

View File

@@ -3,6 +3,27 @@
## Overview ## Overview
The Eiffel Web Framework (EWF) provides Eiffel users with a layer to build anything on top of the http protocol such as websites, web API/services.
This layer is multi-platform: it can be set on Windows, Linux operating systems, and in addition it can run on top of any httpd servers such as Apache2, IIS, nginx, lighttpd. EWF includes as well a standalone httpd web server component, written in Eiffel, which enables users to run easily a web server on their machine, or even embed this component in any application written with Eiffel.
Currently EWF offers a collection of Eiffel libraries designed to be integrated with each others, and among other functionalities, it give simple access to the request data, to handle content negotiation, url dispatcher, integrate with openid system, and so on.
There is a growing ecosystem around EWF, that provides useful components:
* OpenID and OAuth consumer library
* Various hypermedia format such as HAL, Collection+json, …
* Websocket server and client
* Template engine
* API Auto-documentation with swagger
* A simple experimental CMS.
* ...
So if you want to build a website, a web api, RESTful service, …or even if you want to consume other web api, EWF is a solution.
EWF brings with it all the advantages of the Eiffel technology and tools with its powerful features such as Design by Contract, debugging, testing tools which enable to build efficient systems expected to be repeatedly refined, extended, and improved in a predictable and controllable way so as to become with time bugfree systems. Enjoy the full power of debugging your web server application from the IDE.
## Project
Official project site for Eiffel Web Framework: Official project site for Eiffel Web Framework:
* http://eiffelwebframework.github.com/EWF/ * http://eiffelwebframework.github.com/EWF/
@@ -14,10 +35,14 @@ For more information please have a look at the related wiki:
For download, check For download, check
* https://github.com/EiffelWebFramework/EWF/downloads * https://github.com/EiffelWebFramework/EWF/downloads
Tasks and issues are managed with github issue system
* See https://github.com/EiffelWebFramework/EWF/issues
* And visual dashboard: https://waffle.io/eiffelwebframework/ewf
## Requirements ## Requirements
* Compiling from EiffelStudio 7.2 * Compiling from EiffelStudio 7.2 to 13.11 and more recent version of the compiler.
* Developped using EiffelStudio 7.3 (on Windows, Linux) * Developped using EiffelStudio 13.11 (on Windows, Linux)
* Tested using EiffelStudio 7.2 with "jenkins" CI server (not anymore compatible with 6.8 due to use of `TABLE_ITERABLE') * Tested using EiffelStudio 13.11 with "jenkins" CI server (not anymore compatible with 6.8 due to use of `TABLE_ITERABLE')
* The code have to allow __void-safe__ compilation and non void-safe system (see [more about void-safety](http://docs.eiffel.com/book/method/void-safe-programming-eiffel) ) * The code have to allow __void-safe__ compilation and non void-safe system (see [more about void-safety](http://docs.eiffel.com/book/method/void-safe-programming-eiffel) )
## How to get the source code? ## How to get the source code?
@@ -41,7 +66,7 @@ Using git
### protocol ### protocol
* __http__: HTTP related classes, constants for status code, content types, ... [read more](library/protocol/http) * __http__: HTTP related classes, constants for status code, content types, ... [read more](library/protocol/http)
* __uri_template__: URI Template library (parsing and expander) [read more](library/protocol/uri_template) * __uri_template__: URI Template library (parsing and expander) [read more](library/protocol/uri_template)
* __CONNEG__: CONNEG library (Content-type Negociation) [read more](library/protocol/CONNEG) * __CONNEG__: Content negotiation library (Content-type Negociation) [read more](library/protocol/content_negotiation)
### client ### client
* __http_client__: simple HTTP client based on cURL [read more](library/client/http_client) * __http_client__: simple HTTP client based on cURL [read more](library/client/http_client)
@@ -61,6 +86,23 @@ Using git
## Examples ## Examples
.. ..
## Contributing to this project
Anyone and everyone is welcome to contribute. Please take a moment to
review the [guidelines for contributing](CONTRIBUTING.md).
* [Bug reports](CONTRIBUTING.md#bugs)
* [Feature requests](CONTRIBUTING.md#features)
* [Pull requests](CONTRIBUTING.md#pull-requests)
## Community
Keep track of development and community news.
* Follow [@EiffelWeb](https://twitter.com/EiffelWeb) on Twitter
* Follow our [page](https://plus.google.com/u/0/110650349519032194479) and [community](https://plus.google.com/communities/110457383244374256721) on Google+
* Have a question that's not a feature request or bug report? [Ask on the mailing list](http://groups.google.com/group/eiffel-web-framework)
For more information please have a look at the related wiki: For more information please have a look at the related wiki:
* https://github.com/EiffelWebFramework/EWF/wiki * https://github.com/EiffelWebFramework/EWF/wiki

View File

@@ -1,44 +1,44 @@
note note
description : "nino application root class" description : "nino application root class"
date : "$Date$" date : "$Date$"
revision : "$Revision$" revision : "$Revision$"
class class
APPLICATION APPLICATION
inherit inherit
ARGUMENTS ARGUMENTS
HTTP_SERVER_SHARED_CONFIGURATION HTTP_SERVER_SHARED_CONFIGURATION
create create
make make
feature {NONE} -- Initialization feature {NONE} -- Initialization
make make
-- Run application. -- Run application.
local local
l_server : HTTP_SERVER l_server : HTTP_SERVER
l_cfg: HTTP_SERVER_CONFIGURATION l_cfg: HTTP_SERVER_CONFIGURATION
l_http_handler : HTTP_HANDLER l_http_handler : HTTP_HANDLER
do do
create l_cfg.make create l_cfg.make
l_cfg.http_server_port := 9_000 l_cfg.http_server_port := 9_000
l_cfg.document_root := default_document_root l_cfg.document_root := default_document_root
set_server_configuration (l_cfg) set_server_configuration (l_cfg)
debug ("nino") debug ("nino")
l_cfg.set_is_verbose (True) l_cfg.set_is_verbose (True)
end end
create l_server.make (l_cfg) create l_server.make (l_cfg)
create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server) create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server)
l_server.setup (l_http_handler) l_server.setup (l_http_handler)
end end
feature -- Access feature -- Access
default_document_root: STRING = "webroot" default_document_root: STRING = "webroot"
end end

View File

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

View File

@@ -1,53 +1,53 @@
note note
description: "Summary description for {POST_REQUEST_HANDLER}." description: "Summary description for {POST_REQUEST_HANDLER}."
author: "" author: ""
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
POST_REQUEST_HANDLER POST_REQUEST_HANDLER
inherit inherit
GET_REQUEST_HANDLER GET_REQUEST_HANDLER
redefine redefine
process process
end end
create create
make make
feature -- Execution feature -- Execution
process process
-- process the request and create an answer -- process the request and create an answer
local local
l_data: STRING l_data: STRING
s: detachable STRING s: detachable STRING
n: INTEGER n: INTEGER
sock: like socket sock: like socket
do do
from from
n := 1_024 n := 1_024
sock := socket sock := socket
if sock.socket_ok then if sock.socket_ok then
sock.read_stream_thread_aware (n) sock.read_stream_thread_aware (n)
s := sock.last_string s := sock.last_string
else else
s := Void s := Void
end end
create l_data.make_empty create l_data.make_empty
until until
s = Void or else s.count < n s = Void or else s.count < n
loop loop
l_data.append_string (s) l_data.append_string (s)
if sock.socket_ok then if sock.socket_ok then
sock.read_stream_thread_aware (n) sock.read_stream_thread_aware (n)
s := sock.last_string s := sock.last_string
else else
s := Void s := Void
end end
end end
Precursor Precursor
end end
end end

View File

@@ -1,91 +1,91 @@
1.4.2 1.4.2
[Feature] [Feature]
- The plugin support percentages as target ('50%' or {top:'50%', left:'45%'}) - The plugin support percentages as target ('50%' or {top:'50%', left:'45%'})
- Exposed the max() calculation as $.scrollTo.max - Exposed the max() calculation as $.scrollTo.max
[Enhancement] [Enhancement]
- Renamed $.fn.scrollable to $.fn._scrollable to avoid conflicts with other plugins - Renamed $.fn.scrollable to $.fn._scrollable to avoid conflicts with other plugins
[Fix] [Fix]
- Fixing max calculations for regular DOM elements - Fixing max calculations for regular DOM elements
1.4.1 1.4.1
[Feature] [Feature]
- The target can be 'max' to scroll to the end while keeping it elegant. - The target can be 'max' to scroll to the end while keeping it elegant.
[Enhancement] [Enhancement]
- Default duration is 0 for jquery +1.3. Means sync animation - Default duration is 0 for jquery +1.3. Means sync animation
- The plugin works on all major browsers, on compat & quirks modes, including iframes. - 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. - In addition to window/document, if html or body are received, the plugin will choose the right one.
[Fix] [Fix]
- The plugin accepts floating numbers, Thanks Ramin - The plugin accepts floating numbers, Thanks Ramin
- Using jQuery.nodeName where neccessary so that this works on xml+xhtml - 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). - 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 1.4
[Fix] [Fix]
- Fixed the problem when scrolling the window to absolute positioned elements on Safari. - 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. - Fixed the problem on Opera 9.5 when scrolling the window. That it always scrolls to 0.
[Feature] [Feature]
- Added the settings object as 2nd argument to the onAfter callback. - 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. - 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). - Added full support for iframes (even max scroll calculation).
- Instead of $.scrollTo, $(window).scrollTo() and $(document).scrollTo() can be used. - 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. - Added $().scrollable() that returns the real element to scroll, f.e: $(window).scrollable() == [body|html], works for iframes.
[Enhancement] [Enhancement]
- Cleaned the code a bit, specially the comments - Cleaned the code a bit, specially the comments
1.3.3 1.3.3
[Change] [Change]
- Changed the licensing from GPL to GPL+MIT. - Changed the licensing from GPL to GPL+MIT.
1.3.2 1.3.2
[Enhancement] [Enhancement]
- Small improvements to make the code shorter. - Small improvements to make the code shorter.
[Change] [Change]
- Removed the last argument received by onAfter as it was the same as the 'this' but jqueryfied. - Removed the last argument received by onAfter as it was the same as the 'this' but jqueryfied.
1.3.1 1.3.1
[Feature] [Feature]
- Exposed $.scrollTo.window() to get the element that needs to be animated, to scroll the window. - Exposed $.scrollTo.window() to get the element that needs to be animated, to scroll the window.
- Added option 'over'. - Added option 'over'.
[Enhancement] [Enhancement]
- Made the code as short as possible. - Made the code as short as possible.
[Change] [Change]
- Changed the arguments received by onAfter - Changed the arguments received by onAfter
1.3 1.3
[Enhancement] [Enhancement]
- Added semicolon to the start, for safe file concatenation - Added semicolon to the start, for safe file concatenation
- Added a limit check, values below 0 or over the maximum are fixed. - 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. - Now it should work faster, only one of html or body go through all the processing, instead of both for all browsers.
[Fix] [Fix]
- Fixed the behavior for Opera, which seemed to react to both changes on <html> and <body>. - Fixed the behavior for Opera, which seemed to react to both changes on <html> and <body>.
- The border is also reduced, when 'margin' is set to true. - The border is also reduced, when 'margin' is set to true.
[Change] [Change]
- The option speed has been renamed to duration. - The option speed has been renamed to duration.
[Feature] [Feature]
- The duration can be specified with a number as 2nd argument, and the rest of the settings as the third ( like $().animate ) - 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 - Remade the demo
1.2.4 1.2.4
[Enhancement] [Enhancement]
- The target can be in the form of { top:x, left:y } allowing different position for each axis. - The target can be in the form of { top:x, left:y } allowing different position for each axis.
[Feature] [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 }. - 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 1.2.3
[Feature] [Feature]
- Exposed the defaults. - Exposed the defaults.
[Enhancement] [Enhancement]
- Made the callback functions receive more parameters. - Made the callback functions receive more parameters.
1.2.2 1.2.2
[Fix] [Fix]
- Fixed a bug, I didn't have to add the scrolled amount if it was body or html. - Fixed a bug, I didn't have to add the scrolled amount if it was body or html.
1.2 1.2
[Change] [Change]
- The option 'onafter' is now called 'onAfter'. - The option 'onafter' is now called 'onAfter'.
[Feature] [Feature]
- Two axes can be scrolled together, this is set with the option 'axis'. - 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. - 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. - 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). - 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).

View File

@@ -1,11 +1,11 @@
/** /**
* jQuery.ScrollTo - Easy element scrolling using jQuery. * jQuery.ScrollTo - Easy element scrolling using jQuery.
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL. * Dual licensed under MIT and GPL.
* Date: 5/25/2009 * Date: 5/25/2009
* @author Ariel Flesler * @author Ariel Flesler
* @version 1.4.2 * @version 1.4.2
* *
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html * 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); ;(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);

View File

@@ -1,215 +1,215 @@
/** /**
* jQuery.ScrollTo * jQuery.ScrollTo
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL. * Dual licensed under MIT and GPL.
* Date: 5/25/2009 * Date: 5/25/2009
* *
* @projectDescription Easy element scrolling using jQuery. * @projectDescription Easy element scrolling using jQuery.
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html * 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. * 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 * @author Ariel Flesler
* @version 1.4.2 * @version 1.4.2
* *
* @id jQuery.scrollTo * @id jQuery.scrollTo
* @id jQuery.fn.scrollTo * @id jQuery.fn.scrollTo
* @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements.
* The different options for target are: * The different options for target are:
* - A number position (will be applied to all axes). * - A number position (will be applied to all axes).
* - A string position ('44', '100px', '+=90', etc ) 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 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 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 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. * - A percentage of the container's dimension/s, for example: 50% to go to the middle.
* - The string 'max' for go-to-end. * - 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 {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. * @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 {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'.
* @option {Number} duration The OVERALL length of the animation. * @option {Number} duration The OVERALL length of the animation.
* @option {String} easing The easing method for 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 {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} 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 {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 {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} 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. * @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. * @return {jQuery} Returns the same jQuery object, for chaining.
* *
* @desc Scroll to a fixed position * @desc Scroll to a fixed position
* @example $('div').scrollTo( 340 ); * @example $('div').scrollTo( 340 );
* *
* @desc Scroll relatively to the actual position * @desc Scroll relatively to the actual position
* @example $('div').scrollTo( '+=340px', { axis:'y' } ); * @example $('div').scrollTo( '+=340px', { axis:'y' } );
* *
* @dec Scroll using a selector (relative to the scrolled element) * @dec Scroll using a selector (relative to the scrolled element)
* @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } );
* *
* @ Scroll to a DOM element (same for jQuery object) * @ Scroll to a DOM element (same for jQuery object)
* @example var second_child = document.getElementById('container').firstChild.nextSibling; * @example var second_child = document.getElementById('container').firstChild.nextSibling;
* $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){
* alert('scrolled!!'); * alert('scrolled!!');
* }}); * }});
* *
* @desc Scroll on both axes, to different values * @desc Scroll on both axes, to different values
* @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
*/ */
;(function( $ ){ ;(function( $ ){
var $scrollTo = $.scrollTo = function( target, duration, settings ){ var $scrollTo = $.scrollTo = function( target, duration, settings ){
$(window).scrollTo( target, duration, settings ); $(window).scrollTo( target, duration, settings );
}; };
$scrollTo.defaults = { $scrollTo.defaults = {
axis:'xy', axis:'xy',
duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1 duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1
}; };
// Returns the element that needs to be animated to scroll the window. // Returns the element that needs to be animated to scroll the window.
// Kept for backwards compatibility (specially for localScroll & serialScroll) // Kept for backwards compatibility (specially for localScroll & serialScroll)
$scrollTo.window = function( scope ){ $scrollTo.window = function( scope ){
return $(window)._scrollable(); return $(window)._scrollable();
}; };
// Hack, hack, hack :) // Hack, hack, hack :)
// Returns the real elements to scroll (supports window/iframes, documents and regular nodes) // Returns the real elements to scroll (supports window/iframes, documents and regular nodes)
$.fn._scrollable = function(){ $.fn._scrollable = function(){
return this.map(function(){ return this.map(function(){
var elem = this, var elem = this,
isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;
if( !isWin ) if( !isWin )
return elem; return elem;
var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;
return $.browser.safari || doc.compatMode == 'BackCompat' ? return $.browser.safari || doc.compatMode == 'BackCompat' ?
doc.body : doc.body :
doc.documentElement; doc.documentElement;
}); });
}; };
$.fn.scrollTo = function( target, duration, settings ){ $.fn.scrollTo = function( target, duration, settings ){
if( typeof duration == 'object' ){ if( typeof duration == 'object' ){
settings = duration; settings = duration;
duration = 0; duration = 0;
} }
if( typeof settings == 'function' ) if( typeof settings == 'function' )
settings = { onAfter:settings }; settings = { onAfter:settings };
if( target == 'max' ) if( target == 'max' )
target = 9e9; target = 9e9;
settings = $.extend( {}, $scrollTo.defaults, settings ); settings = $.extend( {}, $scrollTo.defaults, settings );
// Speed is still recognized for backwards compatibility // Speed is still recognized for backwards compatibility
duration = duration || settings.speed || settings.duration; duration = duration || settings.speed || settings.duration;
// Make sure the settings are given right // Make sure the settings are given right
settings.queue = settings.queue && settings.axis.length > 1; settings.queue = settings.queue && settings.axis.length > 1;
if( settings.queue ) if( settings.queue )
// Let's keep the overall duration // Let's keep the overall duration
duration /= 2; duration /= 2;
settings.offset = both( settings.offset ); settings.offset = both( settings.offset );
settings.over = both( settings.over ); settings.over = both( settings.over );
return this._scrollable().each(function(){ return this._scrollable().each(function(){
var elem = this, var elem = this,
$elem = $(elem), $elem = $(elem),
targ = target, toff, attr = {}, targ = target, toff, attr = {},
win = $elem.is('html,body'); win = $elem.is('html,body');
switch( typeof targ ){ switch( typeof targ ){
// A number will pass the regex // A number will pass the regex
case 'number': case 'number':
case 'string': case 'string':
if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){
targ = both( targ ); targ = both( targ );
// We are done // We are done
break; break;
} }
// Relative selector, no break! // Relative selector, no break!
targ = $(targ,this); targ = $(targ,this);
case 'object': case 'object':
// DOMElement / jQuery // DOMElement / jQuery
if( targ.is || targ.style ) if( targ.is || targ.style )
// Get the real position of the target // Get the real position of the target
toff = (targ = $(targ)).offset(); toff = (targ = $(targ)).offset();
} }
$.each( settings.axis.split(''), function( i, axis ){ $.each( settings.axis.split(''), function( i, axis ){
var Pos = axis == 'x' ? 'Left' : 'Top', var Pos = axis == 'x' ? 'Left' : 'Top',
pos = Pos.toLowerCase(), pos = Pos.toLowerCase(),
key = 'scroll' + Pos, key = 'scroll' + Pos,
old = elem[key], old = elem[key],
max = $scrollTo.max(elem, axis); max = $scrollTo.max(elem, axis);
if( toff ){// jQuery / DOMElement if( toff ){// jQuery / DOMElement
attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );
// If it's a dom element, reduce the margin // If it's a dom element, reduce the margin
if( settings.margin ){ if( settings.margin ){
attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;
attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;
} }
attr[key] += settings.offset[pos] || 0; attr[key] += settings.offset[pos] || 0;
if( settings.over[pos] ) if( settings.over[pos] )
// Scroll to a fraction of its width/height // Scroll to a fraction of its width/height
attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos];
}else{ }else{
var val = targ[pos]; var val = targ[pos];
// Handle percentage values // Handle percentage values
attr[key] = val.slice && val.slice(-1) == '%' ? attr[key] = val.slice && val.slice(-1) == '%' ?
parseFloat(val) / 100 * max parseFloat(val) / 100 * max
: val; : val;
} }
// Number or 'number' // Number or 'number'
if( /^\d+$/.test(attr[key]) ) if( /^\d+$/.test(attr[key]) )
// Check the limits // Check the limits
attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max );
// Queueing axes // Queueing axes
if( !i && settings.queue ){ if( !i && settings.queue ){
// Don't waste time animating, if there's no need. // Don't waste time animating, if there's no need.
if( old != attr[key] ) if( old != attr[key] )
// Intermediate animation // Intermediate animation
animate( settings.onAfterFirst ); animate( settings.onAfterFirst );
// Don't animate this axis again in the next iteration. // Don't animate this axis again in the next iteration.
delete attr[key]; delete attr[key];
} }
}); });
animate( settings.onAfter ); animate( settings.onAfter );
function animate( callback ){ function animate( callback ){
$elem.animate( attr, duration, settings.easing, callback && function(){ $elem.animate( attr, duration, settings.easing, callback && function(){
callback.call(this, target, settings); callback.call(this, target, settings);
}); });
}; };
}).end(); }).end();
}; };
// Max scrolling position, works on quirks mode // Max scrolling position, works on quirks mode
// It only fails (not too badly) on IE, quirks mode. // It only fails (not too badly) on IE, quirks mode.
$scrollTo.max = function( elem, axis ){ $scrollTo.max = function( elem, axis ){
var Dim = axis == 'x' ? 'Width' : 'Height', var Dim = axis == 'x' ? 'Width' : 'Height',
scroll = 'scroll'+Dim; scroll = 'scroll'+Dim;
if( !$(elem).is('html,body') ) if( !$(elem).is('html,body') )
return elem[scroll] - $(elem)[Dim.toLowerCase()](); return elem[scroll] - $(elem)[Dim.toLowerCase()]();
var size = 'client' + Dim, var size = 'client' + Dim,
html = elem.ownerDocument.documentElement, html = elem.ownerDocument.documentElement,
body = elem.ownerDocument.body; body = elem.ownerDocument.body;
return Math.max( html[scroll], body[scroll] ) return Math.max( html[scroll], body[scroll] )
- Math.min( html[size] , body[size] ); - Math.min( html[size] , body[size] );
}; };
function both( val ){ function both( val ){
return typeof val == 'object' ? val : { top:val, left:val }; return typeof val == 'object' ? val : { top:val, left:val };
}; };
})( jQuery ); })( jQuery );

View File

@@ -1,12 +1,12 @@
$(document).ready(function(){ $(document).ready(function(){
/* This code is executed after the DOM has been completely loaded */ /* This code is executed after the DOM has been completely loaded */
$('nav a,footer a.up').click(function(e){ $('nav a,footer a.up').click(function(e){
// If a link has been clicked, scroll the page to the link's hash target: // If a link has been clicked, scroll the page to the link's hash target:
$.scrollTo( this.hash || 0, 1500); $.scrollTo( this.hash || 0, 1500);
e.preventDefault(); e.preventDefault();
}); });
}); });

View File

@@ -1,219 +1,219 @@
*{ *{
/* Universal reset: */ /* Universal reset: */
margin:0; margin:0;
padding:0; padding:0;
} }
header,footer, header,footer,
article,section, article,section,
hgroup,nav, hgroup,nav,
figure{ figure{
/* Giving a display value to the HTML5 rendered elements: */ /* Giving a display value to the HTML5 rendered elements: */
display:block; display:block;
} }
body{ body{
/* Setting the default text color, size, page background and a font stack: */ /* Setting the default text color, size, page background and a font stack: */
font-size:0.825em; font-size:0.825em;
color:#fcfcfc; color:#fcfcfc;
background-color:#355664; background-color:#355664;
font-family:Arial, Helvetica, sans-serif; font-family:Arial, Helvetica, sans-serif;
} }
/* Hyperlink Styles: */ /* Hyperlink Styles: */
a, a:visited { a, a:visited {
color:#0196e3; color:#0196e3;
text-decoration:none; text-decoration:none;
outline:none; outline:none;
} }
a:hover{ a:hover{
text-decoration:underline; text-decoration:underline;
} }
a img{ a img{
border:none; border:none;
} }
/* Headings: */ /* Headings: */
h1,h2,h3{ h1,h2,h3{
font-family:"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; font-family:"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif;
text-shadow:0 1px 1px black; text-shadow:0 1px 1px black;
} }
h1{ h1{
/* The logo text */ /* The logo text */
font-size:3.5em; font-size:3.5em;
padding:0.5em 0 0; padding:0.5em 0 0;
text-transform:uppercase; text-transform:uppercase;
} }
h3{ h3{
/* The slogan text */ /* The slogan text */
font-family:forte,"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif; font-family:forte,"Myriad Pro","Helvetica Neue",Helvetica,Arial,Sans-Serif;
font-size:2em; font-size:2em;
font-weight:normal; font-weight:normal;
margin:0 0 1em; margin:0 0 1em;
} }
h2{ h2{
font-size:2.2em; font-size:2.2em;
font-weight:normal; font-weight:normal;
letter-spacing:0.01em; letter-spacing:0.01em;
text-transform:uppercase; text-transform:uppercase;
} }
p{ p{
line-height:1.5em; line-height:1.5em;
padding-bottom:1em; padding-bottom:1em;
} }
.line{ .line{
/* The dividing line: */ /* The dividing line: */
height:1px; height:1px;
background-color:#24404c; background-color:#24404c;
border-bottom:1px solid #416371; border-bottom:1px solid #416371;
margin:1em 0; margin:1em 0;
overflow:hidden; overflow:hidden;
} }
article .line{ article .line{
/* The dividing line inside of the article is darker: */ /* The dividing line inside of the article is darker: */
background-color:#15242a; background-color:#15242a;
border-bottom-color:#204656; border-bottom-color:#204656;
margin:1.3em 0; margin:1.3em 0;
} }
footer .line{ footer .line{
margin:2em 0; margin:2em 0;
} }
nav{ nav{
background:url(img/gradient_light.jpg) repeat-x 50% 50% #f8f8f8; background:url(img/gradient_light.jpg) repeat-x 50% 50% #f8f8f8;
padding:0 5px; padding:0 5px;
position:absolute; position:absolute;
right:0; right:0;
top:4em; top:4em;
border:1px solid #FCFCFC; border:1px solid #FCFCFC;
-moz-box-shadow:0 1px 1px #333333; -moz-box-shadow:0 1px 1px #333333;
-webkit-box-shadow:0 1px 1px #333333; -webkit-box-shadow:0 1px 1px #333333;
box-shadow:0 1px 1px #333333; box-shadow:0 1px 1px #333333;
} }
/* The clearfix hack to clear the floats: */ /* The clearfix hack to clear the floats: */
.clear:after{ .clear:after{
content: "."; content: ".";
display: block; display: block;
height: 0; height: 0;
clear: both; clear: both;
visibility: hidden; visibility: hidden;
} }
/* The navigation styling: */ /* The navigation styling: */
nav ul li{ nav ul li{
display:inline; display:inline;
} }
nav ul li a, nav ul li a,
nav ul li a:visited{ nav ul li a:visited{
color:#565656; color:#565656;
display:block; display:block;
float:left; float:left;
font-size:1.25em; font-size:1.25em;
font-weight:bold; font-weight:bold;
margin:5px 2px; margin:5px 2px;
padding:7px 10px 4px; padding:7px 10px 4px;
text-shadow:0 1px 1px white; text-shadow:0 1px 1px white;
text-transform:uppercase; text-transform:uppercase;
} }
nav ul li a:hover{ nav ul li a:hover{
text-decoration:none; text-decoration:none;
background-color:#f0f0f0; background-color:#f0f0f0;
} }
nav, article, nav ul li a,figure{ nav, article, nav ul li a,figure{
/* Applying CSS3 rounded corners: */ /* Applying CSS3 rounded corners: */
-moz-border-radius:10px; -moz-border-radius:10px;
-webkit-border-radius:10px; -webkit-border-radius:10px;
border-radius:10px; border-radius:10px;
} }
/* Article styles: */ /* Article styles: */
#page{ #page{
width:960px; width:960px;
margin:0 auto; margin:0 auto;
position:relative; position:relative;
} }
article{ article{
background-color:#213E4A; background-color:#213E4A;
margin:3em 0; margin:3em 0;
padding:20px; padding:20px;
text-shadow:0 2px 0 black; text-shadow:0 2px 0 black;
} }
figure{ figure{
border:3px solid #142830; border:3px solid #142830;
float:right; float:right;
height:300px; height:300px;
margin-left:15px; margin-left:15px;
overflow:hidden; overflow:hidden;
width:500px; width:500px;
} }
figure:hover{ figure:hover{
-moz-box-shadow:0 0 2px #4D7788; -moz-box-shadow:0 0 2px #4D7788;
-webkit-box-shadow:0 0 2px #4D7788; -webkit-box-shadow:0 0 2px #4D7788;
box-shadow:0 0 2px #4D7788; box-shadow:0 0 2px #4D7788;
} }
figure img{ figure img{
margin-left:-60px; margin-left:-60px;
} }
/* Footer styling: */ /* Footer styling: */
footer{ footer{
margin-bottom:30px; margin-bottom:30px;
text-align:center; text-align:center;
font-size:0.825em; font-size:0.825em;
} }
footer p{ footer p{
margin-bottom:-2.5em; margin-bottom:-2.5em;
position:relative; position:relative;
} }
footer a,footer a:visited{ footer a,footer a:visited{
color:#cccccc; color:#cccccc;
background-color:#213e4a; background-color:#213e4a;
display:block; display:block;
padding:2px 4px; padding:2px 4px;
z-index:100; z-index:100;
position:relative; position:relative;
} }
footer a:hover{ footer a:hover{
text-decoration:none; text-decoration:none;
background-color:#142830; background-color:#142830;
} }
footer a.by{ footer a.by{
float:left; float:left;
} }
footer a.up{ footer a.up{
float:right; float:right;
} }

View File

@@ -1,139 +1,139 @@
<!DOCTYPE html> <!-- The new doctype --> <!DOCTYPE html> <!-- The new doctype -->
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Coding A CSS3 &amp; HTML5 One Page Template | Tutorialzine demo</title> <title>Coding A CSS3 &amp; HTML5 One Page Template | Tutorialzine demo</title>
<link rel="stylesheet" type="text/css" href="styles.css" /> <link rel="stylesheet" type="text/css" href="styles.css" />
<!-- Internet Explorer HTML5 enabling code: --> <!-- Internet Explorer HTML5 enabling code: -->
<!--[if IE]> <!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<style type="text/css"> <style type="text/css">
.clear { .clear {
zoom: 1; zoom: 1;
display: block; display: block;
} }
</style> </style>
<![endif]--> <![endif]-->
</head> </head>
<body> <body>
<section id="page"> <!-- Defining the #page section with the section tag --> <section id="page"> <!-- Defining the #page section with the section tag -->
<header> <!-- Defining the header section of the page with the appropriate tag --> <header> <!-- Defining the header section of the page with the appropriate tag -->
<hgroup> <hgroup>
<h1>Your Logo</h1> <h1>Your Logo</h1>
<h3>and a fancy slogan</h3> <h3>and a fancy slogan</h3>
</hgroup> </hgroup>
<nav class="clear"> <!-- The nav link semantically marks your main site navigation --> <nav class="clear"> <!-- The nav link semantically marks your main site navigation -->
<ul> <ul>
<li><a href="#article1">Photoshoot</a></li> <li><a href="#article1">Photoshoot</a></li>
<li><a href="#article2">Sweet Tabs</a></li> <li><a href="#article2">Sweet Tabs</a></li>
<li><a href="#article3">Navigation Menu</a></li> <li><a href="#article3">Navigation Menu</a></li>
</ul> </ul>
</nav> </nav>
</header> </header>
<section id="articles"> <!-- A new section with the articles --> <section id="articles"> <!-- A new section with the articles -->
<!-- Article 1 start --> <!-- Article 1 start -->
<div class="line"></div> <!-- Dividing line --> <div class="line"></div> <!-- Dividing line -->
<article id="article1"> <!-- The new article tag. The id is supplied so it can be scrolled into view. --> <article id="article1"> <!-- The new article tag. The id is supplied so it can be scrolled into view. -->
<h2>Photoshoot Effect</h2> <h2>Photoshoot Effect</h2>
<div class="line"></div> <div class="line"></div>
<div class="articleBody clear"> <div class="articleBody clear">
<figure> <!-- The figure tag marks data (usually an image) that is part of the article --> <figure> <!-- The figure tag marks data (usually an image) that is part of the article -->
<a href="http://tutorialzine.com/2010/02/photo-shoot-css-jquery/"><img src="http://tutorialzine.com/img/featured/641.jpg" width="620" height="340" /></a> <a href="http://tutorialzine.com/2010/02/photo-shoot-css-jquery/"><img src="http://tutorialzine.com/img/featured/641.jpg" width="620" height="340" /></a>
</figure> </figure>
<p>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.</p> <p>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.</p>
<p>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. </p> <p>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. </p>
</div> </div>
</article> </article>
<!-- Article 1 end --> <!-- Article 1 end -->
<!-- Article 2 start --> <!-- Article 2 start -->
<div class="line"></div> <div class="line"></div>
<article id="article2"> <article id="article2">
<h2>Sweet AJAX Tabs</h2> <h2>Sweet AJAX Tabs</h2>
<div class="line"></div> <div class="line"></div>
<div class="articleBody clear"> <div class="articleBody clear">
<figure> <figure>
<a href="http://tutorialzine.com/2010/01/sweet-tabs-jquery-ajax-css/"><img src="http://tutorialzine.com/img/featured/633.jpg" width="620" height="340" /></a> <a href="http://tutorialzine.com/2010/01/sweet-tabs-jquery-ajax-css/"><img src="http://tutorialzine.com/img/featured/633.jpg" width="620" height="340" /></a>
</figure> </figure>
<p>Here we are making sweet AJAX-powered tabs with CSS3 and the newly released version 1.4 of jQuery.</p> <p>Here we are making sweet AJAX-powered tabs with CSS3 and the newly released version 1.4 of jQuery.</p>
<p>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. </p> <p>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. </p>
</div> </div>
</article> </article>
<!-- Article 2 end --> <!-- Article 2 end -->
<!-- Article 3 start --> <!-- Article 3 start -->
<div class="line"></div> <div class="line"></div>
<article id="article3"> <article id="article3">
<h2>Halftone Navigation Menu</h2> <h2>Halftone Navigation Menu</h2>
<div class="line"></div> <div class="line"></div>
<div class="articleBody clear"> <div class="articleBody clear">
<figure> <figure>
<a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/"><img src="http://tutorialzine.com/img/featured/610.jpg" width="620" height="340" /></a> <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/"><img src="http://tutorialzine.com/img/featured/610.jpg" width="620" height="340" /></a>
</figure> </figure>
<p>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.</p> <p>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.</p>
<p>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. </p> <p>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. </p>
</div> </div>
</article> </article>
<!-- Article 3 end --> <!-- Article 3 end -->
</section> </section>
<footer> <!-- Marking the footer section --> <footer> <!-- Marking the footer section -->
<div class="line"></div> <div class="line"></div>
<p>Copyright 2010 - YourSite.com</p> <!-- Change the copyright notice --> <p>Copyright 2010 - YourSite.com</p> <!-- Change the copyright notice -->
<a href="#" class="up">Go UP</a> <a href="#" class="up">Go UP</a>
<a href="http://tutorialzine.com/2010/02/html5-css3-website-template/" class="by">Template by Tutorialzine</a> <a href="http://tutorialzine.com/2010/02/html5-css3-website-template/" class="by">Template by Tutorialzine</a>
</footer> </footer>
</section> <!-- Closing the #page section --> </section> <!-- Closing the #page section -->
<!-- JavaScript Includes --> <!-- JavaScript Includes -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script src="jquery.scrollTo-1.4.2/jquery.scrollTo-min.js"></script> <script src="jquery.scrollTo-1.4.2/jquery.scrollTo-min.js"></script>
<script src="script.js"></script> <script src="script.js"></script>
</body> </body>
</html> </html>

View File

@@ -1,43 +1,43 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Halftone Navigation Menu With jQuery &amp; CSS3 | Tutorialzine demo</title> <title>Halftone Navigation Menu With jQuery &amp; CSS3 | Tutorialzine demo</title>
<link rel="stylesheet" type="text/css" href="styles.css" /> <link rel="stylesheet" type="text/css" href="styles.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="script.js"></script> <script type="text/javascript" src="script.js"></script>
</head> </head>
<body> <body>
<h1>Halftone Navigation Menu With jQuery &amp; CSS3</h1> <h1>Halftone Navigation Menu With jQuery &amp; CSS3</h1>
<h2>View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial &raquo;</a></h2> <h2>View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial &raquo;</a></h2>
<div id="main"> <div id="main">
<div id="navigation"> <div id="navigation">
<ul class="menuUL"> <ul class="menuUL">
<!-- The class names that are assigned to the links correspond to name of the shape that is shown on hover: --> <!-- The class names that are assigned to the links correspond to name of the shape that is shown on hover: -->
<li><a href="#" class="house">Home</a></li> <li><a href="#" class="house">Home</a></li>
<li><a href="#" class="wrench">Services</a></li> <li><a href="#" class="wrench">Services</a></li>
<li><a href="#" class="envelope">Contact</a></li> <li><a href="#" class="envelope">Contact</a></li>
<li><a href="#" class="info">About</a></li> <li><a href="#" class="info">About</a></li>
</ul> </ul>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div id="stage"> <div id="stage">
<!-- The dot divs are shown here --> <!-- The dot divs are shown here -->
</div> </div>
</div> </div>
<p class="tutInfo">This is a tutorialzine demo. View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial</a>, or download the <a href="demo.zip">source files</a>.</p> <p class="tutInfo">This is a tutorialzine demo. View the <a href="http://tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/">original tutorial</a>, or download the <a href="demo.zip">source files</a>.</p>
</body> </body>
</html> </html>

View File

@@ -1,121 +1,121 @@
/* Set serviceMode to true to create your own shapes: */ /* Set serviceMode to true to create your own shapes: */
var serviceMode = false; var serviceMode = false;
$(document).ready(function(){ $(document).ready(function(){
/* This code is executed after the DOM has been completely loaded */ /* This code is executed after the DOM has been completely loaded */
var str=[]; var str=[];
var perRow = 16; var perRow = 16;
/* Generating the dot divs: */ /* Generating the dot divs: */
for(var i=0;i<192;i++) for(var i=0;i<192;i++)
{ {
str.push('<div class="dot" id="d-'+i+'" />'); str.push('<div class="dot" id="d-'+i+'" />');
} }
/* Joining the array into a string and adding it to the inner html of the stage div: */ /* Joining the array into a string and adding it to the inner html of the stage div: */
$('#stage').html(str.join('')); $('#stage').html(str.join(''));
/* Using the hover method: */ /* Using the hover method: */
$('#navigation li a').hover(function(e){ $('#navigation li a').hover(function(e){
/* serviceDraw is a cut-out version of the draw function, used for shape editing and composing: */ /* serviceDraw is a cut-out version of the draw function, used for shape editing and composing: */
if(serviceMode) if(serviceMode)
serviceDraw($(this).attr('class')); serviceDraw($(this).attr('class'));
else else
draw($(this).attr('class')); draw($(this).attr('class'));
}, function(e){ }, function(e){
}); });
/* Caching the dot divs into a variable for performance: */ /* Caching the dot divs into a variable for performance: */
dots = $('.dot'); dots = $('.dot');
if(serviceMode) if(serviceMode)
{ {
/* If we are in service mode, show borders around the dot divs, add the export link, and listen for clicks: */ /* If we are in service mode, show borders around the dot divs, add the export link, and listen for clicks: */
dots.css({ dots.css({
border:'1px solid black', border:'1px solid black',
width:dots.eq(0).width()-2, width:dots.eq(0).width()-2,
height:dots.eq(0).height()-2, height:dots.eq(0).height()-2,
cursor:'pointer' cursor:'pointer'
}) })
$('<div/>').css({ $('<div/>').css({
position:'absolute', position:'absolute',
bottom:-20, bottom:-20,
right:0 right:0
}).html('<a href="" onclick="outputString();return false;">[Export Shape]</a>').appendTo('#stage'); }).html('<a href="" onclick="outputString();return false;">[Export Shape]</a>').appendTo('#stage');
dots.click(function(){ dots.click(function(){
$(this).toggleClass('active'); $(this).toggleClass('active');
}); });
} }
}); });
var shapes={ var shapes={
/* Each shape is described by an array of points. You can add your own shapes here, /* 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 */ 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], 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], 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], 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] 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 stopCounter = 0;
var dots; var dots;
function draw(shape) function draw(shape)
{ {
/* This function draws a shape from the shapes object */ /* This function draws a shape from the shapes object */
stopCounter++; stopCounter++;
var currentCounter = stopCounter; var currentCounter = stopCounter;
dots.removeClass('active').css('opacity',0); dots.removeClass('active').css('opacity',0);
$.each(shapes[shape],function(i,j){ $.each(shapes[shape],function(i,j){
setTimeout(function(){ setTimeout(function(){
/* If a different shape animaton has been started during the showing of the current one, exit the function */ /* If a different shape animaton has been started during the showing of the current one, exit the function */
if(currentCounter!=stopCounter) return false; if(currentCounter!=stopCounter) return false;
dots.eq(j).addClass('active').fadeTo('slow',0.4); dots.eq(j).addClass('active').fadeTo('slow',0.4);
/* The fade animation is scheduled for 10*i millisecond in the future: */ /* The fade animation is scheduled for 10*i millisecond in the future: */
},10*i); },10*i);
}); });
} }
function serviceDraw(shape) function serviceDraw(shape)
{ {
/* A cut out version of the draw function, used in service mode */ /* A cut out version of the draw function, used in service mode */
dots.removeClass('active'); dots.removeClass('active');
$.each(shapes[shape],function(i,j){ $.each(shapes[shape],function(i,j){
dots.eq(j).addClass('active'); dots.eq(j).addClass('active');
}); });
} }
function outputString() function outputString()
{ {
/* Outputs the positions of the active dot divs as a comma-separated string: */ /* Outputs the positions of the active dot divs as a comma-separated string: */
var str=[]; var str=[];
$('.dot.active').each(function(){ $('.dot.active').each(function(){
str.push(this.id.replace('d-','')); str.push(this.id.replace('d-',''));
}) })
prompt('Insert this string as an array in the shapes object',str.join(',')); prompt('Insert this string as an array in the shapes object',str.join(','));
} }

View File

@@ -1,148 +1,148 @@
body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{ body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{
/* Simple page reset */ /* Simple page reset */
margin:0; margin:0;
padding:0; padding:0;
} }
body{ body{
/* Setting default text color, background and a font stack */ /* Setting default text color, background and a font stack */
color:#cccccc; color:#cccccc;
font-size:0.825em; font-size:0.825em;
background: url(img/background.jpg) no-repeat center top #252525; background: url(img/background.jpg) no-repeat center top #252525;
font-family:Arial, Helvetica, sans-serif; font-family:Arial, Helvetica, sans-serif;
} }
.menuUL li{ .menuUL li{
/* This will arrange the LI-s next to each other */ /* This will arrange the LI-s next to each other */
display:inline; display:inline;
} }
.menuUL li a,.menuUL li a:visited{ .menuUL li a,.menuUL li a:visited{
/* Styling the hyperlinks of the menu as buttons */ /* Styling the hyperlinks of the menu as buttons */
float:left; float:left;
font-weight:bold; font-weight:bold;
background:url(img/button_bg.jpg) repeat-x center bottom #666666; 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 allows for additinal CSS rules to take effect, such as paddings: */
display:block; display:block;
border:1px solid #4D4D4D; border:1px solid #4D4D4D;
color:#CCCCCC; color:#CCCCCC;
border-top-color:#565656; border-top-color:#565656;
padding:4px 6px; padding:4px 6px;
margin:4px 5px; margin:4px 5px;
height:16px; height:16px;
/* Setting a CSS3 box shadow around the button */ /* Setting a CSS3 box shadow around the button */
-moz-box-shadow:0 0 1px black; -moz-box-shadow:0 0 1px black;
-webkit-box-shadow:0 0 1px black; -webkit-box-shadow:0 0 1px black;
box-shadow:0 0 1px black; box-shadow:0 0 1px black;
/* CSS3 text shadow */ /* CSS3 text shadow */
text-shadow:0 1px black; text-shadow:0 1px black;
} }
.menuUL li a:hover{ .menuUL li a:hover{
/* On hover show the top, lighter, part of the background: */ /* On hover show the top, lighter, part of the background: */
background-position:center top; background-position:center top;
text-decoration:none; text-decoration:none;
} }
#navigation{ #navigation{
/* The navigation menu bar: */ /* The navigation menu bar: */
background:#222222; background:#222222;
border:1px solid #111111; border:1px solid #111111;
float:left; float:left;
padding:5px 10px; padding:5px 10px;
} }
#navigation,.menuUL li a{ #navigation,.menuUL li a{
/* CSS3 rounded corners for both the navigation bar and the buttons: */ /* CSS3 rounded corners for both the navigation bar and the buttons: */
-moz-border-radius:4px; -moz-border-radius:4px;
-webkit-border-radius:4px; -webkit-border-radius:4px;
-khtml-border-radius:4px; -khtml-border-radius:4px;
border-radius:4px; border-radius:4px;
} }
#stage{ #stage{
/* The stage contains the individual divs that comprise the halftone icon: */ /* The stage contains the individual divs that comprise the halftone icon: */
height:300px; height:300px;
position:absolute; position:absolute;
right:50px; right:50px;
top:20px; top:20px;
width:400px; width:400px;
} }
.dot{ .dot{
/* The stage contains 192 .dot divs: */ /* The stage contains 192 .dot divs: */
float:left; float:left;
height:25px; height:25px;
width:25px; width:25px;
} }
.dot.active{ .dot.active{
/* When assigned the active class, the div shows a background image of a dot: */ /* When assigned the active class, the div shows a background image of a dot: */
background:url(img/dot.png) no-repeat center center; background:url(img/dot.png) no-repeat center center;
} }
.clear{ .clear{
/* Old-school clear fix hack to clear the floats: */ /* Old-school clear fix hack to clear the floats: */
clear:both; clear:both;
} }
#main{ #main{
margin:0 auto; margin:0 auto;
position:relative; position:relative;
width:900px; width:900px;
} }
/* The styles below are only necessary for the demo page */ /* The styles below are only necessary for the demo page */
h1{ h1{
background:#222222; background:#222222;
border-bottom:1px solid black; border-bottom:1px solid black;
font-size:1.5em; font-size:1.5em;
font-weight:normal; font-weight:normal;
margin-bottom:15px; margin-bottom:15px;
padding:15px; padding:15px;
text-align:center; text-align:center;
} }
h2 { h2 {
font-size:0.9em; font-size:0.9em;
font-weight:normal; font-weight:normal;
padding-right:40px; padding-right:40px;
position:relative; position:relative;
right:0; right:0;
text-align:right; text-align:right;
text-transform:uppercase; text-transform:uppercase;
top:-48px; top:-48px;
} }
a, a:visited { a, a:visited {
color:#0196e3; color:#0196e3;
text-decoration:none; text-decoration:none;
outline:none; outline:none;
} }
a:hover{ a:hover{
text-decoration:underline; text-decoration:underline;
} }
p.tutInfo{ p.tutInfo{
/* The tutorial info on the bottom of the page */ /* The tutorial info on the bottom of the page */
padding:10px 0; padding:10px 0;
text-align:center; text-align:center;
position:absolute; position:absolute;
bottom:0px; bottom:0px;
background:#222222; background:#222222;
border-top:1px solid black; border-top:1px solid black;
width:100%; width:100%;
} }
h1,h2,p.tutInfo{ h1,h2,p.tutInfo{
font-family:"Myriad Pro",Arial,Helvetica,sans-serif; font-family:"Myriad Pro",Arial,Helvetica,sans-serif;
} }

View File

@@ -1,153 +1,153 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>Business Co.</title> <title>Business Co.</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link href="css/styles.css" rel="stylesheet" type="text/css" /> <link href="css/styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript"> <script type="text/javascript">
<!-- <!--
function MM_preloadImages() { //v3.0 function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
} }
function MM_swapImgRestore() { //v3.0 function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
} }
function MM_findObj(n, d) { //v4.01 function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x; if(!x && d.getElementById) x=d.getElementById(n); return x;
} }
function MM_swapImage() { //v3.0 function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
} }
//--> //-->
</script> </script>
</head> </head>
<body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg');"> <body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg');">
<!-- Save for Web Slices (index.psd) --> <!-- Save for Web Slices (index.psd) -->
<table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="table_01"> <table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="table_01">
<tr> <tr>
<td width="59" height="0" nowrap="nowrap"></td> <td width="59" height="0" nowrap="nowrap"></td>
<td width="19" height="0" nowrap="nowrap"></td> <td width="19" height="0" nowrap="nowrap"></td>
<td width="4" height="0" nowrap="nowrap"></td> <td width="4" height="0" nowrap="nowrap"></td>
<td width="23" height="0" nowrap="nowrap"></td> <td width="23" height="0" nowrap="nowrap"></td>
<td width="83" height="0" nowrap="nowrap"></td> <td width="83" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="8" height="0" nowrap="nowrap"></td> <td width="8" height="0" nowrap="nowrap"></td>
<td width="10" height="0" nowrap="nowrap"></td> <td width="10" height="0" nowrap="nowrap"></td>
<td width="31" height="0" nowrap="nowrap"></td> <td width="31" height="0" nowrap="nowrap"></td>
<td width="47" height="0" nowrap="nowrap"></td> <td width="47" height="0" nowrap="nowrap"></td>
<td width="4" height="0" nowrap="nowrap"></td> <td width="4" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="98" height="0" nowrap="nowrap"></td> <td width="98" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="66" height="0" nowrap="nowrap"></td> <td width="66" height="0" nowrap="nowrap"></td>
<td width="31" height="0" nowrap="nowrap"></td> <td width="31" height="0" nowrap="nowrap"></td>
<td width="10" height="0" nowrap="nowrap"></td> <td width="10" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="5" height="0" nowrap="nowrap"></td> <td width="5" height="0" nowrap="nowrap"></td>
<td width="89" height="0" nowrap="nowrap"></td> <td width="89" height="0" nowrap="nowrap"></td>
<td width="3" height="0" nowrap="nowrap"></td> <td width="3" height="0" nowrap="nowrap"></td>
<td width="15" height="0" nowrap="nowrap"></td> <td width="15" height="0" nowrap="nowrap"></td>
<td width="57" height="0" nowrap="nowrap"></td> <td width="57" height="0" nowrap="nowrap"></td>
<td width="21" height="0" nowrap="nowrap"></td> <td width="21" height="0" nowrap="nowrap"></td>
<td width="17" height="0" nowrap="nowrap"></td> <td width="17" height="0" nowrap="nowrap"></td>
<td width="60" height="0" nowrap="nowrap"></td> <td width="60" height="0" nowrap="nowrap"></td>
<td width="0" height="0"></td> <td width="0" height="0"></td>
</tr> </tr>
<tr> <tr>
<td width="59" height="651" rowspan="15"> <td width="59" height="651" rowspan="15">
<img src="images/main.jpg" width="59" height="651" alt="" /></td> <img src="images/main.jpg" width="59" height="651" alt="" /></td>
<td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#efefef" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td> <td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#efefef" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td>
<td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td> <td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td>
<td width="60" height="651" rowspan="15"> <td width="60" height="651" rowspan="15">
<img src="images/main-03.jpg" width="60" height="651" alt="" /></td> <img src="images/main-03.jpg" width="60" height="651" alt="" /></td>
<td width="0" height="33" nowrap="nowrap"></td> <td width="0" height="33" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="21" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td> <td width="656" height="21" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
<td width="0" height="21" nowrap="nowrap"></td> <td width="0" height="21" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="23" height="17" colspan="2" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td> <td width="23" height="17" colspan="2" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
<td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#a7a7a7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#a7a7a7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7"> <td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
<img src="images/lines.jpg" width="3" height="17" alt="" /></td> <img src="images/lines.jpg" width="3" height="17" alt="" /></td>
<td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7"> <td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
<img src="images/lines-07.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-07.jpg" width="3" height="17" alt="" /></td>
<td width="98" height="17" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="98" height="17" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7"> <td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
<img src="images/lines-09.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-09.jpg" width="3" height="17" alt="" /></td>
<td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7"> <td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
<img src="images/lines-11.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-11.jpg" width="3" height="17" alt="" /></td>
<td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7"> <td width="3" height="17" align="left" valign="top" bgcolor="#a7a7a7">
<img src="images/lines-13.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-13.jpg" width="3" height="17" alt="" /></td>
<td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#a7a7a7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="17" height="17" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td> <td width="17" height="17" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
<td width="0" height="17" nowrap="nowrap"></td> <td width="0" height="17" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="19" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td> <td width="656" height="19" colspan="25" align="left" valign="top" nowrap="nowrap" bgcolor="#a7a7a7"></td>
<td width="0" height="19" nowrap="nowrap"></td> <td width="0" height="19" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="240" colspan="25" align="left" valign="top"> <td width="656" height="240" colspan="25" align="left" valign="top">
<img src="images/main-15.jpg" width="656" height="240" alt="" /></td> <img src="images/main-15.jpg" width="656" height="240" alt="" /></td>
<td width="0" height="240" nowrap="nowrap"></td> <td width="0" height="240" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="321" colspan="25" rowspan="10" align="center" valign="middle" nowrap="nowrap" bgcolor="#efefef" class="text1">Content Page</td> <td width="656" height="321" colspan="25" rowspan="10" align="center" valign="middle" nowrap="nowrap" bgcolor="#efefef" class="text1">Content Page</td>
<td width="0" height="7" nowrap="nowrap"></td> <td width="0" height="7" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="43" nowrap="nowrap"></td> <td width="0" height="43" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="56" nowrap="nowrap"></td> <td width="0" height="56" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="26" nowrap="nowrap"></td> <td width="0" height="26" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="12" nowrap="nowrap"></td> <td width="0" height="12" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="17" nowrap="nowrap"></td> <td width="0" height="17" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="23" nowrap="nowrap"></td> <td width="0" height="23" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="22" nowrap="nowrap"></td> <td width="0" height="22" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="58" nowrap="nowrap"></td> <td width="0" height="58" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="0" height="57" nowrap="nowrap"></td> <td width="0" height="57" nowrap="nowrap"></td>
</tr> </tr>
<tr> <tr>
<td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br /> <td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br />
<span class="text3">Copyright &copy; Your Company Name</span><br/> <span class="text3">Copyright &copy; Your Company Name</span><br/>
Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>. Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>.
</td> </td>
<td width="0" height="49" nowrap="nowrap"></td> <td width="0" height="49" nowrap="nowrap"></td>
</tr> </tr>
</table> </table>
<!-- End Save for Web Slices --> <!-- End Save for Web Slices -->
</body> </body>
</html> </html>

View File

@@ -1,160 +1,160 @@
body{ body{
padding:0px; padding:0px;
margin:0px; margin:0px;
background:#c7c7c7; background:#c7c7c7;
color:#848484; color:#848484;
font:10px/14px Tahoma, sans-serif; font:10px/14px Tahoma, sans-serif;
} }
div, p, ul, h2, h3, h4, img, form{padding:0px; margin:0px;} div, p, ul, h2, h3, h4, img, form{padding:0px; margin:0px;}
ul{list-style-type:none;} ul{list-style-type:none;}
.clear{ .clear{
clear:both; clear:both;
} }
.frame { .frame {
border: 1px solid #D5E6E0; border: 1px solid #D5E6E0;
} }
.text1 { .text1 {
font: 11px/14px "Trebuchet MS", Arial, Helvetica, sans-serif; font: 11px/14px "Trebuchet MS", Arial, Helvetica, sans-serif;
color:#000; color:#000;
font-weight:bold; font-weight:bold;
} }
.text2 { .text2 {
font: 11px/14px Tahoma, Geneva, sans-serif; font: 11px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
} }
.text3 { .text3 {
font: 10px/14px Tahoma, Geneva, sans-serif; font: 10px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
} }
.text4 { .text4 {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#052578; color:#052578;
font-weight:bold; font-weight:bold;
} }
.text5 { .text5 {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#052578; color:#052578;
font-weight:bold; font-weight:bold;
} }
a:link { a:link {
font: 11px/14px Tahoma, Geneva, sans-serif; font: 11px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a:visited{ a:visited{
font: 11px/14px Tahoma, Geneva, sans-serif; font: 11px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a:hover { a:hover {
font: 11px/14px Tahoma, Geneva, sans-serif; font: 11px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.a:link { a.a:link {
font: 10px/14px Tahoma, Geneva, sans-serif; font: 10px/14px Tahoma, Geneva, sans-serif;
color:#19a1cb; color:#19a1cb;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.a:visited{ a.a:visited{
font: 10px/14px Tahoma, Geneva, sans-serif; font: 10px/14px Tahoma, Geneva, sans-serif;
color:#19a1cb; color:#19a1cb;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.a:hover { a.a:hover {
font: 10px/14px Tahoma, Geneva, sans-serif; font: 10px/14px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.b:link { a.b:link {
font: 10px/18px Tahoma, Geneva, sans-serif; font: 10px/18px Tahoma, Geneva, sans-serif;
color:#848484; color:#848484;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.b:visited{ a.b:visited{
font: 10px/18px Tahoma, Geneva, sans-serif; font: 10px/18px Tahoma, Geneva, sans-serif;
color:#848484; color:#848484;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.b:hover { a.b:hover {
font: 10px/18px Tahoma, Geneva, sans-serif; font: 10px/18px Tahoma, Geneva, sans-serif;
color:#000; color:#000;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.c:link { a.c:link {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.c:visited{ a.c:visited{
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.c:hover { a.c:hover {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
a.d:link { a.d:link {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.d:visited{ a.d:visited{
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:none; text-decoration:none;
} }
a.d:hover { a.d:hover {
font: 10px/12px Tahoma, Geneva, sans-serif; font: 10px/12px Tahoma, Geneva, sans-serif;
color:#FFF; color:#FFF;
font-weight:normal; font-weight:normal;
text-decoration:underline; text-decoration:underline;
} }
input, textarea, select{ input, textarea, select{
border:#fff 1px solid; border:#fff 1px solid;
background-color:#d6e6e0; background-color:#d6e6e0;
font:10px/12px Tahoma, sans-serif; color:#000; font:10px/12px Tahoma, sans-serif; color:#000;
} }
a.adv:link {text-decoration: none; font-weight:bold; 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:hover {text-decoration: none; font-weight:bold; color:#000;}
a.adv:visited {text-decoration: none; font-weight:bold; color:#000;} a.adv:visited {text-decoration: none; font-weight:bold; color:#000;}

View File

@@ -1,197 +1,197 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>Business Co.</title> <title>Business Co.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="css/styles.css" rel="stylesheet" type="text/css" /> <link href="css/styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript"> <script type="text/javascript">
<!-- <!--
function MM_preloadImages() { //v3.0 function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
} }
function MM_swapImgRestore() { //v3.0 function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
} }
function MM_findObj(n, d) { //v4.01 function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x; if(!x && d.getElementById) x=d.getElementById(n); return x;
} }
function MM_swapImage() { //v3.0 function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
} }
//--> //-->
</script> </script>
</head> </head>
<body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg')"> <body onload="MM_preloadImages('images/btn_1_over.jpg','images/btn_2_over.jpg','images/btn_3_over.jpg','images/btn_4_over.jpg','images/btn_5_over.jpg', 'images/btn_6_over.jpg')">
<!-- Save for Web Slices (index.psd) --> <!-- Save for Web Slices (index.psd) -->
<table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="Table_01"> <table width="775" height="700" border="0" align="center" cellpadding="0" cellspacing="0" id="Table_01">
<tr> <tr>
<td width="59" height="0" nowrap></td> <td width="59" height="0" nowrap></td>
<td width="19" height="0" nowrap></td> <td width="19" height="0" nowrap></td>
<td width="4" height="0" nowrap></td> <td width="4" height="0" nowrap></td>
<td width="23" height="0" nowrap></td> <td width="23" height="0" nowrap></td>
<td width="83" height="0" nowrap></td> <td width="83" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="8" height="0" nowrap></td> <td width="8" height="0" nowrap></td>
<td width="10" height="0" nowrap></td> <td width="10" height="0" nowrap></td>
<td width="31" height="0" nowrap></td> <td width="31" height="0" nowrap></td>
<td width="47" height="0" nowrap></td> <td width="47" height="0" nowrap></td>
<td width="4" height="0" nowrap></td> <td width="4" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="98" height="0" nowrap></td> <td width="98" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="66" height="0" nowrap></td> <td width="66" height="0" nowrap></td>
<td width="31" height="0" nowrap></td> <td width="31" height="0" nowrap></td>
<td width="10" height="0" nowrap></td> <td width="10" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="5" height="0" nowrap></td> <td width="5" height="0" nowrap></td>
<td width="89" height="0" nowrap></td> <td width="89" height="0" nowrap></td>
<td width="3" height="0" nowrap></td> <td width="3" height="0" nowrap></td>
<td width="15" height="0" nowrap></td> <td width="15" height="0" nowrap></td>
<td width="57" height="0" nowrap></td> <td width="57" height="0" nowrap></td>
<td width="21" height="0" nowrap></td> <td width="21" height="0" nowrap></td>
<td width="17" height="0" nowrap></td> <td width="17" height="0" nowrap></td>
<td width="60" height="0" nowrap></td> <td width="60" height="0" nowrap></td>
<td width="0" height="0"></td> <td width="0" height="0"></td>
</tr> </tr>
<tr> <tr>
<td width="59" height="651" rowspan="15"> <td width="59" height="651" rowspan="15">
<img src="images/main.jpg" width="59" height="651" alt="" /></td> <img src="images/main.jpg" width="59" height="651" alt="" /></td>
<td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#EFEFEF" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td> <td width="561" height="33" colspan="22" align="left" valign="middle" bgcolor="#EFEFEF" class="text3" style="padding-left:20px">SEPTEMBER 29, 2009 </td>
<td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td> <td width="95" height="33" colspan="3" align="left" valign="top"><a href="#"><img src="images/client_login.jpg" alt="" width="95" height="33" border="0" /></a></td>
<td width="60" height="651" rowspan="15"> <td width="60" height="651" rowspan="15">
<img src="images/main-03.jpg" width="60" height="651" alt="" /></td> <img src="images/main-03.jpg" width="60" height="651" alt="" /></td>
<td width="0" height="33" nowrap></td> <td width="0" height="33" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="21" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td> <td width="656" height="21" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
<td width="0" height="21" nowrap></td> <td width="0" height="21" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="23" height="17" colspan="2" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td> <td width="23" height="17" colspan="2" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
<td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#A7A7A7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="106" height="17" colspan="2" align="left" valign="top" bgcolor="#A7A7A7"><a href="index.html"><img src="images/btn_1.jpg" alt="" name="btn_1" width="106" height="17" border="0" id="btn_1" onmouseover="MM_swapImage('btn_1','','images/btn_1_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7"> <td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
<img src="images/lines.jpg" width="3" height="17" alt="" /></td> <img src="images/lines.jpg" width="3" height="17" alt="" /></td>
<td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="100" height="17" colspan="5" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_2.jpg" alt="" name="btn_2" width="100" height="17" border="0" id="btn_2" onmouseover="MM_swapImage('btn_2','','images/btn_2_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7"> <td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
<img src="images/lines-07.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-07.jpg" width="3" height="17" alt="" /></td>
<td width="98" height="17" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="98" height="17" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_3.jpg" alt="" name="btn_3" width="98" height="17" border="0" id="btn_3" onmouseover="MM_swapImage('btn_3','','images/btn_3_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7"> <td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
<img src="images/lines-09.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-09.jpg" width="3" height="17" alt="" /></td>
<td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="107" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_4.jpg" alt="" name="btn_4" width="107" height="17" border="0" id="btn_4" onmouseover="MM_swapImage('btn_4','','images/btn_4_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7"> <td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
<img src="images/lines-11.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-11.jpg" width="3" height="17" alt="" /></td>
<td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="97" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_5.jpg" alt="" name="btn_5" width="97" height="17" border="0" id="btn_5" onmouseover="MM_swapImage('btn_5','','images/btn_5_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7"> <td width="3" height="17" align="left" valign="top" bgcolor="#A7A7A7">
<img src="images/lines-13.jpg" width="3" height="17" alt="" /></td> <img src="images/lines-13.jpg" width="3" height="17" alt="" /></td>
<td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td> <td width="93" height="17" colspan="3" align="left" valign="top" bgcolor="#A7A7A7"><a href="contentpage.html"><img src="images/btn_6.jpg" alt="" name="btn_6" width="93" height="17" border="0" id="btn_6" onmouseover="MM_swapImage('btn_6','','images/btn_6_over.jpg',1)" onmouseout="MM_swapImgRestore()"/></a></td>
<td width="17" height="17" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td> <td width="17" height="17" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
<td width="0" height="17" nowrap></td> <td width="0" height="17" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="19" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td> <td width="656" height="19" colspan="25" align="left" valign="top" nowrap bgcolor="#A7A7A7"></td>
<td width="0" height="19" nowrap></td> <td width="0" height="19" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="240" colspan="25" align="left" valign="top"> <td width="656" height="240" colspan="25" align="left" valign="top">
<img src="images/main-15.jpg" width="656" height="240" alt="" /></td> <img src="images/main-15.jpg" width="656" height="240" alt="" /></td>
<td width="0" height="240" nowrap></td> <td width="0" height="240" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="656" height="7" colspan="25" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="656" height="7" colspan="25" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="0" height="7" nowrap></td> <td width="0" height="7" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="19" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="19" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="209" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF"> <td width="209" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/welcome.jpg" width="209" height="43" alt="" /></td> <img src="images/welcome.jpg" width="209" height="43" alt="" /></td>
<td width="174" height="43" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="174" height="43" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="31" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="31" height="314" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="185" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF"> <td width="185" height="43" colspan="8" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/news.jpg" width="185" height="43" alt="" /></td> <img src="images/news.jpg" width="185" height="43" alt="" /></td>
<td width="38" height="314" colspan="2" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="38" height="314" colspan="2" rowspan="9" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="0" height="43" nowrap></td> <td width="0" height="43" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="121" height="82" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="121" height="82" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/welcome-18.jpg" width="121" height="82" alt="" /></td> <img src="images/welcome-18.jpg" width="121" height="82" alt="" /></td>
<td width="10" height="94" rowspan="3" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="10" height="94" rowspan="3" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="252" height="94" colspan="7" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br /> <td width="252" height="94" colspan="7" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br />
Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. <a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td> Nam eu nulla. Donec lobortis purus vel urna. Nunc laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. <a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td>
<td width="21" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF"> <td width="21" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/news-19.jpg" width="21" height="56" alt="" /></td> <img src="images/news-19.jpg" width="21" height="56" alt="" /></td>
<td width="164" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><p class="text1">September 29 <td width="164" height="56" colspan="4" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><p class="text1">September 29
</p> </p>
<p><a href="#" class="a">Integer in ante. Sed posuere ligula </a>rhoncus erat. Fusce urna dui </p></td> <p><a href="#" class="a">Integer in ante. Sed posuere ligula </a>rhoncus erat. Fusce urna dui </p></td>
<td width="0" height="56" nowrap></td> <td width="0" height="56" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="21" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><img src="images/news-20.jpg" width="21" height="55" alt="" /></td> <td width="21" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF"><img src="images/news-20.jpg" width="21" height="55" alt="" /></td>
<td width="164" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><span class="text1">September 28 <td width="164" height="55" colspan="4" rowspan="3" align="left" valign="top" bgcolor="#EFEFEF" style="padding-top:5px"><span class="text1">September 28
</span><br /> </span><br />
<a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui</td> <a href="#" class="a">Integer in ante. Sed posuere ligula</a> rhoncus erat. Fusce urna dui</td>
<td width="0" height="26" nowrap></td> <td width="0" height="26" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="121" height="12" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="121" height="12" colspan="5" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="0" height="12" nowrap></td> <td width="0" height="12" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="162" height="40" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="162" height="40" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/services.jpg" width="162" height="40" alt="" /></td> <img src="images/services.jpg" width="162" height="40" alt="" /></td>
<td width="221" height="40" colspan="6" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="221" height="40" colspan="6" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="0" height="17" nowrap></td> <td width="0" height="17" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="185" height="45" colspan="8" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="185" height="45" colspan="8" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/spotlight.jpg" width="185" height="45" alt="" /></td> <img src="images/spotlight.jpg" width="185" height="45" alt="" /></td>
<td width="0" height="23" nowrap></td> <td width="0" height="23" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="121" height="80" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="121" height="80" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/services-23.jpg" width="121" height="80" alt="" /></td> <img src="images/services-23.jpg" width="121" height="80" alt="" /></td>
<td width="10" height="80" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td> <td width="10" height="80" rowspan="2" align="left" valign="top" nowrap bgcolor="#EFEFEF"></td>
<td width="252" height="80" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br /> <td width="252" height="80" colspan="7" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"><span class="text1">Lorem ipsum dolor sit amet, consectetuer</span><br />
<a href="#" class="a">Nam eu nulla. Donec lobortis purus vel urna. Nunc </a>laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td> <a href="#" class="a">Nam eu nulla. Donec lobortis purus vel urna. Nunc </a>laoreet lacinia nunc. In volutpat sodales ipsum. Sed vestibulum. rhoncus erat. Fusce urna dui, sollicitudin ac, pulvinar quis</td>
<td width="0" height="22" nowrap></td> <td width="0" height="22" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="16" height="115" colspan="3" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="16" height="115" colspan="3" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/spotlight-24.jpg" width="16" height="115" alt="" /></td> <img src="images/spotlight-24.jpg" width="16" height="115" alt="" /></td>
<td width="169" height="115" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:3px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel</a><br /> <td width="169" height="115" colspan="5" rowspan="2" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:3px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel</a><br />
<a href="#" class="b">magna. sagittis. Fusce elit ligula, </a><br /> <a href="#" class="b">magna. sagittis. Fusce elit ligula, </a><br />
<a href="#" class="b">sodales sit amet, tincid unt in, Fusce </a><br /> <a href="#" class="b">sodales sit amet, tincid unt in, Fusce </a><br />
<a href="#" class="b">interdum. Sed laoreet. Aenean. Sed </a><br /> <a href="#" class="b">interdum. Sed laoreet. Aenean. Sed </a><br />
l<a href="#" class="b">aoreet. magna. sagittis. Fusce elit</a></td> l<a href="#" class="b">aoreet. magna. sagittis. Fusce elit</a></td>
<td width="0" height="58" nowrap></td> <td width="0" height="58" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="27" height="57" colspan="2" align="left" valign="top" bgcolor="#EFEFEF"> <td width="27" height="57" colspan="2" align="left" valign="top" bgcolor="#EFEFEF">
<img src="images/services-25.jpg" width="27" height="57" alt="" /></td> <img src="images/services-25.jpg" width="27" height="57" alt="" /></td>
<td width="356" height="57" colspan="11" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:8px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel magna. sagittis. Fusce elit ligula, sodales </a><br /> <td width="356" height="57" colspan="11" align="left" valign="top" bgcolor="#EFEFEF" style="line-height:18px; padding-top:8px"><a href="#" class="b">Morbi volutpat leo in ligula. Inter vel magna. sagittis. Fusce elit ligula, sodales </a><br />
<a href="#" class="b">sit amet, tincid unt in, Fusce interdum. Sed laoreet. Aenean. Sed laoreet. </a></td> <a href="#" class="b">sit amet, tincid unt in, Fusce interdum. Sed laoreet. Aenean. Sed laoreet. </a></td>
<td width="0" height="57" nowrap></td> <td width="0" height="57" nowrap></td>
</tr> </tr>
<tr> <tr>
<td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br /> <td width="775" height="49" colspan="27" align="center" valign="middle" class="text2" style="background:url(images/b_footer.jpg)"><a href="index.html">HOME</a> | <a href="contentpage.html">ABOUT US</a> | <a href="contentpage.html">SERVICES</a> | <a href="contentpage.html">SOLUTIONS</a> | <a href="contentpage.html">SUPPORT</a> | <a href="contentpage.html">CONTACTS</a><br />
<span class="text3">Copyright © Your Company Name</span><br /> <span class="text3">Copyright © Your Company Name</span><br />
Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>. Design by <a href="http://www.templatesbox.com" target="_blank" class="adv">Templates</a> Box. Create a <a href="http://www.wix.com" target="_blank" class="adv">free website</a>.
</td> </td>
<td width="0" height="49" nowrap></td> <td width="0" height="49" nowrap></td>
</tr> </tr>
</table> </table>
<!-- End Save for Web Slices --> <!-- End Save for Web Slices -->
</body> </body>
</html> </html>

View File

@@ -1,86 +1,86 @@
<!-- saved from url=(0022)http://internet.e-mail --> <!-- saved from url=(0022)http://internet.e-mail -->
<html> <html>
<head> <head>
<title>TemplatesBox.com | Terms of Use</title> <title>TemplatesBox.com | Terms of Use</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head> </head>
<body bgcolor="#5E717F" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <body bgcolor="#5E717F" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<table width="700" cellspacing="0" cellpadding="8" align="center" bgcolor="#BED5E2" style="border-collapse:collapse;"> <table width="700" cellspacing="0" cellpadding="8" align="center" bgcolor="#BED5E2" style="border-collapse:collapse;">
<tr> <tr>
<td bgcolor="#567280" style="border-top-width:1px; border-right-width:1px; border-left-width:1px; border-top-color:rgb(216,216,216); border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-top-style:solid; border-right-style:solid; border-left-style:solid;"><font color="#C2DCEB" size="2" face="Verdana,Arial"><b>Templates</b></font><font color="#FF9900" size="2" face="Verdana,Arial"><b>Box</b></font><font color="#FF9B05" size="2" face="Verdana,Arial"><b> <td bgcolor="#567280" style="border-top-width:1px; border-right-width:1px; border-left-width:1px; border-top-color:rgb(216,216,216); border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-top-style:solid; border-right-style:solid; border-left-style:solid;"><font color="#C2DCEB" size="2" face="Verdana,Arial"><b>Templates</b></font><font color="#FF9900" size="2" face="Verdana,Arial"><b>Box</b></font><font color="#FF9B05" size="2" face="Verdana,Arial"><b>
</b></font><font color="#E3E3E3" size="2" face="Verdana,Arial">|<b> Terms of Use</b></font></td> </b></font><font color="#E3E3E3" size="2" face="Verdana,Arial">|<b> Terms of Use</b></font></td>
</tr> </tr>
<tr> <tr>
<td bgcolor="#A1BBCA" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;"> <td bgcolor="#A1BBCA" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;">
<table align="center" cellpadding="0" cellspacing="0" width="98%"> <table align="center" cellpadding="0" cellspacing="0" width="98%">
<tr> <tr>
<td> <td>
<p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">By <p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">By
downloading a template from TemplatesBox.com you agree to the following downloading a template from TemplatesBox.com you agree to the following
Terms of Use: </span></font> Terms of Use: </span></font>
<p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">Our <p style="line-height:115%; margin-top:0; margin-bottom:0;"><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;">Our
web templates may be used for your own and/or your clients' websites, 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, 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 such as distributing to a third party via CD, diskette, or letting others
to download off your websites etc.<br> to download off your websites etc.<br>
<br> <br>
Link back to www.templatesbox.com is required and always appreciated. Link back to www.templatesbox.com is required and always appreciated.
Also, please visit the<br> Also, please visit the<br>
</span></font><a href="http://www.templatesbox.com/linkus.htm" target="_blank"><font face="Verdana,Arial" color="#354D59"><b><span style="font-size:8pt;">Link </span></font><a href="http://www.templatesbox.com/linkus.htm" target="_blank"><font face="Verdana,Arial" color="#354D59"><b><span style="font-size:8pt;">Link
Us</span></b></font></a><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;"> section.<br> Us</span></b></font></a><font face="Verdana,Arial" color="#354D59"><span style="font-size:8pt;"> section.<br>
<br> <br>
The templates are offered &quot;as is&quot; without warranty of any kind, The templates are offered &quot;as is&quot; without warranty of any kind,
either expressed or implied. TemplatesBox.com will not be liable for any 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. 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, In no event shall TemplatesBox.com be liable for any damages including,
but not limited to, direct, indirect, special, incidental or consequential but not limited to, direct, indirect, special, incidental or consequential
damages or other losses arising out of the use of or inability to use damages or other losses arising out of the use of or inability to use
the templates and/or information from TemplatesBox.com.<br> the templates and/or information from TemplatesBox.com.<br>
<br> <br>
TemplatesBox.com team reserves the right to change or modify these terms TemplatesBox.com team reserves the right to change or modify these terms
with no prior notice.</span></font></p> with no prior notice.</span></font></p>
</td> </td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
<tr> <tr>
<td bgcolor="#567280" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;"><font size="2" face="Verdana,Arial" color="#E3E3E3"><b>Featured <td bgcolor="#567280" style="border-right-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-left-style:solid;"><font size="2" face="Verdana,Arial" color="#E3E3E3"><b>Featured
Partners</b></font></td> Partners</b></font></td>
</tr> </tr>
<tr> <tr>
<td bgcolor="#A1BBCA" style="border-right-width:1px; border-bottom-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-bottom-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-bottom-style:solid; border-left-style:solid;" height="235"> <td bgcolor="#A1BBCA" style="border-right-width:1px; border-bottom-width:1px; border-left-width:1px; border-right-color:rgb(216,216,216); border-bottom-color:rgb(216,216,216); border-left-color:rgb(216,216,216); border-right-style:solid; border-bottom-style:solid; border-left-style:solid;" height="235">
<table align="center" cellpadding="0" cellspacing="0" width="98%"> <table align="center" cellpadding="0" cellspacing="0" width="98%">
<tr> <tr>
<td> <td>
<p><a href="http://www.specialtemplates.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Premium Website <p><a href="http://www.specialtemplates.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Premium Website
Templates</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br> Templates</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
Over 9000 High-end Website templates, Flash intros and Logo templates.<b><a href="http://www.freshtemplates.com" target="_blank"><br> Over 9000 High-end Website templates, Flash intros and Logo templates.<b><a href="http://www.freshtemplates.com" target="_blank"><br>
<br> <br>
</a></b></font><a href="http://www.freephotosbank.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Free </a></b></font><a href="http://www.freephotosbank.com" target="_blank"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F">Free
Photos, Free Stock Photography</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><b><br></b> Photos, Free Stock Photography</font></b></a><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><b><br></b>
</font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT </font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT
face=Verdana><FONT color=#2d444f>1000's of FREE high quality stock face=Verdana><FONT color=#2d444f>1000's of FREE high quality stock
Photos!</FONT></FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br> Photos!</FONT></FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
<br> <br>
</font><A </font><A
href="http://www.webmasterschannel.com" target=_blank><FONT face=Verdana><FONT color=#2d444f><B><FONT size=2>Webmaster&nbsp;Resources &amp; href="http://www.webmasterschannel.com" target=_blank><FONT face=Verdana><FONT color=#2d444f><B><FONT size=2>Webmaster&nbsp;Resources &amp;
Directory</FONT></B></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br> Directory</FONT></B></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
</font><FONT size=2><FONT face=Verdana><FONT color=#2d444f>A large web directory with webmaster </font><FONT size=2><FONT face=Verdana><FONT color=#2d444f>A large web directory with webmaster
resources.</FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br> resources.</FONT></FONT></FONT><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
<br> <br>
</font><A href="http://www.photovations.com" </font><A href="http://www.photovations.com"
target=_blank><FONT face=Verdana color=#000000 target=_blank><FONT face=Verdana color=#000000
size=2><FONT face=Verdana color=#2d444f size=2><STRONG>Photovations.com</STRONG></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br> size=2><FONT face=Verdana color=#2d444f size=2><STRONG>Photovations.com</STRONG></FONT></FONT></A><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#2D444F"><br>
</font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT </font><FONT face=Verdana color=#2d444f size=2><FONT size=2><FONT
face=Verdana><FONT color=#2d444f>Online Photo Sharing. Free Image face=Verdana><FONT color=#2d444f>Online Photo Sharing. Free Image
Hosting</FONT></FONT></FONT></FONT></p> Hosting</FONT></FONT></FONT></FONT></p>
</td> </td>
</tr> </tr>
</table> </table>
</td> </td>
</tr> </tr>
</table> </table>
</body> </body>
</html> </html>

View File

@@ -1,9 +1,9 @@
<html> <html>
<body> <body>
<h2>Norwegian Mountain Trip</h2> <h2>Norwegian Mountain Trip</h2>
<img border="0" src="images/pulpit.jpg" alt="Pulpit rock" width="304" height="228" /> <img border="0" src="images/pulpit.jpg" alt="Pulpit rock" width="304" height="228" />
</body> </body>
</html> </html>

View File

@@ -1,10 +1,10 @@
<html> <html>
<body> <body>
<h1>My First Heading</h1> <h1>My First Heading</h1>
<p>My first paragraph.</p> <p>My first paragraph.</p>
</body> </body>
</html> </html>

View File

@@ -1,99 +1,99 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset=utf-8 /> <meta charset=utf-8 />
<meta name="viewport" content="width=620" /> <meta name="viewport" content="width=620" />
<title>HTML5 Demo: data-*</title> <title>HTML5 Demo: data-*</title>
<link rel="stylesheet" href="/css/html5demos.css" type="text/css" /> <link rel="stylesheet" href="/css/html5demos.css" type="text/css" />
<script src="/js/h5utils.js"></script></head> <script src="/js/h5utils.js"></script></head>
<body> <body>
<section id="wrapper"> <section id="wrapper">
<header> <header>
<h1>data-*</h1> <h1>data-*</h1>
</header><style> </header><style>
#test { #test {
padding: 10px; padding: 10px;
border: 1px solid #ccc; border: 1px solid #ccc;
margin: 20px 0; margin: 20px 0;
} }
pre { pre {
overflow-x: auto; overflow-x: auto;
padding: 10px; padding: 10px;
border: 1px dashed #ccc; border: 1px dashed #ccc;
background: #fff; background: #fff;
font-size: 12px; font-size: 12px;
} }
</style> </style>
<article> <article>
<section> <section>
<p>The <code>data-[name]</code> attribute on elements can now be accessed directly via the DOM using <code>element.dataset.[attr]</code>.</p> <p>The <code>data-[name]</code> attribute on elements can now be accessed directly via the DOM using <code>element.dataset.[attr]</code>.</p>
<p>Try openning the Web Console and editing <code>element.dataset</code> directly: <br /><code>element.dataset.foo = 'bar';</code></p> <p>Try openning the Web Console and editing <code>element.dataset</code> directly: <br /><code>element.dataset.foo = 'bar';</code></p>
</section> </section>
<p id="status">Not connected</p> <p id="status">Not connected</p>
<section> <section>
<div id="test" data-name="rem" data-height="short">This element has data</div> <div id="test" data-name="rem" data-height="short">This element has data</div>
<input type="button" value="Show data" id="show" /> <input type="button" value="Show data" id="show" />
<input type="button" value="Change data via dataset" id="change1" /> <input type="button" value="Change data via dataset" id="change1" />
<input type="button" value="change data via setAttribute" id="change2" /> <input type="button" value="change data via setAttribute" id="change2" />
</section> </section>
<pre><code id="element">[click buttons above to show element html]</code></pre> <pre><code id="element">[click buttons above to show element html]</code></pre>
</article> </article>
<script> <script>
(function () { (function () {
function show() { function show() {
code.innerHTML = test.outerHTML.replace(/[<>]/g, function (m) { code.innerHTML = test.outerHTML.replace(/[<>]/g, function (m) {
return { '<': '<', '>': '>' }[m]; return { '<': '<', '>': '>' }[m];
}); });
for (var prop in test.dataset) { for (var prop in test.dataset) {
code.innerHTML += '\nel.dataset.' + prop + ' = "' + test.dataset[prop] + '"'; code.innerHTML += '\nel.dataset.' + prop + ' = "' + test.dataset[prop] + '"';
} }
} }
var state = document.getElementById('status'), var state = document.getElementById('status'),
code = document.getElementById('element'); code = document.getElementById('element');
var test = window.element = document.getElementById('test'); var test = window.element = document.getElementById('test');
if (test.dataset === undefined) { if (test.dataset === undefined) {
state.innerHTML = 'dataset not supported'; state.innerHTML = 'dataset not supported';
state.className = 'fail'; state.className = 'fail';
} else { } else {
state.className = 'success'; state.className = 'success';
state.innerHTML = 'element.dataset supported'; state.innerHTML = 'element.dataset supported';
} }
addEvent(document.getElementById('show'), 'click', function () { addEvent(document.getElementById('show'), 'click', function () {
show(); show();
}); });
addEvent(document.getElementById('change1'), 'click', function () { addEvent(document.getElementById('change1'), 'click', function () {
test.dataset.name = 'via el.dataset'; test.dataset.name = 'via el.dataset';
show(); show();
}); });
addEvent(document.getElementById('change2'), 'click', function () { addEvent(document.getElementById('change2'), 'click', function () {
test.setAttribute('data-name', 'via setAttribute'); test.setAttribute('data-name', 'via setAttribute');
show(); show();
}); });
})(); })();
</script> </script>
<footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a>/<a href="#view-source">view source</a></footer> <footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a>/<a href="#view-source">view source</a></footer>
</section> </section>
<a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0; left: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub" /></a> <a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0; left: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<script src="/js/prettify.packed.js"></script> <script src="/js/prettify.packed.js"></script>
<script> <script>
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script> </script>
<script> <script>
try { try {
var pageTracker = _gat._getTracker("UA-1656750-18"); var pageTracker = _gat._getTracker("UA-1656750-18");
pageTracker._trackPageview(); pageTracker._trackPageview();
} catch(err) {}</script> } catch(err) {}</script>
</body> </body>
</html> </html>

View File

@@ -1,149 +1,149 @@
note note
description: "Summary description for {HTTP_CONSTANTS}." description: "Summary description for {HTTP_CONSTANTS}."
author: "" author: ""
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
HTTP_CONSTANTS HTTP_CONSTANTS
feature feature
http_version_1_1: STRING = "HTTP/1.1" http_version_1_1: STRING = "HTTP/1.1"
http_version_1_0: STRING = "HTTP/1.0" http_version_1_0: STRING = "HTTP/1.0"
crlf: STRING = "%/13/%/10/" crlf: STRING = "%/13/%/10/"
feature -- Status codes feature -- Status codes
-- 1xx Informational -Request received, continuing process -- 1xx Informational -Request received, continuing process
Continue : STRING = "100" Continue : STRING = "100"
Switching_Protocols : STRING = "101" Switching_Protocols : STRING = "101"
-- 2xx Success - The action was successfully received, understood, and accepted -- 2xx Success - The action was successfully received, understood, and accepted
Ok: STRING = "200" Ok: STRING = "200"
Created : STRING = "201" Created : STRING = "201"
Accepted : STRING = "202" Accepted : STRING = "202"
Non_Authoritative_Information : STRING = "203" Non_Authoritative_Information : STRING = "203"
No_Content : STRING = "204" No_Content : STRING = "204"
Reset_Content : STRING = "205" Reset_Content : STRING = "205"
Parcial_Content : STRING = "206" Parcial_Content : STRING = "206"
-- 3xx Redirection - Further Action must be taken in order to complete the request -- 3xx Redirection - Further Action must be taken in order to complete the request
Multiple_Choices : STRING = "300" Multiple_Choices : STRING = "300"
Moved_Permanently: STRING = "301" Moved_Permanently: STRING = "301"
Found : STRING = "302" Found : STRING = "302"
See_Other : STRING = "303" See_Other : STRING = "303"
Not_Modified : STRING = "304" Not_Modified : STRING = "304"
Use_Proxy : STRING = "305" Use_Proxy : STRING = "305"
Temporary_Redirect : STRING = "307" Temporary_Redirect : STRING = "307"
--4xx Client Error - The request contains bad syntax or cannot be fulfilled --4xx Client Error - The request contains bad syntax or cannot be fulfilled
Bad_Request : STRING = "400" Bad_Request : STRING = "400"
Unauthorized : STRING = "401" Unauthorized : STRING = "401"
Payment_Required : STRING = "402" Payment_Required : STRING = "402"
Forbidden : STRING = "403" Forbidden : STRING = "403"
Not_Found : STRING = "404" Not_Found : STRING = "404"
Method_Not_Allowed : STRING = "405" Method_Not_Allowed : STRING = "405"
Not_Acceptable : STRING = "406" Not_Acceptable : STRING = "406"
Proxy_Authentication_Required : STRING = "407" Proxy_Authentication_Required : STRING = "407"
Request_Time_out : STRING = "408" Request_Time_out : STRING = "408"
Conflict : STRING = "409" Conflict : STRING = "409"
Gone : STRING = "410" Gone : STRING = "410"
Length_Required : STRING = "411" Length_Required : STRING = "411"
Precondition_Failed : STRING = "412" Precondition_Failed : STRING = "412"
Request_Entity_Too_Large : STRING = "413" Request_Entity_Too_Large : STRING = "413"
Request_URI_Too_Large : STRING = "414" Request_URI_Too_Large : STRING = "414"
Unsupported_Media_Type : STRING = "415" Unsupported_Media_Type : STRING = "415"
Requested_range_not_satisfiable : STRING = "416" Requested_range_not_satisfiable : STRING = "416"
Expectation_Failed : STRING = "417" Expectation_Failed : STRING = "417"
--5xx Server Error - The server failed to fulfill an apparently valid request --5xx Server Error - The server failed to fulfill an apparently valid request
server_error: STRING = "500" server_error: STRING = "500"
Internal_Server_Error : STRING = "500" Internal_Server_Error : STRING = "500"
Not_Implemented : STRING = "501" Not_Implemented : STRING = "501"
Bad_Gateway : STRING = "502" Bad_Gateway : STRING = "502"
Service_Unavailable : STRING = "503" Service_Unavailable : STRING = "503"
Gateway_Time_out : STRING = "504" Gateway_Time_out : STRING = "504"
HTTP_Version_not_supported : STRING = "505" HTTP_Version_not_supported : STRING = "505"
-- messages -- messages
ok_message: STRING = "OK" ok_message: STRING = "OK"
continue_message : STRING = "Continue" continue_message : STRING = "Continue"
not_found_message: STRING = "URI not found" not_found_message: STRING = "URI not found"
not_implemented_message: STRING = "Not Implemented" not_implemented_message: STRING = "Not Implemented"
feature -- content types feature -- content types
text_html: STRING = "text/html" text_html: STRING = "text/html"
feature -- General Header Fields feature -- General Header Fields
-- There are a few header fields which have general applicability for both request and response messages, -- 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. -- but which do not apply to the entity being transferred.
-- These header fields apply only to the message being transmitted. -- These header fields apply only to the message being transmitted.
Cache_control : STRING = "Cache-Control" Cache_control : STRING = "Cache-Control"
Connection : STRING = "Connection" Connection : STRING = "Connection"
Date : STRING = "Date" Date : STRING = "Date"
Pragma : STRING = "PRAGMA" Pragma : STRING = "PRAGMA"
Trailer : STRING = "Trailer" Trailer : STRING = "Trailer"
Transfer_encoding : STRING = "Transfer-Encoding" Transfer_encoding : STRING = "Transfer-Encoding"
Upgrade : STRING = "Upgrade" Upgrade : STRING = "Upgrade"
Via : STRING = "Via" Via : STRING = "Via"
Warning : STRING = "Warning" Warning : STRING = "Warning"
feature -- Request Header feature -- Request Header
Accept : STRING = "Accept" Accept : STRING = "Accept"
Accept_charset : STRING = "Accept-Charset" Accept_charset : STRING = "Accept-Charset"
Accept_encoding : STRING = "Accept-Encoding" Accept_encoding : STRING = "Accept-Encoding"
Accept_language : STRING = "Accept-Language" Accept_language : STRING = "Accept-Language"
Authorization : STRING = "Authorization" Authorization : STRING = "Authorization"
Expect : STRING = "Expect" Expect : STRING = "Expect"
From_header : STRING = "From" From_header : STRING = "From"
Host : STRING = "Host" Host : STRING = "Host"
If_match : STRING = "If-Match" If_match : STRING = "If-Match"
If_modified_since : STRING = "If-Modified-Since" If_modified_since : STRING = "If-Modified-Since"
If_none_match : STRING = "If-None-Match" If_none_match : STRING = "If-None-Match"
If_range : STRING = "If-Range" If_range : STRING = "If-Range"
If_unmodified_since : STRING = "If-Unmodified-Since" If_unmodified_since : STRING = "If-Unmodified-Since"
Max_forwards : STRING = "Max-Forwards" Max_forwards : STRING = "Max-Forwards"
Proxy_authorization : STRING = "Proxy-Authorization" Proxy_authorization : STRING = "Proxy-Authorization"
Range : STRING = "Range" Range : STRING = "Range"
Referer : STRING = "Referrer" Referer : STRING = "Referrer"
TE : STRING = "TE" TE : STRING = "TE"
User_agent : STRING = "User-Agent" User_agent : STRING = "User-Agent"
feature -- Entity Header feature -- Entity Header
Allow : STRING = "Allow" Allow : STRING = "Allow"
Content_encoding : STRING = "Content-Encoding" Content_encoding : STRING = "Content-Encoding"
Content_language : STRING = "Content-Language" Content_language : STRING = "Content-Language"
Content_length : STRING = "Content-Length" Content_length : STRING = "Content-Length"
Content_location : STRING = "Content-Location" Content_location : STRING = "Content-Location"
Content_MD5 : STRING = "Content-MD5" Content_MD5 : STRING = "Content-MD5"
Content_range : STRING = "Content-Range" Content_range : STRING = "Content-Range"
Content_type : STRING = "Content-Type" Content_type : STRING = "Content-Type"
Expires : STRING = "Expires" Expires : STRING = "Expires"
Last_modified : STRING = "Last-Modified" Last_modified : STRING = "Last-Modified"
feature -- Http Method feature -- Http Method
Options : STRING = "OPTIONS" Options : STRING = "OPTIONS"
Get : STRING = "GET" Get : STRING = "GET"
Head : STRING = "HEAD" Head : STRING = "HEAD"
Post : STRING = "POST" Post : STRING = "POST"
Put : STRING = "PUT" Put : STRING = "PUT"
Delete : STRING = "DELETE" Delete : STRING = "DELETE"
Trace : STRING = "TRACE" Trace : STRING = "TRACE"
Connect : STRING = "CONNECT" Connect : STRING = "CONNECT"
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,60 +1,60 @@
note note
description: "[ description: "[
Provides features to encode and decode messages Provides features to encode and decode messages
]" ]"
legal: "See notice at end of class." legal: "See notice at end of class."
status: "Community Preview 1.0" status: "Community Preview 1.0"
date: "$Date: 2009-09-01 19:15:37 -0300 (mar 01 de sep de 2009) $" date: "$Date: 2009-09-01 19:15:37 -0300 (mar 01 de sep de 2009) $"
revision: "$Revision: 80577 $" revision: "$Revision: 80577 $"
class class
HTTP_ENCODING_FACILITIES HTTP_ENCODING_FACILITIES
create create
make make
feature -- Initialization feature -- Initialization
make make
do do
end end
feature -- Conversion feature -- Conversion
encode_natural(a_i: NATURAL; a_is_fragmented: BOOLEAN): NATURAL 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. -- 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. -- Use decode_natural and decode_flag for decoding.
require require
no_too_big: a_i < 2147483648 no_too_big: a_i < 2147483648
do do
Result := (a_i |<< 1) + a_is_fragmented.to_integer.as_natural_32 Result := (a_i |<< 1) + a_is_fragmented.to_integer.as_natural_32
end end
change_flag(a_i: NATURAL; a_new_flag: BOOLEAN): NATURAL change_flag(a_i: NATURAL; a_new_flag: BOOLEAN): NATURAL
-- Changes the flag to "new_flag" and doesn't change the encoded natural. -- Changes the flag to "new_flag" and doesn't change the encoded natural.
do do
Result := (a_i & 0xFFFFFFFE) + a_new_flag.to_integer.as_natural_32 Result := (a_i & 0xFFFFFFFE) + a_new_flag.to_integer.as_natural_32
end end
decode_natural_and_flag (a_i: NATURAL): TUPLE [NATURAL, BOOLEAN] decode_natural_and_flag (a_i: NATURAL): TUPLE [NATURAL, BOOLEAN]
-- Convenience feature which combines both decodings (natural and flag) -- Convenience feature which combines both decodings (natural and flag)
do do
Result := [decode_natural (a_i), decode_flag (a_i)] Result := [decode_natural (a_i), decode_flag (a_i)]
end end
decode_natural (a_i: NATURAL): NATURAL decode_natural (a_i: NATURAL): NATURAL
-- The natural that was encoded in {ENCODING_FACILITIES}.encode_natural. -- The natural that was encoded in {ENCODING_FACILITIES}.encode_natural.
do do
Result := (a_i |>> 1) Result := (a_i |>> 1)
end end
decode_flag (a_i: NATURAL): BOOLEAN decode_flag (a_i: NATURAL): BOOLEAN
--`Result': the flag that was encoded in encode_natural --`Result': the flag that was encoded in encode_natural
do do
Result := (a_i.bit_and (1) = 1) Result := (a_i.bit_and (1) = 1)
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,56 +1,56 @@
note note
description: "Summary description for {HTTP_SERVER}." description: "Summary description for {HTTP_SERVER}."
author: "" author: ""
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
HTTP_SERVER HTTP_SERVER
create create
make make
feature -- Initialization feature -- Initialization
make (cfg: like configuration) make (cfg: like configuration)
do do
configuration := cfg configuration := cfg
end end
setup (a_http_handler: HTTP_HANDLER) setup (a_http_handler: HTTP_HANDLER)
require require
a_http_handler_valid: a_http_handler /= Void a_http_handler_valid: a_http_handler /= Void
do do
if configuration.is_verbose then if configuration.is_verbose then
log ("%N%N%N") log ("%N%N%N")
log ("Starting Web Application Server (port="+ configuration.http_server_port.out +"):%N") log ("Starting Web Application Server (port="+ configuration.http_server_port.out +"):%N")
end end
stop_requested := False stop_requested := False
a_http_handler.execute a_http_handler.execute
end end
shutdown_server shutdown_server
do do
stop_requested := True stop_requested := True
end end
feature -- Access feature -- Access
configuration: HTTP_SERVER_CONFIGURATION configuration: HTTP_SERVER_CONFIGURATION
-- Configuration of the server -- Configuration of the server
stop_requested: BOOLEAN stop_requested: BOOLEAN
-- Stops the server -- Stops the server
feature -- Output feature -- Output
log (a_message: READABLE_STRING_8) log (a_message: READABLE_STRING_8)
-- Log `a_message' -- Log `a_message'
do do
io.put_string (a_message) io.put_string (a_message)
end end
;note ;note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,118 +1,118 @@
deferred class HTTP_REQUEST_HANDLER deferred class HTTP_REQUEST_HANDLER
inherit inherit
ANY ANY
redefine redefine
default_create default_create
end end
feature {NONE} -- Initialization feature {NONE} -- Initialization
default_create default_create
do do
Precursor Precursor
create request_uri.make_empty create request_uri.make_empty
create script_name.make_empty create script_name.make_empty
create query_string.make_empty create query_string.make_empty
create answer create answer
create headers.make (0) create headers.make (0)
end end
feature -- Access feature -- Access
request_uri: STRING request_uri: STRING
-- requested url -- requested url
script_name: STRING script_name: STRING
-- Script name -- Script name
query_string: STRING query_string: STRING
-- Query string -- Query string
data: detachable STRING data: detachable STRING
-- the entire request message -- the entire request message
headers : HASH_TABLE [STRING, STRING] headers : HASH_TABLE [STRING, STRING]
-- Provides access to the request's HTTP headers, for example: -- Provides access to the request's HTTP headers, for example:
-- headers["Content-Type"] is "text/plain" -- headers["Content-Type"] is "text/plain"
answer: HTTP_RESPONSE answer: HTTP_RESPONSE
-- reply to this request -- reply to this request
feature -- Execution feature -- Execution
process process
-- process the request and create an answer -- process the request and create an answer
require require
valid_uri: request_uri /= Void valid_uri: request_uri /= Void
deferred deferred
end end
feature -- Recycle feature -- Recycle
reset reset
-- reinit the fields -- reinit the fields
do do
request_uri.wipe_out request_uri.wipe_out
script_name.wipe_out script_name.wipe_out
query_string.wipe_out query_string.wipe_out
data := Void data := Void
answer.reset answer.reset
end end
feature -- Element change feature -- Element change
set_uri (new_uri: STRING) set_uri (new_uri: STRING)
-- set new URI -- set new URI
require require
valid_uri: new_uri /= Void valid_uri: new_uri /= Void
local local
p: INTEGER p: INTEGER
do do
request_uri := new_uri request_uri := new_uri
p := new_uri.index_of ('?', 1) p := new_uri.index_of ('?', 1)
if p > 0 then if p > 0 then
script_name := new_uri.substring (1, p - 1) script_name := new_uri.substring (1, p - 1)
query_string := new_uri.substring (p + 1, new_uri.count) query_string := new_uri.substring (p + 1, new_uri.count)
else else
script_name := new_uri.string script_name := new_uri.string
query_string := "" query_string := ""
end end
end end
set_data (new_data: STRING) set_data (new_data: STRING)
-- set new data -- set new data
do do
data := new_data data := new_data
end end
set_headers ( a_header : HASH_TABLE [STRING, STRING] ) set_headers ( a_header : HASH_TABLE [STRING, STRING] )
do do
headers := a_header headers := a_header
end end
feature {NONE} -- Implementation feature {NONE} -- Implementation
real_filename (fn: STRING): STRING real_filename (fn: STRING): STRING
-- Real filename from url-path `fn' -- Real filename from url-path `fn'
--| Find a better design for this piece of code --| Find a better design for this piece of code
--| Eventually in a spec/$ISE_PLATFORM/ specific cluster --| Eventually in a spec/$ISE_PLATFORM/ specific cluster
do do
if {PLATFORM}.is_windows then if {PLATFORM}.is_windows then
create Result.make_from_string (fn) create Result.make_from_string (fn)
Result.replace_substring_all ("/", "\") Result.replace_substring_all ("/", "\")
if Result[Result.count] = '\' then if Result[Result.count] = '\' then
Result.remove_tail (1) Result.remove_tail (1)
end end
else else
Result := fn Result := fn
if Result[Result.count] = '/' then if Result[Result.count] = '/' then
Result := Result.substring (1, Result.count - 1) Result := Result.substring (1, Result.count - 1)
end end
end end
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,147 +1,147 @@
class HTTP_RESPONSE class HTTP_RESPONSE
inherit inherit
HTTP_CONSTANTS HTTP_CONSTANTS
redefine redefine
default_create default_create
end end
create create
default_create default_create
feature -- creation feature -- creation
default_create default_create
do do
Precursor Precursor
set_defaults set_defaults
end end
set_defaults set_defaults
-- Set default values for the reply -- Set default values for the reply
do do
status_code := ok status_code := ok
create content_length_data.make_empty create content_length_data.make_empty
reason_phrase := ok_message reason_phrase := ok_message
content_type_data := text_html content_type_data := text_html
set_reply_text (Void) set_reply_text (Void)
end end
feature -- Recycle feature -- Recycle
reset reset
do do
set_defaults set_defaults
end end
feature -- response header fields feature -- response header fields
status_code: STRING status_code: STRING
-- status -- status
content_length_data : STRING content_length_data : STRING
-- length -- length
reason_phrase: STRING reason_phrase: STRING
-- message, if any -- message, if any
content_type_data: STRING content_type_data: STRING
-- type of content in this reply (eg. text/html) -- type of content in this reply (eg. text/html)
feature -- Element change feature -- Element change
set_content_length (new_content_length: INTEGER) set_content_length (new_content_length: INTEGER)
require require
positive_or_zero: new_content_length >= 0 positive_or_zero: new_content_length >= 0
do do
content_length_data := new_content_length.out content_length_data := new_content_length.out
end end
set_status_code (new_status_code: STRING) set_status_code (new_status_code: STRING)
require require
not_void: new_status_code /= Void not_void: new_status_code /= Void
do do
status_code := new_status_code status_code := new_status_code
end end
set_reason_phrase (new_reason_phrase: STRING) set_reason_phrase (new_reason_phrase: STRING)
require require
not_void: new_reason_phrase /= Void not_void: new_reason_phrase /= Void
do do
reason_phrase := new_reason_phrase reason_phrase := new_reason_phrase
end end
set_content_type (new_content_type: STRING) set_content_type (new_content_type: STRING)
require require
not_void: new_content_type /= Void not_void: new_content_type /= Void
do do
content_type_data := new_content_type content_type_data := new_content_type
end end
feature -- Access: send reply feature -- Access: send reply
reply_header: STRING reply_header: STRING
-- header -- header
do do
Result := http_version_1_1.twin Result := http_version_1_1.twin
Result.extend (' ') Result.extend (' ')
Result.append (status_code) Result.append (status_code)
Result.extend (' ') Result.extend (' ')
Result.append (reason_phrase) Result.append (reason_phrase)
Result.append (crlf) Result.append (crlf)
Result.append ({HTTP_SERVER_CONFIGURATION}.Server_details) Result.append ({HTTP_SERVER_CONFIGURATION}.Server_details)
Result.append (crlf) Result.append (crlf)
Result.append (Content_type + ": ") Result.append (Content_type + ": ")
Result.append (content_type_data) Result.append (content_type_data)
Result.append (crlf) Result.append (crlf)
Result.append (Content_length + ": ") Result.append (Content_length + ": ")
Result.append (content_length_data) Result.append (content_length_data)
Result.append (crlf) Result.append (crlf)
Result.append (crlf) Result.append (crlf)
-- TODO: could add the size of data being sent here and -- TODO: could add the size of data being sent here and
-- then keep the connection alive -- then keep the connection alive
end end
reply_header_continue: STRING reply_header_continue: STRING
-- header -- header
do do
Result := http_version_1_1.twin Result := http_version_1_1.twin
Result.extend (' ') Result.extend (' ')
Result.append (status_code) Result.append (status_code)
Result.extend (' ') Result.extend (' ')
Result.append (continue_message) Result.append (continue_message)
Result.append (crlf) Result.append (crlf)
Result.append (crlf) Result.append (crlf)
-- TODO: could add the size of data being sent here and -- TODO: could add the size of data being sent here and
-- then keep the connection alive -- then keep the connection alive
end end
reply_text: STRING reply_text: STRING
-- reply text -- reply text
feature -- Change element: send reply feature -- Change element: send reply
set_reply_text (new_text: detachable STRING) set_reply_text (new_text: detachable STRING)
-- text could be Void -- text could be Void
do do
if new_text = Void then if new_text = Void then
create reply_text.make_empty create reply_text.make_empty
else else
reply_text := new_text reply_text := new_text
end end
end end
append_reply_text (more_text: STRING) append_reply_text (more_text: STRING)
-- add more text to the reply -- add more text to the reply
require require
reply_text /= Void reply_text /= Void
more_text /= Void more_text /= Void
do do
reply_text.append (more_text) reply_text.append (more_text)
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,18 +1,18 @@
note note
description: "Summary description for {SHARED_URI_CONTENTS_TYPES}." description: "Summary description for {SHARED_URI_CONTENTS_TYPES}."
author: "" author: ""
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
SHARED_URI_CONTENTS_TYPES SHARED_URI_CONTENTS_TYPES
feature feature
ct_table: URI_CONTENTS_TYPES ct_table: URI_CONTENTS_TYPES
once once
create Result.make create Result.make
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,82 +1,82 @@
note note
description: "Summary description for {TCP_STREAM_SOCKET}." description: "Summary description for {TCP_STREAM_SOCKET}."
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
class class
TCP_STREAM_SOCKET TCP_STREAM_SOCKET
inherit inherit
NETWORK_STREAM_SOCKET NETWORK_STREAM_SOCKET
redefine redefine
make make
end end
create create
make_server_by_address_and_port, make_server_by_address_and_port,
make_server_by_port make_server_by_port
create {NETWORK_STREAM_SOCKET} create {NETWORK_STREAM_SOCKET}
make_from_descriptor_and_address make_from_descriptor_and_address
feature {NONE} -- Initialization feature {NONE} -- Initialization
make make
-- Create a network stream socket. -- Create a network stream socket.
do do
Precursor Precursor
set_reuse_address set_reuse_address
end end
make_server_by_address_and_port (an_address: INET_ADDRESS; a_port: INTEGER) make_server_by_address_and_port (an_address: INET_ADDRESS; a_port: INTEGER)
-- Create server socket on `an_address' and `a_port'. -- Create server socket on `an_address' and `a_port'.
require require
valid_port: a_port >= 0 valid_port: a_port >= 0
do do
make make
create address.make_from_address_and_port (an_address, a_port) create address.make_from_address_and_port (an_address, a_port)
bind bind
end end
feature -- Basic operation feature -- Basic operation
send_message (a_msg: STRING) send_message (a_msg: STRING)
local local
a_package : PACKET a_package : PACKET
a_data : MANAGED_POINTER a_data : MANAGED_POINTER
c_string : C_STRING c_string : C_STRING
do do
create c_string.make (a_msg) create c_string.make (a_msg)
create a_data.make_from_pointer (c_string.item, a_msg.count + 1) create a_data.make_from_pointer (c_string.item, a_msg.count + 1)
create a_package.make_from_managed_pointer (a_data) create a_package.make_from_managed_pointer (a_data)
send (a_package, 1) send (a_package, 1)
end end
feature -- Output feature -- Output
put_readable_string_8 (s: READABLE_STRING_8) put_readable_string_8 (s: READABLE_STRING_8)
-- Write readable string `s' to socket. -- Write readable string `s' to socket.
local local
ext: C_STRING ext: C_STRING
do do
create ext.make (s) create ext.make (s)
put_managed_pointer (ext.managed_data, 0, s.count) put_managed_pointer (ext.managed_data, 0, s.count)
end end
feature -- Status report feature -- Status report
try_ready_for_reading: BOOLEAN try_ready_for_reading: BOOLEAN
-- Is data available for reading from the socket right now? -- Is data available for reading from the socket right now?
require require
socket_exists: exists socket_exists: exists
local local
retval: INTEGER retval: INTEGER
do do
retval := c_select_poll_with_timeout (descriptor, True, 0) retval := c_select_poll_with_timeout (descriptor, True, 0)
Result := (retval > 0) Result := (retval > 0)
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,91 +1,91 @@
class URI_CONTENTS_TYPES class URI_CONTENTS_TYPES
create create
make make
feature feature
content_types: HASH_TABLE [STRING, STRING] content_types: HASH_TABLE [STRING, STRING]
extension (uri: STRING): STRING extension (uri: STRING): STRING
-- extract extendion from a URI -- extract extendion from a URI
local local
i: INTEGER i: INTEGER
do do
-- going from the end find the position of the "." -- going from the end find the position of the "."
from from
i := uri.count i := uri.count
until until
i = 0 or else uri.item (i) = '.' i = 0 or else uri.item (i) = '.'
loop loop
i := i - 1 i := i - 1
end end
Result := uri.substring (i+1, uri.count) Result := uri.substring (i+1, uri.count)
end end
feature {NONE} feature {NONE}
make make
do do
create content_types.make (30) create content_types.make (30)
content_types.put ("text/html", "html") content_types.put ("text/html", "html")
content_types.put ("text/html", "htm") content_types.put ("text/html", "htm")
content_types.put ("image/gif", "gif") content_types.put ("image/gif", "gif")
content_types.put ("image/jpeg", "jpeg") content_types.put ("image/jpeg", "jpeg")
content_types.put ("image/png", "jpg") content_types.put ("image/png", "jpg")
content_types.put ("image/png", "png") content_types.put ("image/png", "png")
end end
feature -- Access: Encoding feature -- Access: Encoding
urlencode (s: STRING): STRING urlencode (s: STRING): STRING
-- URL encode `s' -- URL encode `s'
do do
Result := s.string Result := s.string
Result.replace_substring_all ("#", "%%23") Result.replace_substring_all ("#", "%%23")
Result.replace_substring_all (" ", "%%20") Result.replace_substring_all (" ", "%%20")
Result.replace_substring_all ("%T", "%%09") Result.replace_substring_all ("%T", "%%09")
Result.replace_substring_all ("%N", "%%0A") Result.replace_substring_all ("%N", "%%0A")
Result.replace_substring_all ("/", "%%2F") Result.replace_substring_all ("/", "%%2F")
Result.replace_substring_all ("&", "%%26") Result.replace_substring_all ("&", "%%26")
Result.replace_substring_all ("<", "%%3C") Result.replace_substring_all ("<", "%%3C")
Result.replace_substring_all ("=", "%%3D") Result.replace_substring_all ("=", "%%3D")
Result.replace_substring_all (">", "%%3E") Result.replace_substring_all (">", "%%3E")
Result.replace_substring_all ("%"", "%%22") Result.replace_substring_all ("%"", "%%22")
Result.replace_substring_all ("%'", "%%27") Result.replace_substring_all ("%'", "%%27")
end end
urldecode (s: STRING): STRING urldecode (s: STRING): STRING
-- URL decode `s' -- URL decode `s'
do do
Result := s.string Result := s.string
Result.replace_substring_all ("%%23", "#") Result.replace_substring_all ("%%23", "#")
Result.replace_substring_all ("%%20", " ") Result.replace_substring_all ("%%20", " ")
Result.replace_substring_all ("%%09", "%T") Result.replace_substring_all ("%%09", "%T")
Result.replace_substring_all ("%%0A", "%N") Result.replace_substring_all ("%%0A", "%N")
Result.replace_substring_all ("%%2F", "/") Result.replace_substring_all ("%%2F", "/")
Result.replace_substring_all ("%%26", "&") Result.replace_substring_all ("%%26", "&")
Result.replace_substring_all ("%%3C", "<") Result.replace_substring_all ("%%3C", "<")
Result.replace_substring_all ("%%3D", "=") Result.replace_substring_all ("%%3D", "=")
Result.replace_substring_all ("%%3E", ">") Result.replace_substring_all ("%%3E", ">")
Result.replace_substring_all ("%%22", "%"") Result.replace_substring_all ("%%22", "%"")
Result.replace_substring_all ("%%27", "%'") Result.replace_substring_all ("%%27", "%'")
end end
stripslashes (s: STRING): STRING stripslashes (s: STRING): STRING
do do
Result := s.string Result := s.string
Result.replace_substring_all ("\%"", "%"") Result.replace_substring_all ("\%"", "%"")
Result.replace_substring_all ("\'", "'") Result.replace_substring_all ("\'", "'")
Result.replace_substring_all ("\/", "/") Result.replace_substring_all ("\/", "/")
Result.replace_substring_all ("\\", "\") Result.replace_substring_all ("\\", "\")
end end
note note
copyright: "2011-2011, Javier Velilla and others" copyright: "2011-2011, Javier Velilla and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="nino" uuid="32C1D67D-33DE-4F1E-864B-D45388F2E3E6" library_target="nino"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="nino" uuid="32C1D67D-33DE-4F1E-864B-D45388F2E3E6" library_target="nino">
<target name="nino"> <target name="nino">
<root all_classes="true"/> <root all_classes="true"/>
<file_rule> <file_rule>
@@ -8,7 +8,7 @@
<exclude>/CVS$</exclude> <exclude>/CVS$</exclude>
<exclude>/.svn$</exclude> <exclude>/.svn$</exclude>
</file_rule> </file_rule>
<option warning="true" is_attached_by_default="true" void_safety="all"> <option warning="true" full_class_checking="false" is_attached_by_default="true" void_safety="all" syntax="transitional">
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/> <assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option> </option>
<setting name="concurrency" value="thread"/> <setting name="concurrency" value="thread"/>

View File

@@ -1 +0,0 @@

View File

@@ -1,38 +1,38 @@
Eiffel Nino HTTPD Eiffel Nino HTTPD
================= =================
Eiffel Nino is and HTTPD server. It's a work in progress, so maybe it will be refactored. 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 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. The code is based on Xebra and Emu Web Server.
Goal Goal
======== ========
HTTPD server for development, support for HTTP 1.1. HTTPD server for development, support for HTTP 1.1.
Testing Testing
======= =======
To test the HTTPD server, you could run the [example https://github.com/jvelilla/EiffelWebNino/tree/master/example/SimpleWebServer] 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. The server work fine in Windows and Linux.
Run the server and point your browser to one of the following URIs Run the server and point your browser to one of the following URIs
1) http://localhost:9000/post/index.html 1) http://localhost:9000/post/index.html
2) http://localhost:9000/demo1/template.html 2) http://localhost:9000/demo1/template.html
3) http://localhost:9000/demo2/demo.html 3) http://localhost:9000/demo2/demo.html
4) http://localhost:9000/example/html/index.html 4) http://localhost:9000/example/html/index.html
5) http://localhost:9000/html/simple.html 5) http://localhost:9000/html/simple.html
6) http://localhost:9000/html/images.html 6) http://localhost:9000/html/images.html
7) http://localhost:9000/html/images.html 7) http://localhost:9000/html/images.html
8) http://localhost:9000/html5/dataset.html 8) http://localhost:9000/html5/dataset.html
Known Issues Known Issues
============ ============

View File

@@ -0,0 +1,9 @@
# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto
# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
*.e text
*.ecf text
*.bat text
*.json text

View File

@@ -1,26 +1,26 @@
History file for EJSON History file for EJSON
====================== ======================
team: "" team: ""
date: "2011-07-06" date: "2011-07-06"
revision: "0.3.0" revision: "0.3.0"
+++++++++++++++++++++Important Changes since 0.2.0 version++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++Important Changes since 0.2.0 version++++++++++++++++++++++++++++++++++++++++++++++
*Updated skip_white_spaces, now check %U and %T codes *Updated skip_white_spaces, now check %U and %T codes
*Undo changes to is_a_valid_number, because it's doesn't follow the *Undo changes to is_a_valid_number, because it's doesn't follow the
JSON spec. Tests : fail13.json, fail29.json and fail30.json are valid JSON spec. Tests : fail13.json, fail29.json and fail30.json are valid
with this implementation, so we go back to the previous with this implementation, so we go back to the previous
implementation. implementation.
*Added autotest test suite *Added autotest test suite
*Added getest based test program *Added getest based test program
*Updated Eiffel configuration file, updated to the new clusters *Updated Eiffel configuration file, updated to the new clusters
*Added converters and factory classes *Added converters and factory classes
*Added new top level directories; library, test, build and example *Added new top level directories; library, test, build and example

View File

@@ -1,20 +1,20 @@
Copyright (c) 2010 Javier Velilla and others, http://ejson.origo.ethz.ch Copyright (c) 2010 Javier Velilla and others, http://ejson.origo.ethz.ch
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software. all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.

View File

@@ -1,97 +1,99 @@
Readme file for eJSON Readme file for eJSON
===================== =====================
team: "Javier Velilla,Jocelyn Fiat, Paul Cohen" team: "Javier Velilla,Jocelyn Fiat, Paul Cohen"
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
1. Introduction 1. Introduction
--------------- ---------------
eJSON stands for Eiffel JSON library and is a small Eiffel library for dealing eJSON stands for Eiffel JSON library and is a small Eiffel library for dealing
with the JSON format. The objective of the library is to provide two basic with the JSON format. The objective of the library is to provide two basic
features Eiffel2JSON and JSON2Eiffel. features Eiffel2JSON and JSON2Eiffel.
2. Legal stuff 2. Legal stuff
-------------- --------------
eJSON is copyrighted by the author Javier Velilla and others. It is licensed eJSON is copyrighted by the author Javier Velilla and others. It is licensed
under the MIT License. See the file license.txt in the same directory as this under the MIT License. See the file license.txt in the same directory as this
readme file. readme file.
3. Versioning scheme 3. Versioning scheme
-------------------- --------------------
eJSON version numbers has the form: eJSON version numbers has the form:
«major number».«minor number».«patch level» «major number».«minor number».«patch level»
eJSON will retain the major number 0 as long as it has beta status. A change in eJSON will retain the major number 0 as long as it has beta status. A change in
major number indicates that a release is not backward compatible. A change in major number indicates that a release is not backward compatible. A change in
minor number indicates that a release is backward compatible (within that major minor number indicates that a release is backward compatible (within that major
number) but that new useful features may have been added. A change in patch number) but that new useful features may have been added. A change in patch
level simply indicates that the release contains bug fixes for the previous level simply indicates that the release contains bug fixes for the previous
release. Note that as long as eJSON is in beta status (0.Y.Z) backward release. Note that as long as eJSON is in beta status (0.Y.Z) backward
compatibility is not guranteed for changes in minor numbers! compatibility is not guranteed for changes in minor numbers!
4. Documentation 4. Documentation
--------------- ---------------
Currently the only documentation on eJSON is available at: Currently the only documentation on eJSON is available at:
https://github.com/eiffelhub/json/wiki/User-guide https://github.com/eiffelhub/json/wiki/User-guide
5. Requirements and installation 5. Requirements and installation
-------------------------------- --------------------------------
EJSON requires that you have: EJSON requires that you have:
1. Gobo 3.9 installed or later 1. Gobo 3.9 installed or later
2. One of the following compiler combinations installed: 2. One of the following compiler combinations installed:
* ISE Eiffel 6.5 or later. * ISE Eiffel 6.5 or later.
* gec [try to test] * gec [try to test]
* tecomp [try to test] * tecomp [try to test]
eJSON probably works fine with other versions of the above compilers. eJSON probably works fine with other versions of the above compilers.
There are no known platform dependencies (Windows, Linux). There are no known platform dependencies (Windows, Linux).
To install eJSON simply extract the ejson-X.Y.Z.zip file to some appropriate To install eJSON simply extract the ejson-X.Y.Z.zip file to some appropriate
place on your hard disk. There are no requirements on environment variables or place on your hard disk. There are no requirements on environment variables or
registry variables. registry variables.
To verify that everything works you should compile the example programs and/or To verify that everything works you should compile the example programs and/or
the test program. the test program.
6. Contents of eJSON 6. Contents of eJSON
-------------------- --------------------
All directory names below are relative to the root directory of your ejson All directory names below are relative to the root directory of your ejson
installation. installation.
Directory Description Directory Description
--------- ----------- --------- -----------
doc Contains the eJSON.pdf documentation file. doc Contains the eJSON.pdf documentation file.
examples Contains the two example programs. examples Contains the two example programs.
ejson Contains the actual eJSON library classes. ejson Contains the actual eJSON library classes.
test Contains a test program for eJSON. test Contains a test program for eJSON.
7. Contacting the Team 7. Contacting the Team
---------------------- ----------------------
Contact the team: Contact the team:
Javier Velilla «javier.hector@gmail.com» Javier Velilla «javier.hector@gmail.com»
Paul Cohen «paco@seibostudios.se» Paul Cohen «paco@seibostudios.se»
Jocelyn Fiat «jfiat@eiffel.com» Jocelyn Fiat «jfiat@eiffel.com»
8. Releases 8. Releases
----------- -----------
For more information on what was changed in each release look in the file For more information on what was changed in each release look in the file
history.txt. history.txt.
Version Date Description Version Date Description
------- ---- ----------- ------- ---- -----------
0.3.0 2011-07-06 JSON Factory Converters 0.5.0 2013-11-dd Added JSON_ITERATOR, simplified JSON_OBJECT
0.2.0 2010-02-07 Adapted to EiffelStudio 6.4 or later, supports void-safety 0.4.0 2012-12-12 Updated documentation URI
0.3.0 2011-07-06 JSON Factory Converters
0.2.0 2010-02-07 Adapted to EiffelStudio 6.4 or later, supports void-safety
0.1.0 2010-02-07 First release, Adapted to SmartEiffel 1.2r7 and EiffelStudio 6.2 or previous 0.1.0 2010-02-07 First release, Adapted to SmartEiffel 1.2r7 and EiffelStudio 6.2 or previous

View File

@@ -1,38 +1,37 @@
note note
description: "Objects that ..." description: "Objects that ..."
author: "" date: "$Date$"
date: "$Date$" revision: "$Revision$"
revision: "$Revision$"
class
class JSON_FILE_READER
JSON_FILE_READER
feature -- Access
feature -- Access
read_json_from (a_path: STRING): detachable STRING
read_json_from (a_path: STRING): detachable STRING local
local l_file: PLAIN_TEXT_FILE
l_file: PLAIN_TEXT_FILE template_content: STRING
template_content: STRING l_last_string: detachable STRING
l_last_string: detachable STRING do
do create l_file.make_with_name (a_path)
create l_file.make (a_path) -- We perform several checks until we make a real attempt to open the file.
-- We perform several checks until we make a real attempt to open the file. if not l_file.exists then
if not l_file.exists then print ("error: '" + a_path + "' does not exist%N")
print ("error: '" + a_path + "' does not exist%N") else
else if not l_file.is_readable then
if not l_file.is_readable then print ("error: '" + a_path + "' is not readable.%N")
print ("error: '" + a_path + "' is not readable.%N") else
else l_file.open_read
l_file.open_read create template_content.make_empty
create template_content.make_empty l_file.read_stream (l_file.count)
l_file.read_stream (l_file.count) l_last_string := l_file.last_string
l_last_string := l_file.last_string check l_last_string /= Void end -- implied by postcondition of `l_file.read_stream'
check l_last_string /= Void end -- implied by postcondition of `l_file.read_stream' template_content.append (l_last_string.string)
template_content.append (l_last_string.string) Result := template_content
Result := template_content l_file.close
l_file.close end
end end
end end
end
end
end

View File

@@ -0,0 +1,60 @@
note
description:
"JSON Iterator"
pattern: "Iterator visitor"
author: "Jocelyn Fiat"
license:"MIT (see http://www.opensource.org/licenses/mit-license.php)"
date: "2013/08/01"
revision: "Revision 0.1"
deferred class
JSON_ITERATOR
inherit
JSON_VISITOR
feature -- Visitor Pattern
visit_json_array (a_json_array: JSON_ARRAY)
-- Visit `a_json_array'.
do
across
a_json_array as c
loop
c.item.accept (Current)
end
end
visit_json_boolean (a_json_boolean: JSON_BOOLEAN)
-- Visit `a_json_boolean'.
do
end
visit_json_null (a_json_null: JSON_NULL)
-- Visit `a_json_null'.
do
end
visit_json_number (a_json_number: JSON_NUMBER)
-- Visit `a_json_number'.
do
end
visit_json_object (a_json_object: JSON_OBJECT)
-- Visit `a_json_object'.
do
across
a_json_object as c
loop
c.item.accept (Current)
end
end
visit_json_string (a_json_string: JSON_STRING)
-- Visit `a_json_string'.
do
end
end

View File

@@ -1,59 +1,59 @@
note note
description: description:
"JSON Visitor" "JSON Visitor"
pattern: "Visitor" pattern: "Visitor"
author: "Javier Velilla" author: "Javier Velilla"
license:"MIT (see http://www.opensource.org/licenses/mit-license.php)" license:"MIT (see http://www.opensource.org/licenses/mit-license.php)"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
deferred class deferred class
JSON_VISITOR JSON_VISITOR
feature -- Visitor Pattern feature -- Visitor Pattern
visit_json_array (a_json_array: JSON_ARRAY) visit_json_array (a_json_array: JSON_ARRAY)
-- Visit `a_json_array'. -- Visit `a_json_array'.
require require
a_json_array_not_void: a_json_array /= Void a_json_array_not_void: a_json_array /= Void
deferred deferred
end end
visit_json_boolean (a_json_boolean: JSON_BOOLEAN) visit_json_boolean (a_json_boolean: JSON_BOOLEAN)
-- Visit `a_json_boolean'. -- Visit `a_json_boolean'.
require require
a_json_boolean_not_void: a_json_boolean /= Void a_json_boolean_not_void: a_json_boolean /= Void
deferred deferred
end end
visit_json_null (a_json_null: JSON_NULL) visit_json_null (a_json_null: JSON_NULL)
-- Visit `a_json_null'. -- Visit `a_json_null'.
require require
a_json_null_not_void: a_json_null /= Void a_json_null_not_void: a_json_null /= Void
deferred deferred
end end
visit_json_number (a_json_number: JSON_NUMBER) visit_json_number (a_json_number: JSON_NUMBER)
-- Visit `a_json_number'. -- Visit `a_json_number'.
require require
a_json_number_not_void: a_json_number /= Void a_json_number_not_void: a_json_number /= Void
deferred deferred
end end
visit_json_object (a_json_object: JSON_OBJECT) visit_json_object (a_json_object: JSON_OBJECT)
-- Visit `a_json_object'. -- Visit `a_json_object'.
require require
a_json_object_not_void: a_json_object /= Void a_json_object_not_void: a_json_object /= Void
deferred deferred
end end
visit_json_string (a_json_string: JSON_STRING) visit_json_string (a_json_string: JSON_STRING)
-- Visit `a_json_string'. -- Visit `a_json_string'.
require require
a_json_string_not_void: a_json_string /= Void a_json_string_not_void: a_json_string /= Void
deferred deferred
end end
end end

View File

@@ -1,102 +1,102 @@
note note
description: "PRINT_JSON_VISITOR Generates the JSON-String for a JSON_VALUE" description: "PRINT_JSON_VISITOR Generates the JSON-String for a JSON_VALUE"
author: "jvelilla" author: "jvelilla"
date: "2008/08/24" date: "2008/08/24"
revision: "0.1" revision: "0.1"
class class
PRINT_JSON_VISITOR PRINT_JSON_VISITOR
inherit inherit
JSON_VISITOR JSON_VISITOR
create make create make
feature -- Initialization feature -- Initialization
make make
-- Create a new instance -- Create a new instance
do do
create to_json.make_empty create to_json.make_empty
end end
feature -- Access feature -- Access
to_json: STRING to_json: STRING
-- JSON representation -- JSON representation
feature -- Visitor Pattern feature -- Visitor Pattern
visit_json_array (a_json_array: JSON_ARRAY) visit_json_array (a_json_array: JSON_ARRAY)
-- Visit `a_json_array'. -- Visit `a_json_array'.
local local
value: JSON_VALUE value: JSON_VALUE
l_json_array: ARRAYED_LIST [JSON_VALUE] l_json_array: ARRAYED_LIST [JSON_VALUE]
do do
l_json_array:=a_json_array.array_representation l_json_array:=a_json_array.array_representation
to_json.append ("[") to_json.append ("[")
from from
l_json_array.start l_json_array.start
until until
l_json_array.off l_json_array.off
loop loop
value := l_json_array.item value := l_json_array.item
value.accept (Current) value.accept (Current)
l_json_array.forth l_json_array.forth
if not l_json_array.after then if not l_json_array.after then
to_json.append(",") to_json.append(",")
end end
end end
to_json.append ("]") to_json.append ("]")
end end
visit_json_boolean (a_json_boolean: JSON_BOOLEAN) visit_json_boolean (a_json_boolean: JSON_BOOLEAN)
-- Visit `a_json_boolean'. -- Visit `a_json_boolean'.
do do
to_json.append (a_json_boolean.item.out) to_json.append (a_json_boolean.item.out)
end end
visit_json_null (a_json_null: JSON_NULL) visit_json_null (a_json_null: JSON_NULL)
-- Visit `a_json_null'. -- Visit `a_json_null'.
do do
to_json.append ("null") to_json.append ("null")
end end
visit_json_number (a_json_number: JSON_NUMBER) visit_json_number (a_json_number: JSON_NUMBER)
-- Visit `a_json_number'. -- Visit `a_json_number'.
do do
to_json.append (a_json_number.item) to_json.append (a_json_number.item)
end end
visit_json_object (a_json_object: JSON_OBJECT) visit_json_object (a_json_object: JSON_OBJECT)
-- Visit `a_json_object'. -- Visit `a_json_object'.
local local
l_pairs: HASH_TABLE[JSON_VALUE,JSON_STRING] l_pairs: HASH_TABLE[JSON_VALUE,JSON_STRING]
do do
l_pairs := a_json_object.map_representation l_pairs := a_json_object.map_representation
to_json.append ("{") to_json.append ("{")
from from
l_pairs.start l_pairs.start
until until
l_pairs.off l_pairs.off
loop loop
l_pairs.key_for_iteration.accept (Current) l_pairs.key_for_iteration.accept (Current)
to_json.append (":") to_json.append (":")
l_pairs.item_for_iteration.accept (Current) l_pairs.item_for_iteration.accept (Current)
l_pairs.forth l_pairs.forth
if not l_pairs.after then if not l_pairs.after then
to_json.append (",") to_json.append (",")
end end
end end
to_json.append ("}") to_json.append ("}")
end end
visit_json_string (a_json_string: JSON_STRING) visit_json_string (a_json_string: JSON_STRING)
-- Visit `a_json_string'. -- Visit `a_json_string'.
do do
to_json.append ("%"") to_json.append ("%"")
to_json.append (a_json_string.item) to_json.append (a_json_string.item)
to_json.append ("%"") to_json.append ("%"")
end end
end end

View File

@@ -1,85 +1,85 @@
note note
description: "A JSON converter for DS_HASH_TABLE [ANY, HASHABLE]" description: "A JSON converter for DS_HASH_TABLE [ANY, HASHABLE]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: $" date: "$Date: $"
revision: "$Revision: $" revision: "$Revision: $"
file: "$HeadURL: $" file: "$HeadURL: $"
class JSON_DS_HASH_TABLE_CONVERTER class JSON_DS_HASH_TABLE_CONVERTER
inherit inherit
JSON_CONVERTER JSON_CONVERTER
create create
make make
feature {NONE} -- Initialization feature {NONE} -- Initialization
make make
do do
create object.make (0) create object.make (0)
end end
feature -- Access feature -- Access
value: JSON_OBJECT value: JSON_OBJECT
object: DS_HASH_TABLE [ANY, HASHABLE] object: DS_HASH_TABLE [ANY, HASHABLE]
feature -- Conversion feature -- Conversion
from_json (j: like value): detachable like object from_json (j: like value): detachable like object
local local
keys: ARRAY [JSON_STRING] keys: ARRAY [JSON_STRING]
i: INTEGER i: INTEGER
h: HASHABLE h: HASHABLE
a: ANY a: ANY
do do
keys := j.current_keys keys := j.current_keys
create Result.make (keys.count) create Result.make (keys.count)
from from
i := 1 i := 1
until until
i > keys.count i > keys.count
loop loop
h ?= json.object (keys [i], void) h ?= json.object (keys [i], void)
check h /= Void end check h /= Void end
a := json.object (j.item (keys [i]), Void) a := json.object (j.item (keys [i]), Void)
Result.put (a, h) Result.put (a, h)
i := i + 1 i := i + 1
end end
end end
to_json (o: like object): like value to_json (o: like object): like value
local local
c: DS_HASH_TABLE_CURSOR [ANY, HASHABLE] c: DS_HASH_TABLE_CURSOR [ANY, HASHABLE]
js: JSON_STRING js: JSON_STRING
jv: JSON_VALUE jv: JSON_VALUE
failed: BOOLEAN failed: BOOLEAN
do do
create Result.make create Result.make
from from
c := o.new_cursor c := o.new_cursor
c.start c.start
until until
c.after c.after
loop loop
if attached {JSON_STRING} json.value (c.key) as l_key then if attached {JSON_STRING} json.value (c.key) as l_key then
js := l_key js := l_key
else else
create js.make_json (c.key.out) create js.make_json (c.key.out)
end end
jv := json.value (c.item) jv := json.value (c.item)
if jv /= Void then if jv /= Void then
Result.put (jv, js) Result.put (jv, js)
else else
failed := True failed := True
end end
c.forth c.forth
end end
if failed then if failed then
Result := Void Result := Void
end end
end end
end -- class JSON_DS_HASH_TABLE_CONVERTER end -- class JSON_DS_HASH_TABLE_CONVERTER

View File

@@ -1,62 +1,62 @@
note note
description: "A JSON converter for DS_LINKED_LIST [ANY]" description: "A JSON converter for DS_LINKED_LIST [ANY]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date: $" date: "$Date: $"
revision: "$Revision: $" revision: "$Revision: $"
file: "$HeadURL: $" file: "$HeadURL: $"
class JSON_DS_LINKED_LIST_CONVERTER class JSON_DS_LINKED_LIST_CONVERTER
inherit inherit
JSON_CONVERTER JSON_CONVERTER
create create
make make
feature {NONE} -- Initialization feature {NONE} -- Initialization
make make
do do
create object.make create object.make
end end
feature -- Access feature -- Access
value: JSON_ARRAY value: JSON_ARRAY
object: DS_LINKED_LIST [ANY] object: DS_LINKED_LIST [ANY]
feature -- Conversion feature -- Conversion
from_json (j: like value): detachable like object from_json (j: like value): detachable like object
local local
i: INTEGER i: INTEGER
do do
create Result.make create Result.make
from from
i := 1 i := 1
until until
i > j.count i > j.count
loop loop
Result.put_last (json.object (j [i], Void)) Result.put_last (json.object (j [i], Void))
i := i + 1 i := i + 1
end end
end end
to_json (o: like object): like value to_json (o: like object): like value
local local
c: DS_LIST_CURSOR [ANY] c: DS_LIST_CURSOR [ANY]
do do
create Result.make_array create Result.make_array
from from
c := o.new_cursor c := o.new_cursor
c.start c.start
until until
c.after c.after
loop loop
Result.add (json.value (c.item)) Result.add (json.value (c.item))
c.forth c.forth
end end
end end
end -- class JSON_DS_LINKED_LIST_CONVERTER end -- class JSON_DS_LINKED_LIST_CONVERTER

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="json" uuid="4E21C3BD-7951-4C6E-A673-431E762D7414" library_target="json"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="json" uuid="4E21C3BD-7951-4C6E-A673-431E762D7414" library_target="json">
<target name="json"> <target name="json">
<root all_classes="true"/> <root all_classes="true"/>
<file_rule> <file_rule>

View File

@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="json" uuid="4E21C3BD-7951-4C6E-A673-431E762D7414" library_target="json"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="json" uuid="4E21C3BD-7951-4C6E-A673-431E762D7414" library_target="json">
<target name="json"> <target name="json">
<root all_classes="true"/> <root all_classes="true"/>
<file_rule> <file_rule>
<exclude>/EIFGENs$</exclude> <exclude>/EIFGENs$</exclude>
<exclude>/CVS$</exclude> <exclude>/CVS$</exclude>
<exclude>/.svn$</exclude> <exclude>/.svn$</exclude>
</file_rule> </file_rule>
<option trace="false" profile="false" debug="false" warning="true" full_class_checking="true" void_safety="none" syntax="standard" namespace="EJSON.Library"> <option trace="false" profile="false" debug="false" warning="true" full_class_checking="true" void_safety="none" syntax="standard" namespace="EJSON.Library">
<assertions/> <assertions/>
<warning name="export_class_missing" enabled="false"/> <warning name="export_class_missing" enabled="false"/>
<warning name="old_verbatim_strings" enabled="false"/> <warning name="old_verbatim_strings" enabled="false"/>
<warning name="syntax" enabled="false"/> <warning name="syntax" enabled="false"/>
<warning name="vjrv" enabled="false"/> <warning name="vjrv" enabled="false"/>
</option> </option>
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf" readonly="true"/> <library name="base" location="$ISE_LIBRARY\library\base\base.ecf" readonly="true"/>
<cluster name="json" location=".\" recursive="true"> <cluster name="json" location=".\" recursive="true">
<file_rule> <file_rule>
<exclude>^/gobo$</exclude> <exclude>^/gobo$</exclude>
<exclude>^/kernel$</exclude> <exclude>^/kernel$</exclude>
<exclude>^/extras$</exclude> <exclude>^/extras$</exclude>
</file_rule> </file_rule>
<cluster name="kernel" location=".\kernel\" recursive="true"/> <cluster name="kernel" location=".\kernel\" recursive="true"/>
<cluster name="extras" location=".\extras\" recursive="true"/> <cluster name="extras" location=".\extras\" recursive="true"/>
</cluster> </cluster>
</target> </target>
</system> </system>

View File

@@ -1,8 +1,8 @@
note note
description: "A JSON converter for HASH_TABLE [ANY, HASHABLE]" description: "A JSON converter for HASH_TABLE [ANY, HASHABLE]"
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date$" date: "$Date: 2014-01-30 15:27:41 +0100 (jeu., 30 janv. 2014) $"
revision: "$Revision$" revision: "$Revision: 94128 $"
file: "$HeadURL: $" file: "$HeadURL: $"
class JSON_HASH_TABLE_CONVERTER class JSON_HASH_TABLE_CONVERTER
@@ -27,34 +27,20 @@ feature -- Access
feature -- Conversion feature -- Conversion
from_json (j: attached like to_json): like object from_json (j: attached like to_json): like object
local
keys: ARRAY [JSON_STRING]
i: INTEGER
h: detachable HASHABLE
jv: detachable JSON_VALUE
a: detachable ANY
do do
keys := j.current_keys create Result.make (j.count)
create Result.make (keys.count) across
from j as ic
i := 1
until
i > keys.count
loop loop
h ?= json.object (keys [i], Void) if attached json.object (ic.item, Void) as l_object then
check h /= Void end if attached {HASHABLE} json.object (ic.key, Void) as h then
jv := j.item (keys [i]) Result.put (l_object, h)
if jv /= Void then else
a := json.object (jv, Void) check key_is_hashable: False end
if a /= Void then end
Result.put (a, h) else
else check object_attached: False end
check a_attached: a /= Void end
end
else
check j_has_item: False end
end end
i := i + 1
end end
end end
@@ -62,7 +48,6 @@ feature -- Conversion
local local
c: HASH_TABLE_ITERATION_CURSOR [ANY, HASHABLE] c: HASH_TABLE_ITERATION_CURSOR [ANY, HASHABLE]
js: JSON_STRING js: JSON_STRING
jv: detachable JSON_VALUE
failed: BOOLEAN failed: BOOLEAN
do do
create Result.make create Result.make
@@ -76,8 +61,7 @@ feature -- Conversion
else else
create js.make_json (c.key.out) create js.make_json (c.key.out)
end end
jv := json.value (c.item) if attached json.value (c.item) as jv then
if jv /= Void then
Result.put (jv, js) Result.put (jv, js)
else else
failed := True failed := True

View File

@@ -1,268 +1,268 @@
note note
description: "Core factory class for creating JSON objects and corresponding Eiffel objects." description: "Core factory class for creating JSON objects and corresponding Eiffel objects."
author: "Paul Cohen" author: "Paul Cohen"
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
file: "$HeadURL: $" file: "$HeadURL: $"
class EJSON class EJSON
inherit inherit
EXCEPTIONS EXCEPTIONS
feature -- Access feature -- Access
value (an_object: detachable ANY): detachable JSON_VALUE value (an_object: detachable ANY): detachable JSON_VALUE
-- JSON value from Eiffel object. Raises an "eJSON exception" if -- JSON value from Eiffel object. Raises an "eJSON exception" if
-- unable to convert value. -- unable to convert value.
local local
i: INTEGER i: INTEGER
ja: JSON_ARRAY ja: JSON_ARRAY
do do
-- Try to convert from basic Eiffel types. Note that we check with -- Try to convert from basic Eiffel types. Note that we check with
-- `conforms_to' since the client may have subclassed the base class -- `conforms_to' since the client may have subclassed the base class
-- that these basic types are derived from. -- that these basic types are derived from.
if an_object = Void then if an_object = Void then
create {JSON_NULL} Result create {JSON_NULL} Result
elseif attached {BOOLEAN} an_object as b then elseif attached {BOOLEAN} an_object as b then
create {JSON_BOOLEAN} Result.make_boolean (b) create {JSON_BOOLEAN} Result.make_boolean (b)
elseif attached {INTEGER_8} an_object as i8 then elseif attached {INTEGER_8} an_object as i8 then
create {JSON_NUMBER} Result.make_integer (i8) create {JSON_NUMBER} Result.make_integer (i8)
elseif attached {INTEGER_16} an_object as i16 then elseif attached {INTEGER_16} an_object as i16 then
create {JSON_NUMBER} Result.make_integer (i16) create {JSON_NUMBER} Result.make_integer (i16)
elseif attached {INTEGER_32} an_object as i32 then elseif attached {INTEGER_32} an_object as i32 then
create {JSON_NUMBER} Result.make_integer (i32) create {JSON_NUMBER} Result.make_integer (i32)
elseif attached {INTEGER_64} an_object as i64 then elseif attached {INTEGER_64} an_object as i64 then
create {JSON_NUMBER} Result.make_integer (i64) create {JSON_NUMBER} Result.make_integer (i64)
elseif attached {NATURAL_8} an_object as n8 then elseif attached {NATURAL_8} an_object as n8 then
create {JSON_NUMBER} Result.make_natural (n8) create {JSON_NUMBER} Result.make_natural (n8)
elseif attached {NATURAL_16} an_object as n16 then elseif attached {NATURAL_16} an_object as n16 then
create {JSON_NUMBER} Result.make_natural (n16) create {JSON_NUMBER} Result.make_natural (n16)
elseif attached {NATURAL_32} an_object as n32 then elseif attached {NATURAL_32} an_object as n32 then
create {JSON_NUMBER} Result.make_natural (n32) create {JSON_NUMBER} Result.make_natural (n32)
elseif attached {NATURAL_64} an_object as n64 then elseif attached {NATURAL_64} an_object as n64 then
create {JSON_NUMBER} Result.make_natural (n64) create {JSON_NUMBER} Result.make_natural (n64)
elseif attached {REAL_32} an_object as r32 then elseif attached {REAL_32} an_object as r32 then
create {JSON_NUMBER} Result.make_real (r32) create {JSON_NUMBER} Result.make_real (r32)
elseif attached {REAL_64} an_object as r64 then elseif attached {REAL_64} an_object as r64 then
create {JSON_NUMBER} Result.make_real (r64) create {JSON_NUMBER} Result.make_real (r64)
elseif attached {ARRAY [detachable ANY]} an_object as a then elseif attached {ARRAY [detachable ANY]} an_object as a then
create ja.make_array create ja.make_array
from from
i := a.lower i := a.lower
until until
i > a.upper i > a.upper
loop loop
if attached value (a @ i) as v then if attached value (a @ i) as v then
ja.add (v) ja.add (v)
else else
check value_attached: False end check value_attached: False end
end end
i := i + 1 i := i + 1
end end
Result := ja Result := ja
elseif attached {CHARACTER_8} an_object as c8 then elseif attached {CHARACTER_8} an_object as c8 then
create {JSON_STRING} Result.make_json (c8.out) create {JSON_STRING} Result.make_json (c8.out)
elseif attached {CHARACTER_32} an_object as c32 then elseif attached {CHARACTER_32} an_object as c32 then
create {JSON_STRING} Result.make_json (c32.out) create {JSON_STRING} Result.make_json (c32.out)
elseif attached {STRING_8} an_object as s8 then elseif attached {STRING_8} an_object as s8 then
create {JSON_STRING} Result.make_json (s8) create {JSON_STRING} Result.make_json (s8)
elseif attached {STRING_32} an_object as s32 then elseif attached {STRING_32} an_object as s32 then
create {JSON_STRING} Result.make_json_from_string_32 (s32) create {JSON_STRING} Result.make_json_from_string_32 (s32)
end end
if Result = Void then if Result = Void then
-- Now check the converters -- Now check the converters
if an_object /= Void and then attached converter_for (an_object) as jc then if an_object /= Void and then attached converter_for (an_object) as jc then
Result := jc.to_json (an_object) Result := jc.to_json (an_object)
else else
raise (exception_failed_to_convert_to_json (an_object)) raise (exception_failed_to_convert_to_json (an_object))
end end
end end
end end
object (a_value: detachable JSON_VALUE; base_class: detachable STRING): detachable ANY object (a_value: detachable JSON_VALUE; base_class: detachable STRING): detachable ANY
-- Eiffel object from JSON value. If `base_class' /= Void an eiffel -- Eiffel object from JSON value. If `base_class' /= Void an eiffel
-- object based on `base_class' will be returned. Raises an "eJSON -- object based on `base_class' will be returned. Raises an "eJSON
-- exception" if unable to convert value. -- exception" if unable to convert value.
local local
i: INTEGER i: INTEGER
ll: LINKED_LIST [detachable ANY] ll: LINKED_LIST [detachable ANY]
t: HASH_TABLE [detachable ANY, STRING_GENERAL] t: HASH_TABLE [detachable ANY, STRING_GENERAL]
keys: ARRAY [JSON_STRING] keys: ARRAY [JSON_STRING]
do do
if a_value = Void then if a_value = Void then
Result := Void Result := Void
else else
if base_class = Void then if base_class = Void then
if a_value = Void then if a_value = Void then
Result := Void Result := Void
elseif attached {JSON_NULL} a_value then elseif attached {JSON_NULL} a_value then
Result := Void Result := Void
elseif attached {JSON_BOOLEAN} a_value as jb then elseif attached {JSON_BOOLEAN} a_value as jb then
Result := jb.item Result := jb.item
elseif attached {JSON_NUMBER} a_value as jn then elseif attached {JSON_NUMBER} a_value as jn then
if jn.item.is_integer_8 then if jn.item.is_integer_8 then
Result := jn.item.to_integer_8 Result := jn.item.to_integer_8
elseif jn.item.is_integer_16 then elseif jn.item.is_integer_16 then
Result := jn.item.to_integer_16 Result := jn.item.to_integer_16
elseif jn.item.is_integer_32 then elseif jn.item.is_integer_32 then
Result := jn.item.to_integer_32 Result := jn.item.to_integer_32
elseif jn.item.is_integer_64 then elseif jn.item.is_integer_64 then
Result := jn.item.to_integer_64 Result := jn.item.to_integer_64
elseif jn.item.is_natural_64 then elseif jn.item.is_natural_64 then
Result := jn.item.to_natural_64 Result := jn.item.to_natural_64
elseif jn.item.is_double then elseif jn.item.is_double then
Result := jn.item.to_double Result := jn.item.to_double
end end
elseif attached {JSON_STRING} a_value as js then elseif attached {JSON_STRING} a_value as js then
create {STRING_32} Result.make_from_string (js.unescaped_string_32) create {STRING_32} Result.make_from_string (js.unescaped_string_32)
elseif attached {JSON_ARRAY} a_value as ja then elseif attached {JSON_ARRAY} a_value as ja then
from from
create ll.make create ll.make
i := 1 i := 1
until until
i > ja.count i > ja.count
loop loop
ll.extend (object (ja [i], Void)) ll.extend (object (ja [i], Void))
i := i + 1 i := i + 1
end end
Result := ll Result := ll
elseif attached {JSON_OBJECT} a_value as jo then elseif attached {JSON_OBJECT} a_value as jo then
keys := jo.current_keys keys := jo.current_keys
create t.make (keys.count) create t.make (keys.count)
from from
i := keys.lower i := keys.lower
until until
i > keys.upper i > keys.upper
loop loop
if attached {STRING_GENERAL} object (keys [i], Void) as s then if attached {STRING_GENERAL} object (keys [i], Void) as s then
t.put (object (jo.item (keys [i]), Void), s) t.put (object (jo.item (keys [i]), Void), s)
end end
i := i + 1 i := i + 1
end end
Result := t Result := t
end end
else else
if converters.has_key (base_class) and then attached converters.found_item as jc then if converters.has_key (base_class) and then attached converters.found_item as jc then
Result := jc.from_json (a_value) Result := jc.from_json (a_value)
else else
raise (exception_failed_to_convert_to_eiffel (a_value, base_class)) raise (exception_failed_to_convert_to_eiffel (a_value, base_class))
end end
end end
end end
end end
object_from_json (json: STRING; base_class: detachable STRING): detachable ANY object_from_json (json: STRING; base_class: detachable STRING): detachable ANY
-- Eiffel object from JSON representation. If `base_class' /= Void an -- Eiffel object from JSON representation. If `base_class' /= Void an
-- Eiffel object based on `base_class' will be returned. Raises an -- Eiffel object based on `base_class' will be returned. Raises an
-- "eJSON exception" if unable to convert value. -- "eJSON exception" if unable to convert value.
require require
json_not_void: json /= Void json_not_void: json /= Void
local local
jv: detachable JSON_VALUE jv: detachable JSON_VALUE
do do
json_parser.set_representation (json) json_parser.set_representation (json)
jv := json_parser.parse jv := json_parser.parse
if jv /= Void then if jv /= Void then
Result := object (jv, base_class) Result := object (jv, base_class)
end end
end end
converter_for (an_object: ANY): detachable JSON_CONVERTER converter_for (an_object: ANY): detachable JSON_CONVERTER
-- Converter for objects. Returns Void if none found. -- Converter for objects. Returns Void if none found.
require require
an_object_not_void: an_object /= Void an_object_not_void: an_object /= Void
do do
if converters.has_key (an_object.generator) then if converters.has_key (an_object.generator) then
Result := converters.found_item Result := converters.found_item
end end
end end
json_reference (s: STRING): JSON_OBJECT json_reference (s: STRING): JSON_OBJECT
-- A JSON (Dojo style) reference object using `s' as the -- A JSON (Dojo style) reference object using `s' as the
-- reference value. The caller is responsable for ensuring -- reference value. The caller is responsable for ensuring
-- the validity of `s' as a json reference. -- the validity of `s' as a json reference.
require require
s_not_void: s /= Void s_not_void: s /= Void
local local
js_key, js_value: JSON_STRING js_key, js_value: JSON_STRING
do do
create Result.make create Result.make
create js_key.make_json ("$ref") create js_key.make_json ("$ref")
create js_value.make_json (s) create js_value.make_json (s)
Result.put (js_value, js_key) Result.put (js_value, js_key)
end end
json_references (l: LIST [STRING]): JSON_ARRAY json_references (l: LIST [STRING]): JSON_ARRAY
-- A JSON array of JSON (Dojo style) reference objects using the -- A JSON array of JSON (Dojo style) reference objects using the
-- strings in `l' as reference values. The caller is responsable -- strings in `l' as reference values. The caller is responsable
-- for ensuring the validity of all strings in `l' as json -- for ensuring the validity of all strings in `l' as json
-- references. -- references.
require require
l_not_void: l /= Void l_not_void: l /= Void
local local
c: ITERATION_CURSOR [STRING] c: ITERATION_CURSOR [STRING]
do do
create Result.make_array create Result.make_array
from from
c := l.new_cursor c := l.new_cursor
until until
c.after c.after
loop loop
Result.add (json_reference (c.item)) Result.add (json_reference (c.item))
c.forth c.forth
end end
end end
feature -- Change feature -- Change
add_converter (jc: JSON_CONVERTER) add_converter (jc: JSON_CONVERTER)
-- Add the converter `jc'. -- Add the converter `jc'.
require require
jc_not_void: jc /= Void jc_not_void: jc /= Void
do do
converters.force (jc, jc.object.generator) converters.force (jc, jc.object.generator)
ensure ensure
has_converter: converter_for (jc.object) /= Void has_converter: converter_for (jc.object) /= Void
end end
feature {NONE} -- Implementation feature {NONE} -- Implementation
converters: HASH_TABLE [JSON_CONVERTER, STRING] converters: HASH_TABLE [JSON_CONVERTER, STRING]
-- Converters hashed by generator (base class) -- Converters hashed by generator (base class)
once once
create Result.make (10) create Result.make (10)
end end
feature {NONE} -- Implementation (Exceptions) feature {NONE} -- Implementation (Exceptions)
exception_prefix: STRING = "eJSON exception: " exception_prefix: STRING = "eJSON exception: "
exception_failed_to_convert_to_eiffel (a_value: JSON_VALUE; base_class: detachable STRING): STRING exception_failed_to_convert_to_eiffel (a_value: JSON_VALUE; base_class: detachable STRING): STRING
-- Exception message for failing to convert a JSON_VALUE to an instance of `a'. -- Exception message for failing to convert a JSON_VALUE to an instance of `a'.
do do
Result := exception_prefix + "Failed to convert JSON_VALUE to an Eiffel object: " + a_value.generator Result := exception_prefix + "Failed to convert JSON_VALUE to an Eiffel object: " + a_value.generator
if base_class /= Void then if base_class /= Void then
Result.append (" -> {" + base_class + "}") Result.append (" -> {" + base_class + "}")
end end
end end
exception_failed_to_convert_to_json (an_object: detachable ANY): STRING exception_failed_to_convert_to_json (an_object: detachable ANY): STRING
-- Exception message for failing to convert `a' to a JSON_VALUE. -- Exception message for failing to convert `a' to a JSON_VALUE.
do do
Result := exception_prefix + "Failed to convert Eiffel object to a JSON_VALUE" Result := exception_prefix + "Failed to convert Eiffel object to a JSON_VALUE"
if an_object /= Void then if an_object /= Void then
Result.append (" : {" + an_object.generator + "}") Result.append (" : {" + an_object.generator + "}")
end end
end end
feature {NONE} -- Implementation (JSON parser) feature {NONE} -- Implementation (JSON parser)
json_parser: JSON_PARSER json_parser: JSON_PARSER
once once
create Result.make_parser ("") create Result.make_parser ("")
end end
end -- class EJSON end -- class EJSON

View File

@@ -1,141 +1,178 @@
note note
description: "[ description: "[
JSON_ARRAY represent an array in JSON. JSON_ARRAY represent an array in JSON.
An array in JSON is an ordered set of names. An array in JSON is an ordered set of names.
Examples Examples
array array
[] []
[elements] [elements]
]" ]"
author: "Javier Velilla" author: "Javier Velilla"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
class class
JSON_ARRAY JSON_ARRAY
inherit inherit
JSON_VALUE JSON_VALUE
DEBUG_OUTPUT ITERABLE [JSON_VALUE]
create DEBUG_OUTPUT
make_array
create
feature {NONE} -- Initialization make_array
make_array feature {NONE} -- Initialization
-- Initialize JSON Array
do make_array
create values.make (10) -- Initialize JSON Array
end do
create values.make (10)
feature -- Access end
i_th alias "[]" (i: INTEGER): JSON_VALUE feature -- Access
-- Item at `i'-th position
require i_th alias "[]" (i: INTEGER): JSON_VALUE
is_valid_index: valid_index (i) -- Item at `i'-th position
do require
Result := values.i_th (i) is_valid_index: valid_index (i)
end do
Result := values.i_th (i)
representation: STRING end
local
i: INTEGER representation: STRING
do local
Result := "[" i: INTEGER
from do
i := 1 Result := "["
until from
i > count i := 1
loop until
Result.append (i_th (i).representation) i > count
i := i + 1 loop
if i <= count then Result.append (i_th (i).representation)
Result.append_character (',') i := i + 1
end if i <= count then
end Result.append_character (',')
Result.append_character (']') end
end end
Result.append_character (']')
feature -- Visitor pattern end
accept (a_visitor: JSON_VISITOR) feature -- Visitor pattern
-- Accept `a_visitor'.
-- (Call `visit_json_array' procedure on `a_visitor'.) accept (a_visitor: JSON_VISITOR)
do -- Accept `a_visitor'.
a_visitor.visit_json_array (Current) -- (Call `visit_json_array' procedure on `a_visitor'.)
end do
a_visitor.visit_json_array (Current)
feature -- Mesurement end
count: INTEGER feature -- Access
-- Number of items.
do new_cursor: ITERATION_CURSOR [JSON_VALUE]
Result := values.count -- Fresh cursor associated with current structure
end do
Result := values.new_cursor
feature -- Status report end
valid_index (i: INTEGER): BOOLEAN feature -- Mesurement
-- Is `i' a valid index?
do count: INTEGER
Result := (1 <= i) and (i <= count) -- Number of items.
end do
Result := values.count
feature -- Change Element end
add (value: JSON_VALUE) feature -- Status report
require
value_not_null: value /= void valid_index (i: INTEGER): BOOLEAN
do -- Is `i' a valid index?
values.extend (value) do
ensure Result := (1 <= i) and (i <= count)
has_new_value: old values.count + 1 = values.count and end
values.has (value)
end feature -- Change Element
feature -- Report put_front (v: JSON_VALUE)
require
hash_code: INTEGER v_not_void: v /= Void
-- Hash code value do
do values.put_front (v)
from ensure
values.start has_new_value: old values.count + 1 = values.count and
Result := values.item.hash_code values.first = v
until end
values.off
loop add, extend (v: JSON_VALUE)
Result:= ((Result \\ 8388593) |<< 8) + values.item.hash_code require
values.forth v_not_void: v /= Void
end do
Result := Result \\ values.count values.extend (v)
end ensure
has_new_value: old values.count + 1 = values.count and
feature -- Conversion values.has (v)
end
array_representation: ARRAYED_LIST [JSON_VALUE]
-- Representation as a sequences of values prune_all (v: JSON_VALUE)
do -- Remove all occurrences of `v'.
Result := values require
end v_not_void: v /= Void
do
feature -- Status report values.prune_all (v)
ensure
debug_output: STRING not_has_new_value: not values.has (v)
-- String that should be displayed in debugger to represent `Current'. end
do
Result := count.out wipe_out
end -- Remove all items.
do
feature {NONE} -- Implementation values.wipe_out
end
values: ARRAYED_LIST [JSON_VALUE]
-- Value container feature -- Report
invariant hash_code: INTEGER
value_not_void: values /= Void -- Hash code value
do
end from
values.start
Result := values.item.hash_code
until
values.off
loop
Result:= ((Result \\ 8388593) |<< 8) + values.item.hash_code
values.forth
end
Result := Result \\ values.count
end
feature -- Conversion
array_representation: ARRAYED_LIST [JSON_VALUE]
-- Representation as a sequences of values
-- be careful, modifying the return object may have impact on the original JSON_ARRAY object
do
Result := values
end
feature -- Status report
debug_output: STRING
-- String that should be displayed in debugger to represent `Current'.
do
Result := count.out + " item(s)"
end
feature {NONE} -- Implementation
values: ARRAYED_LIST [JSON_VALUE]
-- Value container
invariant
value_not_void: values /= Void
end

View File

@@ -1,61 +1,61 @@
note note
description: "JSON Truth values" description: "JSON Truth values"
author: "Javier Velilla" author: "Javier Velilla"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
class class
JSON_BOOLEAN JSON_BOOLEAN
inherit inherit
JSON_VALUE JSON_VALUE
create create
make_boolean make_boolean
feature {NONE} -- Initialization feature {NONE} -- Initialization
make_boolean (an_item: BOOLEAN) make_boolean (an_item: BOOLEAN)
--Initialize. --Initialize.
do do
item := an_item item := an_item
end end
feature -- Access feature -- Access
item: BOOLEAN item: BOOLEAN
-- Content -- Content
hash_code: INTEGER hash_code: INTEGER
-- Hash code value -- Hash code value
do do
Result := item.hash_code Result := item.hash_code
end end
representation: STRING representation: STRING
do do
if item then if item then
Result := "true" Result := "true"
else else
Result := "false" Result := "false"
end end
end end
feature -- Visitor pattern feature -- Visitor pattern
accept (a_visitor: JSON_VISITOR) accept (a_visitor: JSON_VISITOR)
-- Accept `a_visitor'. -- Accept `a_visitor'.
-- (Call `visit_json_boolean' procedure on `a_visitor'.) -- (Call `visit_json_boolean' procedure on `a_visitor'.)
do do
a_visitor.visit_json_boolean (Current) a_visitor.visit_json_boolean (Current)
end end
feature -- Status report feature -- Status report
debug_output: STRING debug_output: STRING
-- String that should be displayed in debugger to represent `Current'. -- String that should be displayed in debugger to represent `Current'.
do do
Result := item.out Result := item.out
end end
end end

View File

@@ -1,47 +1,47 @@
note note
description: "JSON Null Values" description: "JSON Null Values"
author: "Javier Velilla" author: "Javier Velilla"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
class class
JSON_NULL JSON_NULL
inherit inherit
JSON_VALUE JSON_VALUE
feature --Access feature --Access
hash_code: INTEGER hash_code: INTEGER
-- Hash code value -- Hash code value
do do
Result := null_value.hash_code Result := null_value.hash_code
end end
representation: STRING representation: STRING
do do
Result := "null" Result := "null"
end end
feature -- Visitor pattern feature -- Visitor pattern
accept (a_visitor: JSON_VISITOR) accept (a_visitor: JSON_VISITOR)
-- Accept `a_visitor'. -- Accept `a_visitor'.
-- (Call `visit_element_a' procedure on `a_visitor'.) -- (Call `visit_element_a' procedure on `a_visitor'.)
do do
a_visitor.visit_json_null (Current) a_visitor.visit_json_null (Current)
end end
feature -- Status report feature -- Status report
debug_output: STRING debug_output: STRING
-- String that should be displayed in debugger to represent `Current'. -- String that should be displayed in debugger to represent `Current'.
do do
Result := null_value Result := null_value
end end
feature {NONE}-- Implementation feature {NONE}-- Implementation
null_value: STRING = "null" null_value: STRING = "null"
end end

View File

@@ -1,99 +1,99 @@
note note
description: "JSON Numbers, octal and hexadecimal formats are not used." description: "JSON Numbers, octal and hexadecimal formats are not used."
author: "Javier Velilla" author: "Javier Velilla"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
license:"MIT (see http://www.opensource.org/licenses/mit-license.php)" license:"MIT (see http://www.opensource.org/licenses/mit-license.php)"
class class
JSON_NUMBER JSON_NUMBER
inherit inherit
JSON_VALUE JSON_VALUE
redefine redefine
is_equal is_equal
end end
create create
make_integer, make_integer,
make_natural, make_natural,
make_real make_real
feature {NONE} -- initialization feature {NONE} -- initialization
make_integer (an_argument: INTEGER_64) make_integer (an_argument: INTEGER_64)
-- Initialize an instance of JSON_NUMBER from the integer value of `an_argument'. -- Initialize an instance of JSON_NUMBER from the integer value of `an_argument'.
do do
item := an_argument.out item := an_argument.out
numeric_type := INTEGER_TYPE numeric_type := INTEGER_TYPE
end end
make_natural (an_argument: NATURAL_64) make_natural (an_argument: NATURAL_64)
-- Initialize an instance of JSON_NUMBER from the unsigned integer value of `an_argument'. -- Initialize an instance of JSON_NUMBER from the unsigned integer value of `an_argument'.
do do
item := an_argument.out item := an_argument.out
numeric_type := NATURAL_TYPE numeric_type := NATURAL_TYPE
end end
make_real (an_argument: DOUBLE) make_real (an_argument: DOUBLE)
-- Initialize an instance of JSON_NUMBER from the floating point value of `an_argument'. -- Initialize an instance of JSON_NUMBER from the floating point value of `an_argument'.
do do
item := an_argument.out item := an_argument.out
numeric_type := DOUBLE_TYPE numeric_type := DOUBLE_TYPE
end end
feature -- Access feature -- Access
item: STRING item: STRING
-- Content -- Content
hash_code: INTEGER hash_code: INTEGER
--Hash code value --Hash code value
do do
Result := item.hash_code Result := item.hash_code
end end
representation: STRING representation: STRING
do do
Result := item Result := item
end end
feature -- Visitor pattern feature -- Visitor pattern
accept (a_visitor: JSON_VISITOR) accept (a_visitor: JSON_VISITOR)
-- Accept `a_visitor'. -- Accept `a_visitor'.
-- (Call `visit_json_number' procedure on `a_visitor'.) -- (Call `visit_json_number' procedure on `a_visitor'.)
do do
a_visitor.visit_json_number (Current) a_visitor.visit_json_number (Current)
end end
feature -- Status feature -- Status
is_equal (other: like Current): BOOLEAN is_equal (other: like Current): BOOLEAN
-- Is `other' attached to an object of the same type -- Is `other' attached to an object of the same type
-- as current object and identical to it? -- as current object and identical to it?
do do
Result := item.is_equal (other.item) Result := item.is_equal (other.item)
end end
feature -- Status report feature -- Status report
debug_output: STRING debug_output: STRING
-- String that should be displayed in debugger to represent `Current'. -- String that should be displayed in debugger to represent `Current'.
do do
Result := item Result := item
end end
feature -- Implementation feature -- Implementation
INTEGER_TYPE: INTEGER = 1 INTEGER_TYPE: INTEGER = 1
DOUBLE_TYPE: INTEGER = 2 DOUBLE_TYPE: INTEGER = 2
NATURAL_TYPE: INTEGER = 3 NATURAL_TYPE: INTEGER = 3
numeric_type: INTEGER numeric_type: INTEGER
invariant invariant
item_not_void: item /= Void item_not_void: item /= Void
end end

View File

@@ -8,7 +8,7 @@ note
object object
{} {}
{"key","value"} {"key": "value"}
]" ]"
author: "Javier Velilla" author: "Javier Velilla"
@@ -22,7 +22,9 @@ class
inherit inherit
JSON_VALUE JSON_VALUE
TABLE_ITERABLE [JSON_VALUE, JSON_STRING] TABLE_ITERABLE [JSON_VALUE, JSON_STRING]
DEBUG_OUTPUT
create create
make make
@@ -52,6 +54,67 @@ feature -- Change Element
object.extend (l_value, key) object.extend (l_value, key)
end end
put_string (value: READABLE_STRING_GENERAL; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
require
key_not_present: not has_key (key)
local
l_value: JSON_STRING
do
create l_value.make_json_from_string_32 (value.as_string_32)
put (l_value, key)
end
put_integer (value: INTEGER_64; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
require
key_not_present: not has_key (key)
local
l_value: JSON_NUMBER
do
create l_value.make_integer (value)
put (l_value, key)
end
put_natural (value: NATURAL_64; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
require
key_not_present: not has_key (key)
local
l_value: JSON_NUMBER
do
create l_value.make_natural (value)
put (l_value, key)
end
put_real (value: DOUBLE; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
require
key_not_present: not has_key (key)
local
l_value: JSON_NUMBER
do
create l_value.make_real (value)
put (l_value, key)
end
put_boolean (value: BOOLEAN; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
require
key_not_present: not has_key (key)
local
l_value: JSON_BOOLEAN
do
create l_value.make_boolean (value)
put (l_value, key)
end
replace (value: detachable JSON_VALUE; key: JSON_STRING) replace (value: detachable JSON_VALUE; key: JSON_STRING)
-- Assuming there is no item of key `key', -- Assuming there is no item of key `key',
-- insert `value' with `key'. -- insert `value' with `key'.
@@ -65,6 +128,68 @@ feature -- Change Element
object.force (l_value, key) object.force (l_value, key)
end end
replace_with_string (value: READABLE_STRING_GENERAL; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
local
l_value: JSON_STRING
do
create l_value.make_json_from_string_32 (value.as_string_32)
replace (l_value, key)
end
replace_with_integer (value: INTEGER_64; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
local
l_value: JSON_NUMBER
do
create l_value.make_integer (value)
replace (l_value, key)
end
replace_with_with_natural (value: NATURAL_64; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
local
l_value: JSON_NUMBER
do
create l_value.make_natural (value)
replace (l_value, key)
end
replace_with_real (value: DOUBLE; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
local
l_value: JSON_NUMBER
do
create l_value.make_real (value)
replace (l_value, key)
end
replace_with_boolean (value: BOOLEAN; key: JSON_STRING)
-- Assuming there is no item of key `key',
-- insert `value' with `key'.
local
l_value: JSON_BOOLEAN
do
create l_value.make_boolean (value)
replace (l_value, key)
end
remove (key: JSON_STRING)
-- Remove item indexed by `key' if any.
do
object.remove (key)
end
wipe_out
-- Reset all items to default values; reset status.
do
object.wipe_out
end
feature -- Access feature -- Access
has_key (key: JSON_STRING): BOOLEAN has_key (key: JSON_STRING): BOOLEAN
@@ -95,7 +220,8 @@ feature -- Access
local local
t: HASH_TABLE [JSON_VALUE, JSON_STRING] t: HASH_TABLE [JSON_VALUE, JSON_STRING]
do do
Result := "{" create Result.make (2)
Result.append_character ('{')
from from
t := map_representation t := map_representation
t.start t.start
@@ -103,7 +229,7 @@ feature -- Access
t.after t.after
loop loop
Result.append (t.key_for_iteration.representation) Result.append (t.key_for_iteration.representation)
Result.append (":") Result.append_character (':')
Result.append (t.item_for_iteration.representation) Result.append (t.item_for_iteration.representation)
t.forth t.forth
if not t.after then if not t.after then
@@ -177,7 +303,7 @@ feature -- Status report
debug_output: STRING debug_output: STRING
-- String that should be displayed in debugger to represent `Current'. -- String that should be displayed in debugger to represent `Current'.
do do
Result := object.count.out Result := count.out + " item(s)"
end end
feature {NONE} -- Implementation feature {NONE} -- Implementation
@@ -186,6 +312,6 @@ feature {NONE} -- Implementation
-- Value container -- Value container
invariant invariant
object_not_null: object /= Void object_not_void: object /= Void
end end

View File

@@ -1,329 +1,425 @@
note note
description: "[ description: "[
A JSON_STRING represent a string in JSON. A JSON_STRING represent a string in JSON.
A string is a collection of zero or more Unicodes characters, wrapped in double A string is a collection of zero or more Unicodes characters, wrapped in double
quotes, using blackslash espaces. quotes, using blackslash espaces.
]" ]"
author: "Javier Velilla" author: "Javier Velilla"
date: "2008/08/24" date: "2008/08/24"
revision: "Revision 0.1" revision: "Revision 0.1"
license:"MIT (see http://www.opensource.org/licenses/mit-license.php)" license:"MIT (see http://www.opensource.org/licenses/mit-license.php)"
class class
JSON_STRING JSON_STRING
inherit inherit
JSON_VALUE JSON_VALUE
redefine redefine
is_equal is_equal
end end
create create
make_json, make_json,
make_json_from_string_32, make_json_from_string_32,
make_with_escaped_json make_with_escaped_json
convert convert
make_json ({READABLE_STRING_8, STRING_8, IMMUTABLE_STRING_8}), make_json ({READABLE_STRING_8, STRING_8, IMMUTABLE_STRING_8}),
make_json_from_string_32 ({READABLE_STRING_32, STRING_32, IMMUTABLE_STRING_32}) make_json_from_string_32 ({READABLE_STRING_32, STRING_32, IMMUTABLE_STRING_32})
feature {NONE} -- Initialization feature {NONE} -- Initialization
make_json (s: READABLE_STRING_8) make_json (s: READABLE_STRING_8)
-- Initialize. -- Initialize.
require require
item_not_void: s /= Void item_not_void: s /= Void
do do
make_with_escaped_json (escaped_json_string (s)) make_with_escaped_json (escaped_json_string (s))
end end
make_json_from_string_32 (s: READABLE_STRING_32) make_json_from_string_32 (s: READABLE_STRING_32)
-- Initialize from STRING_32 `s'. -- Initialize from STRING_32 `s'.
require require
item_not_void: s /= Void item_not_void: s /= Void
do do
make_with_escaped_json (escaped_json_string_32 (s)) make_with_escaped_json (escaped_json_string_32 (s))
end end
make_with_escaped_json (s: READABLE_STRING_8) make_with_escaped_json (s: READABLE_STRING_8)
-- Initialize with an_item already escaped -- Initialize with an_item already escaped
require require
item_not_void: s /= Void item_not_void: s /= Void
do do
item := s item := s
end end
feature -- Access feature -- Access
item: STRING item: STRING
-- Contents with escaped entities if any -- Contents with escaped entities if any
unescaped_string_8: STRING_8 feature -- Conversion
-- Unescaped string from `item'
local unescaped_string_8: STRING_8
s: like item -- Unescaped string from `item'.
i, n: INTEGER --| note: valid only if `item' does not encode any unicode character.
c: CHARACTER local
do s: like item
s := item do
n := s.count s := item
create Result.make (n) create Result.make (s.count)
from i := 1 until i > n loop unescape_to_string_8 (Result)
c := s[i] end
if c = '\' then
if i < n then unescaped_string_32: STRING_32
inspect s[i+1] -- Unescaped string 32 from `item'
when '\' then --| some encoders uses UTF-8 , and not the recommended pure json encoding
Result.append_character ('\') --| thus, let's support the UTF-8 encoding during decoding.
i := i + 2 local
when '%"' then s: READABLE_STRING_8
Result.append_character ('%"') do
i := i + 2 s := item
when 'n' then create Result.make (s.count)
Result.append_character ('%N') unescape_to_string_32 (Result)
i := i + 2 end
when 'r' then
Result.append_character ('%R') representation: STRING
i := i + 2 -- String representation of `item' with escaped entities if any
when 'u' then do
--| Leave unicode \uXXXX unescaped create Result.make (item.count + 2)
Result.append_character ('\') Result.append_character ('%"')
i := i + 1 Result.append (item)
else Result.append_character ('%"')
Result.append_character ('\') end
i := i + 1
end unescape_to_string_8 (a_output: STRING_8)
else -- Unescape string `item' into `a_output'.
Result.append_character ('\') --| note: valid only if `item' does not encode any unicode character.
i := i + 1 local
end s: like item
else i, n: INTEGER
Result.append_character (c) c: CHARACTER
i := i + 1 do
end s := item
end n := s.count
end from i := 1 until i > n loop
c := s[i]
unescaped_string_32: STRING_32 if c = '\' then
-- Unescaped string 32 from `item' if i < n then
local inspect s[i+1]
s: like item when '\' then
i, n: INTEGER a_output.append_character ('\')
c: CHARACTER i := i + 2
hex: STRING when '%"' then
do a_output.append_character ('%"')
s := item i := i + 2
n := s.count when 'b' then
create Result.make (n) a_output.append_character ('%B')
from i := 1 until i > n loop i := i + 2
c := s[i] when 'f' then
if c = '\' then a_output.append_character ('%F')
if i < n then i := i + 2
inspect s[i+1] when 'n' then
when '\' then a_output.append_character ('%N')
Result.append_character ('\') i := i + 2
i := i + 2 when 'r' then
when '%"' then a_output.append_character ('%R')
Result.append_character ('%"') i := i + 2
i := i + 2 when 't' then
when 'n' then a_output.append_character ('%T')
Result.append_character ('%N') i := i + 2
i := i + 2 when 'u' then
when 'r' then --| Leave Unicode \uXXXX unescaped
Result.append_character ('%R') a_output.append_character ('\')
i := i + 2 i := i + 1
when 'u' then else
hex := s.substring (i+2, i+2+4 - 1) a_output.append_character ('\')
if hex.count = 4 then i := i + 1
Result.append_code (hexadecimal_to_natural_32 (hex)) end
end else
i := i + 2 + 4 a_output.append_character ('\')
else i := i + 1
Result.append_character ('\') end
i := i + 1 else
end a_output.append_character (c)
else i := i + 1
Result.append_character ('\') end
i := i + 1 end
end end
else
Result.append_character (c.to_character_32) unescape_to_string_32 (a_output: STRING_32)
i := i + 1 -- Unescape string `item' into `a_output' string 32.
end --| some encoders uses UTF-8 , and not the recommended pure json encoding
end --| thus, let's support the UTF-8 encoding during decoding.
end local
s: READABLE_STRING_8
representation: STRING i, n: INTEGER
-- String representation of `item' with escaped entities if any c: NATURAL_32
do ch: CHARACTER_8
create Result.make (item.count + 2) hex: READABLE_STRING_8
Result.append_character ('%"') do
Result.append (item) s := item
Result.append_character ('%"') n := s.count
end from i := 1 until i > n loop
ch := s.item (i)
feature -- Visitor pattern if ch = '\' then
if i < n then
accept (a_visitor: JSON_VISITOR) inspect s[i+1]
-- Accept `a_visitor'. when '\' then
-- (Call `visit_json_string' procedure on `a_visitor'.) a_output.append_character ('\')
do i := i + 2
a_visitor.visit_json_string (Current) when '%"' then
end a_output.append_character ('%"')
i := i + 2
feature -- Comparison when 'b' then
a_output.append_character ('%B')
is_equal (other: like Current): BOOLEAN i := i + 2
-- Is JSON_STRING made of same character sequence as `other' when 'f' then
-- (possibly with a different capacity)? a_output.append_character ('%F')
do i := i + 2
Result := item.same_string (other.item) when 'n' then
end a_output.append_character ('%N')
i := i + 2
feature -- Change Element when 'r' then
a_output.append_character ('%R')
append (a_string: STRING) i := i + 2
-- Add a_string when 't' then
require a_output.append_character ('%T')
a_string_not_void: a_string /= Void i := i + 2
do when 'u' then
item.append_string (a_string) hex := s.substring (i + 2, i + 5) -- i+2 , i+2+4-1
end if hex.count = 4 then
a_output.append_code (hexadecimal_to_natural_32 (hex))
feature -- Status report end
i := i + 6 -- i +2 +4
hash_code: INTEGER else
-- Hash code value a_output.append_character ('\')
do i := i + 1
Result := item.hash_code end
end else
a_output.append_character ('\')
feature -- Status report i := i + 1
end
debug_output: STRING else
-- String that should be displayed in debugger to represent `Current'. c := ch.natural_32_code
do if c <= 0x7F then
Result := item -- 0xxxxxxx
end check ch = c.to_character_32 end
a_output.append_character (ch)
feature {NONE} -- Implementation elseif c <= 0xDF then
-- 110xxxxx 10xxxxxx
is_hexadecimal (s: READABLE_STRING_8): BOOLEAN i := i + 1
-- Is `s' an hexadecimal value? if i <= n then
do a_output.append_code (
Result := across s as scur all scur.item.is_hexa_digit end ((c & 0x1F) |<< 6) |
end (s.code (i) & 0x3F)
)
hexadecimal_to_natural_32 (s: READABLE_STRING_8): NATURAL_32 end
-- Hexadecimal string `s' converted to NATURAL_32 value elseif c <= 0xEF then
require -- 1110xxxx 10xxxxxx 10xxxxxx
s_not_void: s /= Void i := i + 2
is_hexadecimal: is_hexadecimal (s) if i <= n then
local a_output.append_code (
i, nb: INTEGER ((c & 0xF) |<< 12) |
char: CHARACTER ((s.code (i - 1) & 0x3F) |<< 6) |
do (s.code (i) & 0x3F)
nb := s.count )
end
if nb >= 2 and then s.item (2) = 'x' then elseif c <= 0xF7 then
i := 3 -- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
else i := i + 3
i := 1 if i <= n then
end a_output.append_code (
((c & 0x7) |<< 18) |
from ((s.code (i - 2) & 0x3F) |<< 12) |
until ((s.code (i - 1) & 0x3F) |<< 6) |
i > nb (s.code (i) & 0x3F)
loop )
Result := Result * 16 end
char := s.item (i) end
if char >= '0' and then char <= '9' then i := i + 1
Result := Result + (char |-| '0').to_natural_32 end
else end
Result := Result + (char.lower |-| 'a' + 10).to_natural_32 end
end
i := i + 1 feature -- Visitor pattern
end
end accept (a_visitor: JSON_VISITOR)
-- Accept `a_visitor'.
escaped_json_string (s: READABLE_STRING_8): STRING_8 -- (Call `visit_json_string' procedure on `a_visitor'.)
-- JSON string with '"' and '\' characters escaped do
require a_visitor.visit_json_string (Current)
s_not_void: s /= Void end
local
i, n: INTEGER feature -- Comparison
c: CHARACTER_8
do is_equal (other: like Current): BOOLEAN
n := s.count -- Is JSON_STRING made of same character sequence as `other'
create Result.make (n + n // 10) -- (possibly with a different capacity)?
from i := 1 until i > n loop do
c := s.item (i) Result := item.same_string (other.item)
inspect c end
when '%"' then Result.append_string ("\%"")
when '\' then Result.append_string ("\\") feature -- Change Element
when '%R' then Result.append_string ("\r")
when '%N' then Result.append_string ("\n") append (a_string: STRING)
else -- Add a_string
Result.extend (c) require
end a_string_not_void: a_string /= Void
i := i + 1 do
end item.append_string (a_string)
end end
escaped_json_string_32 (s: READABLE_STRING_32): STRING_8 feature -- Status report
-- JSON string with '"' and '\' characters and unicode escaped
require hash_code: INTEGER
s_not_void: s /= Void -- Hash code value
local do
i, j, n: INTEGER Result := item.hash_code
uc: CHARACTER_32 end
c: CHARACTER_8
h: STRING_8 feature -- Status report
do
n := s.count debug_output: STRING
create Result.make (n + n // 10) -- String that should be displayed in debugger to represent `Current'.
from i := 1 until i > n loop do
uc := s.item (i) Result := item
if uc.is_character_8 then end
c := uc.to_character_8
inspect c feature {NONE} -- Implementation
when '%"' then Result.append_string ("\%"")
when '\' then Result.append_string ("\\") is_hexadecimal (s: READABLE_STRING_8): BOOLEAN
when '%R' then Result.append_string ("\r") -- Is `s' an hexadecimal value?
when '%N' then Result.append_string ("\n") local
else i: INTEGER
Result.extend (c) do
end from
else Result := True
Result.append ("\u") i := 1
h := uc.code.to_hex_string until
-- Remove first 0 and keep 4 hexa digit i > s.count or not Result
from loop
j := 1 Result := s[i].is_hexa_digit
until i := i + 1
h.count = 4 or (j <= h.count and then h.item (j) /= '0') end
loop end
j := j + 1
end hexadecimal_to_natural_32 (s: READABLE_STRING_8): NATURAL_32
h := h.substring (j, h.count) -- Hexadecimal string `s' converted to NATURAL_32 value
require
from s_not_void: s /= Void
until is_hexadecimal: is_hexadecimal (s)
h.count >= 4 local
loop i, nb: INTEGER
h.prepend_integer (0) char: CHARACTER
end do
check h.count = 4 end nb := s.count
Result.append (h)
end if nb >= 2 and then s.item (2) = 'x' then
i := i + 1 i := 3
end else
end i := 1
end
invariant
item_not_void: item /= Void from
until
end i > nb
loop
Result := Result * 16
char := s.item (i)
if char >= '0' and then char <= '9' then
Result := Result + (char |-| '0').to_natural_32
else
Result := Result + (char.lower |-| 'a' + 10).to_natural_32
end
i := i + 1
end
end
escaped_json_string (s: READABLE_STRING_8): STRING_8
-- JSON string with '"' and '\' characters escaped
require
s_not_void: s /= Void
local
i, n: INTEGER
c: CHARACTER_8
do
n := s.count
create Result.make (n + n // 10)
from i := 1 until i > n loop
c := s.item (i)
inspect c
when '%"' then Result.append_string ("\%"")
when '\' then Result.append_string ("\\")
when '%B' then Result.append_string ("\b")
when '%F' then Result.append_string ("\f")
when '%N' then Result.append_string ("\n")
when '%R' then Result.append_string ("\r")
when '%T' then Result.append_string ("\t")
else
Result.extend (c)
end
i := i + 1
end
end
escaped_json_string_32 (s: READABLE_STRING_32): STRING_8
-- JSON string with '"' and '\' characters and Unicode escaped
require
s_not_void: s /= Void
local
i, j, n: INTEGER
uc: CHARACTER_32
c: CHARACTER_8
h: STRING_8
do
n := s.count
create Result.make (n + n // 10)
from i := 1 until i > n loop
uc := s.item (i)
if uc.is_character_8 then
c := uc.to_character_8
inspect c
when '%"' then Result.append_string ("\%"")
when '\' then Result.append_string ("\\")
when '%B' then Result.append_string ("\b")
when '%F' then Result.append_string ("\f")
when '%N' then Result.append_string ("\n")
when '%R' then Result.append_string ("\r")
when '%T' then Result.append_string ("\t")
else
Result.extend (c)
end
else
Result.append ("\u")
h := uc.code.to_hex_string
-- Remove first 0 and keep 4 hexa digit
from
j := 1
until
h.count = 4 or (j <= h.count and then h.item (j) /= '0')
loop
j := j + 1
end
h := h.substring (j, h.count)
from
until
h.count >= 4
loop
h.prepend_integer (0)
end
check h.count = 4 end
Result.append (h)
end
i := i + 1
end
end
invariant
item_not_void: item /= Void
end

View File

@@ -1,118 +1,118 @@
note note
description: "Objects that ..." description: "Objects that ..."
author: "jvelilla" author: "jvelilla"
date: "2008/08/24" date: "2008/08/24"
revision: "0.1" revision: "0.1"
class class
JSON_READER JSON_READER
create create
make make
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_json: STRING) make (a_json: STRING)
-- Initialize Reader -- Initialize Reader
do do
set_representation (a_json) set_representation (a_json)
end end
feature -- Commands feature -- Commands
set_representation (a_json: STRING) set_representation (a_json: STRING)
-- Set `representation'. -- Set `representation'.
do do
a_json.left_adjust a_json.left_adjust
a_json.right_adjust a_json.right_adjust
representation := a_json representation := a_json
index := 1 index := 1
end end
read: CHARACTER read: CHARACTER
-- Read character -- Read character
do do
if not representation.is_empty then if not representation.is_empty then
Result := representation.item (index) Result := representation.item (index)
end end
end end
next next
-- Move to next index -- Move to next index
require require
has_more_elements: has_next has_more_elements: has_next
do do
index := index + 1 index := index + 1
ensure ensure
incremented: old index + 1 = index incremented: old index + 1 = index
end end
previous previous
-- Move to previous index -- Move to previous index
require require
not_is_first: has_previous not_is_first: has_previous
do do
index := index - 1 index := index - 1
ensure ensure
incremented: old index - 1 = index incremented: old index - 1 = index
end end
skip_white_spaces skip_white_spaces
-- Remove white spaces -- Remove white spaces
local local
c: like actual c: like actual
do do
from from
c := actual c := actual
until until
(c /= ' ' and c /= '%N' and c /= '%R' and c /= '%U' and c /= '%T' ) or not has_next (c /= ' ' and c /= '%N' and c /= '%R' and c /= '%U' and c /= '%T' ) or not has_next
loop loop
next next
c := actual c := actual
end end
end end
json_substring (start_index, end_index: INTEGER_32): STRING json_substring (start_index, end_index: INTEGER_32): STRING
-- JSON representation between `start_index' and `end_index' -- JSON representation between `start_index' and `end_index'
do do
Result := representation.substring (start_index, end_index) Result := representation.substring (start_index, end_index)
end end
feature -- Status report feature -- Status report
has_next: BOOLEAN has_next: BOOLEAN
-- Has a next character? -- Has a next character?
do do
Result := index <= representation.count Result := index <= representation.count
end end
has_previous: BOOLEAN has_previous: BOOLEAN
-- Has a previous character? -- Has a previous character?
do do
Result := index >= 1 Result := index >= 1
end end
feature -- Access feature -- Access
representation: STRING representation: STRING
-- Serialized representation of the original JSON string -- Serialized representation of the original JSON string
feature {NONE} -- Implementation feature {NONE} -- Implementation
actual: CHARACTER actual: CHARACTER
-- Current character or '%U' if none -- Current character or '%U' if none
do do
if index > representation.count then if index > representation.count then
Result := '%U' Result := '%U'
else else
Result := representation.item (index) Result := representation.item (index)
end end
end end
index: INTEGER index: INTEGER
-- Actual index -- Actual index
invariant invariant
representation_not_void: representation /= Void representation_not_void: representation /= Void
end end

View File

@@ -1,77 +1,77 @@
note note
description: "" description: ""
author: "jvelilla" author: "jvelilla"
date: "2008/08/24" date: "2008/08/24"
revision: "0.1" revision: "0.1"
class class
JSON_TOKENS JSON_TOKENS
feature -- Access feature -- Access
j_OBJECT_OPEN: CHARACTER = '{' j_OBJECT_OPEN: CHARACTER = '{'
j_ARRAY_OPEN: CHARACTER = '[' j_ARRAY_OPEN: CHARACTER = '['
j_OBJECT_CLOSE: CHARACTER = '}' j_OBJECT_CLOSE: CHARACTER = '}'
j_ARRAY_CLOSE: CHARACTER = ']' j_ARRAY_CLOSE: CHARACTER = ']'
j_STRING: CHARACTER = '"' j_STRING: CHARACTER = '"'
j_PLUS: CHARACTER = '+' j_PLUS: CHARACTER = '+'
j_MINUS: CHARACTER = '-' j_MINUS: CHARACTER = '-'
j_DOT: CHARACTER = '.' j_DOT: CHARACTER = '.'
feature -- Status report feature -- Status report
is_open_token (c: CHARACTER): BOOLEAN is_open_token (c: CHARACTER): BOOLEAN
-- Characters which open a type -- Characters which open a type
do do
inspect c inspect c
when j_OBJECT_OPEN, j_ARRAY_OPEN, j_STRING, j_PLUS, j_MINUS, j_DOT then when j_OBJECT_OPEN, j_ARRAY_OPEN, j_STRING, j_PLUS, j_MINUS, j_DOT then
Result := True Result := True
else else
end end
end end
is_close_token (c: CHARACTER): BOOLEAN is_close_token (c: CHARACTER): BOOLEAN
-- Characters which close a type -- Characters which close a type
do do
inspect c inspect c
when j_OBJECT_CLOSE, j_ARRAY_CLOSE, j_STRING then when j_OBJECT_CLOSE, j_ARRAY_CLOSE, j_STRING then
Result := True Result := True
else else
end end
end end
is_special_character (c: CHARACTER): BOOLEAN is_special_character (c: CHARACTER): BOOLEAN
-- Control Characters -- Control Characters
-- %F Form feed -- %F Form feed
-- %H backslasH -- %H backslasH
-- %N Newline -- %N Newline
-- %R carriage Return -- %R carriage Return
-- %T horizontal Tab -- %T horizontal Tab
-- %B Backspace -- %B Backspace
-- / Solidus -- / Solidus
-- " Quotation -- " Quotation
do do
inspect c inspect c
when '%F', '%H', '%N', '%R', '%T', '%B', '/', '"' then when '%F', '%H', '%N', '%R', '%T', '%B', '/', '"' then
Result := True Result := True
else else
end end
end end
is_special_control (c: CHARACTER): BOOLEAN is_special_control (c: CHARACTER): BOOLEAN
--Control Characters --Control Characters
-- \b\f\n\r\t -- \b\f\n\r\t
do do
inspect c inspect c
when 'b', 'f', 'n', 'r', 't' then when 'b', 'f', 'n', 'r', 't' then
Result := True Result := True
else else
end end
end end
end end

View File

@@ -1,11 +1,11 @@
{"menu": { { "menu": {
"id": "file", "id": "file",
"value": "File", "value": "File",
"popup": { "popup": {
"menuitem": [ "menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"}, {"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"} {"value": "Close", "onclick": "CloseDoc()"}
] ]
} }
}} }}

View File

@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="test_suite" uuid="EA141B17-6A21-4781-8B5F-E9939BAE968A"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="test_suite" uuid="EA141B17-6A21-4781-8B5F-E9939BAE968A">
<target name="test_suite"> <target name="test_suite">
<root cluster="test_suite" class="APPLICATION" feature="make"/> <root cluster="test_suite" class="APPLICATION" feature="make"/>
<file_rule> <file_rule>
<exclude>/EIFGENs$</exclude> <exclude>/EIFGENs$</exclude>
<exclude>/CVS$</exclude> <exclude>/CVS$</exclude>
<exclude>/.svn$</exclude> <exclude>/.svn$</exclude>
</file_rule> </file_rule>
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="standard"> <option warning="true" is_attached_by_default="true" void_safety="all" syntax="standard">
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/> <assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option> </option>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/> <library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
<library name="json" location="..\..\..\library\json-safe.ecf"/> <library name="json" location="..\..\..\library\json-safe.ecf"/>
<library name="testing" location="$ISE_LIBRARY\library\testing\testing-safe.ecf"/> <library name="testing" location="$ISE_LIBRARY\library\testing\testing-safe.ecf"/>
<cluster name="test_suite" location=".\" recursive="true"/> <cluster name="test_suite" location=".\" recursive="true"/>
</target> </target>
</system> </system>

View File

@@ -1,13 +1,13 @@
This project is a community project This project is a community project
## Mailing list ## ## Mailing list ##
- Google group: http://groups.google.com/group/eiffel-web-framework - Google group: [http://groups.google.com/group/eiffel-web-framework](http://groups.google.com/group/eiffel-web-framework)
## Materials ## ## Materials ##
- wiki: github wiki at https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki - wiki: github wiki at [https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki](https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki)
- Shared documents: on google docs at http://goo.gl/M8WLP - Shared documents: on google docs at [http://goo.gl/M8WLP](http://goo.gl/M8WLP)
- source code: git repository at https://github.com/Eiffel-World/Eiffel-Web-Framework - source code: git repository at [https://github.com/Eiffel-World/Eiffel-Web-Framework](https://github.com/Eiffel-World/Eiffel-Web-Framework)
- Proposal from Paul Cohen for a EWSGI spec at http://eiffel.seibostudios.se/wiki/EWSGI - Proposal from Paul Cohen for a EWSGI spec at [http://eiffel.seibostudios.se/wiki/EWSGI](http://eiffel.seibostudios.se/wiki/EWSGI)
## Main contributors ## ## Main contributors ##
- **jfiat**: Jocelyn Fiat (Eiffel Software) - **jfiat**: Jocelyn Fiat (Eiffel Software)

48
doc/wiki/Connectors.md Normal file
View File

@@ -0,0 +1,48 @@
The main goal of the connectors is to let you choose a target at compile time.
This allows you to concentrate on your business during development time and then decide which target you choose at deployment time.
The current connectors are:
* Nino
* FastCGI
* CGI
* OpenShift
The most widely used workflow is to use Nino on your development machine and FastCGI on your production server.
Nino being a web server written entirely in Eiffel, you can inspect your HTTP requests and respones in EiffelStudio which is great during development.
On the other hand, FastCGI is great at handling concurrent requests and coupled with Apache (or another web production server), you don't even need to worry about the lifecyle of your application (creation and destruction) as Apache will do it for you!
Let's now dig into each of the connecters.
# Nino
Nino is a web server entirely written in Eiffel.
The goal of Nino is to provide a simple web server for development (like Java, Python and Ruby provide).
Nino is currently maintained by Javier Velilla and the repository can be found here: https://github.com/jvelilla/EiffelWebNino
# FastCGI
FastCGI is a protocol for interfacing an application server with a web server.
It is an improvement over CGI as FastCGI supports long running processes, i.e. processes than can handle multipe requests during their lifecyle. CGI, on the other hand, launches a new process for every new request which is quite time consuming.
FastCGI is implemented by every major web servers: Apache, IIS, Nginx, ...
We recommend to use FastCGI instead of CGI as it is way more faster.
You can read more about FastCGI here: http://www.fastcgi.com/
# CGI
CGI predates FastCGI and is also a protocol for interfacing an application server with a web server.
His main drawback (and the reason why FastCGI was created) is that it launches a new process for every new request, which is quite time consuming.
We recommend to use FastCGI instead of CGI as it is way more faster.
# OpenShift
OpenShift is a cloud computing platform as a service product from Red Hat.
It basically let's you run your application in the cloud.
More informations are available here: https://www.openshift.com
# Writing your own
It's fairly easy to write your own connector. Just inherit from these classes:
* WGI_CONNECTOR
* WGI_ERROR_STREAM
* WGI_INPUT_STREAM
* WGI_OUTPUT_STREAM
* WSF_SERVICE_LAUNCHER

View File

@@ -0,0 +1 @@
See WSF_ROUTER

209
doc/wiki/Documentation.md Normal file
View File

@@ -0,0 +1,209 @@
# Current Status
* Official repository: <https://github.com/EiffelWebFramework/EWF>
* Official website: <http://eiffelwebframework.github.io/EWF/getting-started/>
# What is EWF?
Eiffel Web Framework, is mainly a collection of Eiffel libraries designed to be integrated with each other. One benefit is that it supports all core HTTP features, so enable you embrace HTTP as an application protocol to develop web applications. So you do not need to adapt your applications to the web, instead you use the web power. It means you can build different kind of web applications, from Web APIs following the Hypermedia API style (REST style), CRUD web services or just conventional web applications building a session on top of an stateless protocol.
# EWF core/kernel
> The Web Server Foundation (WSF\_) is the core of the framework. It is compliant with the EWSGI interface (WGI\_).
To build a web [service](#service), the framework provides a set of core components to launch the service, for each [request](#request-and-response), access the data, and send the [response](#request-and-response).
The framework also provides a router component to help dispatching the incoming request.
A service can be a web api, a web interface, … what ever run on top of HTTP.
<a name="wiki-service"></a>
<a name="service"></a>
# Service
> see interface: **WSF_SERVICE**
Each incoming http request is processed by the following routine.
> `{WSF_SERVICE}.execute (req: WSF_REQUEST; res: WSF_RESPONSE)`
This is the low level of the framework, at this point, `req` provides access to the query and form parameters, input data, headers, ... as specified by the Common Gateway Interface (CGI).
The response `res` is the interface to send data back to the client.
For convenience, the framework provides richer service interface that handles the most common needs (filter, router, ...).
> [Learn more about service](Documentation__Service)
<a name="wiki-request"></a><a name="wiki-response"></a><a name="wiki-request-and-response"></a>
<a name="request"></a><a name="response"></a><a name="request-and-response"></a>
# Request and Response
> see interface: **WSF_REQUEST** and **WSF_RESPONSE**
Any incoming http request is represented by an new object of type **WSF_REQUEST**.
**WSF_REQUEST** provides access to
+ __meta variables__: CGI variables (coming from the request http header)
+ __query parameters__: from the uri ex: `?q=abc&type=pdf`
+ __input data__: the message of the request, if this is a web form, this is parsed to build the form parameters. It can be retrieved once.
+ __form parameters__: standard parameters from the request input data.
- typically available when a web form is sent using POST as content of type `multipart/form-data` or `application/x-www-form-urlencoded`
- (advanced usage: it is possible to write mime handler that can processed other type of content, even custom format.)
+ __uploaded files__: if files are uploaded, their value will be available from the form parameters, and from the uploaded files as well.
+ __cookies variable__: cookies extracted from the http header.
+ __path parameters__: note this is related to the router and carry the semantic of the mapping (see the section on router )
+ __execution variables__: used by the application to keep value associated with the request.
The **WSF_RESPONSE** represents the communication toward the client, a service need to provide correct headers, and content. For instance the `Content-Type`, and `Content-Length`. It also allows to send data with chunked encoding.
> [Learn more about request](Documentation__Request) and [about response](Documentation__Response)
<a name="wiki-connector"></a>
<a name="connector"></a>
# Connectors:
> see **WGI_CONNECTOR**
Using EWF, your service is built on top of underlying httpd solution/connectors.
Currently 3 main connectors are available:
* __CGI__: following the CGI interface, this is an easy solution to run the service on any platform.
* __libFCGI__: based on the libfcgi solution, this can be used with Apache, IIS, nginx, ...
* __nino__: a standalone server: Eiffel Web Nino allow you to embed a web server anywhere, on any platform without any dependencies on other httpd server.
At compilation time, you can use a default connector (by using the associated default lib), but you can also use a mixed of them and choose which one to execute at runtime.
It is fairly easy to add new connector, it just has to follow the EWSGI interface
> [Learn more about connector](Documentation__Connector)
<a name="wiki-router"></a>
<a name="router"></a>
# Router or Request Dispatcher:
> Routes HTTP requests to the proper execution code
A web application needs to have a clean and elegant URL scheme, and EWF provides a router component to design URLs.
The association between a URL pattern and the code handling the URL request is called a Router mapping in EWF.
EWF provides 3 main kinds of mappings
+ __URI__: any URL with path being the specified uri.
- example: “/users/” redirects any “/users/” and “/users/?query=...”
+ __URI-template__: any URL matching the specified URI-template
- example: “/project/{name}/” redirects any “/project/foo” or “/project/bar”
+ __Starts-with__: any URL starting with the specified path
Note: in the future, a Regular-Expression based kind will be added in the future, and it is possible to use custom mapping on top of EWF.
Code:
router.map ( create {WSF_URI_TEMPLATE_MAPPING}.make (
“/project/{name}”, project_handler)
)
-- And precising the request methods
router.map_with_request_methods ( ... , router.methods_GET_POST)
In the previous code, the `project_handler` is an object conforming to **WSF_HANDLER**, that will process the incoming requests matching URI-template “/project/{name}”.
Usually, the service will inherit from WSF_ROUTED_SERVICE, which has a `router` attribute.
Configuring the URL scheme is done by implementing `{WSF_ROUTED_SERVICE}.setup_router`.
To make life easier, by inheriting from WSF_URI_TEMPLATE_HELPER_FOR_ROUTED_SERVICE, a few help methods are available to `map` URI template with agent, and so on.
See
+ `map_uri_template (a_tpl: STRING; h: WSF_URI_TEMPLATE_HANDLER)`
+ `map_uri_template_agent (a_tpl: READABLE_STRING_8; proc: PROCEDURE [ANY, TUPLE [req: WSF_REQUEST; res: WSF_RESPONSE]])`
+ and same with request methods ...
...
Check WSF_\*_HELPER_FOR_ROUTED_SERVICE for other available helper classes.
How we do that in EWF? : Router with (or without context).
Related code: wsf_router, wsf_router_context
Examples
> [Learn more about router](Documentation__Router)
# EWF components
## URI Handler:
> Parses the details of the URI (scheme, path, query info, etc.) and exposes them for use.
How we do that in EWF?: URI Templates, but we could also use regex.
Related code: uri_template
Examples:
## Mime Parser/ Content Negotiation:
> Handles the details of determining the media type, language, encoding, compression (conneg).
How do we do that in EWF? Content_Negotiation library.
Example
## Request Handler
> target of request dispatcher + uri handler.
Here is where we handle GET, POST PUT, etc.
## Representation Mapping
> Converts stored data into the proper representation for responses and handles incoming representations from requests.
We dont have a representation library, the developer need to do that.
If we want to provide different kind of representations: JSON, XML, HTML, the responsibility is let
to the developer to map their domain to the target representation.
## Http Client:
> A simple library to make requests and handle responses from other http servers.
How we do that in EWF? http client library
examples:
## Authentication/Security:
> Handle different auth models. (Basic, Digest?, OAuth, OpenId)
How we do that in EWF? http_authorization, OpenId, and Cypress
examples.
## Caching:
> Support for Caching and conditional request
How we do that in Eiffel? Policy framework on top of EWF. {{{need_review}}}
examples
## EWF HTML5 Widgets
## EWF policy Framework
## EWF application generators
<a name="wiki-EWSGI"></a>
<a name="EWSGI"></a>
# EWSGI Specification
<a name="wiki-libraries"></a>
<a name="libraries"></a>
# Libraries
External libraries are included, such as Cypress OAuth (Security), HTML parsing library, Template Engine Smarty.
## server
* __ewsgi__: Eiffel Web Server Gateway Interface read more
* connectors: various web server connectors for EWSGI
* __libfcgi__: Wrapper for libfcgi SDK
* __wsf__: Web Server Framework [read more]
* __router__: URL dispatching/routing based on uri, uri_template, or custom read more
* __wsf_html__: (html and css) Content generator from the server side.
* CMS example: <https://github.com/EiffelWebFramework/cms/tree/master/example>
## protocol
* __http__: HTTP related classes, constants for status code, content types, ... read more
* __uri_template__: URI Template library (parsing and expander) read more
* __content_negotiation__: CONNEG library (Content-type Negociation) read more
## Client
* __http_client__: simple HTTP client based on cURL readmore
* __Firebase API__: <https://github.com/EiffelWebFramework/Redwood>
## Text
* __encoder__: Various simple encoders: base64, url-encoder, xml entities, html entities read more
## Utils
* __error__: very simple/basic library to handle error
## Security
* __http_authentication__ (under EWF/library/server/authentication)
* __open_id__ (under EWF/library/security)
* __OAuth__ see <https://github.com/EiffelWebFramework/cypress>

View File

@@ -0,0 +1 @@
See WSF_CONNECTOR

View File

@@ -0,0 +1,17 @@
See WSF_REQUEST
## About parameters
Note that by default there is a smart computation for the query/post/... parameters:
for instance
- `q=a&q=b` : will create a **WSF_MULTIPLE_STRING** parameter with name **q** and value `[a,b]`
- `tab[a]=ewf&tab[b]=demo` : will create a **WSF_TABLE** parameter with name **tab** and value `{ "a": "ewf", "b": "demo"}`
- `tab[]=ewf&tab[]=demo` : will create a **WSF_TABLE** parameter with name **tab** and value `{ "1": "ewf", "2": "demo"}`
- `tab[foo]=foo&tab[foo]=bar` : will create a **WSF_TABLE** parameter with name **tab** and value `{ "foo": "bar"}` **WARNING: only the last `tab[foo]` is kept**.
Those rules are applied to query, post, path, .... parameters.
## How to get the input data (i.e entity-body) ?
See `{WSF_REQUEST}.read_input_data_into (buf: STRING)`
## How to get the raw header data (i.e the http header text) ?
See `{WSF_REQUEST}.raw_header_data: detachable READABLE_STRING_32`

View File

@@ -0,0 +1 @@
See WSF_RESPONSE

View File

@@ -0,0 +1 @@
See WSF_ROUTER

View File

@@ -0,0 +1,2 @@
EWF Services
> See WSF\_SERVICE

View File

@@ -4,7 +4,7 @@
## Preface ## Preface
This specification is a proposition based on recent discussion on the mailing list. This specification is a proposition based on recent discussion on the mailing list.
This is work in progress, so far nothing had been decided. This is work in progress, so far nothing had been decided.
You can find another proposal at http://eiffel.seibostudios.se/wiki/EWSGI , it has common background and goal, however still differ on specific parts. You can find another proposal at [http://eiffel.seibostudios.se/wiki/EWSGI](http://eiffel.seibostudios.se/wiki/EWSGI) , it has common background and goal, however still differ on specific parts.
The main goal for now is to unified those 2 specifications. The main goal for now is to unified those 2 specifications.
--- ---
@@ -12,7 +12,7 @@ Note the following is work in progress, and reflect a specification proposal, ra
2011-08-01 2011-08-01
--- ---
For now, the specification from EWF is done in Eiffel interface For now, the specification from EWF is done in Eiffel interface
please see: https://github.com/Eiffel-World/Eiffel-Web-Framework/tree/master/library/server/ewsgi/specification please see: [https://github.com/Eiffel-World/Eiffel-Web-Framework/tree/master/library/server/ewsgi/specification](https://github.com/Eiffel-World/Eiffel-Web-Framework/tree/master/library/server/ewsgi/specification)
WGI_APPLICATION WGI_APPLICATION

View File

@@ -1,5 +1,5 @@
- See proposed specifications: [[EWSGI specification| EWSGI-specification]] - See proposed specifications: [EWSGI specification](./EWSGI-specification)
- See [[Open questions| EWSGI-open-questions]] - See [Open questions](./EWSGI-Open-Questions)
- And below the various proposals and associated decision - And below the various proposals and associated decision
---- ----

27
doc/wiki/Filter.md Normal file
View File

@@ -0,0 +1,27 @@
# Introduction
The basic idea of a filter is to pre-process incoming data and post-process outgoing data.
Filters are part of a filter chain, thus following the [chain of responsability design pattern](http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern).
Each filter decides to call the next filter or not.
# Levels
In EWF, there are two levels of filters.
## WSF_FILTER
Typical examples of such filters are: logging, compression, routing (WSF_ROUTING_FILTER), ...
## WSF_FILTER_HANDLER
Handler that can also play the role of a filter.
Typical examples of such filters are: authentication, ...
# References
Filters (also called middelwares) in other environments:
* in Python: http://www.wsgi.org/en/latest/libraries.html
* in Node.js: http://expressjs.com/guide.html#middleware
* in Apache: http://httpd.apache.org/docs/2.2/en/filter.html

View File

@@ -1,26 +1,26 @@
# Eiffel-Web-Framework # # Eiffel-Web-Framework #
## Location ## ## Location ##
The official documentation/wiki is located at https://github.com/EiffelWebFramework/EWF/wiki , if you are visiting a "clone/fork", please always check the [[official wiki|https://github.com/EiffelWebFramework/EWF/wiki]]. The official documentation/wiki is located at [https://github.com/EiffelWebFramework/EWF/wiki](https://github.com/EiffelWebFramework/EWF/wiki) , if you are visiting a "clone/fork", please always check the [official wiki](https://github.com/EiffelWebFramework/EWF/wiki).
## Organization ## ## Organization ##
- Mailing list: please visit and subscribe to the mailing list page [[http://groups.google.com/group/eiffel-web-framework]] ![logo](http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif) - Mailing list: please visit and subscribe to the mailing list page [http://groups.google.com/group/eiffel-web-framework](http://groups.google.com/group/eiffel-web-framework) ![logo](http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif)
- Most of the topics are discussed on the mailing list (google group). - Most of the topics are discussed on the mailing list (google group).
- For time to time we have [[web meetings|meetings]], and less frequently [[physical meetings|meetings]] that occurs usually during other Eiffel related events. - For time to time we have [web meetings](./wiki/Meetings), and less frequently [physical meetings](./wiki/Meetings) that occurs usually during other Eiffel related events.
## Documentation ## ## Documentation ##
- to redo - [Documentation](./Documentation)
## Contributions ## ## Contributions ##
- You want to contribute or follow the progress/discussion, see the [[collaboration page| Community-collaboration]] - You want to contribute or follow the progress/discussion, see the [collaboration page](./wiki/Community-collaboration)
- Potential tasks/projects on EWF: [[Projects page| Projects]] - Potential tasks/projects on EWF: [Projects page](./wiki/Projects)
## See also ## ## See also ##
- [[list of tasks, and a potential roadmap| Tasks-Roadmap]] - [list of tasks, and a potential roadmap](./wiki/Tasks-Roadmap)
- [[General source structure of this project| Source-structure]] - [General source structure of this project](./wiki/Source-structure)
- EWSGI: [[Eiffel Web Server Gateway Interface| EWSGI]] - EWSGI: [Eiffel Web Server Gateway Interface](./wiki/EWSGI)
- [[Overview of the server side architecture| Spec-Server-Architecture]] - [Overview of the server side architecture](./wiki/Spec-Server-Architecture)
- This project is also a collection of [[Libraries]] related to the Web - This project is also a collection of [Libraries](./wiki/Libraries) related to the Web
## Note ## ## Note ##
- This wiki needs to be updated, in the meantime, please have a look at the presentation: https://docs.google.com/presentation/pub?id=1GPFv6aHhTjFSLMnlAt-J4WeIHSGfHdB42dQxmOVOH8s&start=false&loop=false&delayms=3000 - This wiki needs to be updated, in the meantime, please have a look at the presentation: [https://docs.google.com/presentation/pub?id=1GPFv6aHhTjFSLMnlAt-J4WeIHSGfHdB42dQxmOVOH8s&start=false&loop=false&delayms=3000](https://docs.google.com/presentation/pub?id=1GPFv6aHhTjFSLMnlAt-J4WeIHSGfHdB42dQxmOVOH8s&start=false&loop=false&delayms=3000)

View File

@@ -1,4 +1,4 @@
# Previous and future meetings # Previous and future meetings
* [[Web-meeting: 2012-09-18|Web-meeting-2012-09-18]] * [Web-meeting: 2012-09-18](./Web-meeting-2012-09-18)
* For previous meetings, check the ["meeting" topics](https://groups.google.com/forum/?fromgroups=#!tags/eiffel-web-framework/meeting) on the [forum](http://groups.google.com/group/eiffel-web-framework) * For previous meetings, check the ["meeting" topics](https://groups.google.com/forum/?fromgroups=#!tags/eiffel-web-framework/meeting) on the [forum](http://groups.google.com/group/eiffel-web-framework)

View File

@@ -1,5 +1,5 @@
Use this to suggest new projects, or request features. Use this to suggest new projects, or request features.
The content of this page will be moved to the main [[Projects]] page for time to time. The content of this page will be moved to the main [Projects](./Projects) page for time to time.
For any entry, please use this template For any entry, please use this template
---- ----
@@ -15,6 +15,6 @@ For any entry, please use this template
## Add support for Swagger ## Add support for Swagger
* _Suggested by **Olivier**_ * _Suggested by **Olivier**_
* _Description_: Build a Swagger Eiffel implementation * _Description_: Build a Swagger Eiffel implementation
* _References_: http://swagger.wordnik.com/ * _References_: [http://swagger.wordnik.com/](http://swagger.wordnik.com/)
---- ----

View File

@@ -6,13 +6,13 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
## Evaluate EWF according to the following constraints ... ## Evaluate EWF according to the following constraints ...
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Description_: According to http://www.amundsen.com/blog/archives/1130 , evaluate the current design of EWF to see if this match the different points. An other option would be to take the following REST implementation toolkit as a guide to evaluate EWF http://code.google.com/p/implementing-rest/wiki/RESTImplementationToolkit. * _Description_: According to [http://www.amundsen.com/blog/archives/1130](http://www.amundsen.com/blog/archives/1130) , evaluate the current design of EWF to see if this match the different points. An other option would be to take the following REST implementation toolkit as a guide to evaluate EWF [http://code.google.com/p/implementing-rest/wiki/RESTImplementationToolkit](http://code.google.com/p/implementing-rest/wiki/RESTImplementationToolkit).
## Road to Hypermedia API ## Road to Hypermedia API
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: * _Suitability_:
* _Description_: describe differents types of Web API, and how you can build them using EWF. Describing Pros and Cons. This should be on http://martinfowler.com/articles/richardsonMaturityModel.html * _Description_: describe differents types of Web API, and how you can build them using EWF. Describing Pros and Cons. This should be on [http://martinfowler.com/articles/richardsonMaturityModel.html](http://martinfowler.com/articles/richardsonMaturityModel.html)
## Build a video to demonstrate how an Hypermedia API works, and how to build it using EWF ## Build a video to demonstrate how an Hypermedia API works, and how to build it using EWF
* _Suggested by **Javier**_ * _Suggested by **Javier**_
@@ -55,8 +55,8 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: EWF is relying on the notion of "connector" to achieve portability on various platform and underlying httpd server, currently EWF support any CGI or libFCGI system (i.e apache, IIS, ...), and provide a standalone version thanks to Eiffel Web Nino. The goal now, would be to support specific connector for: * _Description_: EWF is relying on the notion of "connector" to achieve portability on various platform and underlying httpd server, currently EWF support any CGI or libFCGI system (i.e apache, IIS, ...), and provide a standalone version thanks to Eiffel Web Nino. The goal now, would be to support specific connector for:
** LightHTTP (http://www.lighttpd.net/) ** LightHTTP ([http://www.lighttpd.net/](http://www.lighttpd.net/))
** nginx (http://nginx.org/en/) ** nginx ([http://nginx.org/en/](http://nginx.org/en/))
## Concurrenty and EWF ## Concurrenty and EWF
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
@@ -75,7 +75,7 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Provide an implementation of websocket with EWF and eventually Eiffel Web Nino, then demonstrate it on a simple example. WebSocket is a web technology providing for bi-directional, full-duplex communications channels over a single TCP connection. * _Description_: Provide an implementation of websocket with EWF and eventually Eiffel Web Nino, then demonstrate it on a simple example. WebSocket is a web technology providing for bi-directional, full-duplex communications channels over a single TCP connection.
* See http://en.wikipedia.org/wiki/Websocket * See [http://en.wikipedia.org/wiki/Websocket](http://en.wikipedia.org/wiki/Websocket)
---- ----
# Usage of EWF # Usage of EWF
@@ -84,13 +84,13 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Build a HAL browser to discover an API using HAL mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by http://haltalk.herokuapp.com/explorer/hal_browser.html#/. HAL stands for Hypertext Application Language see http://stateless.co/hal_specification.html. * _Description_: Build a HAL browser to discover an API using HAL mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by [http://haltalk.herokuapp.com/explorer/hal_browser.html#/](http://haltalk.herokuapp.com/explorer/hal_browser.html#/). HAL stands for Hypertext Application Language see [http://stateless.co/hal_specification.html](http://stateless.co/hal_specification.html).
## Collection-JSON browser ## Collection-JSON browser
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Build a Collection/JSON browser to discover an API using Collection/JSON mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by http://haltalk.herokuapp.com/explorer/hal_browser.html#/. Collection+JSON is a JSON-based read/write hypermedia-type, see http://www.amundsen.com/media-types/collection/ * _Description_: Build a Collection/JSON browser to discover an API using Collection/JSON mediatype. The browser will be able to follow the links, and display the transmitted data. This could be a vision2 application inspired by [http://haltalk.herokuapp.com/explorer/hal_browser.html#/](http://haltalk.herokuapp.com/explorer/hal_browser.html#/). Collection+JSON is a JSON-based read/write hypermedia-type, see [http://www.amundsen.com/media-types/collection/](http://www.amundsen.com/media-types/collection/)
## Build a simple CMS with EWF ## Build a simple CMS with EWF
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
@@ -119,7 +119,7 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Use XHTML as a media type to for hypermedia API. See http://codeartisan.blogspot.com.ar/2012/07/using-html-as-media-type-for-your-api.html * _Description_: Use XHTML as a media type to for hypermedia API. See [http://codeartisan.blogspot.com.ar/2012/07/using-html-as-media-type-for-your-api.html](http://codeartisan.blogspot.com.ar/2012/07/using-html-as-media-type-for-your-api.html)
## Add support for Mediatype such as RSS, ATOM, ... ## Add support for Mediatype such as RSS, ATOM, ...
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
@@ -155,24 +155,24 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Design and build a Single Sign On implementation for Eiffel. That should include the authentication server, and at least one Eiffel client component (it would be convenient to also provide php, js, ...). In the same spirit, having Eiffel client for popular SSO server would be appreciated as well. * _Description_: Design and build a Single Sign On implementation for Eiffel. That should include the authentication server, and at least one Eiffel client component (it would be convenient to also provide php, js, ...). In the same spirit, having Eiffel client for popular SSO server would be appreciated as well.
* _Reference_: * _Reference_:
- http://en.wikipedia.org/wiki/Single_sign-on - [http://en.wikipedia.org/wiki/Single_sign-on](http://en.wikipedia.org/wiki/Single_sign-on)
- http://en.wikipedia.org/wiki/List_of_single_sign-on_implementations - [http://en.wikipedia.org/wiki/List_of_single_sign-on_implementations](http://en.wikipedia.org/wiki/List_of_single_sign-on_implementations)
## library: Template engine ## library: Template engine
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Get inspired by any existing template engine, and build one for Eiffel, this should be easily usable within a web application. This could be inspired, or implementation of standard template engine, this way people can reuse existing content, or migrate easily their application to EWF. For inspiration, one can look at: * _Description_: Get inspired by any existing template engine, and build one for Eiffel, this should be easily usable within a web application. This could be inspired, or implementation of standard template engine, this way people can reuse existing content, or migrate easily their application to EWF. For inspiration, one can look at:
- http://www.smarty.net/ - [http://www.smarty.net/](http://www.smarty.net/)
- http://mustache.github.com/ - [http://mustache.github.com/](http://mustache.github.com/)
- http://en.wikipedia.org/wiki/Template_engine_(web) ... they are plenty of them, a comparison of the different engine would help. - [http://en.wikipedia.org/wiki/Web_template_system](http://en.wikipedia.org/wiki/Web_template_system) ... they are plenty of them, a comparison of the different engine would help.
* This is not specific to EWF, but it will be very useful in website context. * This is not specific to EWF, but it will be very useful in website context.
## library: Wikitext, markdown parser and render engine ## library: Wikitext, markdown parser and render engine
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: Build component to support (read and write, and why not convert), lightweight markup language (see http://en.wikipedia.org/wiki/Lightweight_markup_language) such as wikitext, markdown, and other. The component should be able to read/scan, but also produce an HTML output. Focus first on wikitext, and markdown since they seems to be the most popular. * _Description_: Build component to support (read and write, and why not convert), lightweight markup language (see [http://en.wikipedia.org/wiki/Lightweight_markup_language](http://en.wikipedia.org/wiki/Lightweight_markup_language)) such as wikitext, markdown, and other. The component should be able to read/scan, but also produce an HTML output. Focus first on wikitext, and markdown since they seems to be the most popular.
* Then , a nice addition would be to render those lightweight markup lang into Vision2 widget (not related to EWF, but could be useful to build (editor) desktop application) * Then , a nice addition would be to render those lightweight markup lang into Vision2 widget (not related to EWF, but could be useful to build (editor) desktop application)
## library: Web component to build HTML5 widget ## library: Web component to build HTML5 widget
@@ -195,16 +195,16 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: TODO * _Description_: TODO
* Generic client that can be customized (see design in slide 12) * Generic client that can be customized (see design in slide 12)
* http://s3.amazonaws.com/cimlabs/Oredev-Hypermedia-APIs.pdf * [http://s3.amazonaws.com/cimlabs/Oredev-Hypermedia-APIs.pdf](http://s3.amazonaws.com/cimlabs/Oredev-Hypermedia-APIs.pdf)
* video http://vimeo.com/20781278 * video [http://vimeo.com/20781278](http://vimeo.com/20781278)
## Create a Client Cache based on Apache commons Client Cache. ## Create a Client Cache based on Apache commons Client Cache.
* _Suggested by **Javier**_ * _Suggested by **Javier**_
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: TODO * _Description_: TODO
* http://hc.apache.org/httpcomponents-client-ga/httpclient-cache/index.html * [http://hc.apache.org/httpcomponents-client-ga/httpclient-cache/index.html](http://hc.apache.org/httpcomponents-client-ga/httpclient-cache/index.html)
* http://labs.xfinity.com/benchmarking-the-httpclient-caching-module * [http://labs.xfinity.com/benchmarking-the-httpclient-caching-module](http://labs.xfinity.com/benchmarking-the-httpclient-caching-module)
## Add SSL support to Eiffel Net ## Add SSL support to Eiffel Net
* _Suggested by **Jocelyn**_ * _Suggested by **Jocelyn**_
@@ -231,9 +231,9 @@ If you are a student, don't hesitate to pick one, or even suggest a new project,
* _Supervisor_: * _Supervisor_:
* _Suitability_: TODO * _Suitability_: TODO
* _Description_: TODO * _Description_: TODO
* See: http://en.wikipedia.org/wiki/Edge_Side_Includes * See: [http://en.wikipedia.org/wiki/Edge_Side_Includes](http://en.wikipedia.org/wiki/Edge_Side_Includes)
---- ----
# Feel free to add new idea below this line # Feel free to add new idea below this line
---- ----
Use the following page [[Projects new suggestions]] to suggest new project, or request a feature. Use the following page [Projects new suggestions](./Projects new suggestions) to suggest new project, or request a feature.

View File

@@ -0,0 +1,9 @@
# Request
The class _WSF_REQUEST_ can be used to access data related to the HTTP request.
**TODO**: describe the request interface
# Response
The class _WSF_RESPONSE_ is the media to send data back to the client.
**TODO**: describe the response interface

3
doc/wiki/Router.md Normal file
View File

@@ -0,0 +1,3 @@
The primary goal of the router (class _WSF_ROUTER_) is to dispatch requests according to the request URI.
**TODO**: describe the router interface

View File

@@ -1,3 +1,4 @@
Check new roadmap wiki page: [roadmap](./roadmap)
## Future ## Future
* Focus on REST API * Focus on REST API
- Hypermedia API - Hypermedia API
@@ -31,5 +32,5 @@
* Installation scripts * Installation scripts
## Contributors ## ## Contributors ##
- See [[the collaboration page|Community-collaboration]] - See [the collaboration page](./Community-collaboration)

View File

@@ -1,14 +1,14 @@
## Eiffel ## Eiffel
* http://www.scoop.it/t/eiffel-resources * [http://www.scoop.it/t/eiffel-resources](http://www.scoop.it/t/eiffel-resources)
* http://www.scoop.it/t/eiffel * [http://www.scoop.it/t/eiffel](http://www.scoop.it/t/eiffel)
## Hypermedia ## Hypermedia
* http://www.scoop.it/t/hyper-media-apis * [http://www.scoop.it/t/hyper-media-apis](http://www.scoop.it/t/hyper-media-apis)
* http://www.scoop.it/t/hypermedia-api * [http://www.scoop.it/t/hypermedia-api](http://www.scoop.it/t/hypermedia-api)
## ETags ## ETags
* http://www.mnot.net/blog/2007/08/07/etags * [http://www.mnot.net/blog/2007/08/07/etags](http://www.mnot.net/blog/2007/08/07/etags)
* http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits * [http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits](http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits)

View File

@@ -1,7 +1,5 @@
# Using the policy driven framework # Using the policy driven framework
**This describes a new facility that is not yet in the EWF release**
## Introduction ## Introduction
The aim of the policy-driven framework is to allow authors of web-servers to concentrate on the business logic (e.g., in the case of a GET request, generating the content), without having to worry about the details of the HTTP protocol (such as headers and response codes). However, there are so many possibilities in the HTTP protocol, that it is impossible to correctly guess what to do in all cases. Therefore the author has to supply policy decisions to the framework, in areas such as caching decisions. These are implemented as a set of deferred classes for which the author needs to provide effective implementations. The aim of the policy-driven framework is to allow authors of web-servers to concentrate on the business logic (e.g., in the case of a GET request, generating the content), without having to worry about the details of the HTTP protocol (such as headers and response codes). However, there are so many possibilities in the HTTP protocol, that it is impossible to correctly guess what to do in all cases. Therefore the author has to supply policy decisions to the framework, in areas such as caching decisions. These are implemented as a set of deferred classes for which the author needs to provide effective implementations.

View File

@@ -8,14 +8,14 @@
## Information ## Information
### When ? ### When ?
* Tuesday 18th of september, 19:00 - 20:00 UTC/GMT time (see 3rd time in http://www.doodle.com/8v2sekiyebp4dpyh) * Tuesday 18th of september, 19:00 - 20:00 UTC/GMT time (see 3rd time in [http://www.doodle.com/8v2sekiyebp4dpyh](http://www.doodle.com/8v2sekiyebp4dpyh))
### Where ? ### Where ?
Web meeting using webex Web meeting using webex
* Short url: http://goo.gl/wBz11 * Short url: [http://goo.gl/wBz11](http://goo.gl/wBz11)
* Long url: https://eiffel.webex.com/eiffel/j.php?ED=211265702&UID=0&PW=NZWNiMjBiZWIz&RT=MiMyMA%3D%3D * Long url: [https://eiffel.webex.com/eiffel/j.php?ED=211265702&UID=0&PW=NZWNiMjBiZWIz&RT=MiMyMA%3D%3D](https://eiffel.webex.com/eiffel/j.php?ED=211265702&UID=0&PW=NZWNiMjBiZWIz&RT=MiMyMA%3D%3D)
* Related Google group topic: https://groups.google.com/d/topic/eiffel-web-framework/A7ADPAT3nj8/discussion * Related Google group topic: [https://groups.google.com/d/topic/eiffel-web-framework/A7ADPAT3nj8/discussion](https://groups.google.com/d/topic/eiffel-web-framework/A7ADPAT3nj8/discussion)
## Agenda ## Agenda

4
doc/wiki/roadmap.md Normal file
View File

@@ -0,0 +1,4 @@
# Upcoming versions
# Current state: oct-2013
- check previous wiki page: [Tasks roadmap](./Tasks roadmap)

View File

@@ -1,3 +1,4 @@
The gewf tool, is an experimentation to generate EWF project from template. The gewf tool, is an experimentation to generate EWF project from template.
status: experimental, POC, in-progress, draft status: experimental, POC, in-progress, draft

View File

@@ -10,6 +10,7 @@
</file_rule> </file_rule>
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="transitional" syntax="standard"> <option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="transitional" syntax="standard">
</option> </option>
<setting name="console_application" value="true"/>
<setting name="executable_name" value="gewf"/> <setting name="executable_name" value="gewf"/>
<setting name="concurrency" value="none"/> <setting name="concurrency" value="none"/>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/> <library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>

View File

@@ -18,6 +18,8 @@ feature {NONE} -- Initialization
args: ARGUMENTS_32 args: ARGUMENTS_32
cfg: detachable READABLE_STRING_32 cfg: detachable READABLE_STRING_32
do do
create setup.make
create args create args
if args.argument_count > 0 then if args.argument_count > 0 then
cfg := args.argument (1) cfg := args.argument (1)
@@ -28,13 +30,11 @@ feature {NONE} -- Initialization
execute execute
end end
feature -- Status setup: GEWF_SETUP
feature -- Access feature -- Access
config (k: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 config (k: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
local
l_keys: LIST [READABLE_STRING_GENERAL]
do do
if attached {JSON_STRING} json_item (json, k) as js then if attached {JSON_STRING} json_item (json, k) as js then
Result := js.unescaped_string_32 Result := js.unescaped_string_32
@@ -95,6 +95,9 @@ feature -- Access
create p.make_parser (s) create p.make_parser (s)
json := p.parse json := p.parse
if attached config ("gewf.template_dir") as d then
setup.set_template_dir_from_string (d)
end
end end
json: detachable JSON_VALUE json: detachable JSON_VALUE
@@ -141,8 +144,7 @@ feature -- Execution
p: PATH p: PATH
appname: detachable READABLE_STRING_GENERAL appname: detachable READABLE_STRING_GENERAL
do do
create p.make_from_string ("template") p := setup.template_dir.extended (tpl)
p := p.extended (tpl)
appname := vals.item ("APPNAME") appname := vals.item ("APPNAME")
if appname = Void then if appname = Void then
appname := "_generated" appname := "_generated"

View File

@@ -0,0 +1,109 @@
note
description: "[
Configuration of GEWF tool.
]"
date: "$Date$"
revision: "$Revision$"
class
GEWF_SETUP
inherit
SHARED_EXECUTION_ENVIRONMENT
create
make
feature -- Initialization
make
do
--| root_dir
get_root_dir
--| template_dir
get_template_dir
end
get_root_dir
local
ut: FILE_UTILITIES
p: detachable PATH
do
--| either $GEWF, or $HOME/.gewf or cwd/.gewf or cwd
if attached execution_environment.item ("GEWF") as s then
create p.make_from_string (s)
elseif attached execution_environment.item ("HOME") as s then
create p.make_from_string (s)
p := p.extended (".gewf")
create ut
if not ut.directory_path_exists (p) then
p := Void
end
end
if p = Void then
p := execution_environment.current_working_path
if ut.directory_path_exists (p.extended (".gewf")) then
p := p.extended (".gewf")
end
end
root_dir := p
end
get_template_dir
do
if attached execution_environment.item ("GEWF_TEMPLATE_DIR") as tpl_dir then
create template_dir.make_from_string (tpl_dir)
else
template_dir := root_dir.extended ("template")
end
end
feature -- Access
root_dir: PATH
template_dir: PATH
feature -- Status report
is_custom_template_dir: BOOLEAN
is_custom_root_dir: BOOLEAN
feature -- Change
set_root_dir (p: PATH)
do
is_custom_root_dir := True
root_dir := p
if not is_custom_template_dir then
-- update template_dir
get_template_dir
end
end
set_template_dir_from_string (dn: READABLE_STRING_GENERAL)
do
set_template_dir (create {PATH} .make_from_string (dn))
end
set_template_dir (p: PATH)
do
is_custom_template_dir := True
template_dir := p
end
;note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end

View File

@@ -1,85 +1,18 @@
note note
description: "Summary description for {APPLICATION_LAUNCHER}." description: "[
author: "" Effective class for APPLICATION_LAUNCHER_I
You can put modification in this class
]"
date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $" date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $"
revision: "$Revision: 36 $" revision: "$Revision: 36 $"
deferred class class
APPLICATION_LAUNCHER APPLICATION_LAUNCHER
feature {NONE} -- Initialization inherit
APPLICATION_LAUNCHER_I
launcher_nature: detachable READABLE_STRING_8 feature -- Custom
-- Initialize the launcher nature
-- either cgi, libfcgi, or nino.
--| We could extend with more connector if needed.
--| and we could use WSF_DEFAULT_SERVICE_LAUNCHER to configure this at compilation time.
local
p: PATH
l_entry_name: READABLE_STRING_32
ext: detachable READABLE_STRING_32
do
create p.make_from_string (execution_environment.arguments.command_name)
if attached p.entry as l_entry then
ext := l_entry.extension
end
if ext /= Void then
if ext.same_string (nature_nino) then
Result := nature_nino
end
if ext.same_string (nature_cgi) then
Result := nature_cgi
end
if ext.same_string (nature_libfcgi) or else ext.same_string ("fcgi") then
Result := nature_libfcgi
end
end
end
feature {NONE} -- nino
nature_nino: STRING = "nino"
launch_nino (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
do
create {WSF_NINO_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts)
end
feature {NONE} -- cgi
nature_cgi: STRING = "cgi"
launch_cgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
do
create {WSF_CGI_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts)
end
feature {NONE} -- libfcgi
nature_libfcgi: STRING = "libfcgi"
launch_libfcgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
do
create {WSF_LIBFCGI_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts)
end
feature {NONE} -- Launcher
launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
nature: like launcher_nature
do
nature := launcher_nature
if nature = Void or else nature = nature_nino then
launch_nino (a_service, opts)
elseif nature = nature_cgi then
launch_cgi (a_service, opts)
elseif nature = nature_libfcgi then
launch_libfcgi (a_service, opts)
else
-- bye bye
(create {EXCEPTIONS}).die (-1)
end
end
end end

View File

@@ -0,0 +1,101 @@
note
description: "[
Specific application launcher
DO NOT EDIT THIS CLASS
you can customize APPLICATION_LAUNCHER
]"
date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $"
revision: "$Revision: 36 $"
deferred class
APPLICATION_LAUNCHER_I
inherit
SHARED_EXECUTION_ENVIRONMENT
feature -- Execution
launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
nature: like launcher_nature
do
nature := launcher_nature
if nature = Void or else nature = nature_nino then
launch_nino (a_service, opts)
elseif nature = nature_cgi then
launch_cgi (a_service, opts)
elseif nature = nature_libfcgi then
launch_libfcgi (a_service, opts)
else
-- bye bye
(create {EXCEPTIONS}).die (-1)
end
end
feature {NONE} -- Access
launcher_nature: detachable READABLE_STRING_8
-- Initialize the launcher nature
-- either cgi, libfcgi, or nino.
--| We could extend with more connector if needed.
--| and we could use WSF_DEFAULT_SERVICE_LAUNCHER to configure this at compilation time.
local
p: PATH
l_entry_name: READABLE_STRING_32
ext: detachable READABLE_STRING_32
do
create p.make_from_string (execution_environment.arguments.command_name)
if attached p.entry as l_entry then
ext := l_entry.extension
end
if ext /= Void then
if ext.same_string (nature_nino) then
Result := nature_nino
end
if ext.same_string (nature_cgi) then
Result := nature_cgi
end
if ext.same_string (nature_libfcgi) or else ext.same_string ("fcgi") then
Result := nature_libfcgi
end
end
end
feature {NONE} -- nino
nature_nino: STRING = "nino"
launch_nino (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
launcher: WSF_NINO_SERVICE_LAUNCHER
do
create launcher.make_and_launch (a_service, opts)
end
feature {NONE} -- cgi
nature_cgi: STRING = "cgi"
launch_cgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
launcher: WSF_CGI_SERVICE_LAUNCHER
do
create launcher.make_and_launch (a_service, opts)
end
feature {NONE} -- libfcgi
nature_libfcgi: STRING = "libfcgi"
launch_libfcgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
launcher: WSF_LIBFCGI_SERVICE_LAUNCHER
do
create launcher.make_and_launch (a_service, opts)
end
end

View File

@@ -1,19 +1,18 @@
note note
description: "Summary description for {APPLICATION}." description: "[
author: "" Effective class for APPLICATION_LAUNCHER_I
You can put modification in this class
]"
date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $" date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $"
revision: "$Revision: 36 $" revision: "$Revision: 36 $"
deferred class class
APPLICATION_LAUNCHER APPLICATION_LAUNCHER
feature {NONE} -- Launcher inherit
APPLICATION_LAUNCHER_I
launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) feature -- Custom
local
launcher: WSF_SERVICE_LAUNCHER
do
create {WSF_DEFAULT_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts)
end
end end

View File

@@ -0,0 +1,25 @@
note
description: "[
Specific application launcher
DO NOT EDIT THIS CLASS
you can customize APPLICATION_LAUNCHER
]"
date: "$Date: 2013-06-12 13:55:42 +0200 (mer., 12 juin 2013) $"
revision: "$Revision: 36 $"
deferred class
APPLICATION_LAUNCHER_I
feature -- Execution
launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
local
launcher: WSF_SERVICE_LAUNCHER
do
create {WSF_DEFAULT_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts)
end
end

View File

@@ -0,0 +1,2 @@
This example demonstrates the use of embedded Vision2 web browser component, and embedded EWF server (using nino).

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="desktop_app" uuid="E015841A-D456-46E1-8A18-E0CEB9E69CD5">
<description>Vision2+web browser widget+embedded web service</description>
<target name="desktop_app">
<description>This example demonstrates how to build a vision2 desktop application that embed a web browser accessing the service of an embedded web service.</description>
<root class="DESKTOP_APP" feature="make_and_launch"/>
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
<assertions precondition="true" postcondition="true" check="true"/>
</option>
<setting name="concurrency" value="thread"/>
<precompile name="vision2-pre" location="$ISE_PRECOMP\vision2-mt-safe.ecf"/>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
<library name="ewsgi" location="..\..\library\server\ewsgi\ewsgi-safe.ecf"/>
<library name="thread" location="$ISE_LIBRARY\library\thread\thread-safe.ecf"/>
<library name="vision2" location="$ISE_LIBRARY\library\vision2\vision2-safe.ecf"/>
<library name="web_browser" location="$ISE_LIBRARY\library\web_browser\web_browser-safe.ecf" readonly="false"/>
<library name="wsf" location="..\..\library\server\wsf\wsf-safe.ecf"/>
<library name="wsf_nino" location="..\..\library\server\wsf\connector\nino-safe.ecf"/>
<library name="wsf_nino_connector" location="..\..\library\server\ewsgi\connectors\nino\nino-safe.ecf"/>
<cluster name="src" location=".\src" recursive="true">
<file_rule>
<exclude>/EIFGENs$</exclude>
<exclude>/CVS$</exclude>
<exclude>/.svn$</exclude>
</file_rule>
</cluster>
</target>
</system>

View File

@@ -0,0 +1 @@
Test

View File

@@ -0,0 +1,32 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","http://localhost:52367/test/ajax.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h1>This is a local file test with js</h1><li><a href="http://localhost:52367/">back to home</a></li><div id="myDiv"><h2>Let AJAX change this text</h2>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</div>
</body></html>

View File

@@ -0,0 +1,230 @@
note
description: "Summary description for {APP_EMBEDDED_WEB_SERVICE}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
APP_EMBEDDED_WEB_SERVICE
inherit
EMBEDDED_WEB_SERVICE
redefine
make
end
create
make
feature {NONE} -- Initialization
make
do
Precursor
create request_exit_operation_actions
local_connection_restriction_enabled := True
end
feature -- Execution
request_exit_operation_actions: ACTION_SEQUENCE [TUPLE]
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the request
-- See `req.input' for input stream
-- `req.meta_variables' for the CGI meta variable
-- and `res' for output buffer
local
router: WSF_ROUTER
sess: detachable WSF_ROUTER_SESSION
m: WSF_HTML_PAGE_RESPONSE
b: STRING
fs: WSF_FILE_SYSTEM_HANDLER
do
create router.make (3)
router.handle ("/test/{var}", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_test))
router.handle ("/env", create {WSF_URI_AGENT_HANDLER}.make (agent handle_env))
router.handle ("/exit", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_exit))
create fs.make_with_path ((create {EXECUTION_ENVIRONMENT}).current_working_path.extended ("files"))
router.handle ("/files", fs)
create sess
router.dispatch (req, res, sess)
if not sess.dispatched then
create m.make
create b.make_from_string ("<h1>Hello Eiffel desktop user</h1>")
b.append ("<li><a href=%"" + req.script_url ("/test/start") + "%">test</a></li>")
b.append ("<li><a href=%"" + req.script_url ("/env") + "%">env</a></li>")
b.append ("<li><a href=%"" + req.script_url ("/files") + "%">files</a></li>")
b.append ("<li><a href=%"" + req.script_url ("/exit") + "%">exit</a></li>")
m.set_body (b)
res.send (m)
end
end
handle_test (req: WSF_REQUEST; res: WSF_RESPONSE)
local
m: WSF_HTML_PAGE_RESPONSE
b: STRING
l_name: READABLE_STRING_32
do
if attached {WSF_STRING} req.item ("var") as p_name then
l_name := p_name.value
else
l_name := {STRING_32} "Embedded web service and web_browser in vision2 application"
end
create m.make
create b.make_from_string ("<h1>This is a test about "+ m.html_encoded_string (l_name) +"</h1>")
b.append ("<li><a href=%"" + req.script_url ("/") + "%">back to home</a></li>")
if l_name.is_case_insensitive_equal_general ("start") then
b.append ("<li><a href=%"" + req.script_url ("/test/js") + "%">test javascript+ajax</a></li>")
elseif l_name.is_case_insensitive_equal_general ("js") then
b.append ("[
<div id="myDiv"><h2>Let AJAX change this text</h2>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</div>
]")
m.add_javascript_content ("[
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/test/ajax.txt",true);
xmlhttp.send();
}
]")
elseif l_name.is_case_insensitive_equal_general ("ajax.txt") then
b := "This is AJAX response ... from " + req.absolute_script_url ("")
end
m.set_body (b)
res.send (m)
end
handle_env (req: WSF_REQUEST; res: WSF_RESPONSE)
local
s: STRING_8
p: WSF_PAGE_RESPONSE
v: STRING_8
do
create s.make (2048)
s.append ("**DEBUG**%N")
req.set_raw_input_data_recorded (True)
append_iterable_to ("Meta variables:", req.meta_variables, s)
s.append_character ('%N')
append_iterable_to ("Path parameters", req.path_parameters, s)
s.append_character ('%N')
append_iterable_to ("Query parameters", req.query_parameters, s)
s.append_character ('%N')
append_iterable_to ("Form parameters", req.form_parameters, s)
s.append_character ('%N')
if attached req.content_type as l_type then
s.append ("Content: type=" + l_type.debug_output)
s.append (" length=")
s.append_natural_64 (req.content_length_value)
s.append_character ('%N')
create v.make (req.content_length_value.to_integer_32)
req.read_input_data_into (v)
across
v.split ('%N') as v_cursor
loop
s.append (" |")
s.append (v_cursor.item)
s.append_character ('%N')
end
end
create p.make_with_body (s)
p.header.put_content_type_text_plain
res.send (p)
end
handle_exit (req: WSF_REQUEST; res: WSF_RESPONSE)
local
m: WSF_HTML_PAGE_RESPONSE
b: STRING
do
create m.make
create b.make_from_string ("<h1>Embedded server is about to shutdown</h1>")
b.append ("<li><a href=%"" + req.script_url ("/") + "%">back to home</a></li>")
m.set_body (b)
res.send (m)
if attached {WGI_NINO_CONNECTOR} req.wgi_connector as nino then
nino.server.shutdown_server
end
request_exit_operation_actions.call (Void)
end
feature {NONE} -- Implementation
append_iterable_to (a_title: READABLE_STRING_8; it: detachable ITERABLE [WSF_VALUE]; s: STRING_8)
local
n: INTEGER
t: READABLE_STRING_8
v: READABLE_STRING_8
do
s.append (a_title)
s.append_character (':')
if it /= Void then
across it as c loop
n := n + 1
end
if n = 0 then
s.append (" empty")
s.append_character ('%N')
else
s.append_character ('%N')
across
it as c
loop
s.append (" - ")
s.append (c.item.url_encoded_name)
t := c.item.generating_type
if t.same_string ("WSF_STRING") then
else
s.append_character (' ')
s.append_character ('{')
s.append (t)
s.append_character ('}')
end
s.append_character ('=')
v := c.item.string_representation.as_string_8
if v.has ('%N') then
s.append_character ('%N')
across
v.split ('%N') as v_cursor
loop
s.append (" |")
s.append (v_cursor.item)
s.append_character ('%N')
end
else
s.append (v)
s.append_character ('%N')
end
end
end
else
s.append (" none")
s.append_character ('%N')
end
end
end

View File

@@ -0,0 +1,71 @@
note
description: "Objects that represent the Vision2 application.%
%The original version of this class has been generated by EiffelBuild."
generator: "EiffelBuild"
legal: "See notice at end of class."
status: "See notice at end of class."
date: "$Date: 2012-09-29 01:29:13 +0200 (sam., 29 sept. 2012) $"
revision: "$Revision: 89488 $"
class
DESKTOP_APP
inherit
EV_APPLICATION
create
make_and_launch
feature {NONE} -- Initialization
make_and_launch
-- Create `Current', build and display `main_window',
-- then launch the application.
local
l_win: like main_window
l_embeded_services: APP_EMBEDDED_WEB_SERVICE
do
default_create
create l_win.make
main_window := l_win
l_win.show
create l_embeded_services.make
l_embeded_services.set_port_number (0) -- Use first available port number
l_embeded_services.on_launched_actions.force (agent on_web_service_launched (l_win))
l_embeded_services.request_exit_operation_actions.force (agent on_quit)
l_embeded_services.launch
launch
end
on_quit
do
if attached main_window as win then
win.destroy_and_exit_if_last
end
end
on_web_service_launched (a_win: attached like main_window)
do
add_idle_action_kamikaze (agent a_win.open_link)
end
feature {NONE} -- Implementation
main_window: detachable MAIN_WINDOW
-- Main window of `Current'
;note
copyright: "Copyright (c) 1984-2009, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
356 Storke Road, Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end

View File

@@ -0,0 +1,202 @@
note
description: "Objects that represent an EV_TITLED_WINDOW.%
%The original version of this class was generated by EiffelBuild."
generator: "EiffelBuild"
legal: "See notice at end of class."
status: "See notice at end of class."
date: "$Date: 2010-08-17 10:49:12 +0200 (mar., 17 août 2010) $"
revision: "$Revision: 84189 $"
class
MAIN_WINDOW
inherit
EV_TITLED_WINDOW
redefine
create_interface_objects, initialize, is_in_default_state
end
SHARED_EMBEDED_WEB_SERVICE_INFORMATION
undefine
default_create, copy
end
create
make
feature {NONE} -- Initialization
make
-- Creation method
do
default_create
end
initialize
-- Initialize `Current'.
do
Precursor {EV_TITLED_WINDOW}
set_title ("Desktop Application (demo embedded EWF+browser)")
-- Connect events.
-- Close the application when an interface close
-- request is received on `Current'. i.e. the cross is clicked.
close_request_actions.extend (agent destroy_and_exit_if_last)
-- Call `user_initialization'.
user_initialization
end
create_interface_objects
-- Create objects
do
create home_button.make_with_text ("Home")
create back_button.make_with_text ("Back")
create forth_button.make_with_text ("Forth")
create refresh_button.make_with_text ("Refresh")
create stop_button.make_with_text ("Stop")
create url_text_field.make_with_text ("http://localhost:" + port_number.out)
create go_button.make_with_text ("Go")
create web_browser
end
user_initialization
-- Called by `initialize'.
-- Any custom user initialization that
-- could not be performed in `initialize',
-- (due to regeneration of implementation class)
-- can be added here.
local
l_browser_box: EV_VERTICAL_BOX
l_server_box: EV_VERTICAL_BOX
l_hor_box: EV_HORIZONTAL_BOX
vb: EV_VERTICAL_BOX
do
set_size (800, 600)
create vb
extend (vb)
vb.set_border_width (3)
vb.set_padding_width (3)
-- browser part
create l_browser_box
create l_hor_box
l_browser_box.extend (l_hor_box)
l_browser_box.disable_item_expand (l_hor_box)
home_button.select_actions.force_extend (agent on_home_button_action)
l_hor_box.extend (home_button)
l_hor_box.disable_item_expand (home_button)
back_button.select_actions.force_extend (agent on_back_button_action)
l_hor_box.extend (back_button)
l_hor_box.disable_item_expand (back_button)
forth_button.select_actions.force_extend (agent on_forth_button_action)
l_hor_box.extend (forth_button)
l_hor_box.disable_item_expand (forth_button)
refresh_button.select_actions.force_extend (agent on_refresh_button_action)
l_hor_box.extend (refresh_button)
l_hor_box.disable_item_expand (refresh_button)
stop_button.select_actions.force_extend (agent on_stop_button_action)
l_hor_box.extend (stop_button)
l_hor_box.disable_item_expand (stop_button)
l_hor_box.extend (url_text_field)
go_button.select_actions.force_extend (agent on_go_button_action)
l_hor_box.extend (go_button)
l_hor_box.disable_item_expand (go_button)
l_browser_box.extend (web_browser)
--------------------
vb.extend (l_browser_box)
end
is_in_default_state: BOOLEAN
do
Result := True
end
feature -- Basic operation
open_link
do
url_text_field.set_text ("http://localhost:" + port_number.out)
on_go_button_action
end
feature {NONE} -- Implementation
home_button, go_button, back_button, forth_button, stop_button, refresh_button: EV_BUTTON
-- Buttons
url_text_field: EV_TEXT_FIELD
-- URL text field
on_go_button_action
-- Action for `go_button'
local
l_uri: STRING_32
do
l_uri := url_text_field.text
if l_uri /= Void and then not l_uri.is_empty then
web_browser.load_uri (l_uri)
else
on_home_button_action
end
end
on_home_button_action
-- Action for `home_button'
do
web_browser.load_uri ("http://localhost:" + port_number.out)
end
on_back_button_action
-- Action for `back_button'
do
web_browser.back
end
on_forth_button_action
-- Action for `forth_button'
do
web_browser.forth
end
on_refresh_button_action
-- Action for `refresh_button'
do
web_browser.refresh
end
on_stop_button_action
-- Action for `stop_button'
do
web_browser.stop
end
web_browser: EV_WEB_BROWSER
-- Web browser widget
;note
copyright: "Copyright (c) 1984-2009, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
356 Storke Road, Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end

View File

@@ -0,0 +1,114 @@
note
description: "Summary description for {EMBEDDED_WEB_SERVICE}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
EMBEDDED_WEB_SERVICE
inherit
THREAD
rename
make as make_thread,
execute as execute_thread
end
WSF_SERVICE
rename
execute as execute_embedded
end
SHARED_EMBEDED_WEB_SERVICE_INFORMATION
feature -- Initialization
make
do
make_thread
create on_launched_actions
end
feature {NONE} -- Execution
execute_embedded (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the request
-- See `req.input' for input stream
-- `req.meta_variables' for the CGI meta variable
-- and `res' for output buffer
local
filter: WSF_AGENT_FILTER
m: WSF_PAGE_RESPONSE
do
if local_connection_restriction_enabled then
if
attached req.remote_addr as l_remote_addr and then
l_remote_addr.is_case_insensitive_equal_general ("127.0.0.1")
then
execute (req, res)
else
create m.make_with_body ("Only local connection is allowed")
m.set_status_code (403) -- Forbidden
res.send (m)
end
else
execute (req, res)
end
end
execute_thread
local
nino: WSF_NINO_SERVICE_LAUNCHER
opts: WSF_SERVICE_LAUNCHER_OPTIONS
do
create opts.default_create
opts.set_verbose (True)
opts.set_option ("port", port_number)
create nino.make (Current, opts)
nino.on_launched_actions.force (agent on_launched)
nino.launch
end
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the request
-- See `req.input' for input stream
-- `req.meta_variables' for the CGI meta variable
-- and `res' for output buffer
deferred
end
on_launched (conn: WGI_CONNECTOR)
do
if attached {WGI_NINO_CONNECTOR} conn as nino then
set_port_number (nino.port)
end
on_launched_actions.call (Void)
end
feature -- Control
wait
-- Wait for server to be terminated.
do
join
end
feature -- Access
on_launched_actions: ACTION_SEQUENCE [TUPLE]
feature -- Status report
local_connection_restriction_enabled: BOOLEAN
-- Accept only local connection?
--| based on 127.0.0.1 IP
--| TO IMPROVE
feature -- Change
set_local_connection_restriction_enabled (b: BOOLEAN)
do
local_connection_restriction_enabled := b
end
end

View File

@@ -0,0 +1,27 @@
note
description: "Summary description for {SHARED_EMBEDED_WEB_SERVICE_INFORMATION}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
SHARED_EMBEDED_WEB_SERVICE_INFORMATION
feature -- Access
port_number: INTEGER
do
Result := port_number_cell.item
end
set_port_number (a_port: like port_number)
do
port_number_cell.replace (a_port)
end
port_number_cell: CELL [INTEGER]
once ("process")
create Result.put (0)
end
end

Some files were not shown because too many files have changed in this diff Show More