Skip to content

Commit

Permalink
Merge pull request #1979 from triska/normalize_space
Browse files Browse the repository at this point in the history
ENHANCED: rudimentary implementation of normalize_space
  • Loading branch information
mthom committed Aug 27, 2023
2 parents f74d74f + 75aec69 commit 3bfed50
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions src/lib/xpath.pl
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@
op(200, fy, @)
]).

:- use_module(library(lists),[member/2,memberchk/2]).
:- use_module(library(lists),[member/2,memberchk/2,reverse/2]).
:- use_module(library(charsio)).
:- use_module(library(error)).
:- use_module(library(dcgs)).
:- use_module(library(si)).
Expand Down Expand Up @@ -636,5 +637,27 @@
xsd_number_chars(Number, Chars) :-
number_chars(Number, Chars).

normalize_space(Text0, Text) :-
Text0 = Text. % no conversion for the moment.
normalize_space(Cs0, Cs) :-
must_be(chars, Cs0),
no_leading_whitespace(Cs0, Cs1),
reverse(Cs1, Cs2),
no_leading_whitespace(Cs2, Cs3),
reverse(Cs3, Cs4),
single_intermediate_space(Cs4, Cs).

no_leading_whitespace([], []).
no_leading_whitespace([C0|Cs0], Cs) :-
( char_type(C0, whitespace) ->
no_leading_whitespace(Cs0, Cs)
; Cs = [C0|Cs0]
).

single_intermediate_space([], []).
single_intermediate_space([C0|Cs0], [C|Cs]) :-
( char_type(C0, whitespace) ->
no_leading_whitespace(Cs0, Cs1),
C = ' ',
single_intermediate_space(Cs1, Cs)
; C = C0,
single_intermediate_space(Cs0, Cs)
).

0 comments on commit 3bfed50

Please sign in to comment.