(content, serverUrl, documentTitle = null)
| 184 | |
| 185 | // Function to convert text to DOCX via API |
| 186 | async function convertToDocxViaApi(content, serverUrl, documentTitle = null) { |
| 187 | try { |
| 188 | // Get API settings from storage |
| 189 | const settings = await chrome.storage.sync.get({ |
| 190 | docxServerUrl: 'https://api.ds.rick216.cn', |
| 191 | docxApiKey: '', |
| 192 | removeDividers: false, // Default to false for removing dividers |
| 193 | removeEmojis: false, // Default to false for removing emojis |
| 194 | convertMermaid: false, // Default to false for Mermaid conversion |
| 195 | compatMode: true, // Default to true for compatibility mode |
| 196 | hardLineBreaks: false, // Default to false for hard line breaks |
| 197 | disableAutoNumbering: false, // Default to false for disable auto numbering |
| 198 | lastUsedTemplate: null |
| 199 | }); |
| 200 | |
| 201 | const rawUrl = serverUrl || settings.docxServerUrl || 'https://api.ds.rick216.cn'; |
| 202 | const url = isValidUrl(rawUrl) ? rawUrl : 'https://api.ds.rick216.cn'; |
| 203 | const apiKey = settings.docxApiKey; |
| 204 | |
| 205 | // Ensure API key is provided |
| 206 | if (!apiKey) { |
| 207 | throw new Error('API Key not set. Please configure your API key in the extension settings.'); |
| 208 | } |
| 209 | |
| 210 | // Ensure content is a string |
| 211 | if (!content || typeof content !== 'string') { |
| 212 | throw new Error('Invalid content for conversion. Content must be text.'); |
| 213 | } |
| 214 | |
| 215 | console.debug('Sending content to API:', content.substring(0, 100) + '...'); |
| 216 | console.debug('Remove Dividers:', settings.removeDividers); |
| 217 | console.debug('Remove Emojis:', settings.removeEmojis); |
| 218 | console.debug('Convert Mermaid:', settings.convertMermaid); |
| 219 | |
| 220 | // Remove emojis from content if enabled (frontend processing) |
| 221 | let processedContent = content; |
| 222 | if (settings.removeEmojis) { |
| 223 | // First, convert number emojis to their text equivalents |
| 224 | // Handle keycap number emojis (0️⃣-9️⃣) - these are composed of digit + FE0F + 20E3 |
| 225 | processedContent = processedContent.replace(/0\uFE0F?\u20E3/gu, '0. '); |
| 226 | processedContent = processedContent.replace(/1\uFE0F?\u20E3/gu, '1. '); |
| 227 | processedContent = processedContent.replace(/2\uFE0F?\u20E3/gu, '2. '); |
| 228 | processedContent = processedContent.replace(/3\uFE0F?\u20E3/gu, '3. '); |
| 229 | processedContent = processedContent.replace(/4\uFE0F?\u20E3/gu, '4. '); |
| 230 | processedContent = processedContent.replace(/5\uFE0F?\u20E3/gu, '5. '); |
| 231 | processedContent = processedContent.replace(/6\uFE0F?\u20E3/gu, '6. '); |
| 232 | processedContent = processedContent.replace(/7\uFE0F?\u20E3/gu, '7. '); |
| 233 | processedContent = processedContent.replace(/8\uFE0F?\u20E3/gu, '8. '); |
| 234 | processedContent = processedContent.replace(/9\uFE0F?\u20E3/gu, '9. '); |
| 235 | // Handle special keycap ten emoji |
| 236 | processedContent = processedContent.replace(/🔟/gu, '10. '); |
| 237 | |
| 238 | // Then remove other emoji characters using regex |
| 239 | processedContent = processedContent.replace(/[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F000}-\u{1F02F}\u{1F0A0}-\u{1F0FF}\u{1F100}-\u{1F64F}\u{1F680}-\u{1F6FF}\u{1F900}-\u{1F9FF}\u{1FA00}-\u{1FA6F}\u{1FA70}-\u{1FAFF}\u{FE00}-\u{FE0F}\u{1F200}-\u{1F251}]/gu, ''); |
| 240 | } |
| 241 | |
| 242 | const currentLang = chrome.i18n.getUILanguage(); |
| 243 | const language = currentLang.startsWith('zh') ? 'zh' : 'en'; |
no test coverage detected