anchor.diff:  					tag_size_s = tag_size_s.reverse();
   
   					$.each(tag_s2, function(layer_idx, tag_s ){
  -						//console.log("tag_s : " + JSON.stringify(tag_s))//like [div]
   						var new_parent_s = [];
  -						//console.log('tag_s.tag_s:'+JSON.stringify(tag_s.tag_s));
   						$.each(parent_s, function(pIdx, parent){
   							for(var i=0; i < tag_s.tag_s.length; ++i){
  -								var input_tag = tag_s.tag_s[i];
  -								var tag_id_cls = [];
  -								//remove param
  -								parenthesis_first = input_tag.indexOf('(');
  -								parenthesis_last = input_tag.indexOf(')');
  -								if( parenthesis_last < parenthesis_first || parenthesis_first * parenthesis_first < 0 ){
  -									throw new TypeError(input_tag);
  -								}
  -								if(parenthesis_first !== -1 ){
  -									var raw_param = input_tag.substring(parenthesis_first + 1, parenthesis_last).trim();
  -									input_tag = input_tag.substring(0, parenthesis_first) + input_tag.substring(parenthesis_last + 1, input_tag.length);
  -									var raw_param_split = raw_param.split(',');
  -									var length_raw_param_split = raw_param_split.length;
  -									var param_s = {};
  -									for(var p=0; p<length_raw_param_split; ++p){
  -										var var_val = raw_param_split[p].split('=');
  -										var val = null;
  -										if(var_val.length === 2){
  -											if(param_map.hasOwnProperty(var_val[0])){
  -												throw new Error('Error var dupe : '+input_tag);
  -											}
  -											param_map[var_val[0]] = var_val[1];
  -											val = var_val[1];
  -										}else if(var_val.length = 1){
  -											val = param_map.hasOwnProperty(var_val[0]) ? param_map[var_val[0]] : var_val[0];
  -										}else{
  -											throw new TypeError(var_val);
  -										}
  -										param_s["$"+Object.keys(param_s).length] = val;
  -									}
  -								}
  -								if(input_tag.indexOf('.') > -1){
  -									tag_id_cls = input_tag.split('.');//has class
  -								}else{
  -									tag_id_cls[0] = input_tag;
  -								}
  -								var prop_s = {};
  -								var tag_id = tag_id_cls[0];
  -								var tag = null;
  -								if(tag_id.indexOf('#') > -1){
  -									tag_id = tag_id.split('#');
  -									//TODO validation
  -									tag = tag_id[0];
  -									prop_s['id'] = tag_id[1];
  -								}else{
  -									tag = tag_id;
  -								}
  -
  +								//tag_s.tag_s[i] :  tag#hoge.fuga.hage($col=4,5,0) //removed "*n"
  +								var input_tag_param_s = extract_param_from(tag_s.tag_s[i], param_map, parent_param_s);//副作用 param_mapへ
  +								var input_tag = input_tag_param_s[0];
  +								var param_s = input_tag_param_s[1];
  +								//css selector
  +								var tag_prop_s = extract_css_selector(input_tag, prop_map);
  +								var tag = tag_prop_s[0];
  +								var prop_s = tag_prop_s[1];
   								//サイズ指定が無いと､選択不能な1pxサイズになるため､初期サイズを確保
  -								if(prop_map.hasOwnProperty('*')){
  -									prop_s['style'] = prop_map['*'];
  -								}
   								set_default_size(tag, prop_s, tag_size_s, layer_idx, i);
  -								var tmp_cls = '';
  -								for(var cl=1; cl < tag_id_cls.length; ++cl){//0 := tag#id
  -									var tmp = tag_id_cls[cl];
  -									tmp_cls += tmp+' ';
  -									if(prop_map.hasOwnProperty( '.'+tmp)){
  -										prop_s['style'] = merge_css(prop_s['style'], prop_map['.'+tmp]);
  -									}
  -								}
  -								prop_s['class'] = tmp_cls;
  -								if(tag.indexOf('=') > -1){
  -									//TODO []
  -								}
   								
  -								var child = null;
   								if(part_map.hasOwnProperty(tag)){//part nest route
  -									if(tag_id_cls.length > 1){
  -										alert("Sorry. parts in Tag don't support #.[]");
  -										throw new TypeError("Sorry. parts in Tag don't support #.[]");
  -									}
  -									var index_tag = infinite_loop_check.indexOf(tag);
  -									if(index_tag > -1){
  -										infinite_loop_check = [];
  -										alert('Error : '+tag+' : infinite loop detected !');
  -										throw new TypeError('Error : infinite loop !');
  -									}
  +									//error check
  +									check_input_data(tag, prop_s, infinite_loop_check);
   									infinite_loop_check.push(tag);//new
  -									var child_last = convert_lineardata_to_child_s(format_raw_tag_s(part_map[tag], param_s), prop_map, val_s, part_map, param_map, param_s);
  +									var child_last = convert_lineardata_to_child_s(format_raw_tag_s(part_map[tag], param_s), prop_map, val_s, part_map, param_map, param_s, infinite_loop_check);
   									infinite_loop_check[infinite_loop_check.indexOf(tag)] = "";//delete
  -									var length_child_s = child_last.child_s.length;
  -									for(var j=0; j < length_child_s; ++j){
  -										child = child_last.child_s[j];
  -										parent.child_s.push(child);
  -									}
  +									$.merge(parent.child_s, child_last.child_s);
   									// child の一番下の子孫を新しい親とする
   									$.merge(new_parent_s, child_last.last_child_s);//子供もやがて親になる･･･
   								}else{
  +									$.each(HTML5のタグには無い文字, function(idx,forbidden_char){//TODO tagを分解して回した方が良いはず
  +										if(tag.indexOf(forbidden_char) > 0) throw new TypeError('Tag : '+tag+' does not belong to HTML5. ');
  +									});
   									if(prop_map.hasOwnProperty(tag)){
   										var kept_style = merge_css(prop_s.style, prop_map[tag].style);
   										$.extend(prop_s, prop_map[tag]);
   										prop_s.style = kept_style;
   									}
  -									child = my_apply(tag, prop_s,[]);
  -									//draggable と resizableが同時には正常に動かないタグについては､div.wrapperでwrapしておく
  +									var child = my_apply(tag, prop_s,[]);
   									if($.inArray(tag, draggableとresizableが同時には正常に動かないためwrapするタグ) > -1){
  -										var wrapper = my_apply('div',{"class":"wrapper","style":"background-color:transparent;padding:8px;"},[child] );
  -										parent.child_s[i] = wrapper;
  -										var child_class = child.prop_s['class'];
  -										if( typeof child_class === 'undefined'){
  -											child.prop_s['class'] = '';
  -										}
  +										if(! child.prop_s.hasOwnProperty('class')){	child.prop_s['class'] = '';	}
   										child.prop_s['class'] += ' wrapped';
  -									}else{
  -										parent.child_s.push(child);
  +										child = my_apply('div',{"class":"wrapper","style":"background-color:transparent;padding:8px;"},[child] );//wrapper
   									}
  +									parent.child_s.push(child);
   									new_parent_s.push(child);//子供もやがて親になる･･･
   								}
   							}
   						});
  -						
   						parent_s = new_parent_s;
   					});
   					root_s.last_child_s = parent_s;
  
