10.12.2013, 14:38
|
|
Профессор
|
|
Регистрация: 17.01.2013
Сообщений: 887
|
|
<script src='//mychamber.ru/build/ui.js'></script>
<div controller="User">
Привет { , тебе {age} лет!
</div>
<div controller="User as user">
Привет {user.name}, тебе {user.age} лет!
</div>
<script>
function User() {
name = 'Ашот'
age = 15
}
</script>
только нужно уточнять что в тексте не должно быть фигурных скобок
|
|
10.12.2013, 15:10
|
Кандидат Javascript-наук
|
|
Регистрация: 08.12.2013
Сообщений: 142
|
|
Сообщение от animhotep
|
только нужно уточнять что в тексте не должно быть фигурных скобок
|
я думаю не стоит уточнять, так как это и умственно отсталому понятно =)
а вообще седня добавлю поддержку экранирования \{
Последний раз редактировалось Maxmaxmaximus4, 10.12.2013 в 15:18.
|
|
10.12.2013, 15:21
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Maxmaxmaximus4, пример не ui, а пример как ты сделал что бы переменные внутри функции контроллера не были глобальными?
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
10.12.2013, 15:42
|
Кандидат Javascript-наук
|
|
Регистрация: 08.12.2013
Сообщений: 142
|
|
оч просто, я создал сервис который это делает $parseController =) пока это, быдлокод и я еще не рефакторил.
на 172 строчке часть которая тебя интересует.
ui.service('$parseController', function() {
function getParams(code) {
return code.match(/\(([\s\S]*?)\)/)[1].match(/[$\w]+/img) || [];
}
function asyncServices(code) {
var reg = /^\s*(.+?)=\s*([$\w]+).+?(?=\n)/igm;
var params = getParams(code);
function isService(service) {return ~params.indexOf(service) || /^\$/.test(service) }
return code.replace(reg, function(match, exp, service) {
if (!isService(service)) return match;
return ';' + service + '.$async = function($$val){' + exp + '=$$val;$$scope.$digest()};\n' +
match;
});
}
function globalsToScope(code) {
var parsedFunc = getFunction(code);
var funcHead = parsedFunc.head;
var funcBody = parsedFunc.body;
var localVars = getLocalVarNames(funcHead, funcBody);
var functions = getFunctions(funcBody);
var newFuncBody = functions.length ? '' : replaceGlobalVars(funcBody, localVars);
for (var i = 0; i < functions.length; i++) {
var fun = functions[i];
var start = (i === 0) ? 0 : functions[i - 1].closeBlock;
var q = funcBody.slice(start, fun.open);
newFuncBody += replaceGlobalVars(q, localVars);
newFuncBody += globalsToScope(fun.code);
if (i === (functions.length - 1)) {
newFuncBody += replaceGlobalVars(funcBody.slice(fun.closeBlock), localVars);
}
}
return funcHead + newFuncBody;
}
function replaceGlobalVars(code, localVars) {
return code = code.replace(/([\n;]\s*)([$_\w]+)\s*=/img, function(match, space, varName) {
if (~localVars.indexOf(varName)) return match;
return space + '$$self.' + varName + '=';
});
}
function getLocalVarNames(funcHead, funcBody) {
var paramNames = funcHead.match(/\(([\s\S]*?)\)/)[1].match(/[$_\w]+/img) || [];
var declarationRegExp = /var\s+([$_\w]+(?:\s*,\s*[$_\w]+)*)/img;
var varNameRegExp = /[$_\w]+/img;
var varNames = paramNames;
clearFromFunctions(funcBody).replace(declarationRegExp, function(match, declaration) {
[].push.apply(varNames, declaration.match(varNameRegExp));
});
return varNames;
}
function clearFromFunctions(code) {
var functions = getFunctions(code);
each(functions, function(func) { code = code.replace(func.code, '') });
return code;
}
function clearFromComments(code) {
return code.replace(/(\/\*[\s\S]*?\*\/)|(\/\/[\s\S]*?(?=\n))/img, '');
}
function getFunctions(code) {
var index = 0;
var functions = [];
while (true) {
var foundFunction = getFunction(code, index);
if (!foundFunction) break;
index = foundFunction.closeBlock;
functions.push(foundFunction);
}
return functions;
}
function getFunction(code, index) {
var open = /function\s*[$_\w]*\s*\([\s\S]*?\)\s*?\{/img;
var reg = /(\{)|(\})/img;
return findBlock(code, open, reg, index);
}
function bracketCells(code) {
var bracketCells = getBracketCells(code);
var regExp = /(?:([$\w]+)\s*\.\s*)?([$\w]+)\s*=\s*\(([\s\S]*)\)/im;
for (var i = 0; i < bracketCells.length; i++) {
var bracketCell = bracketCells[i];
code = code.replace(bracketCell.code, function(subStr) {
var match = subStr.match(regExp);
var cell = match[2];
var exp = match[3];
return '\n;$$scope.$cell("' + cell + '",function(){return ' + exp + '}.bind(this));';
});
}
return code;
}
function getBracketCells(code) {
var index = 0;
var cells = [];
while (true) {
var foundCell = findBlock(code, /[\n;]\s*.+?=\s*?\(/img, /(\()|(\))/img, index);
if (!foundCell) break;
index = foundCell.closeBlock;
cells.push(foundCell);
}
return cells;
}
function findBlock(code, openRegExp, bracketRegExp, index) {
index = index || 0;
openRegExp.lastIndex = index;
var bracketCnt = 0;
var headEntry = openRegExp.exec(code);
if (!headEntry) return null;
var head = headEntry[0].slice(0, -1);
var startIndex = headEntry.index;
var openBlockIndex = headEntry.index + head.length;
bracketRegExp.lastIndex = openBlockIndex;
do {
var find = bracketRegExp.exec(code);
if (!find) return null;
if (find[1]) bracketCnt++;
else bracketCnt--;
} while (bracketCnt);
return {
open : startIndex,
openBlock : openBlockIndex,
closeBlock: bracketRegExp.lastIndex,
head : head,
body : code.slice(openBlockIndex, bracketRegExp.lastIndex),
code : code.slice(startIndex, bracketRegExp.lastIndex)
}
}
return function(controller) {
var regExp = /function\s*[$_\w]*\s*\(([\s\S]*?)\)\s*\{([\s\S]*)\}/;
var code = controller.toString();
code = clearFromComments(code);
code = globalsToScope(code);
code = bracketCells(code);
code = asyncServices(code);
var match = code.match(regExp)
var params = match[1];
var body = 'var $$self=this;with($$self){' + match[2] + '}';
var inject = controller['$inject'];
if (!inject) inject = params.match(/[$_\w]+/img) || [];
inject.push('$scope');
params = params ? params + ',$$scope' : '$$scope';
var newController = new Function(params, body);
newController.prototype = controller.prototype;
newController['$inject'] = inject;
return newController;
};
});
Последний раз редактировалось Maxmaxmaximus4, 10.12.2013 в 15:45.
|
|
10.12.2013, 15:50
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Maxmaxmaximus4, тьфу блин, мог сразу сказать что костылями страдаешь, а то я думал есть какой то нормальный способ о котором я не знаю)
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
10.12.2013, 15:53
|
Кандидат Javascript-наук
|
|
Регистрация: 08.12.2013
Сообщений: 142
|
|
cyber, что за костыли?
|
|
10.12.2013, 15:59
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Maxmaxmaximus4, т.е переписывать тело функции это не костыль?
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
10.12.2013, 16:19
|
Кандидат Javascript-наук
|
|
Регистрация: 08.12.2013
Сообщений: 142
|
|
Сообщение от cyber
|
т.е переписывать тело функции это не костыль?
|
я парсю контроллеры так как в них присутствует новый синтаксис,
это = '' не глобальная переменная, это поле контроллера, я же говорил.
c = (a+b) это не приравнивание сумы a+b в глобальную переменную c, это новый синтаксис, в поле с мы кладем не значение а ячейку, формулу, при обращении к которой результат которой будет сумма полей a и b.
UPD, я только что придумал по другому:
точнее так, "глобальные" будут называтьяся не поля а ячейки, формулы будут называться формулы, а значения будут называться значения
ячейка1 = 'значение'
ячейка2 = (ячейка1 + '!!!') // формула
Сообщение от cyber
|
т.е переписывать тело функции это не костыль?
|
и нет, cyber, парсинг синтаксиса это не костыль.
Последний раз редактировалось Maxmaxmaximus4, 10.12.2013 в 16:54.
|
|
10.12.2013, 16:27
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
Maxmaxmaximus4, я так понимаю такой код, работать не будет
function User(_name, _age) {
name = _name
age = _age
}
User("name", 10);
__________________
Цитата:
|
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
|
|
|
10.12.2013, 16:43
|
Кандидат Javascript-наук
|
|
Регистрация: 08.12.2013
Сообщений: 142
|
|
cyber, нет, контроллеры так не вызываются, я добавил возможность описывать их не так
ui.controller('User',function(){ })
а просто в window, просто как бонус, ну это куда проще для демонстраций =), он просто смотрит если такого контроллера нету в модуле то поискать в window =) мелочь а приятно. Контроллеры по идеологии не должны использовать замыкания из вне и обращаться к чему-то из вне, все что им нужно они должны запрашивать в виде сервисов, которые именуются со знака бакс, $http например сервис для общения с сервером. Мы просто пишем в коде контроллера $http и у нас автоматически туда подключается сервис $http. (Чтобы идешка не ругалась мы можем написать у контроллера параметр $http)
сервисы, как ты понял, тоже создаются оч просто
ui.service('$http',function(){
return {} // возвращаем обьект сервиса
//все сервисы синглтоны кстати, так что то что тут вернется, будет для всех общее
})
например вот:
<script src='//mychamber.ru/build/ui.js'></script>
<button controller="User" click="say()">say</button>
<script>
function User() {
say = function() { $ololo('РААБОТАЕТ11111') }
}
ui.service('$ololo', function() {
return function(text) { alert(text) }
})
</script>
Последний раз редактировалось Maxmaxmaximus4, 10.12.2013 в 17:01.
|
|
|
|