Skip to content

Commit 3bfed50

Browse files
authored
Merge pull request #1979 from triska/normalize_space
ENHANCED: rudimentary implementation of normalize_space
2 parents f74d74f + 75aec69 commit 3bfed50

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

src/lib/xpath.pl

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
op(200, fy, @)
9696
]).
9797

98-
:- use_module(library(lists),[member/2,memberchk/2]).
98+
:- use_module(library(lists),[member/2,memberchk/2,reverse/2]).
99+
:- use_module(library(charsio)).
99100
:- use_module(library(error)).
100101
:- use_module(library(dcgs)).
101102
:- use_module(library(si)).
@@ -636,5 +637,27 @@
636637
xsd_number_chars(Number, Chars) :-
637638
number_chars(Number, Chars).
638639

639-
normalize_space(Text0, Text) :-
640-
Text0 = Text. % no conversion for the moment.
640+
normalize_space(Cs0, Cs) :-
641+
must_be(chars, Cs0),
642+
no_leading_whitespace(Cs0, Cs1),
643+
reverse(Cs1, Cs2),
644+
no_leading_whitespace(Cs2, Cs3),
645+
reverse(Cs3, Cs4),
646+
single_intermediate_space(Cs4, Cs).
647+
648+
no_leading_whitespace([], []).
649+
no_leading_whitespace([C0|Cs0], Cs) :-
650+
( char_type(C0, whitespace) ->
651+
no_leading_whitespace(Cs0, Cs)
652+
; Cs = [C0|Cs0]
653+
).
654+
655+
single_intermediate_space([], []).
656+
single_intermediate_space([C0|Cs0], [C|Cs]) :-
657+
( char_type(C0, whitespace) ->
658+
no_leading_whitespace(Cs0, Cs1),
659+
C = ' ',
660+
single_intermediate_space(Cs1, Cs)
661+
; C = C0,
662+
single_intermediate_space(Cs0, Cs)
663+
).

0 commit comments

Comments
 (0)