PageSourceSearch

http://vortaro.cn/

html vortaro.cn collected 2026-10-06 13:15:10 UTC 23,402 bytes, 537 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3
4<head>
5    <meta charset="UTF-8">
6    <meta http-equiv="X-UA-Compatible" content="IE=edge">
7    <meta name="debug" content="disabled">
8    <meta name="viewport" content="width=device-width, initial-scale=1.0">
9    <title>综合世界语插图王典学习网(2026.1.1)</title>
10
11    <!-- 屏蔽开发者工具 -->
12    
12<script>
13    (function() {
14        'use strict';
15
16        document.addEventListener('keydown', function(e) {
17            if (e.key === 'F12') {
18                e.preventDefault();
19                return false;
20            }
21            if ((e.ctrlKey || e.metaKey) && e.shiftKey && (e.key === 'I' || e.key === 'i')) {
22                e.preventDefault();
23                return false;
24            }
25            if ((e.ctrlKey || e.metaKey) && e.shiftKey && (e.key === 'J' || e.key === 'j')) {
26                e.preventDefault();
27                return false;
28            }
29            if ((e.ctrlKey || e.metaKey) && e.shiftKey && (e.key === 'C' || e.key === 'c')) {
30                e.preventDefault();
31                return false;
32            }
33            if ((e.ctrlKey || e.metaKey) && (e.key === 'U' || e.key === 'u')) {
34                e.preventDefault();
35                return false;
36            }
37            if ((e.ctrlKey || e.metaKey) && (e.key === 'S' || e.key === 's')) {
38                e.preventDefault();
39                return false;
40            }
41        });
42
43        document.addEventListener('contextmenu', function(e) {
44            var tag = e.target.tagName.toLowerCase();
45            if (tag !== 'input' && tag !== 'textarea' && tag !== 'a') {
46                e.preventDefault();
47                return false;
48            }
49        });
50
51        var devtoolsThreshold = 160;
52        var detectDevTools = function() {
53            var widthDiff = window.outerWidth - window.innerWidth;
54            var heightDiff = window.outerHeight - window.innerHeight;
55            if (widthDiff > devtoolsThreshold || heightDiff > devtoolsThreshold) {
56                console.clear();
57            }
58        };
59        setInterval(detectDevTools, 1000);
60
61        if (window.outerWidth - window.innerWidth > devtoolsThreshold || 
62            window.outerHeight - window.innerHeight > devtoolsThreshold) {
63            console.clear();
64        }
65
66        console.log('开发者工具防护已启用');
67    })();
68    </script>
68
69
70    <!-- 主样式 -->
71    <link rel="stylesheet" href="css/app.css?v=20260509">
72
73    <!-- 弹窗样式补充 -->
74    <style>
75        /* 确保弹窗有合适的大小 */
76        #itemPopup {
77            position: fixed;
78            top: 50%;
79            left: 50%;
80            transform: translate(-50%, -50%);
81            background-color: white;
82            border: 2px solid #ccc;
83            border-radius: 10px;
84            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
85            display: none;
86            z-index: 10000;
87            min-width: 200px;
88            width: auto !important;
89            height: auto !important;
90        }
91        .popup-content {
92            flex-direction: column;
93            padding: 20px;
94            position: relative;
95            min-width: 180px;
96        }
97        .popup-content .close-btn {
98            font-size: 18px;
99            cursor: pointer;
100            position: absolute;
101            top: 5px;
102            right: 10px;
103        }
104        .popup-content .operate {
105            display: flex;
106            flex-wrap: wrap;
107            justify-content: center;
108            gap: 10px;
109            margin-top: 10px;
110        }
111        .buttonpop {
112            padding: 5px 15px;
113            margin: 2px;
114            background-color: #006400;
115            color: #fff;
116            font-size: 14px;
117            border: none;
118            border-radius: 6px;
119            cursor: pointer;
120            transition: background-color 0.3s;
121            width: auto;
122            min-width: 80px;
123            height: 36px;
124        }
125        .buttonpop:hover {
126            background-color: purple;
127        }
128    </style>
129
130<base target="_blank">
131<base target="_blank">
132</head>
133<body>    
134    <div class="container" id="main-container">
135        <div class="title_bar" id="title">
136            综合世界语插图王典
137            <br>
138            <div>SINTEZA ILUSTRITA VORTARO ĈEĈ</div>			
139            <div>编纂:王崇芳</div>
140        </div>        
141
142        <div class="operate">
143            <input type="text" class="input" id="searchInput" placeholder="请在此输入查询!Tajpu kaj ek!" style="width: 500px; height: 15px; margin: 1px;" oninput="getSuggestions()">            
144        </div>
145
146        <div class="operate">
147            <button class="button" onclick="exampleSearch()">全文检索</button>
148            <button class="button" onclick="showPopupWithContent('tutorial')">世界语教程</button>
149            <button class="button" onclick="LoadEsperantoFile('Gramatiko/PEG2025.html')">世界语语法</button>
150            <button class="button" onclick="LoadEsperantoFile('Gramatiko/Ekzemploj.html')">世界语例句</button>
151            <button class="button" onclick="vortoremoru('Lernadoj/vorto.html')">单词记忆</button>
152            <button class="button" onclick="showPopupWithContent('appendix')">王典附件</button>
153            <button class="button" onclick="LoadEsperantoFile('Softvaroj/softvaroj.html')">弗氏软件</button>
154            <button class="button" onclick="showGuestbookPopup()">📝 留言板</button>
155        </div>
156
157        <div class="flex-container">
158            <div class="list-box" id="listBox"></div>
159            <div class="web-browser" id="webBrowser"></div>
160        </div>
161
162        <div class="copyright"> 程序设计: 毛自赋(Anteo), 熊心影(Frostelo); 词条录音:赵建平; 单词记忆:陈在伟;SAI语音:Doniben</div>
163        <div class="copyright"> 西安世界语协会 监制</div>
164        <div class="beian_hao">友情链接:<a href="https://vortaro.net" target="_blank">PIV 2020</a> <a href="https://retavortaro.de" target="_blank">RetaVortaro</a> <a href="https://sai.esperanto.co" target="_blank">SAI</a> <a href="https://shop.kongfz.com/34008" target="_blank">西安世界语书店</a></div>
165        <div class="beian_hao">
166    <a href="#" onclick="showAdminPopup();return false;" style="color:#006400;text-decoration:underline;">留言管理</a>
167    &nbsp;|&nbsp;
168    <a href="https://beian.miit.gov.cn" target="_blank">陕ICP备2024041503号</a>
169</div>
170    </div>
171
172    <div id="message-view">
173        <div class="message">
174            <div class="icon"><img src="./icon" height="20" width="20"></div>
175            <div><div style="margin-bottom:10px;">提示</div><div id="message"></div></div>
176            <div class="close-btn" onclick="closeMessage()">×</div>
177        </div>
178    </div>
179
180    <div class="beian_hao"><div id="log"></div></div>
181
182    <!-- 统一的弹窗,内容动态变化 -->
183    <div id="itemPopup">
184        <div class="popup-content" id="popupContent">
185            <span class="close-btn" onclick="closePopup()">✖</span>
186            <div class="operate" id="popupButtons">
187                <!-- 按钮会动态填充 -->
188            </div>
189        </div>
190    </div>
191
192    <div id="audioPlayerContainer" class="audio-player-container hidden">
193        <div class="audio-player">
194            <audio id="hmrbPlayer" controls></audio>
195            <button class="close-audio-btn" onclick="closeAudioPlayer()">×</button>
196        </div>
197    </div>
198    
199 <!-- 留言板弹窗(可拖动 + 响应式) -->
200<div id="guestbookPopup" style="display:none;position:fixed;z-index:99999;background:#fff;border:2px solid #006400;border-radius:10px;box-shadow:0 4px 30px rgba(0,0,0,0.3);width:560px;max-width:92vw;max-height:85vh;overflow:hidden;font-family:inherit;top:50%;left:50%;transform:translate(-50%,-50%);min-width:300px;min-height:350px;">
201    <div id="guestbookHeader" style="background:#006400;color:#fff;padding:12px 18px;font-weight:bold;font-size:18px;display:flex;justify-content:space-between;align-items:center;border-radius:8px 8px 0 0;cursor:move;user-select:none;touch-action:none;min-height:44px;">
202        <span style="font-size:16px;line-height:1.4;">📝 留言板</span>
203        <span onclick="closeGuestbookPopup()" style="cursor:pointer;font-size:28px;padding:0 8px;border-radius:4px;line-height:1;" onmouseover="this.style.background='rgba(255,255,255,0.2)'" onmouseout="this.style.background='transparent';">&times;</span>
204    </div>
205    <div style="padding:16px 18px;max-height:calc(85vh - 56px);overflow-y:auto;-webkit-overflow-scrolling:touch;" id="guestbookContent">
206        <!-- 留言表单 -->
207        <form id="guestbookForm" onsubmit="submitGuestbook(event)" enctype="multipart/form-data">
208            <div style="margin-bottom:12px;">
209                <label style="display:block;font-weight:bold;margin-bottom:4px;font-size:14px;">留言主题 <span style="color:#c00;">*</span></label>
210                <input type="text" id="gbSubject" required style="width:100%;padding:10px 12px;border:1px solid #ccc;border-radius:6px;font-size:16px;box-sizing:border-box;-webkit-appearance:none;" placeholder="请输入留言主题">
211            </div>
212            <div style="margin-bottom:12px;">
213                <label style="display:block;font-weight:bold;margin-bottom:4px;font-size:14px;">详细内容 <span style="color:#c00;">*</span></label>
214                <textarea id="gbContent" required rows="4" style="width:100%;padding:10px 12px;border:1px solid #ccc;border-radius:6px;font-size:16px;resize:vertical;box-sizing:border-box;-webkit-appearance:none;font-family:inherit;" placeholder="请输入详细内容"></textarea>
215            </div>
216            <div style="margin-bottom:12px;">
217                <label style="display:block;font-weight:bold;margin-bottom:4px;font-size:14px;">上传图片</label>
218                <input type="file" id="gbImage" accept="image/*" style="width:100%;padding:8px 0;font-size:14px;">
219                <div style="font-size:12px;color:#999;margin-top:4px;">支持 JPG、PNG、GIF,最大 5MB</div>
220            </div>
221            <div style="display:flex;gap:10px;margin-top:6px;flex-wrap:wrap;">
222                <button type="submit" style="flex:1;padding:12px 16px;background:#006400;color:#fff;border:none;border-radius:6px;font-size:16px;cursor:pointer;min-height:48px;min-width:80px;">提交留言</button>
223                <button type="button" onclick="closeGuestbookPopup()" style="flex:1;padding:12px 16px;background:#ccc;color:#333;border:none;border-radius:6px;font-size:16px;cursor:pointer;min-height:48px;min-width:80px;">取消</button>
224            </div>
225            <div id="gbMessage" style="margin-top:10px;font-size:14px;text-align:center;"></div>
226        </form>
227        <hr style="margin:16px 0;border:0;border-top:1px solid #eee;">
228        <!-- 留言列表 -->
229        <div id="guestbookList" style="max-height:250px;overflow-y:auto;-webkit-overflow-scrolling:touch;">
230            <div style="text-align:center;color:#999;padding:15px;font-size:14px;">加载留言中...</div>
231        </div>
232    </div>
233</div>
234
235<style>
236/* 手机端适配 */
237@media (max-width: 768px) {
238    #guestbookPopup {
239        width: 94vw !important;
240        max-width: 94vw !important;
241        min-width: unset !important;
242        min-height: 300px !important;
243        max-height: 92vh !important;
244        top: 4vh !important;
245        left: 3vw !important;
246        transform: none !important;
247        border-radius: 12px !important;
248    }
249    #guestbookPopup #guestbookHeader {
250        padding: 14px 16px !important;
251        font-size: 17px !important;
252        min-height: 50px !important;
253        border-radius: 12px 12px 0 0 !important;
254    }
255    #guestbookPopup #guestbookContent {
256        padding: 14px 16px !important;
257        max-height: calc(92vh - 58px) !important;
258    }
259    #guestbookPopup input,
260    #guestbookPopup textarea {
261        font-size: 16px !important;  /* 防止 iOS 自动缩放 */
262        padding: 12px !important;
263    }
264    #guestbookPopup button {
265        font-size: 16px !important;
266        padding: 14px !important;
267        min-height: 50px !important;
268    }
269    #guestbookPopup #guestbookList {
270        max-height: 200px !important;
271    }
272}
273
274/* 小屏手机(宽度 < 400px) */
275@media (max-width: 400px) {
276    #guestbookPopup {
277        width: 96vw !important;
278        max-width: 96vw !important;
279        left: 2vw !important;
280        top: 2vh !important;
281        max-height: 96vh !important;
282        border-radius: 10px !important;
283    }
284    #guestbookPopup #guestbookHeader {
285        padding: 10px 14px !important;
286        font-size: 15px !important;
287        min-height: 44px !important;
288    }
289    #guestbookPopup #guestbookContent {
290        padding: 12px 14px !important;
291        max-height: calc(96vh - 52px) !important;
292    }
293    #guestbookPopup .operate-btn {
294        flex-direction: column !important;
295        gap: 8px !important;
296    }
297    #guestbookPopup button {
298        width: 100% !important;
299        flex: none !important;
300    }
301}
302</style>
303
304<!-- 管理员后台弹窗(可拖动 + 响应式) -->
305<div id="adminPopup" style="display:none;position:fixed;z-index:99999;background:#fff;border:2px solid #006400;border-radius:10px;box-shadow:0 4px 30px rgba(0,0,0,0.3);width:800px;max-width:92vw;max-height:85vh;overflow:hidden;font-family:inherit;top:50%;left:50%;transform:translate(-50%,-50%);min-width:320px;min-height:280px;">
306    <div id="adminHeader" style="background:#006400;color:#fff;padding:12px 18px;font-weight:bold;font-size:18px;display:flex;justify-content:space-between;align-items:center;border-radius:8px 8px 0 0;cursor:move;user-select:none;touch-action:none;min-height:44px;">
307        <span style="font-size:16px;line-height:1.4;">🔐 留言管理后台</span>
308        <span onclick="closeAdminPopup()" style="cursor:pointer;font-size:28px;padding:0 8px;border-radius:4px;line-height:1;" onmouseover="this.style.background='rgba(255,255,255,0.2)'" onmouseout="this.style.background='transparent';">&times;</span>
309    </div>
310    <div style="padding:15px 18px;max-height:calc(85vh - 56px);overflow-y:auto;-webkit-overflow-scrolling:touch;" id="adminContent">
311        <div style="margin-bottom:12px;display:flex;gap:10px;flex-wrap:wrap;">
312            <input type="password" id="adminPassword" placeholder="请输入管理密码" style="flex:1;padding:10px 12px;border:1px solid #ccc;border-radius:6px;font-size:16px;min-width:120px;-webkit-appearance:none;">
313            <button onclick="loadAdminPanel()" style="padding:10px 24px;background:#006400;color:#fff;border:none;border-radius:6px;font-size:15px;cursor:pointer;min-height:44px;">登录管理</button>
314            <button onclick="closeAdminPopup()" style="padding:10px 24px;background:#ccc;color:#333;border:none;border-radius:6px;font-size:15px;cursor:pointer;min-height:44px;">关闭</button>
315        </div>
316        <div id="adminList" style="max-height:450px;overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:14px;"></div>
317    </div>
318</div>
319
320<style>
321/* 管理员后台 - 手机端适配 */
322@media (max-width: 768px) {
323    #adminPopup {
324        width: 94vw !important;
325        max-width: 94vw !important;
326        min-width: unset !important;
327        min-height: 200px !important;
328        max-height: 92vh !important;
329        top: 4vh !important;
330        left: 3vw !important;
331        transform: none !important;
332        border-radius: 12px !important;
333    }
334    #adminPopup #adminHeader {
335        padding: 14px 16px !important;
336        font-size: 17px !important;
337        min-height: 50px !important;
338        border-radius: 12px 12px 0 0 !important;
339    }
340    #adminPopup #adminContent {
341        padding: 14px 16px !important;
342        max-height: calc(92vh - 58px) !important;
343    }
344    #adminPopup input,
345    #adminPopup button {
346        font-size: 16px !important;
347        padding: 12px !important;
348        min-height: 48px !important;
349    }
350    #adminPopup #adminList {
351        max-height: 300px !important;
352        font-size: 13px !important;
353    }
354    #adminPopup .admin-buttons {
355        flex-direction: column !important;
356    }
357    #adminPopup .admin-buttons button {
358        width: 100% !important;
359    }
360}
361
362@media (max-width: 400px) {
363    #adminPopup {
364        width: 96vw !important;
365        max-width: 96vw !important;
366        left: 2vw !important;
367        top: 2vh !important;
368        max-height: 96vh !important;
369    }
370    #adminPopup #adminHeader {
371        padding: 10px 14px !important;
372        font-size: 15px !important;
373        min-height: 44px !important;
374    }
375    #adminPopup #adminContent {
376        padding: 12px 14px !important;
377        max-height: calc(96vh - 52px) !important;
378    }
379    #adminPopup #adminList {
380        max-height: 200px !important;
381        font-size: 12px !important;
382    }
383}
384</style>
385
386    
386<script>
387    // ==================== 弹窗内容定义 ====================
388
389    // 弹窗内容配置
390    var popupConfig = {
391        tutorial: {
392            title: '世界语教程',
393            buttons: [
394                { text: '初级', onclick: function() { LoadEsperantoFile('Lernadoj/VEJDO_E.html'); closePopup(); } },
395                { text: '中级', onclick: function() { LoadEsperantoFile('Lernadoj/WANGCF_M.html'); closePopup(); } }
396            ]
397        },
398        appendix: {
399            title: '王典附件',
400            buttons: [
401                { text: '前言', onclick: function() { LoadEsperantoFile('Apendicoj/前言.html'); closePopup(); } },
402                { text: '凡例', onclick: function() { LoadEsperantoFile('Apendicoj/凡例.html'); closePopup(); } },
403                { text: '后记', onclick: function() { LoadEsperantoFile('Apendicoj/后记.html'); closePopup(); } },
404            ]
405        },
406        frostelo: {
407            title: '弗氏软件',
408            buttons: [
409                { text: '免费公益版', onclick: function() { LoadEsperantoFile('Apendicoj/前言.html'); closePopup(); } },
410                { text: '专业试用版', onclick: function() { LoadEsperantoFile('Apendicoj/凡例.html'); closePopup(); } },
411            ]
412        }
413    };
414
415    /**
416     * 显示弹窗(动态填充内容)
417     * @param {string} type - 弹窗类型 ('tutorial' 或 'appendix')
418     */
419    function showPopupWithContent(type) {
420        var config = popupConfig[type];
421        if (!config) return;
422
423        var buttonsContainer = document.getElementById('popupButtons');
424        if (!buttonsContainer) return;
425
426        // 清空现有按钮
427        buttonsContainer.innerHTML = '';
428
429        // 动态创建按钮
430        config.buttons.forEach(function(btn) {
431            var button = document.createElement('button');
432            button.className = 'buttonpop';
433            button.textContent = btn.text;
434            button.onclick = btn.onclick;
435            buttonsContainer.appendChild(button);
436        });
437
438        // 显示弹窗
439        var popup = document.getElementById('itemPopup');
440        if (popup) popup.style.display = 'block';
441    }
442
443    /**
444     * 关闭弹窗(保持原有函数)
445     */
446    window.closePopup = function() {
447        var p = document.getElementById('itemPopup');
448        if (p) p.style.display = 'none';
449    };
450
451    /**
452     * 原有 showPopup 函数(保留兼容性,但建议使用新的)
453     */
454    window.showPopup = function() {
455        // 默认显示教程弹窗
456        showPopupWithContent('tutorial');
457    };
458
459    // 点击弹窗外关闭(可选)
460    window.addEventListener('click', function(e) {
461        var popup = document.getElementById('itemPopup');
462        if (popup && popup.style.display === 'block') {
463            // 如果点击的是遮罩层或弹窗外区域
464            if (!popup.contains(e.target)) {
465                // 不自动关闭,让用户点击关闭按钮
466                // 如果需要点击外部关闭,取消注释下面的代码
467                // closePopup();
468            }
469        }
470    });
471
472    // ESC 键关闭弹窗
473    document.addEventListener('keydown', function(e) {
474        if (e.key === 'Escape') {
475            closePopup();
476        }
477    });
478
479    console.log('弹窗模块已加载');
480    
481    // ===== URL Hash 直接查询 =====
482function handleHashQuery() {
483    var hash = window.location.hash;
484    if (hash && hash.length > 1) {
485        // 去掉 # 号,解码 URL 编码
486        var query = decodeURIComponent(hash.substring(1));
487        // 去除末尾可能存在的 _kd 后缀(PIV 风格)
488        if (query.endsWith('_kd')) {
489            query = query.substring(0, query.length - 3);
490        }
491        // 填入搜索框并执行查询
492        var searchInput = document.getElementById('searchInput');
493        if (searchInput) {
494            searchInput.value = query;
495            // 触发输入事件(自动补全)
496            var event = new Event('input', { bubbles: true });
497            searchInput.dispatchEvent(event);
498            // 延迟执行精确搜索
499            setTimeout(function() {
500                window.exactSearch();
501            }, 300);
502        }
503    }
504}
505
506// 页面加载完成后执行
507setTimeout(handleHashQuery, 500);
508
509// 监听 hash 变化(用户手动修改地址栏 # 后面内容)
510window.addEventListener('hashchange', function() {
511    // 清空旧结果
512    var listBox = document.getElementById('listBox');
513    if (listBox) listBox.innerHTML = '';
514    handleHashQuery();
515});
516    </script>
516
517
518    
518<script src="js/security.js?v=20260509"></script>
518
519    
519<script src="js/copy-guard.js?v=20260509"></script>
519
520    
520<script src="js/ai-tts.js?v=20260509"></script>
520
521    
521<script src="js/app.js?v=20260805"></script>
521
522    
522<script src="js/lookup-popup.js?v=20260803"></script>
522
523
524
525<!-- PIV2020 弹窗 -->
526<div id="piv2020Popup" style="display:none;position:fixed;z-index:99999;top:100px;left:100px;background:#fff;border:2px solid #006400;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,0.3);width:700px;max-width:94vw;height:500px;max-height:80vh;overflow:hidden;font-family:monospace;font-size:14px;line-height:1.6;resize:both;min-width:280px;min-height:200px;">
527    <div id="piv2020Header" style="background:#006400;color:#fff;padding:8px 12px;font-weight:bold;font-size:16px;display:flex;justify-content:space-between;align-items:center;border-radius:6px 6px 0 0;cursor:move;user-select:none;touch-action:none;">
528        <span id="piv2020Title">PIV2020</span>
529        <span style="cursor:pointer;padding:2px 6px;border-radius:4px;" onmouseover="this.style.background='rgba(255,255,255,0.2)'" onmouseout="this.style.background='transparent'" onclick="closePiv2020Popup()">&#10006;</span>
530    </div>
531    <div id="piv2020Content" style="padding:0;height:calc(100% - 40px);width:100%;box-sizing:border-box;">
532        <div style="color:#999;padding:20px;text-align:center;">加载中...</div>
533    </div>
534</div>
535
536</body>
537</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.