Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/auto-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Auto Tag on Version Change

on:
push:
branches:
- main
paths:
- 'package.json'

jobs:
tag:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get version from package.json
id: version
run: |
VERSION=$(jq -r '.version' package.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "tag=v$VERSION" >> $GITHUB_OUTPUT

- name: Check if tag exists
id: check_tag
run: |
if git rev-parse "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi

- name: Create and push tag
if: steps.check_tag.outputs.exists == 'false'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "${{ steps.version.outputs.tag }}" -m "Release ${{ steps.version.outputs.tag }}"
git push origin "${{ steps.version.outputs.tag }}"

- name: Tag already exists
if: steps.check_tag.outputs.exists == 'true'
run: echo "Tag ${{ steps.version.outputs.tag }} already exists, skipping"
18 changes: 18 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,21 @@ jobs:
echo "- Chrome: ${{ steps.chrome-check.outputs.needs_publish == 'true' && '✓ Published' || '⊘ Skipped (up to date)' }}" >> $GITHUB_STEP_SUMMARY
echo "- Firefox: ${{ steps.firefox-check.outputs.needs_publish == 'true' && '✓ Published' || '⊘ Skipped (up to date)' }}" >> $GITHUB_STEP_SUMMARY
echo "- Edge: ${{ steps.edge-check.outputs.needs_publish == 'true' && '✓ Published' || '⊘ Skipped (up to date)' }}" >> $GITHUB_STEP_SUMMARY

# Create GitHub Release with built packages
- name: Get version
id: get_version
if: startsWith(github.ref, 'refs/tags/')
run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT

- name: Create GitHub Release
if: startsWith(github.ref, 'refs/tags/')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release create "v${{ steps.get_version.outputs.version }}" \
--title "v${{ steps.get_version.outputs.version }}" \
--notes "See [CHANGELOG](https://github.com/${{ github.repository }}/blob/main/description.md#version-history) for details." \
chrome-extension.zip#"Chrome Extension" \
firefox-extension.zip#"Firefox Extension" \
edge-extension.zip#"Edge Extension"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ node_modules/
dist/
*.zip
coverage/
.env
31 changes: 31 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Claude Code Reminders

## Pre-Commit Checklist

**ALWAYS run before committing:**

1. **Format files**: `pnpm run format`
2. **Run tests**: `pnpm run test`
3. **Check linting**: `pnpm run lint`

## Git Workflow

- Always format before committing
- Ensure all tests pass
- Verify no linting errors

## Common Commands

```bash
# Format all files
pnpm run format

# Run tests
pnpm run test

# Run linter
pnpm run lint

# Build extensions
pnpm run build
```
18 changes: 18 additions & 0 deletions _locales/en/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extensionName": {
"message": "Markdown Printer",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Save web pages as Markdown files to your Downloads folder. No setup required!",
"description": "Description of the extension"
},
"savePageButton": {
"message": "Save Page as Markdown",
"description": "Button text in popup"
},
"contextMenuTitle": {
"message": "Save as Markdown",
"description": "Context menu item title"
}
}
18 changes: 18 additions & 0 deletions _locales/fr/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extensionName": {
"message": "Markdown Printer",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Enregistrez des pages web en tant que fichiers Markdown dans votre dossier Téléchargements. Aucune configuration requise !",
"description": "Description of the extension"
},
"savePageButton": {
"message": "Enregistrer la page en Markdown",
"description": "Button text in popup"
},
"contextMenuTitle": {
"message": "Enregistrer en Markdown",
"description": "Context menu item title"
}
}
18 changes: 18 additions & 0 deletions _locales/he/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extensionName": {
"message": "Markdown Printer",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "שמור דפי אינטרנט כקבצי Markdown לתיקיית ההורדות. ללא הגדרות נדרשות!",
"description": "Description of the extension"
},
"savePageButton": {
"message": "שמור דף כ-Markdown",
"description": "Button text in popup"
},
"contextMenuTitle": {
"message": "שמור כ-Markdown",
"description": "Context menu item title"
}
}
18 changes: 18 additions & 0 deletions _locales/hi/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extensionName": {
"message": "Markdown Printer",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "वेब पेजों को Markdown फ़ाइलों के रूप में अपने डाउनलोड फ़ोल्डर में सहेजें। किसी सेटअप की आवश्यकता नहीं!",
"description": "Description of the extension"
},
"savePageButton": {
"message": "पेज को Markdown के रूप में सहेजें",
"description": "Button text in popup"
},
"contextMenuTitle": {
"message": "Markdown के रूप में सहेजें",
"description": "Context menu item title"
}
}
43 changes: 41 additions & 2 deletions build.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,16 @@ const commonFiles = [
'icon128.png',
];

// Common directories to copy
const commonDirs = ['_locales'];

// Manifest templates
const chromeManifest = {
manifest_version: 3,
name: 'Markdown Printer',
name: '__MSG_extensionName__',
version: version,
description: 'Save web pages as Markdown files to your Downloads folder. No setup required!',
description: '__MSG_extensionDescription__',
default_locale: 'en',
author: 'Lev Gelfenbuim',
homepage_url: 'https://github.com/levz0r/markdown-printer',
permissions: ['activeTab', 'contextMenus', 'downloads', 'scripting'],
Expand Down Expand Up @@ -91,6 +95,31 @@ function copyFiles(sourceDir, destDir, files) {
});
}

