「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;
    });
}


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


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


684行目: 709行目:
function saveToWikiPage(geoJSONData) {
function saveToWikiPage(geoJSONData) {
     var formattedData = geoJSONData;
     var formattedData = geoJSONData;
     $.ajax({
      
        type: "POST",
    getNewToken()
        url: API_BASE_URL + '/api.php',
        .then(function(token) {
        data: {
            return $.ajax({
            action: 'edit',
                type: "POST",
            title: '<!--{$geojson}-->',
                url: API_BASE_URL + '/api.php',
            text: formattedData,
                data: {
            token: mw.user.tokens.get('csrfToken'),
                    action: 'edit',
            format: 'json'
                    title: '<!--{$geojson}-->',
         },
                    text: formattedData,
         success: function(response) {
                    token: token,
//            console.log("Save response:", response);
                    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を非表示にする
                 saveButton.remove();
                  
                  
                 setTimeout(function() {
                 setTimeout(function() {
709行目: 738行目:
                 alert('Error saving data: ' + JSON.stringify(response));
                 alert('Error saving data: ' + JSON.stringify(response));
             }
             }
         },
         })
         error: function(xhr, status, error) {
         .catch(function(error) {
             console.error("Save error:", error);
             console.error("Save error:", error);
//            console.log("XHR status:", status);
            alert('Error saving data: ' + error.message);
//           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;
732行目: 765行目:
// ページ読み込み時にデータを読み込む
// ページ読み込み時にデータを読み込む
$(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:17時点における版