Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Mastodonアーカイブのoutbox.jsonを読むやつ ローカルでも動くよ
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<ul>
<li>表示制限: <input type="number" id="limit" name="limit" min="1" value="1000">件</li>
<li>ファイル:<input type="file" id="file" name="file" accept="application/json"/>(outbox.jsonを指定してください)</li>
</ul>
<hr />
<table id="statuses" width="100%" border=1>
<thead>
<tr>
<td width="200px">published</td>
<td>content</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
<script language="javascript">
if (window.File && window.FileReader && window.FileList && window.Blob) {
// Great success! All the File APIs are supported.
} else {
alert('お使いのブラウザでは動作しないかもしれません');
}
var tbody = document.querySelector('#statuses tbody');
// ファイル選択が変更されたときハンドラ
function handleFileSelect(evt) {
// テーブル内容の初期化
document.querySelector('#statuses tbody').textContent = null;
// リミット値取得
var limit = parseInt(document.getElementById('limit').value, 10);
console.log("Limit = " + limit);
var file = evt.target.files[0]; // File object
var reader = new FileReader();
reader.onload = (function() {
// --S ファイルの簡易バリデーション
try {
var json = JSON.parse(reader.result);
} catch(e) {
alert("ファイルの読み込みに失敗しました。\nファイルが壊れているか、JSON形式ではありません。"); return;
}
var orderedItems = json.orderedItems;
if(orderedItems == null) { alert("対応していないデータ形式です。"); return; }
// --E ファイルの簡易バリデーション
// --S 個別の投稿の処理
var cnt = 1;
var output = "";
for(var i = orderedItems.length-1; i>=0; i--){
if(cnt >= limit) { break; } // リミットに達していたら抜ける
var status = orderedItems[i].object;
var content = "";
// Summary(Content Warning)が入っていたら付ける
if(status.summary != null) { content += '<p class="summary">▼'+status.summary+'</p>'; }
// 本文
content += status.content;
// --S 添付ファイルの処理
var attachments = "";
if(status.attachment != null && status.attachment.length > 0) {
/*
attachments += "<ul>";
for(var k = 0; k < status.attachment.length; k++){
// URLの取得
var url = new URL(status.url).origin + "/system/" + status.attachment[k].url;
attachments += '<li><a href="' + url + '" target="_blank">添付ファイル' + k + '</li>';
}
attachments += "</ul>";
*/
attachments += "<p>※添付ファイルがあります</p>";
}
// --E 添付ファイルの処理
content += attachments;
// 行の組立
output +=
"<tr>" +
'<td><a href="' + status.url + '" target="_blank">' + status.published + '</td>' +
"<td>" + content + "</td>" +
"</tr>";
cnt ++;
//console.log(status);
}
console.log("read+parse done.");
// --E 個別の投稿の処理
tbody.insertAdjacentHTML('beforeend', output); // tbody内に投稿ブロックを挿入する
console.log("insert done.");
});
reader.onerror = (function() {
alert("ファイルの読み込みに失敗しました。\n一般エラーです。");
});
reader.readAsText(file); // ファイルの読み込み
}
document.getElementById('file').addEventListener('change', handleFileSelect, false); // イベントハンドラの登録
</script>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.