Index: branches/testa-single-bookmark/bin/a.sh
===================================================================
--- branches/testa-single-bookmark/bin/a.sh	(revision 41)
+++ branches/testa-single-bookmark/bin/a.sh	(revision 41)
@@ -0,0 +1,12 @@
+#!/bin/sh
+#build_path=/var/www/vhosts/devconf.northern-cross.info/httpdocs/a/tmp/devconf-guest-4/tmp/md2site-x
+#target=d
+#subtarget=2018
+#conf_dir=/var/www/vhosts/devconf.northern-cross.info/httpdocs/a/tmp/devconf-guest-4/tmp/md2site-x/_xtest/wtjx/t12/conf
+
+build_path=$1
+target=$2
+subtarget=$3
+conf_dir=$4
+
+build.sh ${build_path} ${target} ${subtarget} ${conf_dir}
Index: branches/testa-single-bookmark/bin/b.sh
===================================================================
--- branches/testa-single-bookmark/bin/b.sh	(revision 41)
+++ branches/testa-single-bookmark/bin/b.sh	(revision 41)
@@ -0,0 +1,7 @@
+#!/bin/sh
+in_fname="php/x.php"
+out_fname="php/content3.php"
+
+echo "<?php" > $out_fname
+cat $in_fname >> $out_fname
+echo "?>" >> $out_fname
Index: branches/testa-single-bookmark/bin/build.sh
===================================================================
--- branches/testa-single-bookmark/bin/build.sh	(revision 41)
+++ branches/testa-single-bookmark/bin/build.sh	(revision 41)
@@ -0,0 +1,15 @@
+#!/bin/sh
+build_path=$1
+target=$2
+subtarget=$3
+conf_dir=$4
+
+cd ${build_path}
+#bundle exec ruby bin/md2site make -t ${target} -s ${subtarget} -c ${conf_dir} 
+#bundle exec ruby bin/md2site info -z -c _xtest/wtjx/t12/conf
+#echo bundle exec ruby bin/md2site make -t d -s 2018 -c ${conf_dir}
+
+# bundle exec ruby bin/md2site make -t $target -s $subtarget -c ${conf_dir}
+#/var/www/tmp-work/var/local/ruby/2.5.3/bin/bundle exec ruby bin/md2site make -t $target -s $subtarget -c ${conf_dir}
+
+RUBYOPT=--encoding=UTF-8 /var/www/tmp-work/var/local/ruby/2.5.3/bin/md2site make -t $target -s $subtarget -c ${conf_dir}
Index: branches/testa-single-bookmark/js/bookmarkmenu.js
===================================================================
--- branches/testa-single-bookmark/js/bookmarkmenu.js	(revision 40)
+++ branches/testa-single-bookmark/js/bookmarkmenu.js	(revision 41)
@@ -6,5 +6,4 @@
 
     dlg(){
-console.log("BookmarkMenu dlg()")
 	$( '#bookmark_displayname' ).prop( 'maxlength' , Globalx.bookmark_displayname_max_length)
 	$('#bookmarkDlg').dialog({
@@ -30,5 +29,4 @@
     add_bookmark() {
 	let part = Globalx.parts[ Globalx.index ]
-console.log("add_bookmark part=" + part)
 	$( '#bookmark_displayname' ).val( this.bookmark_mgr.get_restricted_display_name( Globalx[part].key ) )
 	$( '#bookmark_path' ).val( Globalx[part].key )
@@ -38,5 +36,4 @@
     remove_bookmark() {
 	let part = Globalx.parts[ Globalx.index ]
-console.log("remove_bookmark part=" + part)
 	this.bookmark_mgr.remove( part, Globalx[part].key )
 	this.rebuild_bookmark_menu(part)
@@ -46,5 +43,4 @@
 	let part = Globalx.parts[ Globalx.index ]
 	let bookmark_op_sel = Globalx[part].bookmark_op_sel
-console.log("bookmark_op part=" + part + " bookmark_op_sel=" + bookmark_op_sel)
 	if( $( bookmark_op_sel ).is(':checked') == true ){
 	    this.add_bookmark()
@@ -58,5 +54,4 @@
 	let bookmark_op_sel = Globalx[part].bookmark_op_sel
 
-	console.log( "set_click_handler() part=" + part + " bookmark_op_sel=" + bookmark_op_sel )
 	$( bookmark_op_sel ).on( 'click' , () => { 
 	    console.log("bookmark_op_sel clicked")
@@ -74,9 +69,7 @@
 	let num = Globalx.num
 	let bookmark_sel = Globalx[part].bookmark_sel
-console.log("BookmarkMenu rebuld_bookmark_menu num="+num+ " part="+part)
 	$( bookmark_sel ).empty()
 
 	const array = this.bookmark_mgr.get_paths(part)
-console.log("BookmarkMenu rebuld_bookmark_menu array=" + array )
 
 	let content = null
@@ -88,5 +81,5 @@
 	    $( bookmark_sel ).append( content );
 	    console.log( "bookmark_sel="+bookmark_sel)
-	    item = $( bookmark_sel ).last()
+	    item = $( bookmark_sel ).children().last()
 	    console.log( "item=" + item )
 	    item.on('click' , () => {
@@ -105,5 +98,5 @@
     }
 
-    bookmark_action = ( part, key ) => {
+    bookmark_action ( part, key ) {
 	if( key === null || key === "" ){
 	    alert("illeagal key=" + key )
@@ -121,5 +114,4 @@
 
 	$( Globalx[part].key_sel ).val( key )
-console.log("jsondata=" + jsondata)
 	if( jsondata[key].length == 0 ){
 	    Globalx[part].key_indicate_file = true;
Index: branches/testa-single-bookmark/js/main.js
===================================================================
--- branches/testa-single-bookmark/js/main.js	(revision 40)
+++ branches/testa-single-bookmark/js/main.js	(revision 41)
@@ -10,32 +10,52 @@
 function init_globalx_storagex() {
     Globalx.storagex = new Storagex();
+    Globalx.build = {
+	'contest2011.md': {
+	    path: '/attempt/contest2011/data/contest2011.md',
+	    target: 'cont',
+	    subtarget: '2011',
+	    category: 'attempt',
+	    output_html: 'contest2011.html',
+	    alias_html: 'contest.html',
+	}
+    }
+
 }
+
 
 function init_globalx() {
     Globalx.num = 0
     Globalx.index = 0
-    Globalx.parts = ["data", "output", "setting"]
+    Globalx.parts = ["data" , "output", "setting"]
     Globalx.bookmark_displayname_max_length = 18
     Globalx.output_url = null
+    Globalx.remote_filename = 'php/content3.php'
+    Globalx.build = new Build()
 
     tab_init()
     topmenu_init()
-    Globalx.remotex = new Remotex('php/content.php')
-    console.log( "init_globalx 1 : Globalx.bookmark_mgr="  + Globalx.bookmark_mgr )
+    Globalx.remotex = new Remotex( Globalx.remote_filename )
     if( Globalx.bookmark_mgr === null || Globalx.bookmark_mgr === undefined ){
 	Globalx.bookmark_mgr = new BookmarkMgr(Globalx.bookmark_displayname_max_length, Globalx.parts)
     }
-    console.log( "init_globalx 2 : Globalx.bookmark_mgr="  + Globalx.bookmark_mgr )
     Globalx.bookmarkmenu = null
+
+    Globalx.build.setup()
 }
 
-async function get_output_url_async( func ){
+async function update_all_filelist( ) {
+    Globalx.parts.map( ( part ) => {
+	Globalx[ part ].sidemenu.update(`#${part}-side`)
+    } )
+}
+
+async function get_output_url_async( num, func ){
     let realData = Globalx.storagex.get_output_url()
 
     if( realData === undefined || realData === null ){
-	await Globalx.remotex.get_output_url( func )
+	await Globalx.remotex.get_output_url( num, func )
     }
     else{
-	const obj = Globalx.storagex.get_output_url( num , part )
+	const obj = Globalx.storagex.get_output_url( num )
 	Globalx.output_url = obj.output_url
 	Globalx.storagex.save_as_info_from_globalx()
@@ -44,5 +64,5 @@
 
 async function setup(){
-    get_output_url_async( (text) => {
+    get_output_url_async( Globalx.num, (text) => {
 	let str = text
 	let obj
@@ -65,6 +85,4 @@
     setup()
 
-    console.log("##### Globalx.bookmarkmenu=" + Globalx.bookmarkmenu)
-    console.log("##### Globalx.bookmark_mgr=" + Globalx.bookmark_mgr)
     Globalx.bookmarkmenu = new BookmarkMenu( Globalx.bookmark_displayname_max_length , Globalx.bookmark_mgr )
     Globalx.bookmarkmenu.dlg()
@@ -73,4 +91,5 @@
 	set_globalx_editor(part)
 
+	Globalx[ part ].menu = null
 	Globalx[ part ].sidemenu = new SideMenu( Globalx.num, part )
 	Globalx[ part ].sidemenu.setup(`#${part}-side`)
@@ -84,11 +103,6 @@
     if( need_to_save ){
 	// LocalStorageにまだ保存していない場合、ここで保存しておく
-	//console.log("call save_as_info_from_globalx()")
 	Globalx.storagex.save_as_info_from_globalx( (data) => { console.log( "data=" + data ) } )
     }
-/*
-    Object.keys(Globalx).forEach((key) => {
-	console.log(key)
-    }) */
 }
 
@@ -130,6 +144,11 @@
 
       let textarea = $( Globalx[part].textarea_sel )
-      editor.getSession().on("change", (textarea) => {
-          textarea.val(editor.getSession().getValue());
+      editor.getSession().on("change", () => {
+/*          textarea.val(editor.getSession().getValue()) */
+	  $( Globalx[part].textarea_sel ).val(editor.getSession().getValue())
       });
 }
+
+function upload_to_host( part ){
+    Globalx.remotex.upload_to_host( part )
+}
Index: branches/testa-single-bookmark/js/remotex.js
===================================================================
--- branches/testa-single-bookmark/js/remotex.js	(revision 40)
+++ branches/testa-single-bookmark/js/remotex.js	(revision 41)
@@ -7,5 +7,5 @@
     }
 
-    make_url_params( arrayx ){
+    make_url_params0( arrayx ){
 	let params = new URLSearchParams();
 	arrayx.reduce(function(acc, element, index, array) {
@@ -13,40 +13,42 @@
 	    return acc;
 	}, params)
-	return params;
+	return params.toString();
+    }
+
+    make_url_params( arrayx , num ){
+	let params = new URLSearchParams();
+	for(let i=0; i<num; i++ ){
+	    params.append(arrayx[i][0], arrayx[i][1])
+	}
+	const pa = params.toString()
+	return pa
     }
 
     async get_filelist_from_remote( num, part, func ) {
-	console.log("remotex get_filelist_from_remote num=" + num + " part=" + part )
 	let param_array = [['cmd', 'get_filelistx'], ['num', num ], ['part', part ]]
-	await this.fetchx( this.filename , param_array, func )
+	await this.fetchx( this.filename , param_array, 3, func )
     }
 
     async update_filelist( num, part, func ) {
-	console.log("remotex update_filelist num=" + num + " part=" + part )
 	let param_array = [['cmd', 'update_filelistx'], ['num', num ], ['part', part ]]
-	await this.fetchx( this.filename , param_array, func )
+	await this.fetchx( this.filename , param_array, 3, func )
     }
 
     async get_content(num, part, path , func) {
-	console.log("remotex get_content num=" + num + " part=" + part )
-	console.log("part=" + part)
 	let param_array = [['cmd', 'get_content'], ['num', num ], ['part', part ], ['path', path]]
-	await this.fetchx( this.filename , param_array, func )
+	await this.fetchx( this.filename , param_array, 4, func )
     }
 
     async get_output_url(num, func) {
-console.log("get_output_url")
-	console.log("remotex get_output_url num=" + num )
 	let param_array = [['cmd', 'get_output_url'], ['num', num ] ]
-	await this.fetchx( this.filename , param_array, func )
+	await this.fetchx( this.filename , param_array, 2, func )
     }
 
-    async fetchx( filename, param_array, func) {
-console.log("fetchx func" + func)
-	let params = this.make_url_params( param_array )
+    async fetchx( filename, param_array, num, func) {
+	let params = this.make_url_params( param_array , num )
 	fetch(`${filename}?${params}`)
-	    .then((response) => response.text())
-	    .then((text) => { console.log(func) ; if( func !== undefined ){func(text)} else { console.log("func=undefined")} })
-	    .catch((error) => console.log(error));
+	    .then((response) => { return response.text() })
+	    .then((text) => { func(text) })
+	    .catch((error) => console.log("error=" + error));
     }
 
@@ -54,6 +56,65 @@
 	if( Globalx[part].key_indicate_file === true ){
 	    let textarea = $( Globalx[part].textarea_sel )
-	    upload_content(Globalx.num, part, Globalx[part].key, textarea.val())
+	    this.upload_content(Globalx.num, part, Globalx[part].key, textarea.val())
 	}
+    }
+
+    async build( cmd, num, part, path, content, func = null ) {
+	await this.upload_file( cmd, num, part, path, content, func = null )
+    }
+
+    async upload_file(cmd, num, part, path, content, func = null) {
+	let form = document.createElement('form')
+	let req_cmd = document.createElement('input')
+	let req_num = document.createElement('input')
+	let req_part = document.createElement('input')
+	let req_path = document.createElement('input')
+	let req_content = document.createElement('input')
+
+	document.body.appendChild(form)
+
+	req_cmd.type = 'hidden'
+	req_cmd.name = 'cmd'
+	req_cmd.value = cmd
+	
+	req_num.type = 'hidden'
+	req_num.name = 'num'
+	req_num.value = num + ''
+	
+	req_part.type = 'hidden'
+	req_part.name = 'part'
+	req_part.value = part
+	
+	req_path.type = 'hidden'
+	req_path.name = 'path'
+	req_path.value = path
+	
+	req_content.type = 'hidden'
+	req_content.name = 'mytext'
+	req_content.value = content
+	
+	form.appendChild(req_cmd)
+	form.appendChild(req_num)
+	form.appendChild(req_part)
+	form.appendChild(req_path)
+	form.appendChild(req_content)
+	
+	// FormDataオブジェクトを作成する
+	var form_data = new FormData(form);
+console.log("remotex.js filename=" + this.filename )
+	fetch( this.filename , {
+	    method: 'POST',
+	    mode: 'same-origin', /* 'no-cors' 'cors' 'same-origin' */
+	    body: form_data
+	})
+	    .then((response) => {
+		return response.text()
+	    })
+	    .then((data) => {console.log( "data=" + data)
+			     if( func !== null ){
+				 func(data)
+			     }
+			    })
+	    .catch((error) => {console.log("error=" + error)})
     }
 
@@ -64,4 +125,5 @@
 	let req_cmd = document.createElement('input');
 	let req_num = document.createElement('input');
+	let req_part = document.createElement('input');
 
 	document.body.appendChild(form);
@@ -82,20 +144,25 @@
 	req_num.value = num + '';
 	
+	req_part.type = 'hidden';
+	req_part.name = 'part';
+	req_part.value = part;
+	
 	form.appendChild(req_content);
 	form.appendChild(req_path);
 	form.appendChild(req_cmd);
 	form.appendChild(req_num);
+	form.appendChild(req_part);
 	
 	// FormDataオブジェクトを作成する
 	var form_data = new FormData(form);
-
-	fetch('php/content.php', {
+console.log("remotex.js filename=" + this.filename )
+	fetch( this.filename , {
 	    method: 'POST',
 	    mode: 'same-origin', /* 'no-cors' 'cors' 'same-origin' */
 	    body: form_data
 	})
-	    .then((response) => response.text())
-	    .then((data) => console.log(data))
-	    .catch((error) => console.log(error));
+	    .then((response) => { return response.text()})
+	    .then((data) => {console.log( "data=" + data)})
+	    .catch((error) => {console.log("error=" + error)});
     }
 
Index: branches/testa-single-bookmark/js/sidemenu.js
===================================================================
--- branches/testa-single-bookmark/js/sidemenu.js	(revision 40)
+++ branches/testa-single-bookmark/js/sidemenu.js	(revision 41)
@@ -12,58 +12,60 @@
     }
 
-    async setup(top_sel){
-	console.log("SideMenu setup menu_sel=" + this.menu_sel)
-	let content = `<ul id="${this.menu_id}"></ul>`
-	$(top_sel).append( content )
-	this.get_filelist_async( this.num , this.part , (text) => {
-	    console.log("SideMenu setup text=" + text)
-	    let str = text
-	    let obj
-	    if( str.match( /{.*}/ ) === null ){
-		obj = {}
-		console.log("sidemenu setup 1 num=" + this.num + " part=" + this.part)
-	    }
-	    else {
-		obj = JSON.parse( str )
-		console.log("sidemenu setup 2 num=" + this.num + " part=" + this.part + " str="+str)
-	    }
-	    console.log( "sidemenu setup this.num=" + this.num + " this.part=" + this.part )
-	    Globalx.storagex.change_cache( obj, this.num , this.part )
-	    
-	    this.make_menu_item_list( obj , Globalx[this.part].key)
-	    $( this.menu_sel ).menu({
+    display_menu( text ) {
+	let str = text
+	let obj
+	if( str.match( /{.*}/ ) === null ){
+	    console.log("sidemenu 1 num="+ this.num + " part="+ this.part +" str="+str)
+	    obj = {}
+	}
+	else {
+	    console.log("sidemenu 2 num="+ this.num +" part="+ this.part +" str="+str)
+	    obj = JSON.parse( str )
+	}
+	Globalx.storagex.change_cache( obj, this.num , this.part )
+
+	this.setup_menu(obj)
+    }
+
+    setup_menu(obj){
+	this.make_menu_item_list( obj , Globalx[this.part].key)
+	if( Globalx[this.part].menu === null ){
+	    Globalx[this.part].menu = $( this.menu_sel ).menu({
 		classes: {
 		    "ui-menu": "highlight"
 		}
 	    })
-	})
+	}
+    }
+
+    menu_init( top_sel ){
+	$( top_sel ).empty()
+	let content = `<ul id="${this.menu_id}"></ul>`
+	$( top_sel ).append( content )
+    }
+
+    async setup( top_sel ){
+	this.menu_init( top_sel )
+	this.get_filelist_async( this.num , this.part , (text) => {
+	    this.display_menu(text)
+	} )
+    }
+
+    async update( top_sel ){
+	this.menu_init( top_sel )
+	await Globalx.remotex.update_filelist( this.num, this.part, (text) => {
+	    this.display_menu(text)
+	} )
     }
 
     async get_filelist_async( num , part , func){
-	if( part == "setting" ){
-	    console.log( "get_filelist_async START part="+ part)
-	}
 	let realData = Globalx.storagex.get_filelist( num , part )
 
-	if( part == "setting" ){
-	    console.log( "get_filelist_async 2 part=" + part)
-	}
 	if( realData === undefined || realData === null ){
-	    if( part == "setting" ){
-		console.log( "get_filelist_async 3 part=" + part)
-	    }
 	    await Globalx.remotex.get_filelist_from_remote( num, part, func )
-	    if( part == "setting" ){
-		console.log( "get_filelist_async 4 part=" + part)
-	    }
 	}
 	else{
 	    const obj = Globalx.storagex.get_filelist( num , part )
-	    this.make_menu_item_list( obj , Globalx[this.part].key)
-	    $( this.menu_sel ).menu({
-		classes: {
-		    "ui-menu": "highlight"
-		}
-	    })
+	    this.setup_menu( obj )
 	}
     }
@@ -121,4 +123,5 @@
 	    if( jsondata[Globalx[part].key].length == 0 ){
 		Globalx[part].key_indicate_file = true;
+console.log("Globalx[" + part + "].key_indicate_file = " + Globalx[part].key_indicate_file)
 		let url = ""
 		$( Globalx[part].download_url_sel ).val( Globalx[part].key )
@@ -128,5 +131,4 @@
 		$( Globalx[part].download_partial_url_sel ).attr('href' , url )
 		Globalx.remotex.get_content( this.num, this.part, Globalx[part].key , (content) => {
-		    //console.log("content=" + content)
 		    Globalx[part].editor.getSession().setValue( content );
 		    $( Globalx[part].textarea_sel ).val( content );
@@ -143,8 +145,6 @@
 	let name = '..(Up)'
 	content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu">${name}</div></li>`;
-	// content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu" onclick="menu_action( '${this.part}', '${this.name}', true)">${name}</div></li>`;
-	//	content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu" onclick="this.menu_action_2">${name}</div></li>`;
 	$( this.menu_sel ).append(content);
-	item = $( this.menu_sel ).last()
+	item = $( this.menu_sel ).children().last()
 	item.on('click' , () => {
 	    this.menu_action( key , true )
@@ -154,8 +154,6 @@
 	    ary.map( ( item_name ) => {
 		content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu">${item_name}</div></li>`;
-		// content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu" onclick="menu_action( '${this.part}', '${item_name}' , false)">${item_name}</div></li>`;
-		//	    content = `<li class="ui-menu-item"><div class="ui-menu-item-wrapper hasmenu" onclick="this.menu_action_2">${item_name}</div></li>`;
 		$( this.menu_sel ).append(content);
-		item = $( this.menu_sel ).last()
+		item = $( this.menu_sel ).children().last()
 		item.on('click' , () => {
 		    this.menu_action( item_name )
@@ -165,8 +163,8 @@
     }
 
-    set_globalx_item_name( item_name ) {
-	Globalx[this.part].item_name = item_name
-	let dl = $( Globalx[ this.part ].download_sel )
-	dl.attr('download' , Globalx[this.part].item_name)
+    set_globalx_item_name( part , item_name ) {
+	Globalx[part].item_name = item_name
+	let dl = $( Globalx[ part ].download_sel )
+	dl.attr('download' , Globalx[part].item_name)
 	dl.removeAttr('href')
     }
@@ -190,7 +188,2 @@
 }
 
-/*
-function menu_action(part, item_name , up_flag = false) {
-    Globalx[part].sidemenu.menu_action(item_name , up_flag)
-}
-*/
Index: branches/testa-single-bookmark/js/storagex.js
===================================================================
--- branches/testa-single-bookmark/js/storagex.js	(revision 40)
+++ branches/testa-single-bookmark/js/storagex.js	(revision 41)
@@ -216,7 +216,6 @@
     }
 
-    reset_info = () => {
-	let item_name = 'info'
-	reset_localstorage(item_name)
+    reset_info() {
+	reset_localstorage('info')
     }
     
@@ -226,5 +225,5 @@
     }
 
-    clear_localstorage = () => {
+    clear_localstorage() {
 	let keys = Object.keys(this._globalStorage)
 	keys.map( (v) => { delete this._globalStorage[v] } )
