# Selima Website Content Management System # Query.pm: The search string parser. # Copyright (c) 2004-2018 imacat. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Author: imacat # First written: 2004-09-12 package Selima::Query; use 5.008; use strict; use warnings; use base qw(Exporter); use vars qw(@EXPORT @EXPORT_OK); BEGIN { @EXPORT = qw(parse_query); @EXPORT_OK = @EXPORT; # Prototype declaration sub parse_query($); } # parse_query: Parse the query string into multiple search phrases sub parse_query($) { local ($_, %_); $_ = $_[0]; s/^\s*(.*?)\s*$/$1/; @_ = qw(); while ($_ ne "") { # Non-quoted word if (s/^([^\s"']+)\s*//) { # " gettext push @_, $1; # Double-quoted string } elsif (s/^"((?:[^\\"]|\\.)+)"?\s*//) { # " gettext eval "push \@_, \"$1\";\n"; # Single-quoted string } elsif (s/^'((?:[^\\']|\\.)+)'?\s*//) { # ' gettext eval "push \@_, '$1';\n"; # Discard empty quoted strings } elsif (s/^(?:""?|''?)\s*//) { } } return @_; } return 1;