40 votes

Convertir Rapidement (.rtf/.doc) les Fichiers de Syntaxe Markdown avec PHP

J'ai été manuellement la conversion d'articles dans la syntaxe Markdown pour quelques jours maintenant, et il devient assez fastidieux. Certains de ceux-ci sont 3 ou 4 pages, italique et d'autres de texte mise en évidence tout au long de. Est-il un moyen plus rapide pour convertir les (.rtf/.doc) les fichiers à nettoyer, la Syntaxe Markdown que je peux profiter de la?

92voto

David Points 801

Si vous arrive d'être sur un mac, textutil fait un bon travail de convertir doc, docx et rtf en html, et pandoc fait un bon travail de convertir le html résultant de markdown:

$ textutil -convert html file.doc -stdout | pandoc -f html -t markdown -o file.md

J'ai un script que j'ai jeté un temps, qui essaie d'utiliser textutil, pdf2html, et pandoc pour convertir tout ce que je jeter à elle de markdown.

11voto

Taj Moore Points 91

ProgTips a une solution possible avec une macro Word (source télécharger):

Une simple macro (source de téléchargement) pour la conversion de la plupart des choses triviales automatiquement. Cette macro:

  • Remplacer le gras et l'italique
  • Remplacer les en-têtes (marquée titre 1-6)
  • Remplacer les listes à puces et numérotées

Il est très buggé, je crois qu'il se bloque sur des documents plus volumineux, mais je suis Ne disons PAS que c'est une version stable de toute façon! :-) L'utilisation à titre expérimental seulement, recode et de la réutiliser comme vous voulez, postez un commentaire si vous avez trouvé un une meilleure solution.

Source: ProgTips

Macro source

Installation

  • ouvrir WinWord,
  • appuyez sur Alt+F11 pour ouvrir l'éditeur VBA,
  • cliquez-droit sur le premier projet dans le navigateur de projets
  • choisissez insertion->module
  • collez le code dans le fichier
  • fermer éditeur de macro
  • allez dans outils>macro>macros; exécuter la macro nommée MarkDown

Source: ProgTips

Source

Macro source pour garder en toute sécurité si ProgTips supprime le post ou le site est anéanti:

'*** A simple MsWord->Markdown replacement macro by Kriss Rauhvargers, 2006.02.02.
'*** This tool does NOT implement all the markup specified in MarkDown definition by John Gruber, only
'*** the most simple things. These are:
'*** 1) Replaces all non-list paragraphs to ^p paragraph so MarkDown knows it is a stand-alone paragraph
'*** 2) Converts tables to text. In fact, tables get lost.
'*** 3) Adds a single indent to all indented paragraphs
'*** 4) Replaces all the text in italics to _text_
'*** 5) Replaces all the text in bold to **text**
'*** 6) Replaces Heading1-6 to #..#Heading (Heading numbering gets lost)
'*** 7) Replaces bulleted lists with ^p *  listitem ^p*  listitem2...
'*** 8) Replaces numbered lists with ^p 1. listitem ^p2.  listitem2...
'*** Feel free to use and redistribute this code
Sub MarkDown()
    Dim bReplace As Boolean
    Dim i As Integer
    Dim oPara As Paragraph


    'remove formatting from paragraph sign so that we dont get **blablabla^p** but rather **blablabla**^p
    Call RemoveBoldEnters


    For i = Selection.Document.Tables.Count To 1 Step -1
            Call Selection.Document.Tables(i).ConvertToText
    Next

    'simple text indent + extra paragraphs for non-numbered paragraphs
    For i = Selection.Document.Paragraphs.Count To 1 Step -1
        Set oPara = Selection.Document.Paragraphs(i)
        If oPara.Range.ListFormat.ListType = wdListNoNumbering Then
            If oPara.LeftIndent > 0 Then
                oPara.Range.InsertBefore (">")
            End If
            oPara.Range.InsertBefore (vbCrLf)
        End If


    Next

    'italic -> _italic_
    Selection.HomeKey Unit:=wdStory
    bReplace = ReplaceOneItalic  'first replacement
    While bReplace 'other replacements
        bReplace = ReplaceOneItalic
    Wend

    'bold-> **bold**
    Selection.HomeKey Unit:=wdStory
    bReplace = ReplaceOneBold 'first replacement
    While bReplace
        bReplace = ReplaceOneBold 'other replacements
    Wend



    'Heading -> ##heading
    For i = 1 To 6 'heading1 to heading6
        Selection.HomeKey Unit:=wdStory
        bReplace = ReplaceH(i) 'first replacement
        While bReplace
            bReplace = ReplaceH(i) 'other replacements
        Wend
    Next

    Call ReplaceLists


    Selection.HomeKey Unit:=wdStory
End Sub


'***************************************************************
' Function to replace bold with _bold_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'***************************************************************
Function ReplaceOneBold() As Boolean
    Dim bReturn As Boolean

    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Font.Bold = True
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Text = "**" & Selection.Text & "**"
        Selection.Font.Bold = False
        Selection.Find.Execute
    Wend

    ReplaceOneBold = bReturn
End Function

'*******************************************************************
' Function to replace italic with _italic_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'********************************************************************
Function ReplaceOneItalic() As Boolean
    Dim bReturn As Boolean

        Selection.Find.ClearFormatting

    With Selection.Find
        .Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Font.Italic = True
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Text = "_" & Selection.Text & "_"
        Selection.Font.Italic = False
        Selection.Find.Execute
    Wend
    ReplaceOneItalic = bReturn
