Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #161 (permalink)  
Старый 10.12.2013, 14:38
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 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>


только нужно уточнять что в тексте не должно быть фигурных скобок
Ответить с цитированием
  #162 (permalink)  
Старый 10.12.2013, 15:10
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от Maxmaxmaximus4
 
Регистрация: 08.12.2013
Сообщений: 142

Сообщение от animhotep
только нужно уточнять что в тексте не должно быть фигурных скобок
я думаю не стоит уточнять, так как это и умственно отсталому понятно =)

а вообще седня добавлю поддержку экранирования \{

Последний раз редактировалось Maxmaxmaximus4, 10.12.2013 в 15:18.
Ответить с цитированием
  #163 (permalink)  
Старый 10.12.2013, 15:21
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Maxmaxmaximus4, пример не ui, а пример как ты сделал что бы переменные внутри функции контроллера не были глобальными?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #164 (permalink)  
Старый 10.12.2013, 15:42
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от Maxmaxmaximus4
 
Регистрация: 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.
Ответить с цитированием
  #165 (permalink)  
Старый 10.12.2013, 15:50
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Maxmaxmaximus4, тьфу блин, мог сразу сказать что костылями страдаешь, а то я думал есть какой то нормальный способ о котором я не знаю)
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #166 (permalink)  
Старый 10.12.2013, 15:53
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от Maxmaxmaximus4
 
Регистрация: 08.12.2013
Сообщений: 142

cyber, что за костыли?
Ответить с цитированием
  #167 (permalink)  
Старый 10.12.2013, 15:59
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Maxmaxmaximus4, т.е переписывать тело функции это не костыль?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #168 (permalink)  
Старый 10.12.2013, 16:19
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от Maxmaxmaximus4
 
Регистрация: 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.
Ответить с цитированием
  #169 (permalink)  
Старый 10.12.2013, 16:27
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Maxmaxmaximus4, я так понимаю такой код, работать не будет
function User(_name, _age) {
    name = _name
    age = _age
  }

User("name", 10);
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #170 (permalink)  
Старый 10.12.2013, 16:43
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от Maxmaxmaximus4
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно найти разрешение рабочей области браузера? Влад Общие вопросы Javascript 3 20.07.2009 10:18
Как найти конец плоского файла Don_001 Общие вопросы Javascript 1 07.07.2009 12:47
Как можно изменить расстояние между панелями overlay и filmstrip в фотогалереи? Honey jQuery 0 29.06.2009 10:16
как найти нужный объект? `p r o x y jQuery 2 05.05.2009 01:12
Как найти путь к файлу для модификации? JuliaMilan Firefox/Mozilla 0 31.03.2009 14:06