<commit_before># Marrow.js

`Marrow.js` это микрофреймворк с загрузчиком, который позволяет создавать в страницу "песочницу" и загружать в нее любое веб приложение предоставляя ему api для работы как с основной страницей + набор полезных утилит.

---

`Marrow.js` предоставляет следующие механизмы:

1. Загрузка веб-приложения в песочницу с настройкой кастомного окружения и подгрузкой зависимостей через рецепты;
1. Для каждого приложения можно подключить один рецепт который определяет список зависимостей для запуска приложения. Так же отвечает за подготовку окружения песочницы

## Демо

Список демо-экспериментов возможностей `Marrow.js`:

* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/thorax/) приложения TodoMVC написанный на `thorax.js`;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/angular/) приложения TodoMVC написанный на `angular.js`;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/doubleapp/) запуска нескольких приложений TodoMVC написанных на `angular.js` и `thorax.js` работающих синхронно в зависимости от адреса;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/multipleapp/) запуска одного и того же приложения 3 раза с разными параметрами.


## Загрузчик
###### Расположение: `core/core.loader.js`

Загрузчик `Marrow` является оберткой над загрузчиком [curl.js](https://github.com/cujojs/curl/) собранного с плугинами `js`, `css`, `link`. 

В свою очередь предотвращая проникновение переменных `curl.js` в глобальную область видимости, а так же предоставляя следующие возможности:

1. Настройка загрузчика в зависимости от настроек приложения;
1. Определение и автоматическая подстановка необходимых префиксов в зависимости от расширения файла;
1. Возможность контролировать область загрузки файлов:
	* Загрузка в "песочницу" к текущему приложению. Поведение по умолчанию;
	* Загрузка в основную страницу. Используется для загрузки стилей в область видимости страницы;
1. В зависимости от параметра запуска приложения позволяет загружать девелоперские версии файлов или же пожатые и минифицированные (файлы для продакшена).

Все статические ресурсы должны хранится в папке `/static` путь до которой можно указывать в настройках приложения (*см. соответсвующий раздел*).

Загрузчик предоставляет следующие преднастроенные правила для загрузки файлов:

* `root` – Правило указывает на директорию `js`. Cоздано "на всякий случай" и вредли пригодится в реальных условиях;

	```
"root/marrow.js" => site.com/static/js/marrow.js
```

* [**deprecated**] `core` – Правило указывает на директорию `js/core`. Создавалось для загрузки файлов ядра. Начиная с версии `0.2.15` ядро без сборки не работоспособно.

	```
"core/core.observatory.js" => site.com/static/js/core/core.observatory.js
```

* `system` – Правило указывает на директорию `js/libs`. Cоздано

	```
"system/jquery/jquery.caret.min.js" => site.com/static/js/libs/jquery/jquery.caret.min.js
```

* `recipes` – Правило указывает на директорию `js/recipes`. Cоздано
* `helpers` – Правило указывает на директорию `js/helpers`. Cоздано
* `recipe` – Правило указывает на директорию `js/recipes/<имя выбранного рецепта>`. Cоздано
* `recipe_libs` – Правило указывает на директорию `js/recipes/<имя выбранного рецепта>/libs`. Cоздано

## Рецепты
###### Расположение: `recipes/<recipe_name>/recipe.js`

Для каждого приложения можно подключить один рецепт который определяет список зависимостей для запуска приложения. Так же отвечает за подготовку окружения песочницы перед инициализацией приложения.

Рецепт может 

## Транзиты
###### Расположение: `core/transits/core.transit.<transit_name>.js`

Транзиты предназначены для прозрачного прокидывания определенного функционала (нативного фунционала или же функционала библиотек) из песочницы в главную страницу.

Существующие транзиты:

1. `core.transit.jquery` – Предназначен для прокидывания селекторов jQuery загруженного в песочницу. Всем селекторам выполненные в песочнице будет автоматически добавляться контекс поиска основной страницы
	> ##### Пример:
	> Без активированного транзита селектор `$('body')` выдаст в качестве результата DOM элемент `sandbox.document.body` находящийся в песочнице, который не предсталвяет никакой ценности, так как песочница не имеет визуального представления.
	
	> С активированным транзитом результатом этого же селектора будет равен `window.document.body`, которой является уже элементом оснавной страницы с которой уже можно работать.

1. `core.transit.location` – Предназначен для двунаправленной синхронизации `location.hash`. При активации этого транзита изменение `location.hash` в песочнице моментально будет отражено на `location.hash` основной страницы и наоборот.

### Работа с транзитами

Для активации транзитов стоит использовать метод: 

```
core.useTransits('<transit_name>', '<transit_name>', …, options);
```

Который принимает в качестве аргументов перечисление строковых названий транзитов которые необходимо активировать. Опции для метода активации транзитов должны идти объектом переданный последним аргументом. 
> Объект опций обязателен для передачи.

#####Пример:

```
// Активируем транзит для jQuery
core.useTransits('jquery', options);

// Активируем транзиты jquery и location
core.useTransits('jquery', 'location', options);
```

Для отключения транзитов используем метод `core.removeTransits()` который принимает в качестве аргументов все тоже самое что и метод `useTransits()`

### Создание новых транзитов

*To be continued…*


## Параметры приложения

*To be continued…*


## TODO

1. Дописать ReadMe;
2. Написать примеры работы;
3. Вынести демки в бранч `gh-pages`;
4. Сделать документацию по коду;


## Авторы
[<NAME>](https://github.com/a-ignatov-parc)

Так же особое спасибо за помощь:

* [<NAME>](https://github.com/f-andrejchev-parc)

[И всем остальным кто помогал](https://github.com/a-ignatov-parc/Marrow/contributors)<commit_msg>Заголовки переменованы в английский для того чтоб на них можно было создавать ссылки<commit_after># Marrow.js

`Marrow.js` это микрофреймворк с загрузчиком, который позволяет создавать в страницу "песочницу" и загружать в нее любое веб приложение предоставляя ему api для работы как с основной страницей + набор полезных утилит.

---

`Marrow.js` предоставляет следующие механизмы:

1. Загрузка веб-приложения в песочницу с настройкой кастомного окружения и подгрузкой зависимостей через рецепты;
1. Для каждого приложения можно подключить один рецепт который определяет список зависимостей для запуска приложения. Так же отвечает за подготовку окружения песочницы

## Demos

Список демо-экспериментов возможностей `Marrow.js`:

* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/thorax/) приложения TodoMVC написанный на `thorax.js`;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/angular/) приложения TodoMVC написанный на `angular.js`;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/doubleapp/) запуска нескольких приложений TodoMVC написанных на `angular.js` и `thorax.js` работающих синхронно в зависимости от адреса;
* [Демо](http://a-ignatov-parc.github.io/Marrow/demos/multipleapp/) запуска одного и того же приложения 3 раза с разными параметрами.


## Loader
###### Расположение: `core/core.loader.js`

Загрузчик `Marrow` является оберткой над загрузчиком [curl.js](https://github.com/cujojs/curl/) собранного с плугинами `js`, `css`, `link`. 

В свою очередь предотвращая проникновение переменных `curl.js` в глобальную область видимости, а так же предоставляя следующие возможности:

1. Настройка загрузчика в зависимости от настроек приложения;
1. Определение и автоматическая подстановка необходимых префиксов в зависимости от расширения файла;
1. Возможность контролировать область загрузки файлов:
	* Загрузка в "песочницу" к текущему приложению. Поведение по умолчанию;
	* Загрузка в основную страницу. Используется для загрузки стилей в область видимости страницы;
1. В зависимости от параметра запуска приложения позволяет загружать девелоперские версии файлов или же пожатые и минифицированные (файлы для продакшена).

Все статические ресурсы должны хранится в папке `/static` путь до которой можно указывать в настройках приложения (*см. соответсвующий раздел*).

Загрузчик предоставляет следующие преднастроенные правила для загрузки файлов:

* `root` – Правило указывает на директорию `js`. Cоздано "на всякий случай" и вредли пригодится в реальных условиях;

	```
"root/marrow.js" => site.com/static/js/marrow.js
```

* [**deprecated**] `core` – Правило указывает на директорию `js/core`. Создавалось для загрузки файлов ядра. Начиная с версии `0.2.15` ядро без сборки не работоспособно.

	```
"core/core.observatory.js" => site.com/static/js/core/core.observatory.js
```

* `system` – Правило указывает на директорию `js/libs`. Cоздано

	```
"system/jquery/jquery.caret.min.js" => site.com/static/js/libs/jquery/jquery.caret.min.js
```

* `recipes` – Правило указывает на директорию `js/recipes`. Cоздано
* `helpers` – Правило указывает на директорию `js/helpers`. Cоздано
* `recipe` – Правило указывает на директорию `js/recipes/<имя выбранного рецепта>`. Cоздано
* `recipe_libs` – Правило указывает на директорию `js/recipes/<имя выбранного рецепта>/libs`. Cоздано

## Recipes
###### Расположение: `recipes/<recipe_name>/recipe.js`

Для каждого приложения можно подключить один рецепт который определяет список зависимостей для запуска приложения. Так же отвечает за подготовку окружения песочницы перед инициализацией приложения.

Рецепт может 

## Transits
###### Расположение: `core/transits/core.transit.<transit_name>.js`

Транзиты предназначены для прозрачного прокидывания определенного функционала (нативного фунционала или же функционала библиотек) из песочницы в главную страницу.

Существующие транзиты:

1. `core.transit.jquery` – Предназначен для прокидывания селекторов jQuery загруженного в песочницу. Всем селекторам выполненные в песочнице будет автоматически добавляться контекс поиска основной страницы
	> ##### Пример:
	> Без активированного транзита селектор `$('body')` выдаст в качестве результата DOM элемент `sandbox.document.body` находящийся в песочнице, который не предсталвяет никакой ценности, так как песочница не имеет визуального представления.
	
	> С активированным транзитом результатом этого же селектора будет равен `window.document.body`, которой является уже элементом оснавной страницы с которой уже можно работать.

1. `core.transit.location` – Предназначен для двунаправленной синхронизации `location.hash`. При активации этого транзита изменение `location.hash` в песочнице моментально будет отражено на `location.hash` основной страницы и наоборот.

### Работа с транзитами

Для активации транзитов стоит использовать метод: 

```
core.useTransits('<transit_name>', '<transit_name>', …, options);
```

Который принимает в качестве аргументов перечисление строковых названий транзитов которые необходимо активировать. Опции для метода активации транзитов должны идти объектом переданный последним аргументом. 
> Объект опций обязателен для передачи.

#####Пример:

```
// Активируем транзит для jQuery
core.useTransits('jquery', options);

// Активируем транзиты jquery и location
core.useTransits('jquery', 'location', options);
```

Для отключения транзитов используем метод `core.removeTransits()` который принимает в качестве аргументов все тоже самое что и метод `useTransits()`

### Создание новых транзитов

*To be continued…*


## App params

*To be continued…*


## TODO

1. Дописать ReadMe;
2. Написать примеры работы;
3. Вынести демки в бранч `gh-pages`;
4. Сделать документацию по коду;


## Authors
[<NAME>](https://github.com/a-ignatov-parc)

Так же особое спасибо за помощь:

* [<NAME>](https://github.com/f-andrejchev-parc)

[И всем остальным кто помогал](https://github.com/a-ignatov-parc/Marrow/contributors)
{'fraction_non_alphanumeric': 0.09382967873533911, 'fraction_numerical': 0.002889682134965154, 'mean_word_length': 5.440613026819923, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 33, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '695939', 'n_tokens_mistral': 4808, 'n_tokens_neox': 5588, 'n_words': 1211}