「Widget:Custom map」の版間の差分

提供:メタファー リファンタジオ 攻略Wiki
移動先:案内検索
編集の要約なし
タグ: 差し戻し済み
編集の要約なし
タグ: 手動差し戻し
508行目: 508行目:




// トークン取得のユーティリティ関数
function getNewToken() {
    return $.ajax({
        url: API_BASE_URL + '/api.php',
        data: {
            action: 'query',
            meta: 'tokens',
            type: 'csrf',
            format: 'json'
        },
        type: 'GET',
        dataType: 'json'
    })
    .then(function(tokenData) {
        if (!tokenData.query || !tokenData.query.tokens || !tokenData.query.tokens.csrftoken) {
            throw new Error('Failed to get CSRF token');
        }
        return tokenData.query.tokens.csrftoken;
    });
}


    
    
536行目: 515行目:
     var url = API_BASE_URL + '/index.php/' + geojsonPage;
     var url = API_BASE_URL + '/index.php/' + geojsonPage;


     // まず新しいトークンを取得
     $.ajax({
    getNewToken()
        type: "GET",
        .then(function(token) {
        url: url,
            return $.ajax({
        dataType: "html",
                type: "GET",
        success: function(htmlContent) {
                url: API_BASE_URL + '/api.php',
                data: {
                    action: 'query',
                    prop: 'revisions',
                    titles: geojsonPage,
                    rvprop: 'content',
                    format: 'json',
                    token: token
                },
                dataType: 'json'
            });
        })
        .then(function(response) {
             try {
             try {
                // レスポンスからページコンテンツを取得
//               console.log("HTML Content: ", htmlContent); // 取得したHTMLをコンソールに出力
                 const pages = response.query.pages;
                 var parser = new DOMParser();
                 const pageId = Object.keys(pages)[0];
                 var doc = parser.parseFromString(htmlContent, "text/html");
                 const content = pages[pageId].revisions[0]['*'];
                 var scriptTag = doc.querySelector('#mw-content-text script');
 
                if (!scriptTag) {
                 // GeoJSONデータを抽出
                    throw new Error("Script tag not found");
                 const geoJSONMatch = content.match(/var GeoJson =(\{[\s\S]*\});/);
                }
                 if (!geoJSONMatch || geoJSONMatch.length < 2) {
                 var scriptContent = scriptTag.textContent.trim();
                     throw new Error("GeoJSON data not found");
                 var jsonDataMatch = scriptContent.match(/var GeoJson =(\{[\s\S]*\});/);
                 if (!jsonDataMatch || jsonDataMatch.length < 2) {
                     throw new Error("GeoJSON data not found in script tag");
                }
                var geoJSONData = jsonDataMatch[1];
                if (!geoJSONData) {
                    throw new Error("GeoJSON data is empty");
                 }
                 }
 
                 var parsedData = JSON.parse(geoJSONData);
                 const parsedData = JSON.parse(geoJSONMatch[1]);
                 processGeoJSONData(parsedData);
                 processGeoJSONData(parsedData);
             } catch (error) {
             } catch (error) {
                 console.error("Error processing data:", error);
                 console.error("Error processing data:", error);
                // エラーが発生した場合は再読み込みを試みる
//               console.log("Raw HTML content:", htmlContent);
                 setTimeout(loadPinsFromWikiPage, 2000);
//              console.log("Extracted script content:", scriptContent);
                 if (typeof geoJSONData !== 'undefined') {
//                  console.log("Extracted GeoJSON data:", geoJSONData);
                }
             }
             }
         })
         },
         .catch(function(error) {
         error: function(xhr, status, error) {
            console.error("Error loading map data:", error);
//          console.error("Error loading data:", error);
            // エラーが発生した場合は再読み込みを試みる
//           console.log("XHR status:", status);
            setTimeout(loadPinsFromWikiPage, 2000);
//          console.log("XHR response:", xhr.responseText);
         });
         }
    });
}
}


709行目: 684行目:
function saveToWikiPage(geoJSONData) {
function saveToWikiPage(geoJSONData) {
     var formattedData = geoJSONData;
     var formattedData = geoJSONData;
      
     $.ajax({
    getNewToken()
        type: "POST",
        .then(function(token) {
        url: API_BASE_URL + '/api.php',
            return $.ajax({
        data: {
                type: "POST",
            action: 'edit',
                url: API_BASE_URL + '/api.php',
            title: '<!--{$geojson}-->',
                data: {
            text: formattedData,
                    action: 'edit',
            token: mw.user.tokens.get('csrfToken'),
                    title: '<!--{$geojson}-->',
            format: 'json'
                    text: formattedData,
        },
                    token: token,
         success: function(response) {
                    format: 'json'
//            console.log("Save response:", response);
                }
            });
         })
        .then(function(response) {
             if (response.edit && response.edit.result === 'Success') {
             if (response.edit && response.edit.result === 'Success') {
                 alert('データは正常に保存されました');
                 alert('データは正常に保存されました');
730行目: 701行目:
                 drawControl.remove();
                 drawControl.remove();
                 editButton.state('enable-edit');
                 editButton.state('enable-edit');
                 saveButton.remove();
                 saveButton.remove(); // saveButtonを非表示にする
                  
                  
                 setTimeout(function() {
                 setTimeout(function() {
738行目: 709行目:
                 alert('Error saving data: ' + JSON.stringify(response));
                 alert('Error saving data: ' + JSON.stringify(response));
             }
             }
         })
         },
         .catch(function(error) {
         error: function(xhr, status, error) {
             console.error("Save error:", error);
             console.error("Save error:", error);
            alert('Error saving data: ' + error.message);
//            console.log("XHR status:", status);
           
//           console.log("XHR response:", xhr.responseText);
            // エラーが発生した場合、再試行オプションを提供
             alert('Error saving data: ' + error);
             if (confirm('保存に失敗しました。再試行しますか?')) {
        }
                saveToWikiPage(geoJSONData);
    });
            }
        });
}
}
map.on(L.Draw.Event.CREATED, function (event) {
map.on(L.Draw.Event.CREATED, function (event) {
     var layer = event.layer;
     var layer = event.layer;
765行目: 732行目:
// ページ読み込み時にデータを読み込む
// ページ読み込み時にデータを読み込む
$(document).ready(function() {
$(document).ready(function() {
    // 地図の初期化後にデータを読み込む
     setTimeout(function() {
     setTimeout(function() {
         map.invalidateSize();
         map.invalidateSize();
          
         loadPinsFromWikiPage();
        // セッションの初期化とトークンの取得
    }, 500); // 少し長めの遅延を設定
        getNewToken()
            .then(function() {
                loadPinsFromWikiPage();
            })
            .catch(function(error) {
                console.error("Initial token error:", error);
                // エラーが発生した場合は再試行
                setTimeout(loadPinsFromWikiPage, 2000);
            });
    }, 500);
});
});
// 定期的なトークンの更新
setInterval(function() {
    getNewToken()
        .then(function(token) {
            console.log("Token refreshed successfully");
        })
        .catch(function(error) {
            console.error("Token refresh error:", error);
        });
}, 1800000); // 30分ごとにトークンを更新
</script>
</script>


</includeonly>
</includeonly>

2024年11月9日 (土) 15:18時点における版