반응형
크롬 확장 프로그램을 만드는 과정을 단계별로 안내해드리겠습니다.
예시파일은 특정문서의 내용을 읽어서 타이핑해주는 프로그램입니다.
1. 파일 구성
먼저 새로운 디렉토리를 만들고 그 안에 필요한 파일들을 생성해야 합니다.
다음 파일들이 필요합니다:
auto-typer-extension/
├── manifest.json
├── popup.html
├── popup.js
├── content.js
└── lib/
└── mammoth.browser.min.js
2. 각 파일의 내용을 작성
1. manifest.json 파일
{
"manifest_version": 3,
"name": "자동 타이핑",
"version": "1.0",
"description": "워드 문서의 내용을 자동으로 타이핑해주는 확장 프로그램",
"permissions": [
"activeTab",
"storage"
],
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/icon16.png",
"32": "images/icon32.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
},
"icons": {
"16": "images/icon16.png",
"32": "images/icon32.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["lib/mammoth.browser.min.js", "content.js"]
}]
}
2. popup.html파일
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
body {
width: 300px;
padding: 15px;
font-family: Arial, sans-serif;
}
.container {
display: flex;
flex-direction: column;
gap: 15px;
}
.speed-control {
display: flex;
align-items: center;
gap: 10px;
}
input[type="number"] {
width: 80px;
}
.status {
margin-top: 10px;
color: #666;
font-size: 0.9em;
}
</style>
</head>
<body>
<div class="container">
<h3>자동 타이핑</h3>
<div>
<input type="file" id="fileInput" accept=".docx">
</div>
<div class="speed-control">
<label>타이핑 속도 (분당):</label>
<input type="number" id="typingSpeed" value="370" min="1">
</div>
<div class="status" id="status"></div>
</div>
<script src="lib/mammoth.browser.min.js"></script>
<script src="popup.js"></script>
</body>
</html>
3. popup.js
document.addEventListener('DOMContentLoaded', function() {
// 저장된 속도 불러오기
chrome.storage.local.get(['typingSpeed'], function(result) {
if (result.typingSpeed) {
document.getElementById('typingSpeed').value = result.typingSpeed;
}
});
// 파일 선택 이벤트 리스너
document.getElementById('fileInput').addEventListener('change', async (event) => {
const file = event.target.files[0];
if (!file || !file.name.endsWith('.docx')) {
showStatus('DOCX 파일을 선택해주세요.', 'error');
return;
}
showStatus('파일 처리 중...', 'processing');
const reader = new FileReader();
reader.onload = async (e) => {
const arrayBuffer = e.target.result;
try {
const result = await mammoth.extractRawText({ arrayBuffer });
const speed = document.getElementById('typingSpeed').value;
// 텍스트와 속도를 storage에 저장
chrome.storage.local.set({
wordText: result.value,
typingSpeed: parseInt(speed) || 370
}, () => {
showStatus('파일이 로드되었습니다. 타이핑할 위치를 더블클릭하세요.', 'success');
});
} catch (err) {
console.error('파일 읽기 오류:', err);
showStatus('파일 읽기 중 오류가 발생했습니다.', 'error');
}
};
reader.readAsArrayBuffer(file);
});
// 타이핑 속도 변경 이벤트 리스너
document.getElementById('typingSpeed').addEventListener('change', (event) => {
const speed = parseInt(event.target.value) || 370;
chrome.storage.local.set({ typingSpeed: speed });
});
});
function showStatus(message, type = 'info') {
const statusEl = document.getElementById('status');
statusEl.textContent = message;
statusEl.style.color = type === 'error' ? '#dc3545' :
type === 'success' ? '#28a745' :
type === 'processing' ? '#007bff' : '#666';
}
4. content.js
let typingInterval = null;
let currentCharIndex = 0;
let targetElement = null;
// 더블클릭 이벤트 리스너
document.addEventListener('dblclick', async (e) => {
if (e.target.isContentEditable ||
e.target.tagName === 'INPUT' ||
e.target.tagName === 'TEXTAREA') {
targetElement = e.target;
// storage에서 저장된 텍스트와 속도 가져오기
const data = await chrome.storage.local.get(['wordText', 'typingSpeed']);
if (!data.wordText) {
alert('먼저 확장 프로그램에서 워드 문서를 선택해주세요.');
return;
}
startTyping(data.wordText, data.typingSpeed);
}
});
function startTyping(text, speed) {
currentCharIndex = 0;
clearInterval(typingInterval);
typingInterval = setInterval(() => {
if (!targetElement) {
clearInterval(typingInterval);
return;
}
if (currentCharIndex < text.length) {
const charToType = text.charAt(currentCharIndex);
if (targetElement.isContentEditable) {
insertTextAtCursor(charToType);
} else {
insertTextAtInput(charToType);
}
currentCharIndex++;
} else {
clearInterval(typingInterval);
alert('타이핑이 완료되었습니다!');
}
}, 60000 / speed);
}
function insertTextAtCursor(text) {
const selection = window.getSelection();
const range = selection.getRangeAt(0);
range.deleteContents();
const textNode = document.createTextNode(text);
range.insertNode(textNode);
range.setStartAfter(textNode);
range.setEndAfter(textNode);
selection.removeAllRanges();
selection.addRange(range);
}
function insertTextAtInput(text) {
const start = targetElement.selectionStart;
const end = targetElement.selectionEnd;
const value = targetElement.value;
targetElement.value = value.substring(0, start) + text + value.substring(end);
targetElement.selectionStart = targetElement.selectionEnd = start + 1;
}
5. mammoth.browser.min.js
파일을 다운로드하여 lib
폴더에 저장합니다
- [https://github.com/mwilliamson/mammoth.js/releases](https://github.com/mwilliamson/mammoth.js/releases) 에서 최신 버전을 다운로드
6. 아이콘 이미지를 준비합니다
- 16x16, 32x32, 48x48, 128x128 크기의 PNG 이미지를 준비
- `images` 폴더를 만들고 그 안에 저장
<
3. 크롬에서 확장 프로그램 설치
- Chrome 브라우저에서 `chrome://extensions` 접속
- 우측 상단의 "개발자 모드" 활성화
- "압축해제된 확장 프로그램을 로드합니다" 클릭
- 위에서 만든 폴더를 선택
4. 사용 방법
- 크롬 브라우저 우측 상단의 확장 프로그램 아이콘 클릭
- Word 문서(.docx) 선택
- 원하는 타이핑 속도 설정
- 다른 웹사이트에서 텍스트를 입력하고 싶은 곳을 더블클릭
- 자동으로 타이핑 시작
반응형
'코딩' 카테고리의 다른 글
파이선(Python) 코드를 윈도우 실행 파일로 만들기 (1) | 2024.12.19 |
---|