// Function to copy directories recursively
function copyDir(src, dest) {
if (!fs.existsSync(src)) {
console.warn(` ⚠ Warning: Directory ${src} not found`);
return;
}

ensureDir(dest);

const entries = fs.readdirSync(src, { withFileTypes: true });

for (const entry of entries) {
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);

if (entry.isDirectory()) {
copyDir(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
}

console.log(` ✓ Copied directory ${path.basename(src)}/`);
}

// Function to create zip package
function createZip(sourceDir, outputName) {
try {
Expand All @@ -114,6 +143,11 @@ if (buildChrome) {
copyFiles(sourceDir, chromeDir, commonFiles);
}

// Copy common directories (like _locales)
commonDirs.forEach(dir => {
copyDir(dir, path.join(chromeDir, dir));
});

// Write manifest
fs.writeFileSync(path.join(chromeDir, 'manifest.json'), JSON.stringify(chromeManifest, null, 2));
console.log(' ✓ Updated manifest.json');
Expand All @@ -137,6 +171,11 @@ if (buildFirefox) {
copyFiles(sourceDir, firefoxDir, commonFiles);
}

// Copy common directories (like _locales)
commonDirs.forEach(dir => {
copyDir(dir, path.join(firefoxDir, dir));
});

// Write manifest
fs.writeFileSync(
path.join(firefoxDir, 'manifest.json'),
Expand Down
92 changes: 92 additions & 0 deletions description-fr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Markdown Printer - Français

Markdown Printer vous permet de sauvegarder n'importe quelle page web en tant que fichier Markdown en un seul clic. Parfait pour le développement IA, la documentation et la prise de notes.

## ✨ FONCTIONNALITÉS

• Aucune configuration requise - fonctionne immédiatement après l'installation
• Préserve le formatage (titres, liens, blocs de code, listes, tableaux)
• Enregistrez n'importe où avec la boîte de dialogue familière "Enregistrer sous"
• Conversion rapide côté client
• Menu contextuel clic droit + popup dans la barre d'outils
• Ajoute des métadonnées (URL source, date d'enregistrement)
• Sortie propre - supprime les scripts, styles et éléments indésirables

## 🎯 COMMENT ÇA MARCHE

1. Accédez à n'importe quelle page web
2. Faites un clic droit et sélectionnez "Enregistrer en Markdown" OU cliquez sur l'icône de l'extension
3. Choisissez où enregistrer dans la boîte de dialogue
4. C'est fait ! Votre page est maintenant un fichier .md

## 📝 PARFAIT POUR

• Développement IA/LLM - Alimentez Claude, ChatGPT ou Cursor avec une efficacité de tokens 2-3x meilleure que HTML
• Codage rapide - Sauvegardez rapidement les docs API, tutoriels et références pour votre assistant de codage IA
• Construction de bases de connaissances - Archivez les docs techniques dans un format optimisé pour le contexte IA
• Revue de code - Sauvegardez les PRs et discussions de code dans un format facilement analysable par les LLMs
• Développeurs sauvegardant la documentation
• Chercheurs archivant des articles
• Étudiants prenant des notes
• Créateurs de contenu sauvegardant des posts
• Tous les amateurs de Markdown !

## 🤖 POURQUOI MARKDOWN POUR L'IA ?

Markdown est le format optimal pour alimenter les outils IA en contexte :
• 2-3x plus de contenu dans les limites de tokens par rapport à HTML
• Format propre et structuré que les LLMs comprennent parfaitement
• Préserve les blocs de code, titres et liens sans le bruit HTML
• Fonctionne parfaitement avec Cursor, Continue et autres outils de codage IA

## 🔒 CONFIDENTIALITÉ

Cette extension ne collecte, ne transmet ni ne partage aucune donnée utilisateur. Toute la conversion se fait localement dans votre navigateur. Aucune donnée ne quitte votre ordinateur.

## 🆓 GRATUIT ET OPEN SOURCE

Voir le code source sur GitHub : https://github.com/levz0r/markdown-printer

## ⭐ SUPPORT

Trouvé un bug ou une suggestion ? Signalez-le sur GitHub ou envoyez un email à hi@lev.engineer

---

## Historique des versions

### v1.1.0 (2025-10-10)

• Ajout de la prise en charge de l'internationalisation pour l'hébreu, l'hindi et le français
• Ajout de la prise en charge des langues RTL (droite à gauche) pour l'hébreu et autres langues RTL
• Ajout de l'affichage du numéro de version dans la popup
• Amélioration du système de build pour inclure les fichiers de localisation

### v1.0.3 (2025-10-06)

• Correction de l'extraction de contenu pour fonctionner de manière fiable sur toutes les mises en page de site
• Amélioration de la capture des sites de documentation complexes (Microsoft Learn, etc.)
• Simplification de la sélection de contenu pour une meilleure compatibilité

### v1.0.2 (2025-10-06)

• Ajout de la capture de page complète avec défilement automatique
• Charge automatiquement le contenu lazy-loaded avant la conversion
• Fait défiler toute la page pour déclencher le contenu dynamique
• Performance de défilement 3x plus rapide

### v1.0.1 (2025-10-05)

• Ajout de la prise en charge de Firefox avec compatibilité multi-navigateurs
• Amélioration de la sortie Markdown en supprimant les éléments indésirables (scripts, styles, iframes, SVGs)
• Ajout d'un système de build automatisé avec gestion des versions
• Meilleure gestion des erreurs pour les pages protégées

### v1.0.0 (2025-10-01)

• Version initiale
• Conversion Markdown en un clic
• Prise en charge du menu contextuel clic droit
• Interface popup dans la barre d'outils
• Insertion de métadonnées (URL source, date de sauvegarde)
• Intégration de la boîte de dialogue Enregistrer sous
Loading