Il modo migliore per formattare i file di testo degli statuti in HTML con ID specifici

0

Sto cercando di trovare il modo migliore per elaborare circa 20.000 righe di uno statuto in formato testo in HTML in modo che possa essere visualizzato e manipolato in modo granulare, ad esempio in base alla clausola. Il formato è essenzialmente un elenco annidato come (a) (1) (A) (i) (II) (aa) ed è abbastanza coerente. Ogni clausola inizia con una nuova riga ed è racchiusa tra parentesi come sopra.

L'obiettivo è che ogni clausola sia racchiusa in un tag di paragrafo con un ID univoco come p id="sec101a1IiI" (scusa non riesco a capire la formattazione del codice). Il punto è di poter riferire a una clausola specifica in seguito. Ho giocato con espressioni regolari ma non sembrano permettermi di scorrere l'intero statuto e taggare le cose in un modo unico. Sono sicuro che ci sono opzioni migliori che usano uno script personalizzato ma non so da dove cominciare a cercarlo. Qualsiasi suggerimento sarebbe apprezzato.

    
posta jkmuller 28.01.2014 - 00:34
fonte

1 risposta

2

Questo è abbastanza semplice da fare, a seconda di come è strutturato l'input. Supponiamo di avere un file come

Legalese Introduction

(1) Some Legalese Section

    With another paragraph inside it

    (a) With some sub-paragraph

        (I) Some other statutes

        (II) Some other statutes

(2) Another Section

Possiamo dividere facilmente questo file in paragrafi e quindi passarci sopra. Per ogni paragrafo con qualche enumerazione, possiamo verificare se questo incrementa il contatore del livello di numerazione corrente. Se è così, eseguiamo questa operazione ed emettiamo un ID.

Altrimenti, questo aggiunge un altro livello o chiude uno o più livelli.

Facciamo questo modellando i contatori con uno stack . Su ciascun paragrafo enumerato, inseriamo o spingiamo elementi nello stack.

La difficoltà sta nel decidere se due enumerazioni siano dello stesso schema di numerazione, ad es. L e I possono essere latenti maiuscoli (A, B, C, ...) o numeri romani (I, II, III, ...). Potresti quindi voler trasformare entrambi nel loro valore numerico e affermare che non sono solo dello stesso schema ma sono anche consecutivi.

Ecco uno script Perl di base che analizzerebbe l'esempio precedente, ma avrebbe difficoltà con input più complessi per i motivi citati:

use strict;
use warnings;
use HTML::Entities qw< encode_entities >;

local $/ = ''; # paragraph mode
my @stack;
while(my $section = <>) {
    $section =~ s/^\s+//;
    $section =~ s/\s+$//;

    my ($number) = $section =~ m/[(] ([A-Z]+|[a-z]+|[0-9]+|[IVXLCDM]+) [)]/x;
    if (not $number) {
       print "<p>", encode_entities($section), "</p>\n";
       next;
    }

    # check if the numbering is a continuation of the current or another level
    if (@stack and grep { compatible($_, $number) } @stack) {
      pop @stack until compatible($stack[-1], $number);
      $stack[-1] = $number
    }
    # open a new level
    else {
      push @stack, $number;
    }

    my $id = join "-", "section", @stack;
    print qq(<p id="$id">), encode_entities($section), "</p>\n";
}

sub compatible {
   my ($prev, $this) = @_;
   (my $expected = $prev)++; # increment is magic and works on strings too.
   no warnings 'numeric';
   # numbers
   return 1 if not (grep /[^0-9]/, $prev, $this) and $expected == $this;
   # upper latin
   return 1 if not (grep /[^A-Z]/, $prev, $this) and $expected eq $this;
   # lower latin
   return 1 if not (grep /[^a-z]/, $prev, $this) and $expected eq $this;
   # roman numerals
   return 1 if not (grep /[^IVXLCDM]/, $prev, $this); # TODO check consecutive
   return 0;
}
    
risposta data 28.01.2014 - 11:41
fonte

Leggi altre domande sui tag