YT YanQuan Tools
首页 › 文档转换工具集
返回工具首页

© 2026 YanQuan Tools · 所有处理均在浏览器本地完成,文件不上传服务器

鄂ICP备xxxxxxxx号

';var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([h],{type:'text/html'}));a.download='export.html';a.click()} function exportMd(){var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([document.getElementById('mdInput').value],{type:'text/markdown'}));a.download='export.md';a.click()} function importHtml(){ var h=prompt('粘贴HTML代码:');if(!h)return; if(window.TurndownService){var td=new TurndownService();document.getElementById('mdInput').value=td.turndown(h);mdPreview()}else{alert('turndown.js 未加载')} } function renderCsvTab(){ return '
' } function switchCsvSub(sub){ document.querySelectorAll('.sub-panel').forEach(function(p){p.classList.remove('active')}); var showId = sub==='toJson' ? 'csvToJson' : 'jsonCsvInputPanel'; document.getElementById(showId).classList.add('active'); document.querySelectorAll('.sub-tab-btn').forEach(function(b,i){b.classList.toggle('active',(sub==='toJson'&&i===0)||(sub==='toCsv'&&i===1))}) } function csvToJson(){ var t=document.getElementById('csvInput').value;var sep=',';if(t.indexOf(';')>=0&&t.indexOf(',')<0)sep=';';if(t.indexOf('\t')>=0)sep='\t'; var lines=t.split('\n').filter(function(l){return l.trim()});var useHeader=document.getElementById('csvHeader').checked;var headers=[]; var data=[];lines.forEach(function(l,i){ var cols=l.split(sep); if(i===0&&useHeader){headers=cols.map(function(c){return c.trim()});return} if(useHeader){var obj={};headers.forEach(function(h,hi){obj[h]=cols[hi]?cols[hi].trim():''});data.push(obj)}else{data.push(cols)} }); document.getElementById('csvResult').value=JSON.stringify(data,null,2) } function jsonToCsv(){ try{var arr=JSON.parse(document.getElementById('jsonCsvInput').value);if(!Array.isArray(arr)||arr.length===0){document.getElementById('jsonCsvResult').value='JSON格式错误,需要对象数组';return}}catch(e){document.getElementById('jsonCsvResult').value='JSON格式错误';return} var keys=Object.keys(arr[0]);var lines=[keys.join(',')];arr.forEach(function(obj){lines.push(keys.map(function(k){var v=String(obj[k]||'');return v.indexOf(',')>=0?'"'+v+'"':v}).join(','))}); document.getElementById('jsonCsvResult').value=lines.join('\n') } function renderXmlTab(){ return '
' } function switchXmlSub(sub){ document.querySelectorAll('.sub-panel').forEach(function(p){p.classList.remove('active')}); document.getElementById(sub==='toJson'?'xmlToJson':'xmlToXml').classList.add('active'); document.querySelectorAll('.sub-tab-btn').forEach(function(b,i){b.classList.toggle('active',(sub==='toJson'&&i===0)||(sub==='toXml'&&i===1))}) } function xmlToJson(){ try{var p=new DOMParser();var doc=p.parseFromString(document.getElementById('xmlInput').value,'text/xml');var err=doc.querySelector('parsererror');if(err){document.getElementById('xmlResult').value='XML解析错误: '+err.textContent;return}var obj=nodeToObj(doc.documentElement);document.getElementById('xmlResult').value=JSON.stringify(obj,null,2)}catch(e){document.getElementById('xmlResult').value='转换失败: '+e.message} } function nodeToObj(el){ var obj={};if(el.attributes.length>0){obj['@attributes']={};Array.from(el.attributes).forEach(function(a){obj['@attributes'][a.name]=a.value})} var hasText=false;Array.from(el.childNodes).forEach(function(c){ if(c.nodeType===3&&c.textContent.trim())hasText=true; if(c.nodeType===1){var key=c.tagName;var val=nodeToObj(c);if(obj[key]){if(!Array.isArray(obj[key]))obj[key]=[obj[key]];obj[key].push(val)}else obj[key]=val} }); if(hasText&&Object.keys(obj).length===0)return el.textContent.trim(); if(hasText)obj['#text']=el.textContent.trim();return obj } function jsonToXml(){ try{var obj=JSON.parse(document.getElementById('jsonXmlInput').value);var root=document.getElementById('xmlRoot').value||'root';var xml='\\n'+objToXml(obj,root);document.getElementById('jsonXmlResult').value=xml}catch(e){document.getElementById('jsonXmlResult').value='JSON解析错误'} } function objToXml(obj,tag){ if(typeof obj!=='object'||obj===null)return '<'+tag+'>'+String(obj)+''; if(Array.isArray(obj))return obj.map(function(i){return objToXml(i,tag)}).join(''); var attrs='';var inner='';Object.keys(obj).forEach(function(k){if(k==='@attributes'){Object.keys(obj[k]).forEach(function(a){attrs+=' '+a+'="'+obj[k][a]+'"'})}else if(k==='#text'){inner+=obj[k]}else{inner+=objToXml(obj[k],k)}}); return '<'+tag+attrs+'>'+inner+'' } function renderYamlTab(){ return '
' } function switchYamlSub(sub){ document.querySelectorAll('.sub-panel').forEach(function(p){p.classList.remove('active')}); document.getElementById(sub==='toJson'?'yamlToJson':'yamlToYaml').classList.add('active'); document.querySelectorAll('.sub-tab-btn').forEach(function(b,i){b.classList.toggle('active',(sub==='toJson'&&i===0)||(sub==='toYaml'&&i===1))}) } function yamlToJson(){ if(window.jsyaml){try{var obj=jsyaml.load(document.getElementById('yamlInput').value);document.getElementById('yamlResult').value=JSON.stringify(obj,null,2)}catch(e){document.getElementById('yamlResult').value='YAML解析错误: '+e.message}}else{document.getElementById('yamlResult').value='加载js-yaml中...'} } function jsonToYaml(){ if(window.jsyaml){try{var obj=JSON.parse(document.getElementById('jsonYamlInput').value);document.getElementById('jsonYamlResult').value=jsyaml.dump(obj)}catch(e){document.getElementById('jsonYamlResult').value='转换错误: '+e.message}}else{document.getElementById('jsonYamlResult').value='加载js-yaml中...'} } function renderImgTab(){ return '

