test/fixture/TEST_LICENSE.txt in code_zauker-0.0.2 vs test/fixture/TEST_LICENSE.txt in code_zauker-0.0.3

- old
+ new

@@ -26,975 +26,5 @@ transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] - - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007#+STARTUP: showall -#+STYLE: <link rel="stylesheet" href="tutorial.css" /> -#+TITLE: Introduction to Nitrogen - -* Welcome -#+HTML: <div style="text-align:center; font-size: 400%; line-height: 1em;"> -#+HTML: <br> -#+HTML: Introduction to Nitrogen -#+HTML: <hr> -#+HTML: </div> -#+HTML: <div style="text-align:center; font-size: 100%; line-height: 1.5em;"> -#+HTML: A step-by-step introduction to the<br> -#+HTML: major features and concepts behind<br> -#+HTML: the Nitrogen Web Framework. -#+HTML: </div> - -* Main Agenda Slide -** Agenda - + Part 1: Install & Run Nitrogen - + Part 2: Nitrogen Pages - + Part 3: Nitrogen Elements - + Part 4: Nitrogen Actions - + Part 5: Nitrogen Postback Events - + Part 6: Session and Page State - + Part 7: Security - + Part 8: Validation - + Part 9: Comet - + Part 10: Extending Nitrogen - + Conclusion - -* PART 1 AGENDA -** Install & Run Nitrogen - - + Install Nitrogen - + Run the Website - + A Tour Through the Files - -* Install Nitrogen -** Install Nitrogen - -*** If you *don't* have Erlang Installed: - -[[http://nitrogenproject.com/downloads][Download Nitrogen]], unzip and =cd nitrogen=. - -*** If you *do* have Erlang installed: - -Pull the [[http://github.com/nitrogen/nitrogen][Nitrogen Source Code]], then =make rel_inets; cd rel/nitrogen=. - -* Start the Website in Console Mode -** Install & Run Nitrogen -*** Start Up - : bin/nitrogen console - : open http://localhost:8000 - -* Stop the Website -** Install & Run Nitrogen -*** Shut Down - /Press Control-C twice./ - -*** View the Directory - : ls -l - -* Anatomy of a Nitrogen Project -** Install & Run Nitrogen -*** Anatomy of a Nitrogen Project - + BuildInfo.txt :: From =uname=. - + Makefile :: Used by =make=. - + bin/ :: Commands to start and stop system, plus developer tools. - + etc/ :: Configuration settings. - + site/ :: Contains the website files, templates, and Erlang modules. - + log/ :: The logs. - + doc/ :: Contains Nitrogen documentation. - + erts-5.7.5/ :: Embedded Erlang. - + releases/ :: Tells Erlang how to start the system. - + lib/ :: Dependent libraries. - -* Anatomy of the site/ Directory -** Install & Run Nitrogen -*** The =site/= Directory - The site directory should go under source control, it contains all - of the information necessary to run the website. - - + Emakefile :: Used by make.erl to compile the system. - + ebin/ :: Compiled Erlang modules. - + include/ :: Include files for your website. - + src/ :: Erlang source files for your website. - + static/ :: Static files for your website. - + templates/ :: Template files for your website. - -* Anatomy of the site/src Directory -** Install & Run Nitrogen -*** The =site/src/= Directory - Stores the Erlang source files for your application. By default it - contains: - - + nitrogen\_init.erl :: Runs once on Nitrogen startup. - + nitrogen\_PLATFORM.erl :: Holds the request loop depending on - platform. - + index.erl :: The default web page. - + elements/ :: By convention, custom alements are placed here. - + actions/ :: By convention, custom actions are placed here. - -* Exercise: Modify a Nitrogen Page -** Install & Run Nitrogen -*** Exercise: Modify Your First Page - + Open =site/src/index.erl= - + Change "Welcome to Nitrogen" to "Welcome to My Website" - + From the Erlang Shell, run: - : sync:go() - + Reload the page - -* Exercise: Compile in Different Ways -** Install & Run Nitrogen -*** Exercise: Compile in a Different Way - + Change to "Welcome to my ERL-TASTIC WEBSITE!" (or, you know, whatever) - + From a different terminal, run: - : bin/dev compile - + Reload the page - -* Exercise: Debugging -** Install & Run Nitrogen -*** Debug Statements - + Add =?DEBUG= to =index.erl=. Then compile and - reload. What happens? - + Add =?PRINT(node())= to =index.erl=. Then compile and reload. What - happens? - -* Emacs Mode -** Install & Run Nitrogen -*** Emacs =nitrogen-mode= - #+BEGIN_SRC lisp - (add-to-list 'load-path "PATH/TO/NITROGEN/support/nitrogen-mode") - (require 'nitrogen-mode) - #+END_SRC - - Without =nitrogen-mode=: - #+BEGIN_SRC erlang - #panel { id=my_panel, body=[ - #panel { id=my_panel2, body=[ - #label { text="Name" }, - #textbox { id=my_textbox } - ]} - ]} - #+END_SRC - - With =nitrogen-mode=: - #+BEGIN_SRC erlang - M-x nitrogen-mode - #panel { id=my_panel, body=[ - #panel { id=my_panel2, body=[ - #label { text="Name" }, - #textbox { id=my_textbox } - ]} - ]} - #+END_SRC - -* PART 2 AGENDA -** Nitrogen Pages - + What is a Nitrogen Page? - + Dynamic Routing Explained - + Creating Your First Page - + How is a Page Rendered? - + Anatomy of a Template - + Experimenting With Templates - -* What is a Nitrogen Page? -** Nitrogen Pages -*** What is a Nitrogen Page - + A Page is an Erlang Module - + Each page should accomplish one store or piece of - functionality. - - Some examples: - + Allow the user to log in (=user_login.erl=). - + Change the user's preferences. (=user_preferences.erl=) - + Display a list of items. (=items_view.erl=) - + Allow the user to edit an item. (=items_edit.erl=) - -* Dynamic Routes Explained -** Nitrogen Pages -*** Dynamic Routing Explained - Dynamic routing rules: - 1. If there is an extension, assume a static file. - : http://localhost:8000/routes/to/a/module - : http://localhost:8000/routes/to/a/static/file.html - 2. Root page maps to =index.erl= - 3. Replaces slashes with underscores. - : http://localhost:8000/routes/to/a/module -> - : routes_to_a_module.erl - 4. Try the longest matching module. - : http://localhost:8000/routes/to/a/module/foo/bar -> - : routes_to_a_module.erl - 5. Modules that aren't found go to =web\_404.erl= if it exists. - 6. Static files that aren't found are handled by the underlying - platform (not yet generalized.) - -* Creating a New Page -** Nitrogen Pages -*** Exercise: Create a New Page - + Generate the Page - : bin/dev page my\_page - : $EDIT site/src/my\_page.erl - - + Replace the default body with: - #+BEGIN_SRC erlang - body() -> "Hello World!". - #+END_SRC - - + Remove the =event/1= function. - - + Compile the page and load =http://localhost:8080/my/page= - -* How is a Page Rendered (Simple Version) -** Nitrogen Pages -*** How is a Page Rendered? - 1. User hits a URL. - 2. URL is mapped to a module. - 3. Nitrogen framework calls =module:main()= - 4. =module:main()= calls a =#template= - 5. =#template= calls back into the page (or other modules) - 6. Nitrogen framework renders the output into HTML/Javascript. - (This is the simple version. Complex version will come later.) - -* Anatomy of a Template -** Nitrogen Pages -*** Anatomy of a Template - + HTML. The Page is slurped into the Template. - + Contains one or more callouts, ie: - : [[[module:body()]]] - + Contains a script callout for Javascript: - : [[[script]]] - + The callouts look like Erlang, but they are not. They can only be - of the form =module:function(Args)=. The 'page' module refers to - the current page. - -* Experimenting With Templates -** Nitrogen Pages -*** Experimenting With Templates - + Change the callout from =page:body()= to =page:body1()= in the - default template and reload the page. What happens? - - + Create another callout. What happens? - - + What happens when you change =page= to be a specific module? - - + Replace the module call with some arbitrary Erlang code. What happens? - -* PART 3 AGENDA -** Nitrogen Elements - + What is a Nitrogen Element? - + Add Elements to Your Page - + Nested Elements - + Documentation - + Anatomy of a Nitrogen Element - -* What is a Nitrogen Element? -** Nitrogen Elements -*** What is a Nitrogen Element? - An element can be either HTML, or some record that renders into - HTML. - - Change this: - #+BEGIN_SRC erlang - body() -> "Hello World!". - #+END_SRC - - To this: - #+BEGIN_SRC erlang - body() -> #label { text="Hello World!" }. - #+END_SRC - -* What is a Nitrogen Element? -** Nitrogen Elements -*** What is a Nitrogen Element? - The =#label{}= element is rendered into: - - #+BEGIN_SRC html - <label class="wfid_tempNNNNN label">Hello World!</label> - #+END_SRC - - View the rendered page source in your browser and search for "Hello World". - -* Nitrogen Element Properties -** Nitrogen Elements -*** Why Nitrogen Elements? - - Nitrogen elements serve two purposes: - - 1. Allow you to generate HTML within Erlang: - + Avoid mixing languages == clearer code. - + Fewer characters to type. - + Checked at compile time. - - 2. Abstraction layer: - + Avoid repeating common functionality. - + Hide complexity in a module. - -* Nitrogen Element Examples -** Nitrogen Elements -*** Nitrogen Element Examples - - Try this on my\_page.erl: - #+BEGIN_SRC erlang - body() -> [ - #h1 { text="My Simple Application" }, - #label { text="What is your name?" }, - #textbox { }, - #button { text="Submit" } - ]. - #+END_SRC - - Then compile, reload, and view source. - -* Nested Elements -** Nitrogen Elements -*** Nested Elements - - Try a nested element: - - #+BEGIN_SRC erlang - body() -> - #panel { style="margin: 50px;", body=[ - #h1 { text="My Page" }, - #label { text="Enter Your Name:" }, - #textbox { }, - #button { text="Submit" } - ]}. - #+END_SRC - -* PART 4 AGENDA -** Nitrogen Actions - + What is a Nitrogen Action? - + Wiring an Action - + Conditional Actions with =#event{}= - + Postbacks - -* What is a Nitrogen Action? -** Nitrogen Actions -*** What is a Nitrogen Action? - An action can either be Javascript, or some record that renders - into Javascript. - - Add a Javascript alert to the =#button{}= element. Then recompile - and run. What do you expect will happen? - - #+BEGIN_SRC erlang - body() -> - [ - #button { text="Submit", actions="alert('hello');" } - ]. - #+END_SRC - -* What is a Nitrogen Action? -** Nitrogen Actions -*** What is a Nitrogen Action? - Do the same thing a different way. - - #+BEGIN_SRC erlang - body() -> - [ - #button { - text="Submit", - actions=#alert { text="Hello" } - } - ]. - #+END_SRC - -* Wiring an Action -** Nitrogen Actions -*** Wiring an Action - - Setting the =actions= property of an element can lead to messy - code. Another, cleaner way to wire an action is the =wf:wire/N= - function. - - #+BEGIN_SRC erlang - body() -> - wf:wire(mybutton, #effect { effect=pulsate }), - [ - #button { id=mybutton, text="Submit" } - ]. - #+END_SRC - -* Conditional Actions with =#event{}= -** Nitrogen Actions -*** Conditional Actions with =#event{}= - - Put the =#effect{}= action inside of an =#event{}= action. This - causes the effect to *only* get fired if the user clicks on - =mybutton=. - - #+BEGIN_SRC erlang - body() -> - wf:wire(mybutton, #event { - type=click, - actions=#effect { effect=pulsate } - }), - [ - #button { id=mybutton, text="Submit" } - ]. - #+END_SRC - -* Triggers and Targets -** Nitrogen Actions -*** Triggers and Targets - - All actions have a =target= property. The =target= specifies what - element(s) the action effects. - - The event action also has a =trigger= property. The =trigger= - specifies what element(s) trigger the action. - - Try this: - - #+BEGIN_SRC erlang - body() -> - wf:wire(#event { - type=click, trigger=mybutton, target=mylabel, - actions=#effect { effect=pulsate } - }), - [ - #label { id=mylabel, text="Make Me Blink!" }, - #button { id=mybutton, text="Submit" } - ]. - #+END_SRC - -* Triggers and Targets -** Nitrogen Actions -*** Triggers and Targets - - You can also specify the *Trigger* and *Target* directly in =wf:wire/N=. It takes three forms: - - #+BEGIN_SRC erlang - % Specify a trigger and target. - wf:wire(Trigger, Target, Actions) - - % Use the same element for both trigger and target. - wf:wire(TriggerAndTarget, Actions) - - % Assume the trigger and/or target is provided in the actions. - % If not, then wire the action directly to the page. - % (Useful for catching keystrokes.) - wf:wire(Actions) - #+END_SRC - -* Quick Review -** Nitrogen Actions -*** Quick Review - - 1. Elements make HTML. - 2. Actions make Javascript. - 3. An action can be wired using the =actions= property, or wired - later with =wf:wire/N=. Both approaches can take a single - action or a list of actions. - 4. An action looks for =trigger= and =target= properties. These - can be specified in a few different ways. - 5. Everything we have seen so far happens on the client. - -* PART 5 AGENDA -** Nitrogen Events - + What is a Postback? - + Your First Postback - + Event Properties - + More Event Examples - + Postback Shortcuts - + Modifying Elements -* What is a Postback? -** Nitrogen Events -*** What is a Postback? - - A postback briefly transfers control from the browser to the - Nitrogen server. It is initiated when an event fires with the - =postback= property set. For example: - - #+BEGIN_SRC erlang - #event { type=click, postback=my_click_event } - #+END_SRC - - The postback tag can be any valid Erlang term. You use this to - differentiate incoming events. - -* Your First Postback -** Nitrogen Events -*** Your First Postback - - First, let's use the postback to print out a debug message. - - #+BEGIN_SRC erlang - body() -> - wf:wire(mybutton, #event { type=click, postback=myevent }), - [ - #button { id=mybutton, text="Submit" } - ]. - - event(myevent) -> - ?PRINT({event, now()}). - #+END_SRC - -* Postback Shortcuts -** Nitrogen Events -*** Postback Shortcuts - - A few elements allow you to set the =postback= property as a - shortcut to handle their most common events. - - | Element | Shortcut Event | - | =#button{}= | click | - | =#textbox{}= | enter key | - | =#checkbox{}= | click | - | =#dropdown{}= | change | - | =#password{}= | enter key | - -* Postback Shortcuts -** Nitrogen Events -*** Postback Shortcuts - - A few elements allow you to set the =postback= property as a - shortcut to handle their most common events. - - The previous code, simplified: - - #+BEGIN_SRC erlang - body() -> - [ - #button { id=mybutton, text="Submit", postback=myevent }