Réduisez le html à n caractères tout en conservant la mise en forme

11

Presque chaque langue a une fonction intégrée qui peut diviser une chaîne à une position donnée. Cependant, dès que vous avez des balises html dans la chaîne, la fonction intégrée ne fonctionnera pas correctement.

Votre tâche consiste à écrire un programme ou une fonction qui divise une chaîne au nième caractère mais ne compte pas les caractères des balises html et produira un html valide. Le programme doit conserver la mise en forme. Les espaces en dehors des balises html peuvent être comptés ou non, comme vous le souhaitez, mais doivent être préservés. Vous pouvez cependant échanger plusieurs espaces consécutifs en un seul espace.

Contribution:

  1. la chaîne
  2. la position de séparation à (sur la base de 0)

Ceux-ci peuvent être considérés comme des arguments de programme ou de fonction ou peuvent être lus à partir de l'entrée standard.

Sortie: la chaîne divisée qui peut être retournée ou écrite dans la sortie standard.

L'entrée sera html valide, elle ne contiendra aucune entité (comme  ). Les balises ouvertes après la limite de caractères doivent être omises de la sortie (voir le dernier exemple).

Exemple:

Entrée:, <i>test</i>3
Sortie:<i>tes</i>

Entrée:, <strong><i>more</i> <span style="color: red">complicated</span></strong>7
Sortie:<strong><i>more</i> <span style="color: red">co</span></strong>

Entrée:, no html2
Sortie:no

Entrée:, <b>no</b> <i>html root</i>5
Sortie:<b>no</b> <i>ht</i>

Entrée:, <b>no img</b><img src="test.png" />more text6
Sortie:<b>no img</b>

Vous pouvez utiliser n'importe quelle langue et la bibliothèque standard de la langue donnée. C'est le golf de code, le programme le plus court gagne. S'amuser!

David Frank
la source
1
l'entrée peut-elle contenir des "<" s et ">" qui ne font pas partie d'une balise HTML?
xem
On devrait utiliser &lt;et &gt;au lieu de <>, donc non ( &lt;ou &gt;ne sera pas présent non plus).
David Frank
Pourriez-vous inclure un exemple où il y a du balisage après le nœud de texte où la division se produit? Comme <i>ab</i><b>cd</b> 1?
Martin Ender
Y a-t-il d'autres options que <i>a</i>?
David Frank
@DavidFrank <i>a</i><b></b>(ce qui est logique si vous considérez que cela bpourrait également être divou img.)
Martin Ender

Réponses:

2

Cette réponse n'est plus valable avec la dernière règle.

Javascript ( ES6 ) 94 91

f=(s,l)=>s.split(/(<[^>]+>)/).map(x=>x[0]=='<'?x:[l-->0?y:''for(y of x)].join('')).join('')
f('<strong><i>more</i> <span style="color: red">complicated</span></strong>', 7);
// '<strong><i>more</i> <span style="color: red">co</span></strong>'

Non golfé:

f=(s,l)=>
    s.split(/(<[^>]+>)/). // split string s by <*>, capture group is spliced into the array 
    map(x=> // map function to every item in the array
        x[0]=='<'? // if first character is a <
            x // don't modify the string
        : // else
            [ // array comprehension
                for(y of x) // for every character y in x
                    l-->0? // if l > 0 (and decrement l)
                        y // character y
                    : // else
                        '' // empty string 
            ].join('') // join characters in array
        ).
    join('') // join all strings in array
nderscore
la source
Pourriez-vous s'il vous plaît fournir le code non-golfé, ou peut-être juste une explication de quoi et pourquoi le code fait? C'est actuellement un peu difficile à saisir. Merci!
Gaurang Tandon
@GaurangTandon a ajouté du code non golfé avec des commentaires
nderscore
2

Rebol - 252 caractères

c: complement charset"<>"f: func[s n][t: e: 0 to-string collect[parse s[any[(m: 0)copy w[["</"some c">"](-- t)|["<"some c"/>"]|["<"some c">"](++ t)| any c(m: 1)](if e = 0[if m = 1[w: copy/part w n n: n - length? w]keep w]if all[n <= 0 t = 0][e: 1])]]]]

Non golfé avec des commentaires:

c: complement charset "<>"