上传图片 · 支持PNG/JPEG/WebP/BMP

80%
' } var dcImages=[]; function handleDcImages(){var files=document.getElementById('dcImgFiles').files;dcImages=Array.from(files).map(function(f){return {name:f.name,size:f.size,file:f,converted:null,convSize:0}});renderDcImgList()} function renderDcImgList(){ var h='';dcImages.forEach(function(img,i){h+='
'+img.name+'
原始: '+(img.size/1024).toFixed(1)+'KB '+(img.converted?(' → '+(img.convSize/1024).toFixed(1)+'KB'):'')+'
'}); document.getElementById('dcImgResult').innerHTML=h||'

未上传图片

' } function convertDcImages(){ var fmt=document.getElementById('dcImgFmt').value.toLowerCase();var q=parseInt(document.getElementById('dcImgQ').value)/100;var mime='image/'+(fmt==='ico'?'png':fmt); dcImages.forEach(function(img){ var reader=new FileReader();reader.onload=function(e){var orig=new Image();orig.onload=function(){var c=document.createElement('canvas');c.width=orig.width;c.height=orig.height;c.getContext('2d').drawImage(orig,0,0);var data=c.toDataURL(mime,q);img.converted=data;img.convSize=Math.ceil(data.split(',')[1].length*3/4);renderDcImgList()};orig.src=e.target.result};reader.readAsDataURL(img.file) }) } function downloadDcImgs(){ if(dcImages.length===0)return;var script=document.createElement('script');script.src='https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js'; script.onload=function(){var zip=new JSZip();var ext=document.getElementById('dcImgFmt').value.toLowerCase();dcImages.forEach(function(img,i){var data=(img.converted||'').split(',')[1];if(data)zip.file(img.name.replace(/\.[^.]+$/,'.'+ext),data,{base64:true})});zip.generateAsync({type:'blob'}).then(function(b){var a=document.createElement('a');a.href=URL.createObjectURL(b);a.download='converted_images.zip';a.click()})}; document.head.appendChild(script) } function renderRegexTab(){ return '
' } function setRegexPat(p){var el=document.getElementById('regexPat');el.value=p;testRegex()} function testRegex(){ var pat=document.getElementById('regexPat').value;var flags=document.getElementById('regexFlags').value;var text=document.getElementById('regexText').value; var hasRep=document.getElementById('regexHasReplace').checked;var repEl=document.getElementById('regexReplace');repEl.style.display=hasRep?'inline-block':'none';var repl=repEl.value; var hl=document.getElementById('regexHighlight');var ml=document.getElementById('regexMatchList'); if(!pat){hl.textContent=text;ml.innerHTML='';return} try{var re=new RegExp(pat,flags)}catch(e){hl.textContent='正则表达式错误: '+e.message;ml.innerHTML='
'+e.message+'
';return} if(hasRep){hl.textContent=text.replace(re,repl);var all=text.match(new RegExp(re.source,'g'+flags.replace('g','')));var mh='匹配到 '+((all?all.length:0))+' 处:
';if(all)all.forEach(function(m,i){mh+=i+': '+m+'
'});ml.innerHTML=mh;return} var gRe=new RegExp(re.source,'g'+flags.replace('g',''));var hlText=text.replace(gRe,function(m){return ''+m+''}); hl.innerHTML=hlText; var matches=text.match(gRe)||[];var mh='匹配到 '+matches.length+' 处:
';matches.forEach(function(m,i){mh+=i+': '+m+'
'}); var capRe=new RegExp(re.source,flags.replace('g',''));var capMatch=text.match(capRe);if(capMatch){mh+='
捕获组详情:
';for(var j=1;j'} ml.innerHTML=mh } var unitCategories={length:[{name:'米(m)',factor:1},{name:'千米(km)',factor:1000},{name:'厘米(cm)',factor:0.01},{name:'毫米(mm)',factor:0.001},{name:'英里(mi)',factor:1609.344},{name:'英尺(ft)',factor:0.3048},{name:'英寸(in)',factor:0.0254}],weight:[{name:'千克(kg)',factor:1},{name:'克(g)',factor:0.001},{name:'毫克(mg)',factor:0.000001},{name:'吨(t)',factor:1000},{name:'磅(lb)',factor:0.453592},{name:'盎司(oz)',factor:0.0283495}],area:[{name:'平方米',factor:1},{name:'平方千米',factor:1e6},{name:'公顷',factor:10000},{name:'亩',factor:666.667},{name:'平方英尺',factor:0.092903}],volume:[{name:'升(L)',factor:1},{name:'毫升(mL)',factor:0.001},{name:'立方米',factor:1000},{name:'加仑(gal)',factor:3.78541},{name:'品脱(pt)',factor:0.473176}],temperature:[],speed:[{name:'米/秒',factor:1},{name:'千米/时',factor:0.277778},{name:'英里/时',factor:0.44704},{name:'节',factor:0.514444},{name:'马赫',factor:340.3}],data:[{name:'bit',factor:1},{name:'Byte',factor:8},{name:'KB',factor:8192},{name:'MB',factor:8388608},{name:'GB',factor:8589934592},{name:'TB',factor:8796093022208},{name:'PB',factor:9007199254740992}]}; var unitCat='length'; function renderUnitTab(){ var labels={length:'长度',weight:'重量',area:'面积',volume:'体积',temperature:'温度',speed:'速度',data:'数据存储'}; var cats=Object.keys(unitCategories); var opts=cats.map(function(k){return ''}).join(''); return '
'+opts+'
' } function switchUnitCat(cat){unitCat=cat;renderDcTab(6)} function convertUnits(){ if(unitCat==='temperature'){renderTempUnits();return} var units=unitCategories[unitCat];if(!units)return; var g=document.getElementById('unitGrid');g.innerHTML=''; units.forEach(function(u,i){ var d=document.createElement('div');d.className='unit-item'; var inp=document.createElement('input');inp.type='text';inp.id='unit'+i; inp.oninput=(function(idx){return function(){updateFromUnit(idx)}})(i); d.appendChild(inp); var l=document.createElement('span');l.className='unit-label';l.textContent=u.name;d.appendChild(l); var bt=document.createElement('button');bt.textContent='复制';bt.className='btn btn-sm btn-outline';bt.style.fontSize='0.65rem';bt.style.padding='2px 6px'; bt.onclick=function(){var el=document.getElementById('unit'+i);el.select();navigator.clipboard.writeText(el.value)};d.appendChild(bt);g.appendChild(d) }); if(window._unitBase){updateAllUnits(window._unitBase)}else{document.getElementById('unit0')?document.getElementById('unit0').value='1':null;if(document.getElementById('unit0'))updateFromUnit(0)} } function updateFromUnit(idx){ var el=document.getElementById('unit'+idx);if(!el)return;var val=parseFloat(el.value);if(isNaN(val))return;var units=unitCategories[unitCat];var base=val*units[idx].factor;window._unitBase=base;updateAllUnits(base) } function updateAllUnits(base){ var units=unitCategories[unitCat];var prec=parseInt(document.getElementById('unitPrec').value)||6; units.forEach(function(u,i){var el=document.getElementById('unit'+i);if(!el||document.activeElement===el)return;el.value=parseFloat((base/u.factor).toFixed(prec))}) } function renderTempUnits(){ var g=document.getElementById('unitGrid');g.innerHTML='
摄氏(°C)
华氏(°F)
开尔文(K)
' } function convertTemp(from){ var c=document.getElementById('tC'),f=document.getElementById('tF'),k=document.getElementById('tK'); if(from==='C'){var v=parseFloat(c.value);if(isNaN(v))return;f.value=(v*9/5+32).toFixed(2);k.value=(v+273.15).toFixed(2)} else if(from==='F'){var v=parseFloat(f.value);if(isNaN(v))return;c.value=((v-32)*5/9).toFixed(2);k.value=((v-32)*5/9+273.15).toFixed(2)} else{var v=parseFloat(k.value);if(isNaN(v))return;c.value=(v-273.15).toFixed(2);f.value=((v-273.15)*9/5+32).toFixed(2)} } function copyResult(id){var el=document.getElementById(id);if(!el)return;el.select();try{navigator.clipboard.writeText(el.value)}catch(e){document.execCommand('copy')}} function downloadResult(id,ext){var el=document.getElementById(id);if(!el)return;var a=document.createElement('a');a.href=URL.createObjectURL(new Blob([el.value],{type:'text/plain'}));a.download='output'+ext;a.click()} function loadCdns(){ var scripts=['https://cdnjs.cloudflare.com/ajax/libs/marked/4.3.0/marked.min.js','https://cdnjs.cloudflare.com/ajax/libs/turndown/7.1.2/turndown.js','https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js']; scripts.forEach(function(s){var sc=document.createElement('script');sc.src=s;document.head.appendChild(sc)}) } loadCdns(); renderDcTab(0);