| @@ -574,7 +574,7 @@ label[for="box-have"]::after | |||
| content: "Generate QR code:"; | |||
| } | |||
| .formation-from-string::before | |||
| .formation-link-from-string>a::before | |||
| { | |||
| content: "A formation link read from string"; | |||
| } | |||
| @@ -537,7 +537,7 @@ label[for="box-have"]::after | |||
| content: "QRコードを生成します:"; | |||
| } | |||
| .formation-from-string::before | |||
| .formation-link-from-string>a::before | |||
| { | |||
| content: "文字列から読み取られた列リンク"; | |||
| } | |||
| @@ -3,7 +3,22 @@ | |||
| addition_display: "追加の表示", | |||
| title_blank: "入力タイトル", | |||
| detail_blank: "入力詳細", | |||
| force_reload_data: "データの強制更新", | |||
| request_input: tp`${'info'}を入力してください`, | |||
| link_read_message: { | |||
| success: tp`発見 ${'type'} 形式.`, | |||
| type: { | |||
| 1: "PADDF", | |||
| 2: "PDC", | |||
| 3: "PADDB", | |||
| }, | |||
| error: { | |||
| 1: "サポートされていない形式。" , | |||
| 2: "チームデータがありません" , | |||
| 3: "間違った JSON 形式です。" , | |||
| 4: "間違った URL 形式です。 ", | |||
| } | |||
| }, | |||
| sort_name:{ | |||
| sort_none: "いいえ", | |||
| sort_id: "カード ID", | |||
| @@ -24,7 +39,6 @@ | |||
| sort_rcvMax120_awoken: "最大回復 (+覚醒)", | |||
| sort_abilityIndex_awoken: "最大加重能力指数 (+覚醒)", | |||
| }, | |||
| force_reload_data: "データの強制更新", | |||
| } | |||
| deepMerge(localTranslating, _localTranslating); | |||
| localisation(localTranslating); | |||
| @@ -518,7 +518,7 @@ label[for="have-8-latent-slot"]::after | |||
| content: "QR 코드 생성:"; | |||
| } | |||
| .formation-from-string::before | |||
| .formation-link-from-string>a::before | |||
| { | |||
| content: "문자열에서 읽은 팀 링크입니다"; | |||
| } | |||
| @@ -3,7 +3,22 @@ | |||
| addition_display: "추가 표시입니다", | |||
| title_blank: "입력 제목", | |||
| detail_blank: "입력 내용", | |||
| force_reload_data: "데이터 강제 새로 고침", | |||
| request_input: tp`${'info'}를 입력하십시오`, | |||
| link_read_message: { | |||
| success: tp`검색 ${'type'} 형식입니다. `, | |||
| type: { | |||
| 1: "PADDF", | |||
| 2: "PDC", | |||
| 3: "PADDB", | |||
| }, | |||
| error: { | |||
| 1: "지원되지 않는 형식입니다." , | |||
| 2: "팀 데이터가 없습니다." , | |||
| 3: "잘못된 JSON 형식입니다." , | |||
| 4: "잘못된 URL 형식입니다." , | |||
| } | |||
| }, | |||
| sort_name:{ | |||
| sort_none: "없음", | |||
| sort_id: "카드 ID", | |||
| @@ -24,7 +39,6 @@ | |||
| sort_rcvMax120_awoken: "최대 회복 (+각성)", | |||
| sort_abilityIndex_awoken: "최대 가중 능력 지수 (+각성)", | |||
| }, | |||
| force_reload_data: "데이터 강제 새로 고침", | |||
| } | |||
| deepMerge(localTranslating, _localTranslating); | |||
| localisation(localTranslating); | |||
| @@ -528,7 +528,13 @@ label[for="box-have"]::after | |||
| content: "生成二維碼:"; | |||
| } | |||
| .formation-from-string::before | |||
| .read-qr-box .result-code::before { | |||
| content: "代碼 "; | |||
| } | |||
| .read-qr-box .result-code.error::before { | |||
| content: "錯誤 "; | |||
| } | |||
| .formation-link-from-string>a::before | |||
| { | |||
| content: "從字串中讀取的隊伍連結"; | |||
| } | |||
| @@ -2,7 +2,21 @@ | |||
| webpage_title: `龍族拼圖${teamsCount}人隊伍圖製作`, | |||
| title_blank: "輸入隊伍標題", | |||
| detail_blank: "輸入説明", | |||
| force_reload_data: "強制刷新數據", | |||
| request_input: tp`請輸入${'info'}`, | |||
| link_read_message: { | |||
| success: tp`發現 ${'type'} 格式。`, | |||
| type: { | |||
| "1": "智龍急速陣型", | |||
| "2": "PDC", | |||
| "3": "PADDB", | |||
| }, | |||
| error: { | |||
| 1: "No formation data.", | |||
| 2: "The illegal JSON format.", | |||
| 3: "The illegal URL format.", | |||
| } | |||
| }, | |||
| sort_name:{ | |||
| sort_none: "無", | |||
| sort_id: "怪物ID", | |||
| @@ -23,7 +37,6 @@ | |||
| sort_rcvMax120_awoken: "最大回復(+覺醒)", | |||
| sort_abilityIndex_awoken: "最大加權能力指數(+覺醒)", | |||
| }, | |||
| force_reload_data: "強制刷新數據", | |||
| skill_parse: { | |||
| skill: { | |||
| error: tp`😫技能解析發生錯誤,請將角色 ID 反饋給開發者。`, | |||
| @@ -526,7 +526,13 @@ label[for="box-have"]::after | |||
| content: "生成二维码:"; | |||
| } | |||
| .formation-from-string::before | |||
| .read-qr-box .result-code::before { | |||
| content: "代码 "; | |||
| } | |||
| .read-qr-box .result-code.error::before { | |||
| content: "错误 "; | |||
| } | |||
| .formation-link-from-string>a::before | |||
| { | |||
| content: "从字符串中读取的队伍链接"; | |||
| } | |||
| @@ -2,7 +2,22 @@ | |||
| webpage_title: `智龙迷城${teamsCount}人队伍图制作`, | |||
| title_blank: "输入队伍标题", | |||
| detail_blank: "输入说明", | |||
| force_reload_data: "强制刷新数据", | |||
| request_input: tp`请输入${'info'}`, | |||
| link_read_message: { | |||
| success: tp`发现 ${'type'} 格式。`, | |||
| type: { | |||
| "1": "智龙急速阵型", | |||
| "2": "PDC", | |||
| "3": "PADDB", | |||
| }, | |||
| error: { | |||
| 1: "不支持的格式。", | |||
| 2: "无队伍数据。", | |||
| 3: "错误的 JSON 格式。", | |||
| 4: "错误的 网址 格式。", | |||
| } | |||
| }, | |||
| sort_name:{ | |||
| sort_none: "无", | |||
| sort_id: "怪物ID", | |||
| @@ -23,7 +38,6 @@ | |||
| sort_rcvMax120_awoken: "最大回复(+觉醒)", | |||
| sort_abilityIndex_awoken: "最大加权能力指数(+觉醒)", | |||
| }, | |||
| force_reload_data: "强制刷新数据", | |||
| skill_parse: { | |||
| skill: { | |||
| error: tp`😫技能解析发生错误,请将角色 ID 反馈给开发者。`, | |||
| @@ -1336,7 +1336,10 @@ var formation = new Formation(teamsCount,5); | |||
| <button class="read-qr-file brown-button"><!--读文件--></button> | |||
| <input type="file" accept="image/*" class="file-select display-none"> | |||
| </div> | |||
| <div class="info"></div> | |||
| <div class="info"> | |||
| <span class="result-code"></span><span class="result-message"></span> | |||
| <div class="formation-link-from-string"><a></a></div> | |||
| </div> | |||
| <div class="video-box display-none"> | |||
| <div><label for="sourceSelect"><!--视频源选择--></label><select id="sourceSelect"></select></div> | |||
| <video id="video" width="500" height="500"></video> | |||
| @@ -17,7 +17,22 @@ let localTranslating = { | |||
| addition_display: "💬", | |||
| title_blank: "Input Formation Title", | |||
| detail_blank: "Input Detail", | |||
| force_reload_data: `Force refresh data`, | |||
| request_input: tp`Please Input ${'info'}`, | |||
| link_read_message: { | |||
| success: tp`Find the ${'type'} format.`, | |||
| type: { | |||
| 1: "PADDF", | |||
| 2: "PDC", | |||
| 3: "PADDB", | |||
| }, | |||
| error: { | |||
| 1: "Unsupported format.", | |||
| 2: "No formation data.", | |||
| 3: "The illegal JSON format.", | |||
| 4: "The illegal URL format.", | |||
| } | |||
| }, | |||
| sort_name:{ | |||
| sort_none: "Nope", | |||
| sort_id: "Cards Id", | |||
| @@ -37,7 +52,6 @@ let localTranslating = { | |||
| sort_rcvMax120_awoken: "Max RCV (+Awoken)", | |||
| sort_abilityIndex_awoken: "Maximum Weighted Ability Index (+Awakening)", | |||
| }, | |||
| force_reload_data: `Force refresh data`, | |||
| skill_parse: { | |||
| skill: { | |||
| error: tp`😫An error occurred in skill parsing, please feedback the Card ID to the developer.`, | |||
| @@ -1462,30 +1462,32 @@ function ObjToUrl(obj) | |||
| //解析从QR图里获取的字符串 | |||
| function inputFromQrString(string) | |||
| { | |||
| const re = {code: 0, message: null}; | |||
| console.log(string); | |||
| const re = {type: 0, error: 0}; | |||
| //code 1~99 为各种编码 | |||
| if (string[0] === "{" && string[string.length-1] === "}") | |||
| { | |||
| { //生成的二维码 | |||
| console.log(string); | |||
| try{ | |||
| let jo = JSON.parse(string); | |||
| if (jo.d && typeof jo.d == "object") | |||
| { | |||
| re.code = 1; | |||
| re.message = "发现队伍数据 | Formation data founded"; | |||
| re.type = 1; | |||
| //re.message = "发现队伍数据 | Formation data founded"; | |||
| re.url = ObjToUrl(jo); | |||
| }else | |||
| { | |||
| re.code = 100; | |||
| re.message = "无队伍数据 | No formation data"; | |||
| re.error = 2; | |||
| //re.message = "无队伍数据 | No formation data"; | |||
| } | |||
| }catch(e) | |||
| { | |||
| re.code = 111; | |||
| re.message = "错误的 JSON 格式 | The illegal JSON format"; | |||
| re.error = 3; | |||
| //re.message = "错误的 JSON 格式 | The illegal JSON format"; | |||
| } | |||
| } | |||
| else if (/^(https?|file):\/\//i.test(string)) | |||
| { | |||
| { //网址二维码 | |||
| let url = new URL(string); | |||
| if (url.searchParams.get('d')) | |||
| { | |||
| @@ -1494,32 +1496,34 @@ function inputFromQrString(string) | |||
| d: JSON.parse(url.searchParams.get('d')), | |||
| s: url.searchParams.get('s'), | |||
| } | |||
| re.code = 1; | |||
| re.message = "发现队伍数据 | Formation data founded"; | |||
| re.type = 1; | |||
| //re.message = "发现队伍数据 | Formation data founded"; | |||
| re.url = ObjToUrl(jo); | |||
| }catch(e) | |||
| { | |||
| re.code = 112; | |||
| re.message = "错误的 网址 格式 | The illegal URL format"; | |||
| } catch(e) { | |||
| re.error = 4; | |||
| //re.message = "错误的 网址 格式 | The illegal URL format"; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| re.code = 100; | |||
| re.message = "无队伍数据 | No formation data"; | |||
| else if(/^https?:\/\/paddb\.net\/team\/[a-f0-9]+/i.test(string)) { | |||
| re.type = 3; | |||
| //re.message = "发现 PADDB 网址 | PADDB URL found"; | |||
| } | |||
| else { | |||
| re.error = 2; | |||
| //re.message = "无队伍数据 | No formation data"; | |||
| } | |||
| } | |||
| else if(/^\d[\d\-\w,\]}]+}/.test(string)) | |||
| { //PDC | |||
| re.code = 2; | |||
| re.message = "发现 PDC 格式 | PDC format found"; | |||
| re.type = 2; | |||
| //re.message = "发现 PDC 格式 | PDC format found"; | |||
| const newFotmation = pdcFotmationToPdfFotmation(string); | |||
| re.url = ObjToUrl(newFotmation.getPdfQrObj(false)); | |||
| } | |||
| else | |||
| { | |||
| re.code = 110; | |||
| re.message = "不支持的格式 | Unsupported format"; | |||
| re.error = 1; | |||
| //re.message = "不支持的格式 | Unsupported format"; | |||
| } | |||
| return re; | |||
| } | |||
| @@ -1760,13 +1764,13 @@ function initialize() { | |||
| qrCodeFrame.show(); | |||
| }; | |||
| qrCodeFrame.initialize = function(){ | |||
| const saveBox = this.content.saveBox; | |||
| const readBox = this.content.readBox; | |||
| readBox.info.textContent = ""; | |||
| const qrSaveBox = this.content.saveBox; | |||
| const qrReadBox = this.content.readBox; | |||
| qrReadBox.info.show(''); | |||
| readBox.videoBox.classList.add(className_displayNone); | |||
| qrReadBox.videoBox.classList.add(className_displayNone); | |||
| let qrTypeRadio = saveBox.qrDataType.find(radio=>radio.checked); | |||
| let qrTypeRadio = qrSaveBox.qrDataType.find(radio=>radio.checked); | |||
| if (qrTypeRadio) qrTypeRadio.onclick(); //打开二维码窗口就先产生二维码 | |||
| }; | |||
| qrCodeFrame.hide = function(){qrcodeReader.reset();}; | |||
| @@ -1779,25 +1783,39 @@ function initialize() { | |||
| qrReadBox.readQrFile = qrReadBox.querySelector(".read-qr-file"); | |||
| qrReadBox.filePicker = qrReadBox.querySelector(".file-select"); | |||
| qrReadBox.info = qrReadBox.querySelector(".info"); | |||
| qrReadBox.info.code = qrReadBox.info.querySelector(".result-code"); | |||
| qrReadBox.info.message = qrReadBox.info.querySelector(".result-message"); | |||
| qrReadBox.info.newLink = qrReadBox.info.querySelector(".formation-link-from-string>a"); | |||
| qrReadBox.video = qrReadBox.querySelector("#video"); | |||
| qrReadBox.videoBox = qrReadBox.querySelector(".video-box"); | |||
| qrReadBox.sourceSelect = qrReadBox.querySelector("#sourceSelect"); | |||
| qrReadBox.qrStr = qrReadBox.querySelector(".string-input"); | |||
| qrReadBox.info.show = function(message, code = 0, error = false, url="") { | |||
| qrReadBox.info.message.innerHTML = ''; | |||
| qrReadBox.info.message.append(message); | |||
| qrReadBox.info.code.textContent = code; | |||
| qrReadBox.info.code.classList.toggle(className_displayNone, code===0); | |||
| qrReadBox.info.code.classList.toggle("error", error); | |||
| qrReadBox.info.newLink.classList.toggle(className_displayNone, url.length===0); | |||
| qrReadBox.info.newLink.href = url; | |||
| } | |||
| qrReadBox.readString.onclick = function() | |||
| { | |||
| let inputResult = inputFromQrString(qrReadBox.qrStr.value); | |||
| if (inputResult.code < 100) | |||
| { | |||
| qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message; | |||
| const newLink = document.createElement("a"); | |||
| newLink.className = "formation-from-string"; | |||
| newLink.href = inputResult.url; | |||
| newLink.target = "_blank"; | |||
| qrReadBox.info.appendChild(newLink); | |||
| }else | |||
| { | |||
| qrReadBox.info.textContent = 'Code ' + inputResult.code + ':' + inputResult.message; | |||
| let lrm = localTranslating.link_read_message; | |||
| let message; | |||
| if (inputResult.type) { | |||
| message = lrm.success({type: lrm.type[inputResult.type]}); | |||
| } else { | |||
| message = lrm.error[inputResult.error]; | |||
| } | |||
| qrReadBox.info.show( | |||
| message, | |||
| inputResult.type || inputResult.error, | |||
| Boolean(inputResult.error), | |||
| inputResult.url | |||
| ) | |||
| } | |||
| qrSaveBox.qrImage = qrSaveBox.querySelector(".qr-code-image"); | |||
| @@ -1890,49 +1908,15 @@ function initialize() { | |||
| console.error(err); | |||
| if (err) { | |||
| if (err instanceof ZXing.NotFoundException) { | |||
| qrReadBox.info.textContent = 'No QR code found.'; | |||
| // console.debug('Try crop PDC original QR'); | |||
| // let cropLeft = 0, cropTop = 0, cropWidth = 300, cropHeight = 300, //裁剪尺寸 | |||
| // scale = 3, //放大倍率 | |||
| // extraLeft = 100, extraTop = 100, extraRight = 100, extraBottom = 100; //额外增加的宽度 | |||
| // let cavans = document.createElement("canvas"); | |||
| // cavans.width = cropWidth * scale + extraLeft + extraRight; | |||
| // cavans.height = cropHeight * scale + extraTop + extraBottom; | |||
| // let ctx = cavans.getContext('2d'); | |||
| // ctx.fillStyle="white"; | |||
| // ctx.fillRect(0, 0, cavans.width, cavans.height); | |||
| // ctx.drawImage(img, cropLeft, cropTop, cropWidth, cropHeight, extraLeft, extraTop, cropWidth * scale, cropHeight * scale); | |||
| // //qrReadBox.appendChild(cavans); | |||
| // qrcodeReader.decodeFromImageUrl(cavans.toDataURL()).then((result2) => { | |||
| // console.debug('Found QR code!', result2); | |||
| // qrReadBox.qrStr.value = result2.text; | |||
| // qrReadBox.readString.onclick(); | |||
| // }).catch((err2) => { | |||
| // console.error(err2); | |||
| // if (err2) { | |||
| // if (err2 instanceof ZXing.NotFoundException) { | |||
| // qrReadBox.info.textContent = 'No QR code found.'; | |||
| // } | |||
| // if (err2 instanceof ZXing.ChecksumException) { | |||
| // qrReadBox.info.textContent = 'A code was found, but it\'s read value was not valid.'; | |||
| // } | |||
| // if (err2 instanceof ZXing.FormatException) { | |||
| // qrReadBox.info.textContent = 'A code was found, but it was in a invalid format.'; | |||
| // } | |||
| // } | |||
| // }); | |||
| qrReadBox.info.show('No QR code found.'); | |||
| } | |||
| if (err instanceof ZXing.ChecksumException) { | |||
| qrReadBox.info.textContent = 'A code was found, but it\'s read value was not valid.'; | |||
| qrReadBox.info.show('A code was found, but it\'s read value was not valid.'); | |||
| } | |||
| if (err instanceof ZXing.FormatException) { | |||
| qrReadBox.info.textContent = 'A code was found, but it was in a invalid format.'; | |||
| qrReadBox.info.show('A code was found, but it was in a invalid format.'); | |||
| } | |||
| } | |||
| }); | |||
| @@ -1964,15 +1948,15 @@ function initialize() { | |||
| if (err) { | |||
| if (err instanceof ZXing.NotFoundException) { | |||
| console.debug('No QR code found.') | |||
| console.debug('No QR code found.') | |||
| } | |||
| if (err instanceof ZXing.ChecksumException) { | |||
| console.debug('A code was found, but it\'s read value was not valid.') | |||
| console.debug('A code was found, but it\'s read value was not valid.') | |||
| } | |||
| if (err instanceof ZXing.FormatException) { | |||
| console.debug('A code was found, but it was in a invalid format.') | |||
| console.debug('A code was found, but it was in a invalid format.') | |||
| } | |||
| } | |||
| }); | |||
| @@ -2011,7 +1995,7 @@ function initialize() { | |||
| { | |||
| qrcodeReader.reset(); | |||
| qrReadBox.videoBox.classList.add(className_displayNone); | |||
| qrReadBox.info.textContent = ""; | |||
| qrReadBox.info.show(''); | |||
| }else | |||
| { | |||
| @@ -8051,7 +8051,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "multi.html", | |||
| "7a8c2f2cdd08036c0b18d0fd82ca5213" | |||
| "2a9044e1ed123093a4b70d0b07164662" | |||
| ], | |||
| [ | |||
| "script-custom_elements.js", | |||
| @@ -8059,7 +8059,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "script-json_data.js", | |||
| "cbc8a5c4829cb92fb5d1d58acafb2de5" | |||
| "258b3e94b42b220da59305f70dd8920d" | |||
| ], | |||
| [ | |||
| "script-skill-parser.js", | |||
| @@ -8071,11 +8071,11 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "script.js", | |||
| "78a0521d1e288053f00e4551adb05ec7" | |||
| "7e691cad4b7b2a710e4130a44e8749a6" | |||
| ], | |||
| [ | |||
| "solo.html", | |||
| "9a82c31d52533ebc37f1a04e5753fb63" | |||
| "9525defd39f2d93ab421200bb38638ac" | |||
| ], | |||
| [ | |||
| "style-monsterimages.css", | |||
| @@ -8083,7 +8083,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "style.css", | |||
| "f10faaee49b6b30d3869e648111d5823" | |||
| "f11cfc4fb3d9757ca12f73845048e61a" | |||
| ], | |||
| [ | |||
| "temp.js", | |||
| @@ -8091,11 +8091,11 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "triple.html", | |||
| "a5deb7b8a7a1c2a9e077e079fb18271c" | |||
| "fe7bb80b2f946a477a12b446ab265c5a" | |||
| ], | |||
| [ | |||
| "languages/en.css", | |||
| "dcb34cceaac4619cba3cf18223b2e107" | |||
| "a81b75df76c97c6d07e279c9471d7f42" | |||
| ], | |||
| [ | |||
| "languages/en.js", | |||
| @@ -8103,19 +8103,19 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "languages/ja.css", | |||
| "d8906770c2dae573aca31c74db035a07" | |||
| "c37d6381c0d2a7b26bfe8ab695c4a7bc" | |||
| ], | |||
| [ | |||
| "languages/ja.js", | |||
| "17f837f31da46113606f8acb7d863dba" | |||
| "763894608375030a3596927f9cae6753" | |||
| ], | |||
| [ | |||
| "languages/ko.css", | |||
| "056bbecb3193dab6d55f0e99fcfdc7af" | |||
| "3155f19e216d42d3ac114e126392cfd8" | |||
| ], | |||
| [ | |||
| "languages/ko.js", | |||
| "9c016e79d84c2c008d6e5a4b2a16d885" | |||
| "1256cbdc3d696a57f60e2586142d6dac" | |||
| ], | |||
| [ | |||
| "languages/language-list.js", | |||
| @@ -8131,19 +8131,19 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "languages/zh-TW.css", | |||
| "a643b0b9d040a9553240b0b9c72c1f68" | |||
| "0d7584c238d91463daace4d0c0c4aa57" | |||
| ], | |||
| [ | |||
| "languages/zh-TW.js", | |||
| "b97067d6ff6412a2ace98f8aa425dc08" | |||
| "50c0fc87d11998c3df71e9abc5bbc1da" | |||
| ], | |||
| [ | |||
| "languages/zh.css", | |||
| "e5c3d7d1c2bc7268a88566ec4fa663d9" | |||
| "509b89a6de160b5bcdab42d66eac5021" | |||
| ], | |||
| [ | |||
| "languages/zh.js", | |||
| "c7d9f3adbcaf1d71bb8326ea2b33f0af" | |||
| "7ca07cb61affa6dd16fa92e226315e17" | |||
| ], | |||
| [ | |||
| "images/attrs.png", | |||
| @@ -1178,7 +1178,10 @@ var formation = new Formation(teamsCount,6); | |||
| <button class="read-qr-file brown-button"><!--读文件--></button> | |||
| <input type="file" accept="image/*" class="file-select display-none"> | |||
| </div> | |||
| <div class="info"></div> | |||
| <div class="info"> | |||
| <span class="result-code"></span><span class="result-message"></span> | |||
| <div class="formation-link-from-string"><a></a></div> | |||
| </div> | |||
| <div class="video-box display-none"> | |||
| <div><label for="sourceSelect"><!--视频源选择--></label><select id="sourceSelect"></select></div> | |||
| <video id="video" width="500" height="500"></video> | |||
| @@ -3356,11 +3356,21 @@ table .orb-icon | |||
| font-size: 20px; | |||
| padding: 5px; | |||
| } | |||
| .formation-from-string | |||
| .formation-link-from-string | |||
| { | |||
| font-size: 1.5em; | |||
| display: block; | |||
| } | |||
| .read-qr-box .result-code::before { | |||
| content: "Code "; | |||
| } | |||
| .read-qr-box .result-code.error::before { | |||
| content: "Error "; | |||
| color: red; | |||
| } | |||
| .read-qr-box .result-code::after { | |||
| content: ":"; | |||
| } | |||
| .qr-code-image | |||
| { | |||
| background-color: white; | |||
| @@ -2238,7 +2238,10 @@ var formation = new Formation(teamsCount,6); | |||
| <button class="read-qr-file brown-button"><!--读文件--></button> | |||
| <input type="file" accept="image/*" class="file-select display-none"> | |||
| </div> | |||
| <div class="info"></div> | |||
| <div class="info"> | |||
| <span class="result-code"></span><span class="result-message"></span> | |||
| <div class="formation-link-from-string"><a></a></div> | |||
| </div> | |||
| <div class="video-box display-none"> | |||
| <div><label for="sourceSelect"><!--视频源选择--></label><select id="sourceSelect"></select></div> | |||
| <video id="video" width="500" height="500"></video> | |||