f: func [s n] [
    t: e: 0             ;; tag level (nesting) & end output flag
    to-string collect [
        parse s [
            any [
                (m: 0)                            ;; tag mode
                copy w [
                      ["</" some c ">" ] (-- t)   ;; close tag
                    | ["<"  some c "/>"]          ;; self-closing / void elements
                    | ["<"  some c ">" ] (++ t)   ;; open tag
                    | any c (m: 1)                ;; text mode
                ] (
                    ;; flag not set so can still output
                    if e = 0 [
                        ;; in text mode - so trim text
                        if m = 1 [
                            w: copy/part w n
                            n: n - length? w
                        ]
                        keep w
                    ]

                    ; if all trimmed and returned to flat tag level then end future output
                    if all [n <= 0  t = 0] [e: 1]
                )
            ]
        ]
    ]
]

Exemples dans la console Rebol:

>> f "<i>test</i>" 3
== "<i>tes</i>"

>> f {<strong><i>more</i> <span style="color: red">complicated</span></strong>} 7
== {<strong><i>more</i> <span style="color: red">co</span></strong>}

>> f {no html} 2
== "no"

>> f {<b>no</b> <i>html root</i>} 5
== "<b>no</b> <i>ht</i>"

>> f {<b>no img</b><img src="test.png" />more text} 6
== "<b>no img</b>"

>> f {<i>a</i><b></b>} 1
== "<i>a</i>"

>> f {<strong><i>even</i> <span style="color: red">more <b>difficult</b></span></strong>} 14
== {<strong><i>even</i> <span style="color: red">more <b>diff</b></span></strong>}

>> f {<strong><i>even</i> <span style="color: red">more <b>difficult</b></span></strong>} 3 
== {<strong><i>eve</i><span style="color: red"><b></b></span></strong>}
draegtun
la source
Encore une fois, cela rompt la dernière règle: les balises ouvertes après la limite de caractères doivent être omises de la sortie (voir le dernier exemple). Dans le dernier exemple, les balises span et b doivent être omises. Cette règle rend le défi presque impossible.
edc65
@ edc65 - Malheureusement (@David Frank) n'a pas commenté ou mis à jour ses exemples, il n'est donc pas clair s'il veut ou non ce comportement? J'espérais que mon dernier exemple remuerait quelque chose! Je vais laisser tel quel jusqu'à ce que nous obtenions des éclaircissements. Quoi qu'il en soit, il ne faudrait que 17 caractères supplémentaires pour que cela fonctionne comme vous l'avez suggéré. Je n'ai pas particulièrement aimé le hack, alors au lieu de le réécrire ici (non golfé) - gist.github.com/draegtun/93682f5a07c40bd86e31
draegtun
0

Ruby ... Très dépourvu de style avec des boucles

def split(str,n)

  i = current = 0 
  return_str = ""

  while i < n
    if str[current] == "<"
      while str[current] != ">"
        return_str.concat str[current]
        current += 1
      end
      return_str.concat str[current]
      current += 1
    else
      return_str.concat str[current]
      i += 1
      current += 1
    end
  end

  while current < str.length
    if str[current] == "<"
      while str[current] != ">"
        return_str.concat str[current]
        current += 1
      end
      return_str.concat str[current]
      current += 1
    end
    current += 1
  end


  return_str + str[current..-1]
end
user26900
la source
Cette question est marquée comme codegolf, vous devez jouer votre réponse. Vous pouvez commencer par remplacer les noms de variables par des noms à une lettre, en utilisant des noms de fonction plus courts et en supprimant les espaces blancs partout où vous le pouvez
sagiksp
0

(IE) JS - 135

function f(t,n){b=document.body;b.innerHTML=t;r=b.createTextRange();r.moveStart("character",n);r.select();r.execCommand('cut');return b.innerHTML}

Maintenant je me sens sale. Mais il faut commencer à supprimer tous ces caractères ...

function f(t,n)
{b=document.body;b.innerHTML=t;r=b.createTextRange();r.collapse();r.moveEnd("character",n);
r.select();return r.htmlText}

Avertissement:

  • exécuter dans la console IE
eithed
la source
1
Cela brise la dernière règle (folle): les balises ouvertes après la limite de caractères doivent être omises de la sortie (essayez mon exemple dans les commentaires ci-dessus).
edc65
@ edc65 espérons -le , des contrôles de la version mise à jour sur toutes les règles
eithed