CSV読み込み(途中)

by MKGaru

HTML

<ol>
  <li>日本語Localizationを放り込む</li>
  <li>日本語Localization - Questを放り込む</li>
  <li>バニラLocalizationを放り込む</li>
  <li>バニラLocalization - Questを放り込む</li>
  <li>対象のLocalizationを放り込む</li>
  <li>対象のLocalization - Questを放り込む</li>
</ol>

<ul id="download">
  <li><a id="l" href="#" download="localization.txt">localization.txt</a></li>
  <li><a id="q" href="#" download="Localization - Quest.txt">Localization - Quest.txt</a></li>
</ul>

CSS

html,
body{
  height:100%;
}

.done{
  text-decoration: line-through;
  color: lightgray;
}

#download{
  display:none;
}

JavaScript

const container = document.body;

const headers = {
	Key:0,
  Source:1,
  Context:2,
  Changes:3,
  English:4,
  French:5,
  German:6,
  Klingon:7,
  Spanish:8
}
const jaLocalization = new Map();
const jaLocalizationQuest = new Map();
const originalLocalization = new Map();
const originalLocalizationQuest = new Map();
let localization;
let localizationQuest;
const db = [
	jaLocalization,
  jaLocalizationQuest,
  originalLocalization,
  originalLocalizationQuest
];
const translate = new Map();
const unknown = new Map();

let count = 0;
const handlers = {
	onDragOver(e){
  	e.preventDefault();
	},
  onDrop(e){
  	if(!e.dataTransfer.files.length) return;
  	e.stopPropagation();
  	e.preventDefault();
    for(const file of e.dataTransfer.files){
    	const reader = new FileReader();
    	reader.onloadend = handlers.onLoad;
    	reader.readAsText(file);
    }
  },
  onLoad(e){
  	const result = e.target.result;
    if(count<4){
    	result.replace(/\r/g,'').split('\n').forEach(line=>{
      	if(!line) return; 
    		const words = line
        	.match(/[^,"\r\n]+,|"(?:[^"]|"")*",|,/g)
          .map(w=>w.substring(0,w.length-1));
    	  if(db[count].has(words[headers.Key])) return;
    	  db[count].set(words[headers.Key],words[headers.English])
    	})
    }
    else{
    	if(count==4) localization = result.replace(/\r/g,'');
      if(count==5) localizationQuest = result.replace(/\r/g,'');
    }
    
  	document.querySelector('ol>li:nth-child('+(++count)+')').classList.add('done');
    if(count==6) handlers.onResourcesReady();
  },
  onResourcesReady(){
  	// 辞書の生成
  	db[2/*o_l*/].forEach((v,k)=>{
    	if(translate.has(v)) return;
      if(!db[0/*j_l*/].has(k)) return;
      if(v == db[0/*j_l*/].get(k)) {if(k.endsWith('Desc'))unknown.set(v); return;}
      translate.set(v,db[0/*j_l*/].get(k));
    });
    db[3/*o_lq*/].forEach((v,k)=>{
    	if(translate.has(v)) return;
      if(!db[1/*j_lq*/].has(k)) {if(k.endsWith('Desc'))unknown.set(v); return;}
      if(v ==...