# Guidelines for Contributors
* [Development](#development)
* [Node.js](#nodejs)
* [Flex SDK](#flex)
* [Building](#building)
## Development
Unless you are developing a fix for a reported issue, the development of a new feature follows specific conventions.
* Tab size is **8** for indentation.
* File name format: `mep-feature-[feature_name].js`.
* **ALWAYS** make changes to the files in the `/src/` directory, and **NEVER** in `/build/` directory. This is with the sole purpose of facilitating the merging (and further, the compiling) operation, and help people to see changes more easily.
* Test the changes with `/test/test.html`. Make sure you download the media files from https://github.com/johndyer/mediaelement-files and place them inside the `/media/` directory.
* A code template to build a feature is presented below.
```javascript
(function($) {
$.extend(mejs.MepDefaults, {
// Any variable that can be configured by the end user belongs here.
// Make sure is unique by checking API and Configuration file.
// Add comments about the nature of each of these variables.
});
$.extend(MediaElementPlayer.prototype, {
// Public variables
build[feature_name]: function(player, controls, layers, media) {
// This allows us to access options and other useful elements already set.
// Adding variables to the object is a good idea if you plan to reuse
// those variables in further operations.
var t = this;
// All code required inside here to keep it private;
// otherwise, you can create more methods or add variables
// outside of this scope
}
// Public methods
});
})(mejs.$);
```
If the feature must be integrated in the core package, place it inside `/src/` folder to be reviewed and, if code integrates any configuration variables, make sure you also write comments about their purpose, and add them into [API and Configuration](api.md) to keep documentation up-to-date; otherwise, to use it immediately, just call it after the main files and add its name in the `features` configuration.
```html
```
If it is a translation that wants to be added, a couple of considerations need to be considered:
* The current format is `'mejs.[ID of element]' : 'translation'` (i.e., `'mejs.play': 'Play'`).
* The first element in the object **MUST** be `mejs.plural-form: [Number]`, where `[Number]` is the Family Group Number the language belongs (see `/src/js/me-18n.js` to determine which number is the appropriate one).
* If you require to use plurals, you must write the possible translations in the order specified in http://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html as an array, and the placeholder to replace the number would be `%1`.
* **Only one** plural can be in the strings.
* A code template to build a translation is presented below.
```javascript
/*!
* [Locale] translation ([lang])
*
* @see me-i18n.js
*/
;(function(exports, undefined) {
"use strict";
if (typeof exports.[lang] === 'undefined') {
exports.[lang] = {
// Find the family group number; see `/src/js/me-18n.js`
'mejs.plural-form': 14,
// Regular translations; to get the entire list of elements, always refer to `me-i18n-locale-en.js`
...
// Example for pluralization following the form `nplurals=3; plural=(n%10==1 ? 0 : n%10==2 ? 1 : 2);`
// meaning that if the modulo between number indicated and 10 is 1, then the first string will be used;
// if the modulo between number indicated and 10 is 2, it will use the second one; otherwise, it will use the third case
'mejs.time-skip-back' : ["Назад на %1 секунд", "Назад на %1 секунди", "Назад на %1 секунда"],
};
}
}(mejs.i18n.locale.strings));
```
## Node.js
Since `MediaElement.js` uses [Grunt](http://gruntjs.com/) to compile it, Node.js is required. Download it at https://nodejs.org/ and follow the steps to install it, or install `node.js` with `npm`.
Once installed, at the command prompt, type `npm install`, which will download all the necessary tools.
## Flex SDK
One of the subtasks involved during the compiling of `MediaElement.js` is the compiling of the Flash files. In order to do it, Flex SDK needs to be installed.
1. Make sure your version of Java is **1.5 or later** since Flex compilers are 32-bit executables and cannot launch 64-bit processes; otherwise, you will receive the error ```This Java instance does not support a 32-bit JVM.Please install the desired version```. For more information about this topic, read [Adobe's JVM Configuration](http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7fd9.html#WS2db454920e96a9e51e63e3d11c0bf5fb32-7ff3).
2. Download the free Flex SDK from http://sourceforge.net/adobe/flexsdk/wiki/Download%20Flex%204.6/
2. Unzip it to a directory on your local machine (eg: ```/usr/local/flex_sdk_4.6```)
3. Create a symlink from the install location to this directory (eg: ```ln -s /usr/local/flex_sdk_4.6 /path/to/mediaelement/src/flash```)
4. If you do not have the required player global swc file (version **10.1**), download it from https://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html and place it inside ```/path/to/flex_sdk_4.6/frameworks/libs/player/10.1/playerglobal.swc```
## Building
To compile ALL the files, in your Terminal window just type `grunt` in the root of the project.
If during the development wasn't necessary to do any changes to the Flash files, type `grunt html5only`. That way, the Flash files will remain intact. You can also type `grunt debug_html5` to avoid removing the console messages.
If, on the other hand, only the ActionScript files were affected, type `sh compile_swf.sh` and it will build the compiled files in `/local-build/` directory. Then just copy the files and put them inside `/build/` directory.
Finally, if changes were done to the `FlashMediaElement.fla` file:
1. Open it in the Flash Professional IDE.
2. Go to the menu item `File->Publish Settings`
3. Click the `Flash` tab
4. Make sure the box `Export SWC` is checked
5. Click `Publish`
________
[Back to Main](README.md)