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

提供:ゼルダの伝説 知恵のかりもの 攻略Wiki
移動先:案内検索
編集の要約なし
編集の要約なし
14行目: 14行目:
<link rel="stylesheet" href="https://dq.h1g.jp/img/marker-icon-img/editable-popup.css" />
<link rel="stylesheet" href="https://dq.h1g.jp/img/marker-icon-img/editable-popup.css" />


<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightgallery/2.7.2/lightgallery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightgallery/2.7.2/lightgallery.min.js"></script>
<link rel="stylesheet" href="https://dq.h1g.jp/img/lightgallery.min.css"/>
<link rel="stylesheet" href="https://dq.h1g.jp/img/lightgallery.min.css"/>


<script src="https://dq.h1g.jp/leaflet/custom-image_leaflet_map_h1g.js" ></script>


<script type="text/javascript">
<script type="text/javascript">
511行目: 509行目:
    
    
function loadPinsFromWikiPage() {
function loadPinsFromWikiPage() {
     var host = window.location.origin;
     getMwToken()
    var geojsonPage = "<!--{$geojson}-->";
        .then(function(token) {
    var url = API_BASE_URL + '/index.php/' + geojsonPage;
            var geojsonPage = "<!--{$geojson}-->";
            var url = API_BASE_URL + '/api.php';
            console.log('Request URL:', url);


    $.ajax({
            return $.ajax({
        type: "GET",
                type: "GET",
        url: url,
                url: url,
        dataType: "html",
                data: {
         success: function(htmlContent) {
                    action: 'query',
                    titles: geojsonPage,
                    prop: 'revisions',
                    rvprop: 'content',
                    format: 'json',
                    // 明示的にwikiを指定
                    redirects: 0  // リダイレクトを防ぐ
                },
                headers: {
                    'Authorization': 'Bearer ' + token
                }
            });
         })
        .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 geoJSONData = JSON.parse(content);
                var scriptContent = scriptTag.textContent.trim();
                 processGeoJSONData(geoJSONData);
                 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);
                 processGeoJSONData(parsedData);
             } catch (error) {
             } catch (error) {
                 console.error("Error processing data:", error);
                 console.error("Error processing data:", error);
//                console.log("Raw HTML content:", htmlContent);
                 throw error;
//              console.log("Extracted script content:", scriptContent);
                 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 data:", error);
//           console.log("XHR status:", status);
            // より詳細なエラー情報を表示
//          console.log("XHR response:", xhr.responseText);
            console.error('Detailed error:', {
         }
                message: error.message,
    });
                status: error.status,
                responseText: error.responseText
            });
         });
}
}


681行目: 683行目:




// トークンを取得する関数
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({
      
        type: "POST",
    // 保存前に新しいトークンを取得
        url: API_BASE_URL + '/api.php',
    getMwToken()
        data: {
        .then(function(token) {
            action: 'edit',
            return $.ajax({
            title: '<!--{$geojson}-->',
                type: "POST",
            text: formattedData,
                url: API_BASE_URL + '/api.php',
            token: mw.user.tokens.get('csrfToken'),
                data: {
            format: 'json'
                    action: 'edit',
         },
                    title: '<!--{$geojson}-->',
         success: function(response) {
                    text: formattedData,
//            console.log("Save response:", response);
                    token: token,
                    format: 'json'
                }
            });
         })
         .then(function(response) {
             if (response.edit && response.edit.result === 'Success') {
             if (response.edit && response.edit.result === 'Success') {
                 alert('データは正常に保存されました');
                 alert('データは正常に保存されました');
701行目: 733行目:
                 drawControl.remove();
                 drawControl.remove();
                 editButton.state('enable-edit');
                 editButton.state('enable-edit');
                 saveButton.remove(); // saveButtonを非表示にする
                 saveButton.remove();
                  
                  
                 setTimeout(function() {
                 // 保存成功後、新しいトークンで再読み込み
                    loadPinsFromWikiPage();
                getMwToken()
                }, 1000);
                    .then(function(newToken) {
                        loadPinsFromWikiPage(newToken);
                    })
                    .catch(function(error) {
                        console.error("Failed to get token for reload:", error);
                    });
             } else {
             } else {
                 alert('Error saving data: ' + JSON.stringify(response));
                 throw new Error('保存に失敗しました');
             }
             }
         },
         })
         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.message);
//            console.log("XHR response:", xhr.responseText);
         });
             alert('Error saving data: ' + error);
         }
    });
}
}
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行目: 772行目:
     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>

2024年11月10日 (日) 11:50時点における版