0 votos

¿Convertir el código HTML de las listas con viñetas en Markdown en AppleScript?

Tengo este texto para manipular en AppleScript (por ejemplo, el texto de una variable):

Example note exported from Apple.

<ul>
  <li>Indent</li>
  <ul>
    <li>*Further* indent</li>
    <ul>
      <li>Even **further **indent. With a [link](https://duck.com).</li>
    </ul>
  </ul>
</ul>

End note.

Lo estoy convirtiendo todo a Markdown desde HTML. Necesito limpiar este trozo de HTML que queda, que es la lista de viñetas, para que el resultado sea (con tabulaciones reales como espacio de sangría):

Example note exported from Apple.

- Indent
    - *Further* indent
        - Even **further **indent. With a [link](https://duck.com).

End note.

Tiene que ser capaz de atender a la sangría anidada a cualquier 'n' número de niveles, y con posiblemente algún texto rico dentro de los elementos como este ejemplo. Prefiero que la salida de Markdown utilice guiones y un tabulador para la sangría.

También tiene que ser contenida dentro del applescript - no externa .py archivos, etc., y para no requerir homebrew o una herramienta de terceros para ser instalado.

0voto

user3439894 Puntos 5883

Lo siguiente ejemplo AppleScript código tal y como está codificado, está pensado para trabajar con lista con viñetas HTML código como se muestra en el OP lo que significa que lo que se pasa en el variable es sólo lo que corresponde código para definir el lista con viñetas y no otros arbitrarios HTML código .

Tal y como está codificado, producirá la salida adecuada para las variaciones de lista con viñetas HTML código también, no sólo el específico ejemplo que se muestra en este documento. Esto se ha probado en una variedad de otras muestras que contienen sólo lista con viñetas HTML código y produce la salida pertinente para ello al igual que el ejemplo aquí.

--  # Define exportedNote variable containing the bulleted list HTML code.

set exportedNote to "<ul>
  <li>Indent</li>
  <ul>
    <li>*Further* indent</li>
    <ul>
      <li>Even **further** indent. With a [link](https://duck.com).</li>
    </ul>
  </ul>
</ul>"

--  # Create an AppleScript list from the lines of bulleted list HTML code.

set exportedNoteList to paragraphs of exportedNote

--  # Process the list, acting only on items that contain "</li>" 
--  # as they are the only ones relevant to converting the 
--  # bulleted list HTML code to Markdown.

set tempList to {}
repeat with i from 1 to the number of items in exportedNoteList
    if item i of exportedNoteList contains "<li>" then
        set thisItem to item i of exportedNoteList
        set thisItem to findAndReplaceInText(thisItem, "</li>", "")
        set numberOfLeadingSpaces to ((offset of "<" in thisItem) - 1)
        if numberOfLeadingSpaces is less than 4 then
            set searchString to characters 1 thru numberOfLeadingSpaces of thisItem & "<li>" as text
            set thisItem to findAndReplaceInText(thisItem, searchString, "- ")
            set end of tempList to thisItem
        end if
        if numberOfLeadingSpaces is greater than 3 then
            set searchString to characters 1 thru numberOfLeadingSpaces of thisItem & "<li>" as text
            set thisItem to findAndReplaceInText(thisItem, searchString, "- ")
            set numberOfLeadingTabs to (numberOfLeadingSpaces / 2) as integer
            repeat with i from 1 to (numberOfLeadingTabs - 1)
                set thisItem to tab & thisItem
            end repeat
            set end of tempList to thisItem
        end if
    end if
end repeat

--  # Update the contents of the exportedNoteList
--  # list to contain only the relevant list items.

set exportedNoteList to tempList

--  # Convert the exportedNoteList list to text.

set AppleScript's text item delimiters to linefeed
set convertedNote to text items of exportedNoteList
set convertedNote to convertedNote as text
set AppleScript's text item delimiters to {}

--  # 'return' is only used to show its value in Script Editor. Use
--  # the convertedNote variable as needed in the working code.

return convertedNote

--  # Handler(s)

--  # Note: Handlers may be placed as one chooses as appropriate.
--  # My preference is at the bottom of the rest of the code.

on findAndReplaceInText(theText, theSearchString, theReplacementString)
    set AppleScript's text item delimiters to theSearchString
    set theTextItems to every text item of theText
    set AppleScript's text item delimiters to theReplacementString
    set theText to theTextItems as string
    set AppleScript's text item delimiters to ""
    return theText
end findAndReplaceInText

Resultado:

"- Indent
    - *Further* indent
        - Even **further** indent. With a [link](https://duck.com)."

Que se muestra como lo siguiente en un navegador en este sitio web:

  • Indent
    • Más información en sangría
      • Incluso más sangría. Con un enlace .

0voto

Glen Donnelly Puntos 51

También responderé a esta pregunta con un método alternativo que he elaborado:

set exportedNote to "Example note exported from Apple.

<ul>
  <li>Indent</li>
  <ul>
    <li>*Further* indent</li>
    <ul>
      <li>Even **further **indent. With a [link](https://duck.com).</li>
    </ul>
  </ul>
</ul>

End note."

set deleteHTMLline to {"<ul>"}
set exportedNote to deleteLinesFromText(exportedNote, deleteHTMLline) of me as text
set deleteHTMLline to {"</ul>"}
set exportedNote to deleteLinesFromText(exportedNote, deleteHTMLline) of me as text

set exportedNote to replace_chars(exportedNote, "      <li>", tab & tab & "- ") of me as text
set exportedNote to replace_chars(exportedNote, "    <li>", tab & "- ") of me as text
set exportedNote to replace_chars(exportedNote, "  <li>", "- ") of me as text
set exportedNote to replace_chars(exportedNote, "</li>", "") of me as text

return exportedNote

on replace_chars(this_text, search_string, replacement_string)
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set AppleScript's text item delimiters to the replacement_string
    set this_text to the item_list as string
    set AppleScript's text item delimiters to {""}
    return this_text
end replace_chars

on deleteLinesFromText(theText, deletePhrase)
    set newText to ""
    try
        set textList to paragraphs of theText
        repeat with i from 1 to count of textList
            set thisLine to item i of textList
            if thisLine does not contain deletePhrase then
                set newText to newText & thisLine & return
            end if
        end repeat
        if newText is not "" then set newText to text 1 thru -2 of newText
    on error
        set newText to theText
    end try
    return newText
end deleteLinesFromText

Resultado:

Example note exported from Apple.

- Indent
    - *Further* indent
        - Even **further **indent. With a [link](https://duck.com).

End note.

Notas:

Al igual que en la respuesta principal, si quieres convertir más niveles de sangría tendrás que añadir líneas adicionales para ello.

Este código de ejemplo sólo convierte tres niveles. Para añadir un cuarto, puede añadir en la parte superior del código set exportedNote to replace_chars sección:

set exportedNote to replace_chars(exportedNote, "        <li>", tab & tab & tab & "- ") of me as text

Añadir niveles más profundos en la parte superior bajando en orden cronológico con dos espacios más antes de cada uno <li> y uno más tab & .

Si alguien tiene código para poder convertir cualquier n número de niveles de sangría, por favor, intervengan o envíen ediciones.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X