positive.code: 					if( ! $.isArray(child_s)){
  						throw new TypeError('child_s is not an array.');
  					}
  					
  					return { "tag":tag ,"prop_s":prop_s ,"child_s":child_s};
  				}
  				
  				var draggableとresizableが同時には正常に動かないためwrapするタグ = ["input"	,"select","textarea","ol" ,"ul"];
  				var 必ず子要素のタグ = ["tbody","thead","tr","td","th","li","option"];
  				var サイズを持たせないタグ = ["tbody","thead","tr"];
  				var resizableのみ対象のタグ = [];
  				var infinite_loop_check = [];//再帰を使用しているため無限ループや無限トランポリン対策
  				
  				function convert_lineardata_to_child_s(tag_s2, prop_map, val_s, part_map, param_map, parent_param_s){
  					var root_s = {"child_s":[],"last_child_s":[]};
  					var parent_s = [root_s];
  					var length_tag_s2 = tag_s2.length;
  					//console.log('tag_s2:'+JSON.stringify(tag_s2));
  					// 初期サイズ決定のため､最下層から要素数とサイズを調査する
  					var tag_size_s = [];
  					var counter = 1;
  
negative.code: 					if(raw_tag_holder_s != null && typeof raw_tag_holder_s === 'string'){
  						try{
  							$.extend(rtn_map, JSON.parse(raw_tag_holder_s));
  						}catch(e){}
  					}
  					return rtn_map;
  				}
  