Skip to content

Commit

Permalink
Merge pull request #4 from brutdethe/importer-les-produits
Browse files Browse the repository at this point in the history
Importer les produits
  • Loading branch information
pntbr authored Nov 1, 2024
2 parents 5504846 + d321460 commit 7bbe6b4
Show file tree
Hide file tree
Showing 13 changed files with 969 additions and 23 deletions.
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ dist/

# Ignore test files
.cache
test/stubs-layout-cache/_includes/*.js
test/stubs-layout-cache/_includes/*.js

img_products/
produits/
output/
41 changes: 30 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,12 @@ Créer une boutique simple et minimaliste pour vendre des objets ou des prestati

### Terminées

- US-01 Création de pages
- [x] Header
- [x] Footer
- [x] Déploiement sur GitHub Pages

- US-02 Gestion de l'i18n
- [x] Organisation des fichiers
- [x] Menu de sélection de la langue
- [x] Pages traduites
- [x] Traduction de l'interface
- US-05 Migration des fiches
- [x] Générer des fiches .md à partir du JSON de la boutique
- [x] Adapter les titres des fiches
- [x] Adapter le .gitignore pour ne pas enregistrer tous les produits
- [x] Tester l'import
- [x] Documenter le script de migration

- US-03 Fiche produit
- [x] Reprend une fiche produit
Expand All @@ -28,11 +24,21 @@ Créer une boutique simple et minimaliste pour vendre des objets ou des prestati
- [x] Améliore l'accessibilité Aria
- [x] Gère l'i18n
- [x] Simplifie le CSS

- US-02 Gestion de l'i18n
- [x] Organisation des fichiers
- [x] Menu de sélection de la langue
- [x] Pages traduites
- [x] Traduction de l'interface

- US-01 Création de pages
- [x] Header
- [x] Footer
- [x] Déploiement sur GitHub Pages

### À venir

- US-04 Carrousel
- US-05 Migration des fiches
- US-06 Présentation des produits
- US-07 Gestion du panier
- US-08 Paiements
Expand Down Expand Up @@ -60,6 +66,19 @@ $ npx @11ty/eleventy --serve

Le site sera accessible à l'adresse suivante : [http://localhost:8080/](http://localhost:8080/)

## Génération de Fichiers Markdown

Un [script](https://github.com/brutdethe/boutique-11ty/blob/main/script/import) est à disposition qui génère des fichiers Markdown pour chaque produit à partir d'un fichier JSON : [produits.json](https://github.com/brutdethe/boutique-11ty/blob/main/script/import/produit.json). Les fichiers générés sont organisés en deux répertoires : _/fr_ et _/en_.

Les noms de fichiers dans le répertoire _/en_ conservent les titres en français pour faciliter la gestion _i18n_ dans _11ty_.
Les titres des fichiers sont normalisés pour éliminer les caractères spéciaux, les accents et les espaces, en remplaçant ces derniers par des tirets.

Pour générer les fichiers Markdown, exécutez le script suivant :

```bash
$ node generateMarkdown.js
```

## Contribuer

Si vous souhaitez contribuer, contactez-nous, nous serons ravis d'examiner vos suggestions. Consultez aussi [CONTRIBUTING.md](./CONTRIBUTING.md) pour plus de détails.
Expand Down
164 changes: 164 additions & 0 deletions script/import/generateMD.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import fs from 'fs'
import path from 'path'

// Fonction pour normaliser le texte
function normalizeString(str) {
return str
.toLowerCase() // Convertir en minuscules
.normalize('NFD') // Décomposer les caractères accentués
.replace(/[\u0300-\u036f]/g, '') // Supprimer les marques de diacritiques
.replace(/[€]/g, '') // Supprimer le symbole euro
.replace(/[^\w\s-]/g, '') // Supprimer les caractères non alphanumériques sauf les tirets
.replace(/\s+/g, '-') // Remplacer les espaces par des tirets
.replace(/--+/g, '-') // Remplacer plusieurs tirets consécutifs par un seul
.replace(/^-+|-+$/g, '') // Supprimer les tirets en début et fin
.trim() // Supprimer les espaces en début et fin
}

// Fonction pour transformer le pinyin
function transformPinyin(pinyin) {
return pinyin
.normalize('NFD') // Normalise les caractères accentués
.replace(/[\u0300-\u036f]/g, '') // Supprime les marques de diacritiques
.replace(/([A-Z])/g, '-$1') // Ajoute un tiret devant chaque majuscule
.replace(/^-/, '') // Supprime un tiret au début s'il y en a un
.toLowerCase() // Convertit tout en minuscules
.replace(/\s+/g, '-') // Remplace les espaces par des tirets
.replace(/[^\w\s-]/g, '') // Supprime les caractères non alphanumériques sauf les tirets
.replace(/--+/g, '-') // Remplacer plusieurs tirets consécutifs par un seul
.replace(/_-+/g, '_') // Remplace _- par _
.replace(/^-+|-+$/g, '') // Supprime les tirets en début et fin
.trim() // Supprime les espaces en début et fin
}

// Obtient le chemin du répertoire courant
const __filename = new URL('', import.meta.url).pathname // Chemin absolu du fichier
const __dirname = path.dirname(__filename) // Répertoire du fichier courant

const dataFilePath = path.join(__dirname, 'produits.json') // Chemin vers le fichier JSON
const outputFrDir = path.join(__dirname, 'output/fr')
const outputEnDir = path.join(__dirname, 'output/en')

fs.mkdirSync(outputFrDir, { recursive: true })
fs.mkdirSync(outputEnDir, { recursive: true })

// Lecture du fichier JSON
fs.readFile(dataFilePath, 'utf8', (err, data) => {
if (err) {
console.error('Erreur de lecture du fichier JSON:', err)
return
}

const products = JSON.parse(data)

products.forEach((product, index) => {
// Vérification de la structure de l'objet produit
if (!product.titre || !product.description || !product.catégorie) {
console.error(
`Produit à l'index ${index} est manquant des propriétés nécessaires:`,
product
)
return // Ignorez ce produit
}

const {
id,
titre,
catégorie,
description,
prix,
quantité_produite,
poids,
capacité,
dimension,
photos
} = product

let frFileName
let enFileName

// Gestion des titres chinois
if (/[^\x00-\x7F]/.test(titre.fr)) {
// Si le titre contient des caractères chinois
frFileName = path.join(
outputFrDir,
`${id}_${transformPinyin(titre.fr)}.md`
)
enFileName = path.join(
outputEnDir,
`${id}_${transformPinyin(titre.fr)}.md`
) // Utiliser le titre français
} else {
// Normalisation pour les titres français normaux
const titleSlug = normalizeString(titre.fr)
frFileName = path.join(outputFrDir, `${id}_${titleSlug}.md`)

// Utiliser le titre français pour le fichier anglais
enFileName = path.join(outputEnDir, `${id}_${titleSlug}.md`)
}

// Contenu en français
const frOptions = []
if (dimension) frOptions.push(` dimension: ${dimension}`)
if (capacité) frOptions.push(` capacité: ${capacité}`)
if (poids) frOptions.push(` poids: ${Math.round(poids * 1000)} g`)
if (quantité_produite)
frOptions.push(
` stock: il reste ${quantité_produite} article${
quantité_produite > 1 ? 's' : ''
}`
)

// Générer la section photos
const frPhotos = photos.map((photo) => ` - ${photo}`).join('\n')

const frContent = `---
layout: product.njk
titre: ${titre.fr}
catégorie: ${catégorie}
description: >
${description.fr}
photos:
${frPhotos}
price: ${prix.toFixed(2)}
options:
${frOptions.join('\n')}
---
`

// Contenu en anglais
const enOptions = []
if (dimension) enOptions.push(` dimension: ${dimension}`)
if (capacité) enOptions.push(` capacity: ${capacité}`)
if (poids) enOptions.push(` weight: ${Math.round(poids * 1000)} g`)
if (quantité_produite)
enOptions.push(
` stock: ${quantité_produite} item${
quantité_produite > 1 ? 's' : ''
} left`
)

// Générer la section photos en anglais
const enPhotos = photos.map((photo) => ` - ${photo}`).join('\n')

const enContent = `---
layout: product.njk
titre: ${titre.en}
category: ${catégorie}
description: >
${description.en}
photos:
${enPhotos}
price: ${prix.toFixed(2)}
options:
${enOptions.join('\n')}
---
`

// Écriture des fichiers Markdown
fs.writeFileSync(frFileName, frContent.trim(), 'utf8')
fs.writeFileSync(enFileName, enContent.trim(), 'utf8')
})

console.log('Fichiers Markdown créés avec succès.')
})
Loading

0 comments on commit 7bbe6b4

Please sign in to comment.