Very rough sketch of a beginning, not even nearly doing anything interesting.
470
LICENSE
|
@ -1,214 +1,340 @@
|
||||||
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
|
GNU GENERAL PUBLIC LICENSE
|
||||||
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
|
Version 2, June 1991
|
||||||
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
|
||||||
|
|
||||||
1. DEFINITIONS
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
"Contribution" means:
|
Preamble
|
||||||
|
|
||||||
a) in the case of the initial Contributor, the initial code and
|
The licenses for most software are designed to take away your
|
||||||
documentation distributed under this Agreement, and
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
b) in the case of each subsequent Contributor:
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
i) changes to the Program, and
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
ii) additions to the Program;
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
where such changes and/or additions to the Program originate from and are
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
distributed by that particular Contributor. A Contribution 'originates' from
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
a Contributor if it was added to the Program by such Contributor itself or
|
distribute and/or modify the software.
|
||||||
anyone acting on such Contributor's behalf. Contributions do not include
|
|
||||||
additions to the Program which: (i) are separate modules of software
|
|
||||||
distributed in conjunction with the Program under their own license
|
|
||||||
agreement, and (ii) are not derivative works of the Program.
|
|
||||||
|
|
||||||
"Contributor" means any person or entity that distributes the Program.
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
"Licensed Patents" mean patent claims licensable by a Contributor which are
|
Finally, any free program is threatened constantly by software
|
||||||
necessarily infringed by the use or sale of its Contribution alone or when
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
combined with the Program.
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
"Program" means the Contributions distributed in accordance with this
|
The precise terms and conditions for copying, distribution and
|
||||||
Agreement.
|
modification follow.
|
||||||
|
|
||||||
"Recipient" means anyone who receives the Program under this Agreement,
|
GNU GENERAL PUBLIC LICENSE
|
||||||
including all Contributors.
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
2. GRANT OF RIGHTS
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
a) Subject to the terms of this Agreement, each Contributor hereby grants
|
Activities other than copying, distribution and modification are not
|
||||||
Recipient a non-exclusive, worldwide, royalty-free copyright license to
|
covered by this License; they are outside its scope. The act of
|
||||||
reproduce, prepare derivative works of, publicly display, publicly perform,
|
running the Program is not restricted, and the output from the Program
|
||||||
distribute and sublicense the Contribution of such Contributor, if any, and
|
is covered only if its contents constitute a work based on the
|
||||||
such derivative works, in source code and object code form.
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
b) Subject to the terms of this Agreement, each Contributor hereby grants
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
Recipient a non-exclusive, worldwide, royalty-free patent license under
|
source code as you receive it, in any medium, provided that you
|
||||||
Licensed Patents to make, use, sell, offer to sell, import and otherwise
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
transfer the Contribution of such Contributor, if any, in source code and
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
object code form. This patent license shall apply to the combination of the
|
notices that refer to this License and to the absence of any warranty;
|
||||||
Contribution and the Program if, at the time the Contribution is added by the
|
and give any other recipients of the Program a copy of this License
|
||||||
Contributor, such addition of the Contribution causes such combination to be
|
along with the Program.
|
||||||
covered by the Licensed Patents. The patent license shall not apply to any
|
|
||||||
other combinations which include the Contribution. No hardware per se is
|
|
||||||
licensed hereunder.
|
|
||||||
|
|
||||||
c) Recipient understands that although each Contributor grants the licenses
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
to its Contributions set forth herein, no assurances are provided by any
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
Contributor that the Program does not infringe the patent or other
|
|
||||||
intellectual property rights of any other entity. Each Contributor disclaims
|
|
||||||
any liability to Recipient for claims brought by any other entity based on
|
|
||||||
infringement of intellectual property rights or otherwise. As a condition to
|
|
||||||
exercising the rights and licenses granted hereunder, each Recipient hereby
|
|
||||||
assumes sole responsibility to secure any other intellectual property rights
|
|
||||||
needed, if any. For example, if a third party patent license is required to
|
|
||||||
allow Recipient to distribute the Program, it is Recipient's responsibility
|
|
||||||
to acquire that license before distributing the Program.
|
|
||||||
|
|
||||||
d) Each Contributor represents that to its knowledge it has sufficient
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
copyright rights in its Contribution, if any, to grant the copyright license
|
of it, thus forming a work based on the Program, and copy and
|
||||||
set forth in this Agreement.
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
3. REQUIREMENTS
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
A Contributor may choose to distribute the Program in object code form under
|
b) You must cause any work that you distribute or publish, that in
|
||||||
its own license agreement, provided that:
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
a) it complies with the terms and conditions of this Agreement; and
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
b) its license agreement:
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
i) effectively disclaims on behalf of all Contributors all warranties and
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
conditions, express and implied, including warranties or conditions of title
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
and non-infringement, and implied warranties or conditions of merchantability
|
exercise the right to control the distribution of derivative or
|
||||||
and fitness for a particular purpose;
|
collective works based on the Program.
|
||||||
|
|
||||||
ii) effectively excludes on behalf of all Contributors all liability for
|
In addition, mere aggregation of another work not based on the Program
|
||||||
damages, including direct, indirect, special, incidental and consequential
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
damages, such as lost profits;
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
iii) states that any provisions which differ from this Agreement are offered
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
by that Contributor alone and not by any other party; and
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
iv) states that source code for the Program is available from such
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
Contributor, and informs licensees how to obtain it in a reasonable manner on
|
source code, which must be distributed under the terms of Sections
|
||||||
or through a medium customarily used for software exchange.
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
When the Program is made available in source code form:
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
a) it must be made available under this Agreement; and
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
b) a copy of this Agreement must be included with each copy of the Program.
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
Contributors may not remove or alter any copyright notices contained within
|
If distribution of executable or object code is made by offering
|
||||||
the Program.
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
Each Contributor must identify itself as the originator of its Contribution,
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
if any, in a manner that reasonably allows subsequent Recipients to identify
|
except as expressly provided under this License. Any attempt
|
||||||
the originator of the Contribution.
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
4. COMMERCIAL DISTRIBUTION
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
Commercial distributors of software may accept certain responsibilities with
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
respect to end users, business partners and the like. While this license is
|
Program), the recipient automatically receives a license from the
|
||||||
intended to facilitate the commercial use of the Program, the Contributor who
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
includes the Program in a commercial product offering should do so in a
|
these terms and conditions. You may not impose any further
|
||||||
manner which does not create potential liability for other Contributors.
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
Therefore, if a Contributor includes the Program in a commercial product
|
You are not responsible for enforcing compliance by third parties to
|
||||||
offering, such Contributor ("Commercial Contributor") hereby agrees to defend
|
this License.
|
||||||
and indemnify every other Contributor ("Indemnified Contributor") against any
|
|
||||||
losses, damages and costs (collectively "Losses") arising from claims,
|
|
||||||
lawsuits and other legal actions brought by a third party against the
|
|
||||||
Indemnified Contributor to the extent caused by the acts or omissions of such
|
|
||||||
Commercial Contributor in connection with its distribution of the Program in
|
|
||||||
a commercial product offering. The obligations in this section do not apply
|
|
||||||
to any claims or Losses relating to any actual or alleged intellectual
|
|
||||||
property infringement. In order to qualify, an Indemnified Contributor must:
|
|
||||||
a) promptly notify the Commercial Contributor in writing of such claim, and
|
|
||||||
b) allow the Commercial Contributor tocontrol, and cooperate with the
|
|
||||||
Commercial Contributor in, the defense and any related settlement
|
|
||||||
negotiations. The Indemnified Contributor may participate in any such claim
|
|
||||||
at its own expense.
|
|
||||||
|
|
||||||
For example, a Contributor might include the Program in a commercial product
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
offering, Product X. That Contributor is then a Commercial Contributor. If
|
infringement or for any other reason (not limited to patent issues),
|
||||||
that Commercial Contributor then makes performance claims, or offers
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
warranties related to Product X, those performance claims and warranties are
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
such Commercial Contributor's responsibility alone. Under this section, the
|
excuse you from the conditions of this License. If you cannot
|
||||||
Commercial Contributor would have to defend claims against the other
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
Contributors related to those performance claims and warranties, and if a
|
License and any other pertinent obligations, then as a consequence you
|
||||||
court requires any other Contributor to pay any damages as a result, the
|
may not distribute the Program at all. For example, if a patent
|
||||||
Commercial Contributor must pay those damages.
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
5. NO WARRANTY
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON
|
It is not the purpose of this section to induce you to infringe any
|
||||||
AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
|
patents or other property right claims or to contest validity of any
|
||||||
EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
|
such claims; this section has the sole purpose of protecting the
|
||||||
CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
|
integrity of the free software distribution system, which is
|
||||||
PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
|
implemented by public license practices. Many people have made
|
||||||
appropriateness of using and distributing the Program and assumes all risks
|
generous contributions to the wide range of software distributed
|
||||||
associated with its exercise of rights under this Agreement , including but
|
through that system in reliance on consistent application of that
|
||||||
not limited to the risks and costs of program errors, compliance with
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
applicable laws, damage to or loss of data, programs or equipment, and
|
to distribute software through any other system and a licensee cannot
|
||||||
unavailability or interruption of operations.
|
impose that choice.
|
||||||
|
|
||||||
6. DISCLAIMER OF LIABILITY
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
|
original copyright holder who places the Program under this License
|
||||||
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
may add an explicit geographical distribution limitation excluding
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
those countries, so that distribution is permitted only in or among
|
||||||
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
|
countries not thus excluded. In such case, this License incorporates
|
||||||
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
|
the limitation as if written in the body of this License.
|
||||||
OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
7. GENERAL
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
If any provision of this Agreement is invalid or unenforceable under
|
Each version is given a distinguishing version number. If the Program
|
||||||
applicable law, it shall not affect the validity or enforceability of the
|
specifies a version number of this License which applies to it and "any
|
||||||
remainder of the terms of this Agreement, and without further action by the
|
later version", you have the option of following the terms and conditions
|
||||||
parties hereto, such provision shall be reformed to the minimum extent
|
either of that version or of any later version published by the Free
|
||||||
necessary to make such provision valid and enforceable.
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
If Recipient institutes patent litigation against any entity (including a
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Program itself
|
programs whose distribution conditions are different, write to the author
|
||||||
(excluding combinations of the Program with other software or hardware)
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
infringes such Recipient's patent(s), then such Recipient's rights granted
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
under Section 2(b) shall terminate as of the date such litigation is filed.
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
All Recipient's rights under this Agreement shall terminate if it fails to
|
NO WARRANTY
|
||||||
comply with any of the material terms or conditions of this Agreement and
|
|
||||||
does not cure such failure in a reasonable period of time after becoming
|
|
||||||
aware of such noncompliance. If all Recipient's rights under this Agreement
|
|
||||||
terminate, Recipient agrees to cease use and distribution of the Program as
|
|
||||||
soon as reasonably practicable. However, Recipient's obligations under this
|
|
||||||
Agreement and any licenses granted by Recipient relating to the Program shall
|
|
||||||
continue and survive.
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute copies of this Agreement, but in
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
order to avoid inconsistency the Agreement is copyrighted and may only be
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
modified in the following manner. The Agreement Steward reserves the right to
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
publish new versions (including revisions) of this Agreement from time to
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
time. No one other than the Agreement Steward has the right to modify this
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
Agreement. The Eclipse Foundation is the initial Agreement Steward. The
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
Eclipse Foundation may assign the responsibility to serve as the Agreement
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
Steward to a suitable separate entity. Each new version of the Agreement will
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
be given a distinguishing version number. The Program (including
|
REPAIR OR CORRECTION.
|
||||||
Contributions) may always be distributed subject to the version of the
|
|
||||||
Agreement under which it was received. In addition, after a new version of
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
the Agreement is published, Contributor may elect to distribute the Program
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
(including its Contributions) under the new version. Except as expressly
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
licenses to the intellectual property of any Contributor under this
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
Agreement, whether expressly, by implication, estoppel or otherwise. All
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
rights in the Program not expressly granted under this Agreement are
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
reserved.
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
{description}
|
||||||
|
Copyright (C) {year} {fullname}
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
{signature of Ty Coon}, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
||||||
|
|
||||||
This Agreement is governed by the laws of the State of New York and the
|
|
||||||
intellectual property laws of the United States of America. No party to this
|
|
||||||
Agreement will bring a legal action under this Agreement more than one year
|
|
||||||
after the cause of action arose. Each party waives its rights to a jury trial
|
|
||||||
in any resulting litigation.
|
|
||||||
|
|
119
README.md
|
@ -1,120 +1,5 @@
|
||||||
# mw3
|
# mw3
|
||||||
|
|
||||||
|
MW3 is intended to be a re-implementation of MicroWorld in ClojureScript: the third reimplementation, although not nearly as dramatic as the shift from C to Clojure!
|
||||||
|
|
||||||
## Development
|
It is a very long way from finished and does not even nearly work yet. Come back in a month or two.
|
||||||
|
|
||||||
Open a terminal and type `lein repl` to start a Clojure REPL
|
|
||||||
(interactive prompt).
|
|
||||||
|
|
||||||
In the REPL, type
|
|
||||||
|
|
||||||
```clojure
|
|
||||||
(run)
|
|
||||||
(browser-repl)
|
|
||||||
```
|
|
||||||
|
|
||||||
The call to `(run)` starts the Figwheel server at port 3449, which takes care of
|
|
||||||
live reloading ClojureScript code and CSS. Figwheel's server will also act as
|
|
||||||
your app server, so requests are correctly forwarded to the http-handler you
|
|
||||||
define.
|
|
||||||
|
|
||||||
Running `(browser-repl)` starts the Weasel REPL server, and drops you into a
|
|
||||||
ClojureScript REPL. Evaluating expressions here will only work once you've
|
|
||||||
loaded the page, so the browser can connect to Weasel.
|
|
||||||
|
|
||||||
When you see the line `Successfully compiled "resources/public/app.js" in 21.36
|
|
||||||
seconds.`, you're ready to go. Browse to `http://localhost:3449` and enjoy.
|
|
||||||
|
|
||||||
**Attention: It is not needed to run `lein figwheel` separately. Instead we
|
|
||||||
launch Figwheel directly from the REPL**
|
|
||||||
|
|
||||||
## Trying it out
|
|
||||||
|
|
||||||
If all is well you now have a browser window saying 'Hello Chestnut',
|
|
||||||
and a REPL prompt that looks like `cljs.user=>`.
|
|
||||||
|
|
||||||
Open `resources/public/css/style.css` and change some styling of the
|
|
||||||
H1 element. Notice how it's updated instantly in the browser.
|
|
||||||
|
|
||||||
Open `src/cljs/mw3/core.cljs`, and change `dom/h1` to
|
|
||||||
`dom/h2`. As soon as you save the file, your browser is updated.
|
|
||||||
|
|
||||||
In the REPL, type
|
|
||||||
|
|
||||||
```
|
|
||||||
(ns mw3.core)
|
|
||||||
(swap! app-state assoc :text "Interactivity FTW")
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice again how the browser updates.
|
|
||||||
|
|
||||||
### Lighttable
|
|
||||||
|
|
||||||
Lighttable provides a tighter integration for live coding with an inline
|
|
||||||
browser-tab. Rather than evaluating cljs on the command line with weasel repl,
|
|
||||||
evaluate code and preview pages inside Lighttable.
|
|
||||||
|
|
||||||
Steps: After running `(run)`, open a browser tab in Lighttable. Open a cljs file
|
|
||||||
from within a project, go to the end of an s-expression and hit Cmd-ENT.
|
|
||||||
Lighttable will ask you which client to connect. Click 'Connect a client' and
|
|
||||||
select 'Browser'. Browse to [http://localhost:3449](http://localhost:3449)
|
|
||||||
|
|
||||||
View LT's console to see a Chrome js console.
|
|
||||||
|
|
||||||
Hereafter, you can save a file and see changes or evaluate cljs code (without saving a file). Note that running a weasel server is not required to evaluate code in Lighttable.
|
|
||||||
|
|
||||||
### Emacs/Cider
|
|
||||||
|
|
||||||
Start a repl in the context of your project with `M-x cider-jack-in`.
|
|
||||||
|
|
||||||
Switch to repl-buffer with `C-c C-z` and start web and figwheel servers with
|
|
||||||
`(run)`, and weasel server with `(browser-repl`). Load
|
|
||||||
[http://localhost:3449](http://localhost:3449) on an external browser, which
|
|
||||||
connects to weasel, and start evaluating cljs inside Cider.
|
|
||||||
|
|
||||||
To run the Clojurescript tests, do
|
|
||||||
|
|
||||||
```
|
|
||||||
lein doo phantom
|
|
||||||
```
|
|
||||||
|
|
||||||
## Deploying to Heroku
|
|
||||||
|
|
||||||
This assumes you have a
|
|
||||||
[Heroku account](https://signup.heroku.com/dc), have installed the
|
|
||||||
[Heroku toolbelt](https://toolbelt.heroku.com/), and have done a
|
|
||||||
`heroku login` before.
|
|
||||||
|
|
||||||
``` sh
|
|
||||||
git init
|
|
||||||
git add -A
|
|
||||||
git commit
|
|
||||||
heroku create
|
|
||||||
git push heroku master:master
|
|
||||||
heroku open
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running with Foreman
|
|
||||||
|
|
||||||
Heroku uses [Foreman](http://ddollar.github.io/foreman/) to run your
|
|
||||||
app, which uses the `Procfile` in your repository to figure out which
|
|
||||||
server command to run. Heroku also compiles and runs your code with a
|
|
||||||
Leiningen "production" profile, instead of "dev". To locally simulate
|
|
||||||
what Heroku does you can do:
|
|
||||||
|
|
||||||
``` sh
|
|
||||||
lein with-profile -dev,+production uberjar && foreman start
|
|
||||||
```
|
|
||||||
|
|
||||||
Now your app is running at
|
|
||||||
[http://localhost:5000](http://localhost:5000) in production mode.
|
|
||||||
## License
|
|
||||||
|
|
||||||
Copyright © 2016 FIXME
|
|
||||||
|
|
||||||
Distributed under the Eclipse Public License either version 1.0 or (at
|
|
||||||
your option) any later version.
|
|
||||||
|
|
||||||
## Chestnut
|
|
||||||
|
|
||||||
Created with [Chestnut](http://plexus.github.io/chestnut/) 0.9.1 (3a675806).
|
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
# Contributor Code of Conduct
|
|
||||||
|
|
||||||
As contributors and maintainers of this project, we pledge to respect
|
|
||||||
all people who contribute through reporting issues, posting feature
|
|
||||||
requests, updating documentation, submitting pull requests or patches,
|
|
||||||
and other activities.
|
|
||||||
|
|
||||||
We are committed to making participation in this project a
|
|
||||||
harassment-free experience for everyone, regardless of level of
|
|
||||||
experience, gender, gender identity and expression, sexual
|
|
||||||
orientation, disability, personal appearance, body size, race, age, or
|
|
||||||
religion.
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include the use of
|
|
||||||
sexual language or imagery, derogatory comments or personal attacks,
|
|
||||||
trolling, public or private harassment, insults, or other
|
|
||||||
unprofessional conduct.
|
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit,
|
|
||||||
or reject comments, commits, code, wiki edits, issues, and other
|
|
||||||
contributions that are not aligned to this Code of Conduct. Project
|
|
||||||
maintainers who do not follow the Code of Conduct may be removed from
|
|
||||||
the project team.
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior
|
|
||||||
may be reported by opening an issue or contacting one or more of the
|
|
||||||
project maintainers.
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the
|
|
||||||
[Contributor Covenant](http:contributor-covenant.org), version 1.0.0,
|
|
||||||
available at
|
|
||||||
[http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
|
|
@ -4,13 +4,14 @@
|
||||||
:license {:name "Eclipse Public License"
|
:license {:name "Eclipse Public License"
|
||||||
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
||||||
|
|
||||||
:dependencies [[org.clojure/clojure "1.8.0-RC5"]
|
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||||
[org.clojure/clojurescript "1.7.228" :scope "provided"]
|
[org.clojure/clojurescript "1.7.228" :scope "provided"]
|
||||||
[ring "1.4.0"]
|
[ring "1.4.0"]
|
||||||
[ring/ring-defaults "0.1.5"]
|
[ring/ring-defaults "0.1.5"]
|
||||||
[bk/ring-gzip "0.1.1"]
|
[bk/ring-gzip "0.1.1"]
|
||||||
[ring.middleware.logger "0.5.0"]
|
[ring.middleware.logger "0.5.0"]
|
||||||
[compojure "1.4.0"]
|
[compojure "1.4.0"]
|
||||||
|
[prismatic/dommy "1.1.0"] ;; probably don't need both this and om in the longer term
|
||||||
[org.omcljs/om "1.0.0-alpha28"]
|
[org.omcljs/om "1.0.0-alpha28"]
|
||||||
[environ "1.0.2"]]
|
[environ "1.0.2"]]
|
||||||
|
|
||||||
|
|
150
resources/public/css/phone.css
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: larger;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ids generally in document order */
|
||||||
|
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
|
||||||
|
#main-container{
|
||||||
|
clear: both;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footer of the document */
|
||||||
|
#footer {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
width:100%;
|
||||||
|
padding: 0.25em 5% 0.25em 5%;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h1 {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 149;
|
||||||
|
background:rgba(40,40,40,0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav:hover #nav-menu {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-icon {
|
||||||
|
padding: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-menu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav ul li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav ul li a {
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0.1em 0.75em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#nav ul li.active a { background: silver;}
|
||||||
|
li.nav-item a:hover { background: rgb( 240, 240, 240) }
|
||||||
|
li.nav-item a:active { background: gray; color: white; }
|
||||||
|
|
||||||
|
.error {
|
||||||
|
background-color: red;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* there isn't enough room on a phone display for optional elements, and
|
||||||
|
load/save isn't going to work on a phone anyway */
|
||||||
|
.nav-optional {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
border: thin solid white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.error {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
background-color: silver;
|
||||||
|
border: thin solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 300%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, pre, ul, ol, dl, h1, h2, h3, h4, h5 {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.submit {
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.required:after {
|
||||||
|
content: " \*";
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
min-width: 35%;
|
||||||
|
}
|
||||||
|
|
||||||
|
label, input {
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
margin: 0 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
border-right: thin solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li::before {
|
||||||
|
content: "|| ";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.world table, div.world tr td {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
150
resources/public/css/standard.css
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ids generally in document order */
|
||||||
|
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
|
||||||
|
#main-container{
|
||||||
|
clear: both;
|
||||||
|
/* width:100%; */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footer of the document */
|
||||||
|
#footer {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller;
|
||||||
|
padding: 0 2em;
|
||||||
|
text-align: center;
|
||||||
|
color:white;
|
||||||
|
background:rgba(196,196,196,0.95);
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
bottom:0;
|
||||||
|
position:fixed;
|
||||||
|
z-index:150;
|
||||||
|
_position:absolute;
|
||||||
|
_top:expression(eval(document.documentElement.scrollTop+
|
||||||
|
(document.documentElement.clientHeight-this.offsetHeight)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
width:100%;
|
||||||
|
padding: 2em 0 0.25em 0;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab-bar {
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.25em 10%;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 149;
|
||||||
|
color: white;
|
||||||
|
background: rgba(40,40,40,0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab-bar li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
display: inline;
|
||||||
|
color: white;
|
||||||
|
background: rgba(40,40,40,0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab-bar li a {
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0.1em 0.75em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab-bar li.active a { background: silver;}
|
||||||
|
li.tab a:hover { background: rgb( 240, 240, 240) }
|
||||||
|
li.tab a:active { background: gray; color: white; }
|
||||||
|
|
||||||
|
.error {
|
||||||
|
background-color: red;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget {
|
||||||
|
background-color: silver;
|
||||||
|
border: thin solid white;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.error {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
border: thin solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 300%;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 1em 10% 0.25em 10%;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content, form, p, pre, ul, ol, dl, menu, h2, h3, h4, h5 {
|
||||||
|
padding: 0.25em 10%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.submit {
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.required:after {
|
||||||
|
content: " \*";
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
width: 30em;
|
||||||
|
min-width: 20em;
|
||||||
|
border-right: thin solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li::before {
|
||||||
|
content: "|| ";
|
||||||
|
}
|
||||||
|
|
||||||
|
div.world table, div.world table tr td {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.music-ruled tr:nth-child(odd) {
|
||||||
|
background-color: silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
text-align: left;
|
||||||
|
padding: 0 0.25em;
|
||||||
|
}
|
||||||
|
|
52
resources/public/css/states.css
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
td.waste {
|
||||||
|
background-color: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.water {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.pasture, td.grassland, td.meadow {
|
||||||
|
background-color: lime;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.crop {
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.camp, td.house, td.inn, td.market {
|
||||||
|
background-color: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.ploughland {
|
||||||
|
background-color: brown;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.heath {
|
||||||
|
background-color: chartreuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.scrub {
|
||||||
|
background-color: lime;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.forest {
|
||||||
|
background-color: forestgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.climax {
|
||||||
|
background-color: olive;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.fire {
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.error, td.plague {
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.snow, td.ice {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
166
resources/public/css/tablet.css
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ids generally in document order */
|
||||||
|
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
|
||||||
|
#main-container{
|
||||||
|
clear: both;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footer of the document */
|
||||||
|
#footer {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller;
|
||||||
|
padding: 0 2em;
|
||||||
|
text-align: center;
|
||||||
|
color:white;
|
||||||
|
background:rgba(196,196,196,0.95);
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
bottom:0;
|
||||||
|
position:fixed;
|
||||||
|
z-index:150;
|
||||||
|
_position:absolute;
|
||||||
|
_top:expression(eval(document.documentElement.scrollTop+
|
||||||
|
(document.documentElement.clientHeight-this.offsetHeight)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer:hover #credits {
|
||||||
|
font-size: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
width:100%;
|
||||||
|
padding: 0.25em 5% 0.25em 5%;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h1 {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 149;
|
||||||
|
background:rgba(40,40,40,0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav:hover #nav-menu {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-icon {
|
||||||
|
padding: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-menu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav ul li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav ul li a {
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0.1em 0.75em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#nav ul li.active a { background: silver;}
|
||||||
|
li.nav-item a:hover { background: rgb( 240, 240, 240) }
|
||||||
|
li.nav-item a:active { background: gray; color: white; }
|
||||||
|
|
||||||
|
.error {
|
||||||
|
background-color: red;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* there isn't enough room on a tablet display for optional elements, and
|
||||||
|
load/save isn't going to work on a tablet anyway */
|
||||||
|
.nav-optional {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
border: thin solid white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.error {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
background-color: silver;
|
||||||
|
border: thin solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 300%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5 {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, pre, ul, ol, dl, h1, h2, h3, h4, h5 {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.submit {
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.required:after {
|
||||||
|
content: " \*";
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
min-width: 35%;
|
||||||
|
}
|
||||||
|
|
||||||
|
label, input {
|
||||||
|
padding: 0.25em 1em;
|
||||||
|
margin: 0 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
border-right: thin solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu li::before {
|
||||||
|
content: "|| ";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.world table, div.world tr td {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
BIN
resources/public/img/clojure-icon.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/public/img/earth-space-strip.jpg
Normal file
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 1,013 KiB |
After Width: | Height: | Size: 6 KiB |
BIN
resources/public/img/heightmaps/isle_of_man.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
resources/public/img/heightmaps/life_gosperglidergun.png
Normal file
After Width: | Height: | Size: 192 B |
BIN
resources/public/img/heightmaps/small_hill.png
Normal file
After Width: | Height: | Size: 779 B |
BIN
resources/public/img/heightmaps/test.heightmap.png
Normal file
After Width: | Height: | Size: 229 KiB |
BIN
resources/public/img/screenshot.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
resources/public/img/screenshot_med.png
Normal file
After Width: | Height: | Size: 116 KiB |
BIN
resources/public/img/threelines.png
Normal file
After Width: | Height: | Size: 260 B |
BIN
resources/public/img/tiles/abandoned.png
Normal file
After Width: | Height: | Size: 605 B |
BIN
resources/public/img/tiles/black.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
resources/public/img/tiles/camp.png
Normal file
After Width: | Height: | Size: 395 B |
BIN
resources/public/img/tiles/climax.png
Normal file
After Width: | Height: | Size: 921 B |
BIN
resources/public/img/tiles/crop.png
Normal file
After Width: | Height: | Size: 641 B |
BIN
resources/public/img/tiles/error.png
Normal file
After Width: | Height: | Size: 160 B |
BIN
resources/public/img/tiles/fire.png
Normal file
After Width: | Height: | Size: 977 B |
BIN
resources/public/img/tiles/forest.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
resources/public/img/tiles/grassland.png
Normal file
After Width: | Height: | Size: 163 B |
BIN
resources/public/img/tiles/heath.png
Normal file
After Width: | Height: | Size: 855 B |
BIN
resources/public/img/tiles/house.png
Normal file
After Width: | Height: | Size: 591 B |
BIN
resources/public/img/tiles/ice.png
Normal file
After Width: | Height: | Size: 782 B |
BIN
resources/public/img/tiles/inn.png
Normal file
After Width: | Height: | Size: 587 B |
BIN
resources/public/img/tiles/market.png
Normal file
After Width: | Height: | Size: 805 B |
BIN
resources/public/img/tiles/meadow.png
Normal file
After Width: | Height: | Size: 368 B |
BIN
resources/public/img/tiles/pasture.png
Normal file
After Width: | Height: | Size: 368 B |
BIN
resources/public/img/tiles/plague.png
Normal file
After Width: | Height: | Size: 643 B |
BIN
resources/public/img/tiles/ploughland.png
Normal file
After Width: | Height: | Size: 718 B |
BIN
resources/public/img/tiles/scrub.png
Normal file
After Width: | Height: | Size: 687 B |
BIN
resources/public/img/tiles/snow.png
Normal file
After Width: | Height: | Size: 782 B |
BIN
resources/public/img/tiles/waste.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/public/img/tiles/water.png
Normal file
After Width: | Height: | Size: 621 B |
BIN
resources/public/img/tiles/white.png
Normal file
After Width: | Height: | Size: 164 B |
|
@ -4,9 +4,360 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link href="css/style.css" rel="stylesheet" type="text/css">
|
<link href="css/style.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="css/phone.css" media="only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="css/tablet.css" media="only screen and (min-device-width: 481px) and (max-device-width: 1024px)" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="css/standard.css" media="screen and (min-device-width: 1025px)" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="css/states.css" rel="stylesheet" type="text/css" />
|
||||||
|
<title>Welcome to MicroWorld!</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<ul id="tab-bar">
|
||||||
|
<li class="tab" id="home-tab" onclick="core.home()">
|
||||||
|
Home
|
||||||
|
</li>
|
||||||
|
<li class="tab" id="params-tab" onclick="core.params()">
|
||||||
|
Params
|
||||||
|
</li>
|
||||||
|
<li class="tab" id="rules-tab" onclick="onclick.rules()">
|
||||||
|
Rules
|
||||||
|
</li>
|
||||||
|
<li class="tab" id="world-tab" onclick="onclick.world()">
|
||||||
|
World
|
||||||
|
</li>
|
||||||
|
<li class="tab" id="docs-tab" onclick="onclick.docs()">
|
||||||
|
Documentation
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div id="home-content">
|
||||||
|
<a name="home-content"></a>
|
||||||
|
<h1>
|
||||||
|
Welcome to MicroWorld!
|
||||||
|
</h1>
|
||||||
|
<div class="content">
|
||||||
|
<h2>What this is about</h2>
|
||||||
|
<p>
|
||||||
|
<img alt="Screenshot" id="screenshot" style="float: left; padding-right: 2em;" src="img/screenshot_med.png"/>
|
||||||
|
MicroWorld is a rule driven cellular automaton. What does that mean? Well, it's a two dimensional world made up of squares called <strong>cells</strong>. The world develops in steps, and at each step, each cell is modified by applying the rules.</p>
|
||||||
|
<p><a href='world'>Go and watch</a> it running for a few moments, then come back here.</p><p>The demonstration world is a mountain, with snow at the top and the sea at the bottom. as you watched, you probably saw the bright green of grass on the lower slopes of the mountain turn to the darker green of forest. You may have seen some forest fires break out.</p>
|
||||||
|
<p>That's all controlled by rules. You make the rules. To start Noah's flood, <a href='rules'>go to the rules page</a> now, and add this rule at the very top:</p>
|
||||||
|
<pre>
|
||||||
|
if altitude is less than 200 then state should be water
|
||||||
|
</pre>
|
||||||
|
<p>then, <a href='world'>go and watch the world</a> again. What happens? You should see water spread across everywhere except the very top of the mountain. But after the flood, the waters should drain away again. Go back to <a href='rules'>rules</a> and add this rule at the very top:</p>
|
||||||
|
<pre>
|
||||||
|
if altitude is more than 9 and state is water then state should be grassland
|
||||||
|
</pre>
|
||||||
|
<p>Now the world alternates between <em>new</em> and <em>grassland</em>. That's no good! Go back to <a href='rules'>rules</a> and delete the rule that you first added - the one that says</p>
|
||||||
|
<pre>
|
||||||
|
if altitude is less than 200 then state should be water
|
||||||
|
</pre>
|
||||||
|
<p>And see! The world starts growing again.</p>
|
||||||
|
<h2>What you can do next</h2>
|
||||||
|
<h3>Change some rules</h3>
|
||||||
|
<p>Change some of the other rules and see what happens. Very likely, one of the first things that will happen is that you will get a message like this:</p>
|
||||||
|
<pre>
|
||||||
|
I did not understand 'if state is grassland then 1 chance in 10 state will be heath'
|
||||||
|
</pre>
|
||||||
|
<p>That means that you changed a rule in a way that the engine could no longer understand it. To find out what the engine will understand, have a look at the <a href='docs#grammar'>documentation</a>.</p>
|
||||||
|
<h3>Invent some rules of your own!</h3>
|
||||||
|
<p>What happens when people come into the world? Where would they make their first camp? Would they want to be near the water, so they could fish? Would they want to be near fertile grassland, to graze their sheep and cattle?</p>
|
||||||
|
<h4>Write a rule which adds some camps to the world</h4>
|
||||||
|
<p>What happens to the land around a camp? Do the people burn down forest to make new grassland? Do they convert the grassland into meadow, or into crop?</p>
|
||||||
|
<p>Does growing crops reduce the soil fertility? What makes people decide that their camp is a good enough place to build a proper house?</p>
|
||||||
|
<h4>Write some rules which describe this</h4>
|
||||||
|
<p>How many squares of meadow or crop does it take to feed each house full of people? What happens when there are too many houses and not enough fields? Can houses catch fire? What happens to a house which is next to a fire?</p>
|
||||||
|
<p>How many houses do you need for a market place? Where would people build a harbour?</p>
|
||||||
|
<h3>Change the rules completely</h3>
|
||||||
|
<p>I've provided rules which use the MicroWorld cellular automaton to make a simple model of the changes to land in Europe after the ice age. But you don't have to use it like that, at all.</p>
|
||||||
|
<p><a href='http://en.wikipedia.org/wiki/Conway's_Game_of_Life'>Conway's Game of Life</a> is one of the famous uses of a cellular automaton. The rules for the Game of Life are very simple. To set up your game of life you'll need some initialisation rules, one for every cell you want to start live (we'll use <i>black</i> for live, and <i>white</i> for dead):</p>
|
||||||
|
<pre>
|
||||||
|
if x is equal to 4 and y is equal to 4 and state is new then state should be black</pre>
|
||||||
|
<p>Add as many of these as you need for your starting pattern. Then add a rule, after all those:</p>
|
||||||
|
<pre>
|
||||||
|
if state is new then state should be white
|
||||||
|
</pre>
|
||||||
|
<p>I'll leave you to work out what the rules of life are for yourself, from the Wiki page I linked to.</p>
|
||||||
|
<p><strong>CHEAT</strong> <i>You'll find other rule sets you can explore if you go to the <a href='params'>Parameters</a> page</i>.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="params-content">
|
||||||
|
<a name="params-content"></a>
|
||||||
|
<h1>
|
||||||
|
Set your parameters
|
||||||
|
</h1>
|
||||||
|
<div class="content">
|
||||||
|
<form action="{{servlet-context}}/params" method="POST">
|
||||||
|
<p class="widget">
|
||||||
|
<label for="ruleset">The rule set to use</label>
|
||||||
|
<select name="ruleset">
|
||||||
|
<option value="">No change - use your current rules</option>
|
||||||
|
{% for ruleset in rulesets %}
|
||||||
|
<option value="{{ruleset}}">{{ruleset}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
<p class="widget">
|
||||||
|
<label for="heightmap">The map to use</label>
|
||||||
|
<select name="heightmap">
|
||||||
|
<option value="">No change - use your current map</option>
|
||||||
|
{% for heightmap in heightmaps %}
|
||||||
|
<option value="{{heightmap}}">{{heightmap}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
<p class="widget">
|
||||||
|
<label for="pause">
|
||||||
|
Pause duration
|
||||||
|
</label>
|
||||||
|
<input id="pause" type="range" value="{{pause}}" min="0" max="60" step="5" />
|
||||||
|
</p>
|
||||||
|
<p class="help">
|
||||||
|
The pause beteen computing a new state of your world, in seconds
|
||||||
|
</p>
|
||||||
|
<p class="widget">
|
||||||
|
<label for="submit">When you have chosen your parameters</label>
|
||||||
|
<input name="submit" id="submit" type="submit" value="Save your parameters!"/>
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="rules-content">
|
||||||
|
<a name="rules-content"></a>
|
||||||
|
<h1>
|
||||||
|
Edit your rules
|
||||||
|
</h1>
|
||||||
|
<div class="content">
|
||||||
|
<form action="{{servlet-context}}/rules" method="POST">
|
||||||
|
<textarea name="src" id="src" rows="10" cols="80">
|
||||||
|
{{rule-text}}
|
||||||
|
</textarea>
|
||||||
|
<p class="widget">
|
||||||
|
<label for="submit">When you have finished editing</label>
|
||||||
|
<input name="submit" id="submit" type="submit" value="Save your rules"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="world-content">
|
||||||
|
<a name="world-content"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="docs-content">
|
||||||
|
<a name="docs-content"></a>
|
||||||
|
<h1>
|
||||||
|
Read the documentation
|
||||||
|
</h1>
|
||||||
|
<div class="content">
|
||||||
|
<div>
|
||||||
|
<a name="top"/>
|
||||||
|
<menu>
|
||||||
|
<li><a href="#top">Top</a></li>
|
||||||
|
<li><a href="#grammar">Rule language</a></li>
|
||||||
|
<li><a href="#states">Implemented states</a></li>
|
||||||
|
<li><a href="#api">API documentation</a></li>
|
||||||
|
<li><a href="#teachers">For teachers</a></li>
|
||||||
|
</menu>
|
||||||
|
<hr/>
|
||||||
|
<div><a name="parser"> </a></div>
|
||||||
|
{{parser|safe}}
|
||||||
|
<hr/>
|
||||||
|
<div><a name="states"> </a></div>
|
||||||
|
<menu>
|
||||||
|
<li><a href="#top">Top</a></li>
|
||||||
|
<li><a href="#grammar">Rule language</a></li>
|
||||||
|
<li><a href="#states">Implemented states</a></li>
|
||||||
|
<li><a href="#api">API documentation</a></li>
|
||||||
|
<li><a href="#teachers">For teachers</a></li>
|
||||||
|
</menu>
|
||||||
|
<hr/>
|
||||||
|
<h2>Implemented states</h2>
|
||||||
|
<p>As it says in the rule language documentation, above, you can use
|
||||||
|
any sequence of alphanumeric characters you want as the name of a state
|
||||||
|
- you can call it whatever you like. However, if you use state
|
||||||
|
names that there aren't already tiles for, and aren't already classes
|
||||||
|
for in the CSS file, your states won't be displayed nicely in the
|
||||||
|
<a href="{{servlet-context}}/">World</a> display. The states for which
|
||||||
|
there are already tiles are:</p>
|
||||||
|
<ul>
|
||||||
|
{% for state in states %}
|
||||||
|
<li>
|
||||||
|
{{state}}
|
||||||
|
<img src="{{servlet-context}}/img/tiles/{{state}}.png"/>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div><a name="api"> </a></div>
|
||||||
|
<hr/>
|
||||||
|
<menu>
|
||||||
|
<li><a href="#top">Top</a></li>
|
||||||
|
<li><a href="#grammar">Rule language</a></li>
|
||||||
|
<li><a href="#states">Implemented states</a></li>
|
||||||
|
<li><a href="#api">API documentation</a></li>
|
||||||
|
<li><a href="#teachers">For teachers</a></li>
|
||||||
|
</menu>
|
||||||
|
<hr/>
|
||||||
|
<h2>API documentation</h2>
|
||||||
|
|
||||||
|
<p>If you're adventurous you may want to modify the MicroWorld engine
|
||||||
|
itself. To do that you'll need this documentation.
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{% for component in components %}
|
||||||
|
<li>
|
||||||
|
<a href="{{servlet-context}}/docs/{{component}}/uberdoc.html">
|
||||||
|
{{component}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div><a name="teachers"> </a></div>
|
||||||
|
<hr/>
|
||||||
|
<menu>
|
||||||
|
<li><a href="#top">Top</a></li>
|
||||||
|
<li><a href="#grammar">Rule language</a></li>
|
||||||
|
<li><a href="#states">Implemented states</a></li>
|
||||||
|
<li><a href="#api">API documentation</a></li>
|
||||||
|
<li><a href="#teachers">For teachers</a></li>
|
||||||
|
</menu>
|
||||||
|
<hr/>
|
||||||
|
<h2>For teachers</h2>
|
||||||
|
<p>MicroWorld was written in the hope that it would be of use for teachers,
|
||||||
|
particularly teachers in primary schools. The reason for attempting to write
|
||||||
|
a very simple rule language was that young people would be able to create
|
||||||
|
their own rules and rule sets.</p>
|
||||||
|
|
||||||
|
<h3>Classroom setup</h3>
|
||||||
|
<p>MicroWorld will run on a Raspberry Pi, and I plan to produce a
|
||||||
|
downloadable SD card image which auto-runs it. One ideal classroom setup
|
||||||
|
would be to have one Raspberry Pi running MicroWorld to every group of
|
||||||
|
two or three children.</p>
|
||||||
|
<p>MicroWorld will also run on any ordinary PC, including Windows,
|
||||||
|
Macintosh and Linux machines. I plan to produce a packaged installer
|
||||||
|
for each operating system.</p>
|
||||||
|
<h4>Servers and clients</h4>
|
||||||
|
<p>MicroWorld is a web-app, which means it runs in a web server and the
|
||||||
|
user interface is a web browser. It would be possible to arrange a
|
||||||
|
classroom with one copy of MicroWorld on a single server, and each child's
|
||||||
|
machine running MicroWorld from that single server.</p>
|
||||||
|
<p>However, many users accessing the same server at the same time may
|
||||||
|
lead to poor performance.
|
||||||
|
Check performance on your system before introducing a class to it, and if in doubt,
|
||||||
|
running a separate copy on each machine used by children may well be more
|
||||||
|
satisfactory.</p>
|
||||||
|
<p>If many users are using the same shared machine, you should make sure
|
||||||
|
that they don't use the 'original' or 'med' versions of the Great Britain
|
||||||
|
and Ireland map - both of these are big, and performance will inevitably
|
||||||
|
be poor.</p>
|
||||||
|
|
||||||
|
<h3>Subject areas</h3>
|
||||||
|
<p>One of my main objectives in writing MicroWorld was to create a system
|
||||||
|
which would be engaging for children and would enable them to see
|
||||||
|
computing in the context of other subject areas.</p>
|
||||||
|
<h4>Geography</h4>
|
||||||
|
<p>Maps of Great Britain and Ireland, and of the Isle of Man, are included
|
||||||
|
in the distribution; however, only the 'small' version of the map of
|
||||||
|
Great Britain and Ireland is really useable, the others are too big and
|
||||||
|
will be two slow. However, you can cut a map of your local area from the
|
||||||
|
larger maps if that is helpful to your class.</p>
|
||||||
|
<p>The following rulesets are of potential use in geography teaching:</p>
|
||||||
|
<dl>
|
||||||
|
<dt>basic</dt>
|
||||||
|
<dd>A very simple ruleset which simply establishes vegetation in the
|
||||||
|
landscape. Not particularly useful in itself, but a good ruleset for
|
||||||
|
children to use as a basis for their own projects.</dd>
|
||||||
|
<dt>iceage<dt>
|
||||||
|
<dd>illustrates ice thawing gradually. Because of inadequacies in the
|
||||||
|
rule language, currently the ice retreats from north to south, which is
|
||||||
|
of course wrong for the northern hemisphere; but the principle of
|
||||||
|
retreating ice, the way in which ice retreats up mountains, and the way
|
||||||
|
in which ecosystems establish themselves.</dd>
|
||||||
|
<dt>ecology</dt>
|
||||||
|
<dd>Attempts to model the effects of browsers and predators - represented
|
||||||
|
by deer and wolves, respectively - on the landscape.</dd>
|
||||||
|
<dt>settlement</dt>
|
||||||
|
<dd>illustrates human settlement appearing first on coastal promontaries
|
||||||
|
(e.g. kitchen-midden people), gradually spreads inland (in this model as
|
||||||
|
nomadic pastoralists), and forms permanent settlements where conditions
|
||||||
|
are favourable. This helps explore why the towns in your locality are
|
||||||
|
where they are. The model is obviously simplified, but produces a
|
||||||
|
potentially useful account of settlement in at least north-western Europe
|
||||||
|
from paleolithic up to at least late bronze age. <b>Note</b> that unless
|
||||||
|
your map has at least some coastal promontaries this ruleset will need
|
||||||
|
to be modified.</dd>
|
||||||
|
<dt>
|
||||||
|
</dl>
|
||||||
|
<p>All of these rulesets are deliberately simple. This is so that
|
||||||
|
children have something to start with, but so that they can actually make
|
||||||
|
real, demonstrable improvements quite simply.</p>
|
||||||
|
<h4>History</h4>
|
||||||
|
<p>The <em>settlement</em> ruleset is probably the best starting point for
|
||||||
|
history exploration. As described above, it essentially covers only
|
||||||
|
pre-history; the development of the feudal system, for example, or of
|
||||||
|
industrialisation, are not modelled. They could be, as (more advanced)
|
||||||
|
class projects. Writing rules will enable discussion of why castles, or
|
||||||
|
mills, are positioned where they are, and what the social consequences of
|
||||||
|
these developments are.</p>
|
||||||
|
<p>You might also want to explore the conditions for the spread of epidemic
|
||||||
|
disease - such as the black death - I've provided a state for this,
|
||||||
|
but no rules.</p>
|
||||||
|
<h4>IT/Informatics</h4>
|
||||||
|
<p>Obviously, any of the rulesets but particularly the <em>life</em>
|
||||||
|
ruleset are good introduction points to informatics lessons. The rule
|
||||||
|
language is sufficiently simple that introducing children to writing
|
||||||
|
their own rules can begin almost as soon as basic literacy is
|
||||||
|
established.</p>
|
||||||
|
<p>In more advanced IT lessons, at the upper end of primary school or in
|
||||||
|
secondary schools, I would encourage you to explore modifying the engine
|
||||||
|
itself in your classes. Also, it would be interesting to write an
|
||||||
|
export program which would export MicroWorld maps to Minecraft, or
|
||||||
|
render them as explorable three dimensional spaces using
|
||||||
|
<a href="http://jmonkeyengine.org/">JMonkeyEngine</a>
|
||||||
|
or <a href="https://nightmod.net/">NightMod</a>.</p>
|
||||||
|
<h4>Art and design</h4>
|
||||||
|
<p>A number of projects, progressively more ambitious, are possible in
|
||||||
|
art and design.</p>
|
||||||
|
<ol>
|
||||||
|
<li>The tiles I've drawn are pretty basic - again, that's
|
||||||
|
intentional, children can easily produce better ones. They don't have to
|
||||||
|
be 32x32, but they do all have to be the same size.</li>
|
||||||
|
<li>The stylesheets providing the overall look and feel of the system
|
||||||
|
could be modified</li>
|
||||||
|
<li>If you have an IT project to render a 3d world, you will need 3d
|
||||||
|
models of each of the states, instead of tiles. That might be a job for
|
||||||
|
<a href="http://blender.org">Blender</a>.</li></ol>
|
||||||
|
|
||||||
|
<h3>Lesson plans</h3>
|
||||||
|
<ul>
|
||||||
|
{% for lesson in lessons %}
|
||||||
|
<li>
|
||||||
|
<a href="{{servlet-context}}/md?content=lesson-plans/{{lesson}}.md">
|
||||||
|
{{lesson}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<hr/>
|
||||||
|
<menu>
|
||||||
|
<li><a href="#top">Top</a></li>
|
||||||
|
<li><a href="#grammar">Rule language</a></li>
|
||||||
|
<li><a href="#states">Implemented states</a></li>
|
||||||
|
<li><a href="#api">API documentation</a></li>
|
||||||
|
<li><a href="#teachers">For teachers</a></li>
|
||||||
|
</menu>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div id="credits">
|
||||||
|
Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
|
||||||
|
<img height="16" width="16" align="top" src="img/clojure-icon.gif"> Powered by <a href="http://clojure.org">Clojure</a> ||
|
||||||
|
Engineering and hosting by <a href="http://www.journeyman.cc">Journeyman</a> ||
|
||||||
|
World generated using <a href="http://git.journeyman.cc/?p=mw-engine;a=summary">MicroWorld Engine</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<script src="js/compiled/mw3.js" type="text/javascript"></script>
|
<script src="js/compiled/mw3.js" type="text/javascript"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,18 +1,70 @@
|
||||||
(ns mw3.core
|
(ns ^:figwheel-always mw3.core
|
||||||
(:require [om.core :as om :include-macros true]
|
(:require [om.core :as om :include-macros true]
|
||||||
[om.dom :as dom :include-macros true]))
|
[om.dom :as dom :include-macros true]
|
||||||
|
[cljs.core.async :refer [put! chan <!]]
|
||||||
|
[clojure.string :as string]))
|
||||||
|
|
||||||
(enable-console-print!)
|
(enable-console-print!)
|
||||||
|
|
||||||
(defonce app-state (atom {:text "Hello Chestnut!"}))
|
;; The state of the application.
|
||||||
|
;; NOTE that app-state can contain vectors and maps only, not lists.
|
||||||
|
(defonce app-state (atom {:available-tabs {:#home-tab :#home-content
|
||||||
|
:#params-tab :#params-content
|
||||||
|
:#rules-tab :#rules-content
|
||||||
|
:#world-tab :#world-content
|
||||||
|
:#docs-tab :#docs-content}
|
||||||
|
:selected-tab :#home-tab
|
||||||
|
:text "Welcome to MicroWorld!"
|
||||||
|
:rules []
|
||||||
|
:params {:available-rulesets []
|
||||||
|
:available-heightmaps []
|
||||||
|
:ruleset ""
|
||||||
|
:heightmap ""}
|
||||||
|
:world []}))
|
||||||
|
|
||||||
(defn root-component [app owner]
|
(deref app-state)
|
||||||
|
(:available-tabs (deref app-state))
|
||||||
|
|
||||||
|
(defn root-component [data owner]
|
||||||
(reify
|
(reify
|
||||||
om/IRender
|
om/IRender
|
||||||
(render [_]
|
(render [_]
|
||||||
(dom/div nil (dom/h1 nil (:text app))))))
|
(dom/div nil (dom/h1 nil (:text data))))))
|
||||||
|
|
||||||
|
(defn tab-bar [data owner]
|
||||||
|
(reify
|
||||||
|
om/IInitState
|
||||||
|
(init-state [_]
|
||||||
|
{:selected-tab :#home-tab
|
||||||
|
:selected-content :#home-content})
|
||||||
|
om/IRender
|
||||||
|
(render [this]
|
||||||
|
(dmu/ul nil
|
||||||
|
)))
|
||||||
|
|
||||||
|
|
||||||
|
(def pages [:#home-content :#params-content :#rules-content :#world-content :#docs-content])
|
||||||
|
|
||||||
|
(defn onclick-handler
|
||||||
|
"Handles a click on the specified `tab` and reveals the specified `content`."
|
||||||
|
[tab content]
|
||||||
|
(doseq [page pages]
|
||||||
|
(dommy/hide!(sel page)))
|
||||||
|
(dommy/show! content))
|
||||||
|
|
||||||
|
;; NASTY! Javascript interprets hyphens as subtraction operators, so function names
|
||||||
|
;; exposed to raw Javascript (e.g. onclick event handlers) must not contain hyphens.
|
||||||
|
|
||||||
|
(defn ^:export home []
|
||||||
|
(onclick-handler :#home-tab :#home-content))
|
||||||
|
|
||||||
|
(defn ^:export params []
|
||||||
|
(onclick-handler :#params-tab :#params-content))
|
||||||
|
|
||||||
|
|
||||||
(om/root
|
(om/root
|
||||||
root-component
|
root-component
|
||||||
app-state
|
app-state
|
||||||
{:target (. js/document (getElementById "app"))})
|
{:target (. js/document (getElementById "world-content"))})
|
||||||
|
|
||||||
|
|
||||||
|
|