End Function

'*********************************************************************
' Function to replace headingX with #heading, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'*********************************************************************
Function ReplaceH(ByVal ipNumber As Integer) As Boolean
    Dim sReplacement As String

    Select Case ipNumber
    Case 1: sReplacement = "#"
    Case 2: sReplacement = "##"
    Case 3: sReplacement = "###"
    Case 4: sReplacement = "####"
    Case 5: sReplacement = "#####"
    Case 6: sReplacement = "######"
    End Select

    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("Heading " & ipNumber)
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With


     bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Range.InsertBefore (vbCrLf & sReplacement & " ")
        Selection.Style = ActiveDocument.Styles("Normal")
        Selection.Find.Execute
    Wend

    ReplaceH = bReturn
End Function



'***************************************************************
' A fix-up for paragraph marks that ar are bold or italic
'***************************************************************
Sub RemoveBoldEnters()
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Font.Italic = True
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Bold = False
    Selection.Find.Replacement.Font.Italic = False
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = "^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Font.Bold = True
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Bold = False
    Selection.Find.Replacement.Font.Italic = False
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = "^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

'***************************************************************
' Function to replace bold with _bold_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'***************************************************************
Sub ReplaceLists()
    Dim i As Integer
    Dim j As Integer
    Dim Para As Paragraph

    Selection.HomeKey Unit:=wdStory

    'iterate through all the lists in the document
    For i = Selection.Document.Lists.Count To 1 Step -1
        'check each paragraph in the list
        For j = Selection.Document.Lists(i).ListParagraphs.Count To 1 Step -1
            Set Para = Selection.Document.Lists(i).ListParagraphs(j)
            'if it's a bulleted list
            If Para.Range.ListFormat.ListType = wdListBullet Then
                        Para.Range.InsertBefore (ListIndent(Para.Range.ListFormat.ListLevelNumber, "*"))
            'if it's a numbered list
            ElseIf Para.Range.ListFormat.ListType = wdListSimpleNumbering Or _
                                                    wdListMixedNumbering Or _
                                                    wdListListNumOnly Then
                Para.Range.InsertBefore (Para.Range.ListFormat.ListValue & ".  ")
            End If
        Next j
        'inserts paragraph marks before and after, removes the list itself
        Selection.Document.Lists(i).Range.InsertParagraphBefore
        Selection.Document.Lists(i).Range.InsertParagraphAfter
        Selection.Document.Lists(i).RemoveNumbers
    Next i
End Sub

'***********************************************************
' Returns the MarkDown indent text
'***********************************************************
Function ListIndent(ByVal ipNumber As Integer, ByVal spChar As String) As String
    Dim i  As Integer
    For i = 1 To ipNumber - 1
        ListIndent = ListIndent & "    "
    Next
    ListIndent = ListIndent & spChar & "    "
End Function

Source: ProgTips

8voto

matb33 Points 1859

Si vous êtes ouvert à l'aide de l' .docx format, vous pouvez utiliser ce script PHP que j'ai mis en place qui va extraire le fichier XML, exécuter certaines transformations XSL de sortie et un bon de Réductions de prix équivalent:

https://github.com/matb33/docx2md

Notez qu'il est prévu pour fonctionner à partir de la ligne de commande, et est plutôt basique dans son interface. Cependant, il obtiendra le travail fait!

Si le script ne fonctionne pas assez bien pour vous, je vous encourage à m'envoyer votre .docx fichiers afin que je puisse reproduire votre problème et de le résoudre. Journal d'un problème dans GitHub ou à me contacter directement si vous le souhaitez.

7voto

Mike Eng Points 356

Pandoc est une bonne ligne de commande de l'outil de conversion, mais encore une fois, vous devrez d'abord obtenir l'entrée dans un format que Pandoc permet de lire, qui est:

  • markdown
  • reStructuredText
  • textile
  • HTML
  • LaTeX

3voto

janpaul123 Points 11

Nous avons eu le même problème d'avoir à convertir des documents Word au format markdown. Certains ont été plus compliqué et (très) gros documents, avec des équations mathématiques et des images, par exemple. Alors j'ai fait ce script qui convertit à l'aide de différents outils: https://github.com/Versal/word2markdown

Parce qu'il utilise une chaîne de plusieurs outils, il est un peu plus sujettes à l'erreur, mais il peut être un bon point de départ si vous avez plus compliqué documents. J'espère que ça peut être utile! :)

Mise à jour: Actuellement, il ne fonctionne que sur Mac OS X, et vous avez besoin d'avoir des exigences installé (Word, Pandoc, HTML Tidy, git, nœud/mnp). Pour que cela fonctionne correctement, vous devez également ouvrir un document Word vide, et à faire: Fichier>Enregistrer en tant Que Page web->Compatibilité->Codage->UTF-8. Puis ce codage est enregistré en tant que par défaut. Voir le fichier README pour plus de détails sur la façon de configurer.

Ensuite, exécutez ceci dans la console:

$ git clone git@github.com:Versal/word2markdown.git
$ cd word2markdown
$ npm install
(copy over the Word files, for example, "document.docx")
$ ./doc-to-md.sh document.docx document_files > document.md

Ensuite, vous pouvez trouver la Démarque en document.md et les images dans le répertoire document_files.

C'est peut-être un peu compliqué, alors je serais heureux de toutes les contributions qui font de ce plus facile ou faire ce travail sur d'autres systèmes d'exploitation! :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X