kopia lustrzana https://github.com/backface/turtlestitch
Refactor contributing guidelines
Having contributing guidelines in a single file can improve readability for new users. GitHub also has a mechanism that invites users to read (or re-read) contributing guidelines before submitting an issue or a modification. This is why I merged the code and the translating guidelines into a single file. See GitHub blog article for reference: https://help.github.com/articles/setting-guidelines-for-repository-contributors/upd4.1
rodzic
859c0f9b92
commit
a0fe3bc249
|
@ -0,0 +1,283 @@
|
|||
# How to contribute
|
||||
|
||||
Attached is the current development code base for BYOB4 a.k.a. Snap. It consists of
|
||||
several JavaScript, HTML and text files, and while some of it may be functional
|
||||
most parts will be in flux and subject to frequent, even fundamental modifications.
|
||||
This document lays out a few simple guidelines ensuring that collaborative code
|
||||
contribution works out.
|
||||
|
||||
|
||||
## Coding
|
||||
|
||||
|
||||
### Working with changesets
|
||||
|
||||
You'll often want to change or add code in existing JS files. Please don't. Instead
|
||||
use a changeset. The way I always do it myself is to copy the empty `changeset.js`
|
||||
file and rename it to something like `JensChangesToMorphic.js`.
|
||||
|
||||
Into this file I write all the functions I want to add to Morphic. If I want to
|
||||
change a function in Morphic.js I copy it to the changeset and edit it there. Then
|
||||
I always validate the changeset with JSLint.com.
|
||||
|
||||
Please check your code frequently with JSLint!
|
||||
|
||||
For our Snap code set JSLint's settings to:
|
||||
|
||||
* assume a browser
|
||||
* tolerate missing 'use strict' pragma
|
||||
* `4` indentation
|
||||
* `78` maximum line length
|
||||
|
||||
If you're working on the core Morphic library you can also
|
||||
|
||||
* tolerate eval
|
||||
* tolerate unfiltered for in
|
||||
|
||||
although you'll probably not ever going to need either EVAL or FORIN in your
|
||||
changesets anyway.
|
||||
|
||||
There are, of course, other tools - like JSHint and browser debug tools - that
|
||||
help you debug your code. Feel free to use whichever suits you best, but let's
|
||||
all agree on JSLint's (nitpicky!) formatting rules so we get code that's well
|
||||
readable and easily shareable among ourselves.
|
||||
|
||||
|
||||
### Coding style
|
||||
|
||||
Snap's codebase is both big and fast moving. We'll continue to churn out several
|
||||
builds per day for a long time, hunting bugs and adding features throughout the
|
||||
whole application. We'll also need to be able to get our heads around the whole
|
||||
codebase. Being able to read and to quickly understand the code is most important,
|
||||
much more so than mathematical elegance.
|
||||
|
||||
Let me really stress this point: In creating Snap we're neither playing "Code Golf"
|
||||
(solving a problem using the least number of keystrokes) nor are we trying to
|
||||
outsmart Knuth. Instead we're maintaining a large number of small interchangeable
|
||||
code chunks, therefore:
|
||||
|
||||
|
||||
### Avoid
|
||||
|
||||
* accessing the DOM
|
||||
* frameworks (e.g. JQuery)
|
||||
* modules and namespaces (e.g. IIFE)
|
||||
- all of Snap is a single "World" with unique names for everything
|
||||
- remember: Changesets contain "small interchangeable code chunks"...
|
||||
* passing "thisArg" to functions like `map()`, `filter()` or `forEach()`
|
||||
- except in `call()`
|
||||
- always use `myself` to reference `this` in an outer scope instead
|
||||
* meta-class systems
|
||||
- use Morphic's way of creating class-like constructors instead
|
||||
- initialize all attributes either in the constructor or in an `init()`
|
||||
method, so you now the object's structure by casting a single look
|
||||
upon it. Avoid adding adding attributes elsewhere, or if you do,
|
||||
initialize them explicitly to "null" in the constructor or `init()`
|
||||
code
|
||||
* nested ternary operators
|
||||
* RegEx
|
||||
* overwriting existing definitions
|
||||
- except in changesets, duh :-)
|
||||
- create new constructors instead
|
||||
* non-descriptive names for variables, functions, objects
|
||||
* giant functions
|
||||
- which often are "modules in disguise",
|
||||
especially if they define local helper functions
|
||||
- create a new constructor instead
|
||||
|
||||
|
||||
### Testing your code
|
||||
|
||||
(don't worry, I'm not talking about formal UnitTest Suites or other BDSM software
|
||||
fetishes, just about playing with what you're creating while you're doing it)
|
||||
|
||||
To test your changesets just add another line in the html stub file with your
|
||||
changeset. Make sure to put your changeset **after** Morphic.js and Blocks.js and
|
||||
whichever libraries are already included, so it'll actually get used.
|
||||
|
||||
In your changeset override the world's `customMorphs` function so it returns a
|
||||
list of instances of your Morphs. For `Blocks.js` that code is:
|
||||
|
||||
```javascript
|
||||
var BlockMorph;
|
||||
var ScriptsMorph;
|
||||
|
||||
WorldMorph.prototype.customMorphs = function () {
|
||||
var sm = new ScriptsMorph();
|
||||
sm.setExtent(new Point(800, 600));
|
||||
return [
|
||||
new BlockMorph(),
|
||||
sm
|
||||
];
|
||||
};
|
||||
```
|
||||
|
||||
Just modify this code so it returns your list of sample Morphs instead of
|
||||
`BlockMorph` and `ScriptsMorph` instances.
|
||||
|
||||
Once you've added this code to your changeset you can open your sample html file
|
||||
in your browser, and you'll find your sample Morphs in the World's DEMO menu.
|
||||
|
||||
|
||||
### Inspectors
|
||||
|
||||
To actually test play with your Morphs you can right-click on them and open an
|
||||
inspector on them. You can open more than one inspector on each object. The
|
||||
inspector pretty much works the same as in Smalltalk. It even has an evaluation
|
||||
pane at the bottom, in which you can type in any JS code, mark it with your mouse
|
||||
(or select all with ctrl-a), righ-click on the selection and either "do it", "show
|
||||
it" or "inspect it" (again, like in Squeak).
|
||||
|
||||
Needless to say, in the evaluation pane `this` always refers to the inspected
|
||||
object.
|
||||
|
||||
|
||||
### Source Code Mgmt
|
||||
|
||||
The good thing about changesets is that you can continue working on them regardless
|
||||
of new dev releases that happen in the meantime. When you feel you've got something
|
||||
that's finished just send me your changeset, and I'll work all the changesets into
|
||||
the Snap codebase and release another dev version. That way there will always (and
|
||||
frequently) be a harmonized common code base.
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Translating Snap!
|
||||
|
||||
At this stage of development, Snap! can be translated to any LTR language
|
||||
maintaining the current order of inputs (formal parameters in blocks).
|
||||
|
||||
Translating Snap! is easy:
|
||||
|
||||
|
||||
### 1. Download
|
||||
|
||||
Download the sources and extract them into a local folder on your
|
||||
computer: https://snap.berkeley.edu/snapsource/snap.zip.
|
||||
|
||||
Use the German translation file (named 'lang-de.js') as template for your
|
||||
own translations. Start with editing the original file, because that way
|
||||
you will be able to immediately check the results in your browsers while
|
||||
you're working on your translation (keep the local copy of snap.html open
|
||||
in your web browser, and refresh it as you progress with your
|
||||
translation).
|
||||
|
||||
|
||||
### 2. Edit
|
||||
|
||||
Edit the translation file with a regular text editor, or with your
|
||||
favorite JavaScript editor.
|
||||
|
||||
In the first non-commented line (the one right below this
|
||||
note) replace "de" with the two-letter ISO 639-1 code for your language,
|
||||
e.g.
|
||||
|
||||
fr - French => SnapTranslator.dict.fr = {
|
||||
it - Italian => SnapTranslator.dict.it = {
|
||||
pl - Polish => SnapTranslator.dict.pl = {
|
||||
pt - Portuguese => SnapTranslator.dict.pt = {
|
||||
es - Spanish => SnapTranslator.dict.es = {
|
||||
el - Greek => => SnapTranslator.dict.el = {
|
||||
|
||||
etc. (see <http://en.wikipedia.org/wiki/ISO_639-1>)
|
||||
|
||||
|
||||
### 3. Translate
|
||||
|
||||
Then work through the dictionary, replacing the German strings against
|
||||
your translations. The dictionary is a straight-forward JavaScript ad-hoc
|
||||
object, for review purposes it should be formatted as follows:
|
||||
|
||||
```
|
||||
{
|
||||
'English string':
|
||||
'Translation string',
|
||||
'last key':
|
||||
} 'last value'
|
||||
```
|
||||
|
||||
and you only edit the indented value strings. Note that each key-value
|
||||
pair needs to be delimited by a comma, but that there shouldn't be a comma
|
||||
after the last pair (again, just overwrite the template file and you'll be
|
||||
fine).
|
||||
|
||||
If something doesn't work, or if you're unsure about the formalities you
|
||||
should check your file with [JSLint](https://JSLint.com)
|
||||
|
||||
This will inform you about any missed commas etc.
|
||||
|
||||
|
||||
### 4. Accented characters
|
||||
|
||||
Depending on which text editor and which file encoding you use you can
|
||||
directly enter special characters (e.g. Umlaut, accented characters) on
|
||||
your keyboard. However, I've noticed that some browsers may not display
|
||||
special characters correctly, even if other browsers do. So it's best to
|
||||
check your results in several browsers. If you want to be on the safe
|
||||
side, it's even better to escape these characters using Unicode.
|
||||
|
||||
See this collection of JavaScript utilities: http://0xcc.net/jsescape/
|
||||
|
||||
|
||||
### 5. Block specs
|
||||
|
||||
At this time your translation of block specs will only work
|
||||
correctly, if the order of formal parameters and their types
|
||||
are unchanged. Placeholders for inputs (formal parameters) are
|
||||
indicated by a preceding % prefix and followed by a type
|
||||
abbreviation.
|
||||
|
||||
For example:
|
||||
|
||||
'say %s for %n secs'
|
||||
|
||||
can currently not be changed into
|
||||
|
||||
'say %n secs long %s'
|
||||
|
||||
and still work as intended.
|
||||
|
||||
Similarly
|
||||
|
||||
'point towards %dst'
|
||||
|
||||
cannot be changed into
|
||||
|
||||
'point towards %cst'
|
||||
|
||||
without breaking its functionality.
|
||||
|
||||
|
||||
### 6. Submit
|
||||
|
||||
When you're done, rename the edited file by replacing the "de" part of the
|
||||
filename with the two-letter ISO 639-1 code for your language, e.g.
|
||||
|
||||
fr - French => lang-fr.js
|
||||
it - Italian => lang-it.js
|
||||
pl - Polish => lang-pl.js
|
||||
pt - Portuguese => lang-pt.js
|
||||
es - Spanish => lang-es.js
|
||||
el - Greek => => lang-el.js
|
||||
|
||||
and send it to me for inclusion in the official Snap! distribution.
|
||||
Once your translation has been included, Your name will the shown in the
|
||||
"Translators" tab in the "About Snap!" dialog box, and you will be able to
|
||||
directly launch a translated version of Snap! in your browser by appending
|
||||
|
||||
lang:xx
|
||||
|
||||
to the URL, `xx` representing your translations two-letter code.
|
||||
|
||||
|
||||
### 7. Known issues
|
||||
|
||||
In some browsers accents or ornaments located in typographic ascenders
|
||||
above the cap height are currently (partially) cut-off.
|
||||
|
||||
---
|
||||
|
||||
Enjoy!
|
||||
|
||||
-Jens
|
|
@ -1,173 +0,0 @@
|
|||
*****************************
|
||||
Contributing to BYOB4 / Snap!
|
||||
by Jens Mönig
|
||||
last changed: 12/09/14
|
||||
*****************************
|
||||
|
||||
Attached is the current development code base for BYOB4 a.k.a. Snap. It consists of
|
||||
several JavaScript, HTML and text files, and while some of it may be functional
|
||||
most parts will be in flux and subject to frequent, even fundamental modifications.
|
||||
This document lays out a few simple guidelines ensuring that collaborative code
|
||||
contribution works out.
|
||||
|
||||
|
||||
Working with changesets
|
||||
-----------------------
|
||||
You'll often want to change or add code in existing JS files. Please don't. Instead
|
||||
use a changeset. The way I always do it myself is to copy the empty
|
||||
|
||||
changeset.js
|
||||
|
||||
file and rename it to something like
|
||||
|
||||
JensChangesToMorphic.js
|
||||
|
||||
Into this file I write all the functions I want to add to Morphic. If I want to
|
||||
change a function in Morphic.js I copy it to the changeset and edit it there. Then
|
||||
I always validate the changeset with
|
||||
|
||||
JSLint.com
|
||||
|
||||
Please check your code frequently with JSLint!
|
||||
|
||||
For our Snap code set JSLint's settings to:
|
||||
|
||||
assume a browser
|
||||
tolerate missing 'use strict' pragma
|
||||
|
||||
[4] indentation
|
||||
[78] maximum line length
|
||||
|
||||
If you're working on the core Morphic library you can also
|
||||
|
||||
tolerate eval
|
||||
tolerate unfiltered for in
|
||||
|
||||
although you'll probably not ever going to need either EVAL or FORIN in your
|
||||
changesets anyway.
|
||||
|
||||
There are, of course, other tools - like JSHint and Firebug - that help you debug
|
||||
your code. Feel free to use whichever suits you best, but let's all agree on
|
||||
JSLint's (nitpicky!) formatting rules so we get code that's well readable and
|
||||
easily shareable among ourselves.
|
||||
|
||||
|
||||
Coding style
|
||||
------------
|
||||
Snap's codebase is both big and fast moving. We'll continue to churn out several
|
||||
builds per day for a long time, hunting bugs and adding features throughout the
|
||||
whole application. We'll also need to be able to get our heads around the whole
|
||||
codebase. Being able to read and to quickly understand the code is most important,
|
||||
much more so than mathematical elegance.
|
||||
|
||||
Let me really stress this point: In creating Snap we're neither playing "Code Golf"
|
||||
(solving a problem using the least number of keystrokes) nor are we trying to
|
||||
outsmart Knuth. Instead we're maintaining a large number of small interchangeable
|
||||
code chunks, therefore:
|
||||
|
||||
|
||||
Avoid
|
||||
-----
|
||||
* accessing the DOM
|
||||
|
||||
* frameworks (e.g. JQuery)
|
||||
|
||||
* modules and namespaces (e.g. IIFE)
|
||||
|
||||
- all of Snap is a single "World" with unique names for everything
|
||||
|
||||
- remember: Changesets contain "small interchangeable code chunks"...
|
||||
|
||||
* passing "thisArg" to functions like map(), filter() or forEach()
|
||||
|
||||
- except in call()
|
||||
- always use "myself" to reference "this" in an outer scope instead
|
||||
|
||||
* meta-class systems
|
||||
|
||||
- use Morphic's way of creating class-like constructors instead
|
||||
|
||||
- initialize all attributes either in the constructor or in an init()
|
||||
method, so you now the object's structure by casting a single look
|
||||
upon it. Avoid adding adding attributes elsewhere, or if you do,
|
||||
initialize them explicitly to "null" in the constructor or init()
|
||||
code
|
||||
|
||||
* nested ternary operators
|
||||
|
||||
* RegEx
|
||||
|
||||
* overwriting existing definitions
|
||||
|
||||
- except in changesets, duh :-)
|
||||
- create new constructors instead
|
||||
|
||||
* non-descriptive names for variables, functions, objects
|
||||
|
||||
* giant functions
|
||||
|
||||
- which often are "modules in disguise",
|
||||
especially if they define local helper functions
|
||||
|
||||
- create a new constructor instead
|
||||
|
||||
|
||||
Testing your code
|
||||
------------------
|
||||
(don't worry, I'm not talking about formal UnitTest Suites or other BDSM software
|
||||
fetishes, just about playing with what you're creating while you're doing it)
|
||||
|
||||
To test your changesets just add another line in the html stub file with your
|
||||
changeset. Make sure to put your changeset /after/ Morphic.js and Blocks.js and
|
||||
whichever libraries are already included, so it'll actually get used.
|
||||
|
||||
In your changeset override the world's
|
||||
|
||||
customMorphs
|
||||
|
||||
function so it returns a list of instances of your Morphs. For "Blocks.js" that
|
||||
code is:
|
||||
|
||||
var BlockMorph;
|
||||
var ScriptsMorph;
|
||||
|
||||
WorldMorph.prototype.customMorphs = function () {
|
||||
var sm = new ScriptsMorph();
|
||||
sm.setExtent(new Point(800, 600));
|
||||
return [
|
||||
new BlockMorph(),
|
||||
sm
|
||||
];
|
||||
};
|
||||
|
||||
Just modify this code so it returns your list of sample Morphs instead of
|
||||
BlockMorph and ScriptsMorph instances.
|
||||
|
||||
Once you've added this code to your changeset you can open your sample html file
|
||||
in your browser, and you'll find your sample Morphs in the World's DEMO menu.
|
||||
|
||||
|
||||
Inspectors
|
||||
----------
|
||||
To actually test play with your Morphs you can right-click on them and open an
|
||||
inspector on them. You can open more than one inspector on each object. The
|
||||
inspector pretty much works the same as in Smalltalk. It even has an evaluation
|
||||
pane at the bottom, in which you can type in any JS code, mark it with your mouse
|
||||
(or select all with ctrl-a), righ-click on the selection and either "do it", "show
|
||||
it" or "inspect it" (again, like in Squeak).
|
||||
|
||||
Needless to say, in the evaluation pane "this" always refers to the inspected
|
||||
object.
|
||||
|
||||
|
||||
Source Code Mgmt
|
||||
-----------------
|
||||
The good thing about changesets is that you can continue working on them regardless
|
||||
of new dev releases that happen in the meantime. When you feel you've got something
|
||||
that's finished just send me your changeset, and I'll work all the changesets into
|
||||
the Snap codebase and release another dev version. That way there will always (and
|
||||
frequently) be a harmonized common code base.
|
||||
|
||||
Thanks!
|
||||
|
||||
--Jens
|
|
@ -1,143 +0,0 @@
|
|||
*****************************
|
||||
Translating BYOB4 / Snap!
|
||||
by Jens Moenig
|
||||
last changed: 12/10/16
|
||||
*****************************
|
||||
|
||||
At this stage of development, Snap! can be translated to any LTR language
|
||||
maintaining the current order of inputs (formal parameters in blocks).
|
||||
|
||||
Translating Snap! is easy:
|
||||
|
||||
|
||||
1. Download
|
||||
|
||||
Download the sources and extract them into a local folder on your
|
||||
computer:
|
||||
|
||||
<http://snap.berkeley.edu/snapsource/snap.zip>
|
||||
|
||||
Use the German translation file (named 'lang-de.js') as template for your
|
||||
own translations. Start with editing the original file, because that way
|
||||
you will be able to immediately check the results in your browsers while
|
||||
you're working on your translation (keep the local copy of snap.html open
|
||||
in your web browser, and refresh it as you progress with your
|
||||
translation).
|
||||
|
||||
|
||||
2. Edit
|
||||
|
||||
Edit the translation file with a regular text editor, or with your
|
||||
favorite JavaScript editor.
|
||||
|
||||
In the first non-commented line (the one right below this
|
||||
note) replace "de" with the two-letter ISO 639-1 code for your language,
|
||||
e.g.
|
||||
|
||||
fr - French => SnapTranslator.dict.fr = {
|
||||
it - Italian => SnapTranslator.dict.it = {
|
||||
pl - Polish => SnapTranslator.dict.pl = {
|
||||
pt - Portuguese => SnapTranslator.dict.pt = {
|
||||
es - Spanish => SnapTranslator.dict.es = {
|
||||
el - Greek => => SnapTranslator.dict.el = {
|
||||
|
||||
etc. (see <http://en.wikipedia.org/wiki/ISO_639-1>)
|
||||
|
||||
|
||||
3. Translate
|
||||
|
||||
Then work through the dictionary, replacing the German strings against
|
||||
your translations. The dictionary is a straight-forward JavaScript ad-hoc
|
||||
object, for review purposes it should be formatted as follows:
|
||||
|
||||
{
|
||||
'English string':
|
||||
'Translation string',
|
||||
'last key':
|
||||
} 'last value'
|
||||
|
||||
and you only edit the indented value strings. Note that each key-value
|
||||
pair needs to be delimited by a comma, but that there shouldn't be a comma
|
||||
after the last pair (again, just overwrite the template file and you'll be
|
||||
fine).
|
||||
|
||||
If something doesn't work, or if you're unsure about the formalities you
|
||||
should check your file with
|
||||
|
||||
<http://JSLint.com>
|
||||
|
||||
This will inform you about any missed commas etc.
|
||||
|
||||
|
||||
4. Accented characters
|
||||
|
||||
Depending on which text editor and which file encoding you use you can
|
||||
directly enter special characters (e.g. Umlaut, accented characters) on
|
||||
your keyboard. However, I've noticed that some browsers may not display
|
||||
special characters correctly, even if other browsers do. So it's best to
|
||||
check your results in several browsers. If you want to be on the safe
|
||||
side, it's even better to escape these characters using Unicode.
|
||||
|
||||
see: <http://0xcc.net/jsescape/>
|
||||
|
||||
|
||||
5. Block specs:
|
||||
|
||||
At this time your translation of block specs will only work
|
||||
correctly, if the order of formal parameters and their types
|
||||
are unchanged. Placeholders for inputs (formal parameters) are
|
||||
indicated by a preceding % prefix and followed by a type
|
||||
abbreviation.
|
||||
|
||||
For example:
|
||||
|
||||
'say %s for %n secs'
|
||||
|
||||
can currently not be changed into
|
||||
|
||||
'say %n secs long %s'
|
||||
|
||||
and still work as intended.
|
||||
|
||||
Similarly
|
||||
|
||||
'point towards %dst'
|
||||
|
||||
cannot be changed into
|
||||
|
||||
'point towards %cst'
|
||||
|
||||
without breaking its functionality.
|
||||
|
||||
|
||||
6. Submit
|
||||
|
||||
When you're done, rename the edited file by replacing the "de" part of the
|
||||
filename with the two-letter ISO 639-1 code for your language, e.g.
|
||||
|
||||
fr - French => lang-fr.js
|
||||
it - Italian => lang-it.js
|
||||
pl - Polish => lang-pl.js
|
||||
pt - Portuguese => lang-pt.js
|
||||
es - Spanish => lang-es.js
|
||||
el - Greek => => lang-el.js
|
||||
|
||||
and send it to me for inclusion in the official Snap! distribution.
|
||||
Once your translation has been included, Your name will the shown in the
|
||||
"Translators" tab in the "About Snap!" dialog box, and you will be able to
|
||||
directly launch a translated version of Snap! in your browser by appending
|
||||
|
||||
lang:xx
|
||||
|
||||
to the URL, xx representing your translations two-letter code.
|
||||
|
||||
|
||||
7. Known issues
|
||||
|
||||
In some browsers accents or ornaments located in typographic ascenders
|
||||
above the cap height are currently (partially) cut-off.
|
||||
|
||||
|
||||
|
||||
Enjoy!
|
||||
-Jens
|
Ładowanie…
Reference in New Issue