「Widget:Custom map」の版間の差分
提供:ロマサガ2リメイク 攻略Wiki(ロマンシング サガ2 リベンジオブザセブン)
編集の要約なし タグ: 手動差し戻し |
編集の要約なし |
||
238行目: | 238行目: | ||
popup.setContent(editableContent); | popup.setContent(editableContent); | ||
} else { | } else { | ||
// 編集モードでない場合は表示用のコンテンツを設定 | |||
if (title === '' && content === '') { | |||
layer.unbindPopup(); // タイトルと内容が空の場合はポップアップを表示しない | |||
} else { | |||
var displayContent = '<strong>' + title + '</strong><br>' + content; | |||
renderMediaWikiContent(displayContent) | |||
.then(function(renderedContent) { | |||
popup.setContent(renderedContent); | |||
}) | |||
.catch(function(error) { | |||
console.error("Render error:", error); | |||
// エラー時は未加工のコンテンツを表示 | |||
popup.setContent(displayContent); | |||
}); | |||
} | } | ||
// MediaWikiコンテンツのレンダリング | // MediaWikiコンテンツのレンダリング | ||
function renderMediaWikiContent(content) { | function renderMediaWikiContent(content) { | ||
return new Promise((resolve, reject) => { | |||
$.ajax({ | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'parse', | |||
text: content, | |||
format: 'json' | |||
}, | |||
type: 'GET', | |||
success: function(data) { | |||
if (data.parse && data.parse.text) { | |||
var renderedContent = data.parse.text['*']; | |||
// レンダリング後の画像処理 | |||
setTimeout(function() { | |||
initLightGallery(renderedContent); | |||
}, 100); | |||
resolve(renderedContent); | |||
} else { | |||
} | reject(new Error('Invalid response format')); | ||
} | |||
}, | |||
error: function(xhr, status, error) { | |||
console.error('Failed to render MediaWiki content:', error); | |||
reject(error); | |||
} | |||
}); | |||
}); | }); | ||
} | } | ||
511行目: | 511行目: | ||
function loadPinsFromWikiPage() { | function loadPinsFromWikiPage() { | ||
var host = window.location.origin; | getMwToken() | ||
.then(function(token) { | |||
var host = window.location.origin; | |||
var geojsonPage = "<!--{$geojson}-->"; | |||
var url = API_BASE_URL + '/index.php/' + geojsonPage; | |||
return $.ajax({ | |||
type: "GET", | |||
url: url, | |||
dataType: "html", | |||
headers: { | |||
'Authorization': 'Bearer ' + token | |||
} | |||
}); | |||
}) | |||
.then(function(htmlContent) { | |||
try { | try { | ||
var parser = new DOMParser(); | var parser = new DOMParser(); | ||
var doc = parser.parseFromString(htmlContent, "text/html"); | var doc = parser.parseFromString(htmlContent, "text/html"); | ||
541行目: | 547行目: | ||
} catch (error) { | } catch (error) { | ||
console.error("Error processing data:", error); | console.error("Error processing data:", error); | ||
throw error; | |||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Error loading data:", error); | |||
}); | |||
} | } | ||
681行目: | 680行目: | ||
// トークンを取得する関数 | |||
function getMwToken() { | |||
return new Promise((resolve, reject) => { | |||
$.ajax({ | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'query', | |||
meta: 'tokens', | |||
type: 'csrf', | |||
format: 'json' | |||
}, | |||
type: 'GET', | |||
success: function(response) { | |||
if (response.query && response.query.tokens && response.query.tokens.csrftoken) { | |||
resolve(response.query.tokens.csrftoken); | |||
} else { | |||
reject(new Error('Failed to get token')); | |||
} | |||
}, | |||
error: function(xhr, status, error) { | |||
reject(error); | |||
} | |||
}); | |||
}); | |||
} | |||
function saveToWikiPage(geoJSONData) { | function saveToWikiPage(geoJSONData) { | ||
var formattedData = geoJSONData; | var formattedData = geoJSONData; | ||
$.ajax({ | |||
// 保存前に新しいトークンを取得 | |||
getMwToken() | |||
.then(function(token) { | |||
return $.ajax({ | |||
type: "POST", | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'edit', | |||
} | title: '<!--{$geojson}-->', | ||
text: formattedData, | |||
token: token, | |||
format: 'json' | |||
} | |||
}); | |||
}) | |||
.then(function(response) { | |||
if (response.edit && response.edit.result === 'Success') { | if (response.edit && response.edit.result === 'Success') { | ||
alert('データは正常に保存されました'); | alert('データは正常に保存されました'); | ||
701行目: | 730行目: | ||
drawControl.remove(); | drawControl.remove(); | ||
editButton.state('enable-edit'); | editButton.state('enable-edit'); | ||
saveButton.remove(); | saveButton.remove(); | ||
// 保存成功後、新しいトークンで再読み込み | |||
getMwToken() | |||
.then(function(newToken) { | |||
loadPinsFromWikiPage(newToken); | |||
}) | |||
.catch(function(error) { | |||
console.error("Failed to get token for reload:", error); | |||
}); | |||
} else { | } else { | ||
throw new Error('保存に失敗しました'); | |||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Save error:", error); | console.error("Save error:", error); | ||
alert('データの保存に失敗しました: ' + error.message); | |||
}); | |||
alert(' | |||
} | } | ||
map.on(L.Draw.Event.CREATED, function (event) { | map.on(L.Draw.Event.CREATED, function (event) { | ||
var layer = event.layer; | var layer = event.layer; | ||
734行目: | 769行目: | ||
setTimeout(function() { | setTimeout(function() { | ||
map.invalidateSize(); | map.invalidateSize(); | ||
loadPinsFromWikiPage(); | // 初期読み込み時にトークンを取得してからデータを読み込む | ||
}, 500); | getMwToken() | ||
.then(function(token) { | |||
console.log('Initial token obtained'); | |||
loadPinsFromWikiPage(token); | |||
}) | |||
.catch(function(error) { | |||
console.error("Failed to get initial token:", error); | |||
alert('データの読み込みに失敗しました。ページを再読み込みしてください。'); | |||
}); | |||
}, 500); | |||
}); | }); | ||
</script> | </script> | ||
</includeonly> | </includeonly> |