CXuesong / MwParserFromScratch

A basic .NET Library for parsing wikitext into AST.
Apache License 2.0
18 stars 5 forks source link

Strip out <math> tags #15

Closed RobSchoenaker closed 4 years ago

RobSchoenaker commented 4 years ago

Issue for PR. I can create a PR for this. Cannot commit the file though. Fix in next comment.

RobSchoenaker commented 4 years ago

In node.cs:

[Flags]
  public enum NodePlainTextOptions
  {
    /// <summary>
    /// Default behavior.
    /// </summary>
    None = 0,
    /// <summary>
    /// Remove the content of &lt;ref&gt; parser tags.
    /// </summary>
    RemoveRefTags = 1,
    /// <summary>
    /// Remove the content of &lt;math&gt; parser tags.
    /// </summary>
    RemoveMathTags = 2,
  }

in inline.cs:

 protected override string GetContentPlainText(NodePlainTextOptions options)
    {
      if ((options & NodePlainTextOptions.RemoveRefTags) == NodePlainTextOptions.RemoveRefTags
          && string.Equals(Name, "ref", StringComparison.OrdinalIgnoreCase))
        return null;
      if ((options & NodePlainTextOptions.RemoveMathTags) == NodePlainTextOptions.RemoveMathTags
       && string.Equals(Name, "math", StringComparison.OrdinalIgnoreCase))
        return null;
      return Content;
    }

There may be more tags, so it might be an idea to change this code to a callback, so it's easier to add new tags an there is no need to expand the flags

CXuesong commented 4 years ago

There may be more tags, so it might be an idea to change this code to a callback, so it's easier to add new tags an there is no need to expand the flags

I've decided to give you more liberty. Now you can pass in a delegate to customize how the child nodes of a node should be converted into plain text.

delegate void NodePlainTextFormatter(Node node, StringBuilder builder)

The default implementation is to call Node.ToString(builder), and you can put some conditional inside like

(node, builder) => {
    if (node is ParserTag t && string.Equals(Name, "math", StringComparison.OrdinalIgnoreCase)
        return;
    Node.ToString(builder);
}

But you actually won't need to do this now, as I've decided to bypass some parser tags in the default implementation https://github.com/CXuesong/MwParserFromScratch/blob/db608c72c347effdbac193d8a0f9f18a217424c7/MwParserFromScratch/Nodes/Inline.cs#L659-L669

CXuesong commented 4 years ago

Released v0.3.0-int.2.

Note that I've removed NodePlainTextOptions in favor of NodePlainTextFormatter.

CXuesong commented 4 years ago

Cannot commit the file though.

Though it may not be needed anymore... did you come across any problem opening a PR for this?

RobSchoenaker commented 4 years ago

There is an issue with the delegate on
tags. See this bit:

====Berlijn==== [[Bestand:Bundesarchiv Bild 146III-373, Modell der Neugestaltung Berlins ("Germania").jpg|miniatuur|260px|right| Schaalmodel van de [[Welthauptstadt Germania]], 1939]] [[Bestand:Bundesarchiv Bild 183-K1216-501, Berlin, Neue Reichskanzlei, Marmorgalerie.jpg|thumb|260px|Marmeren galerij van 146&nbsp;m lengte van de nieuwe rijkskanselarij]] [[Bestand:Berlin belastungskoerper.jpg|thumb|260px|''Schwerbelastungskörper'', Berlijn, 1941]] In 1937 werd hij benoemd tot regeringscommissaris voor de bouw in de staf van de Führer en inspecteur-generaal voor de bouwnijverheid in Berlijn. Zijn ontwerpen waren naar de smaak van Hitler die hield van gebouwen in een [[Neoclassicistische architectuur|neoclassicistische stijl]] met een [[Minimalisme (architectuur)|minimalistische]] uitstraling maar dan vergroot tot buitensporige afmetingen. Voor de spaarzame aankleding wilde Hitler het liefst de klassieke Arische beelden gebruiken van de hand van de door Hitler bewonderde [[Arno Breker]]. Vooral voor Berlijn had Hitler grootse plannen. Deze stad zou na de ''Endsieg'' herdoopt worden in [[Welthauptstadt Germania|Germania]] (overigens is Speer de enige bron die dit beweerde). Met talloze statige bouwwerken en brede boulevards wilde Hitler aan zijn hoofdstad een enorme grandeur geven. Hitlers en Speers megalomane motto was: 'hoe groter hoe beter'. Speer ordonneerde stabiliteitstesten in de moerassige grond van Berlijn om na te gaan of deze het enorme gewicht van de geplande gebouwen kon dragen. Daartoe bouwde de firma [[Dyckerhoff & Widmann AG]] in 1941 tegen de prijs van 400&nbsp;000 [[Reichsmark]] aan de rand van Berlijn het ''Schwerbelastingskörper''. Het betrof een betonnen 12&nbsp;360 ton wegende [[Cilinder (meetkunde)|cilinder]] met een diameter van 21&nbsp;m. De nog intact zijnde kolos veroorzaakte volgens Speers metingen een verzakking van 19&nbsp;cm. De Berlijnse ondergrond was bijgevolg geschikt voor het bouwen van dergelijke grootschalige bouwwerken. <br> Tevens werd een begin gemaakt met het aanleggen van de weids opgezette boulevards. In [[1938]] en [[1939]] werd in recordtijd de bouw van de nieuwe [[Rijkskanselarij]] aan de Wilhelmstrasse en de Voßstraße voltooid. Speer toonde zich hier al als een goede bouworganisator. Het bouwwerk met gigantische afmetingen (het geheel mat 200 ha) was voor Hitler een representatieve plaats om de buitenlandse gasten en diplomaten te ontvangen. Zij moesten op deze wijze onder de indruk raken van de grootsheid van het Duitse Rijk. Het merkwaardigste onderdeel van het geheel betrof een lange rechte galerij van 146&nbsp;m lengte, twee maal zo lang als de spiegelzaal in Versailles van 73 meter, met een spiegelgladde vloer die leidde naar de persoonlijke ontvangstruimten van Hitler; deze "straat" werd "der lange Marsch der Diplomaten" genoemd. Sommigen maakten de opmerking dat de gladde vloer eigenlijk wel gevaarlijk was om op te lopen. Hitler wimpelde deze bezwaren weg met de woorden: “Diplomaten zijn wel gewend om zich op glad ijs te begeven”. Door het uitbreken van de oorlog moesten verdere plannen echter opgeschort worden. Gereed kwamen wel het vliegveld [[Luchthaven Berlin-Tempelhof|Tempelhof]] dat nog steeds een van de grootste luchthavengebouwen ter wereld heeft. Ook het nog steeds gebruikte Olympisch Stadion van 1936 was een onderdeel van de herbouw van Berlijn. Hitlers nieuwe kanselarij werd tijdens de eindstrijd in 1945 zwaar beschadigd en kort na de oorlog afgebroken.

It fails with a nullref on the <br> tag in the middle, since it is a self enclosing tag without any additional text in it.

I used the delegate to trap this: image

Which results in the complete paragraph missing from the endresult.

RobSchoenaker commented 4 years ago

This will fix it: image

CXuesong commented 4 years ago

Seems that I've forgotten that TagNode.Content can be null, such as in <br /> tag.

CXuesong commented 4 years ago

Released v0.3.0-int.4. Hopefully you won't need to bypass the default logic anymore 😀