Importer des documents en markdown ou HTML dans Prismic

La gem kramdown-prismic permet de convertir du markdown ou du HTML en JSON pour Prismic. Il est également possible de convertir dans l’autre sens.

J’ai récemment apporté quelques corrections et améliorations à cette gem et c’est l’occasion de montrer comment migrer du contenu Jekyll vers Prismic.

Attention: Ce type de migration nécessite d’utiliser l’import de documents dans Prismic, ce qui demande le plan Medium de Prismic (juste pour un mois si vous n’en avez pas l’usage).

Il faut écrire sa propre logique de migration en fonction de ce que vous voulez migrer. En effet kramdown-prismic n’est pas un outil directement utilisable pour l’importation, il s’occupe uniquement de la conversion markdown -> prismic.

Création du type de contenu

La première chose à faire est de créer la structure dans Prismic. Pour l’exemple, la structure sera très simple, mais vous pouvez l’adapter pour rajouter des champs correspondants a vos métadonnées de vos posts jekyll.

  • uid pour le slug de vos posts
  • title pour le champ titre
  • date pour la date de publication
  • content pour le contenu proprement dit
Le JSON du type Prismic que vous pouvez copier/coller dans l'interface de Prismic.
{
  "Main": {
    "uid": {
      "type": "UID",
      "config": {
        "label": "slug"
      }
    },
    "title": {
      "type": "StructuredText",
      "config": {
        "single": "heading1, heading2, heading3, heading4, heading5, heading6",
        "label": "title"
      }
    },
    "content": {
      "type": "StructuredText",
      "config": {
        "multi": "paragraph, preformatted, heading1, heading2, heading3, heading4, heading5, heading6, strong, em, hyperlink, image, embed, list-item, o-list-item, rtl",
        "label": "content"
      }
    },
    "date": {
      "type": "Date",
      "config": {
        "label": "date"
      }
    }
  }
}

Création des fichiers json

Le principe est de lister les fichiers markdown du dossier _posts, lire son contenu, et créer les fichiers json correspondant. Pour séparer les métadonnées des posts du contenu markdown (le fameux YAML front matter), j’utilise la gem front_matter_parser.

require 'json'
require 'date'
require 'front_matter_parser'
require 'kramdown-prismic'

loader = FrontMatterParser::Loader::Yaml.new(allowlist_classes: [Date, Time])

Dir.glob('_posts/**.md').each do |filepath|
  filename = filepath.split('/').last
  match = filename.match(/^([0-9]{4}-[0-9]{2}-[0-9]{2})-(.+).md$/)
  parsed = FrontMatterParser::Parser.parse_file(filepath, loader: loader)
  uid = match[2]
  title = parsed.front_matter['title']
  date = parsed.front_matter['date'] || match[1]
  kramdown = Kramdown::Document.new(parsed.content, input: :markdown)
  doc = {
    type: "blog",
    uid: uid,
    title: [
      {
        type: "heading1",
        content: {
          text: title,
          spans: []
        }
      }
    ],
    date: date,
    content: kramdown.to_prismic
  }
  p filepath, kramdown.warnings if kramdown.warnings.size > 0
  File.write(File.join('migration', "#{uid}.json"), JSON.generate(doc))
end

Suite

La suite de la migration consiste à gérer les pièces jointes éventuelles (image ou autre). Par simplicité je ne l’ai pas fait ici.

Ensuite vous pouvez créer une archive zip du contenu du dossier migration et l’envoyer sur Prismic. Vous pouvez suivre la procédure officielle pour cela.

Bonne migration !

Un commentaire ? Contactez moi par email.