2 Commits 7094ec098b ... 8d5956cb7f

Author SHA1 Message Date
  Alex Schroeder 8d5956cb7f grep-filtered: old/new module 4 years ago
  Alex Schroeder e9773ea694 Add wordcount module 4 years ago
2 changed files with 107 additions and 0 deletions
  1. 48 0
      modules/grep-filtered.pl
  2. 59 0
      modules/wordcount.pl

+ 48 - 0
modules/grep-filtered.pl

@@ -0,0 +1,48 @@
+# Copyright (C) 2020  Alex Schroeder <alex@gnu.org>
+# Copyright (C) 2020  Daniel MacKay <daniel@bonmot.ca>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use v5.10;
+
+AddModuleDescription('grep-filtered.pl', 'Grep Filtered');
+
+our ($PageDir);
+our ($UseGrep);
+
+$UseGrep = 1;
+
+*OldGrepFiltered = \&Filtered;
+*Filtered = \&NewGrepFiltered;
+
+sub NewGrepFiltered {
+  my ($string, @pages) = @_;
+  my @pages = OldGrepFiltered(@_);
+  my $regexp = SearchRegexp($string);
+  return @pages unless GetParam('grep', $UseGrep) and $regexp;
+  my @result = grep(/$regexp/i, @pages); # search parameter for page titles
+  my %found = map {$_ => 1} @result;
+  $regexp =~ s/\\n(\)*)$/\$$1/g; # sometimes \n can be replaced with $
+  $regexp =~ s/([?+{|()])/\\$1/g; # basic regular expressions from man grep
+  # if we know of any remaining grep incompatibilities we should
+  # return @pages here!
+  $regexp = quotemeta($regexp);
+    open(F, '-|:encoding(UTF-8)', "find $PageDir -type f -print0 | xargs -0 -n10 -P4 grep --ignore-case -l '$regexp'") ;
+  while (<F>) {
+    my ($pageName) = m/.*\/(.*)\.pg$/ ;
+    push(@result, $pageName) if not $found{$pageName};
+  }  close(F);
+  return sort @result;
+}

+ 59 - 0
modules/wordcount.pl

@@ -0,0 +1,59 @@
+# Copyright (C) 2005  Robin V. Stacey (robin@greywulf.net)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the
+#    Free Software Foundation, Inc.
+#    59 Temple Place, Suite 330
+#    Boston, MA 02111-1307 USA
+
+# This module adds a wordcount to the bottom of edit boxes. The javascript code is munged from
+# Richard Livsey's Textarea Tools page: http://livsey.org/experiments/textareatools/
+# Though I've stripped it down to it's barest necessities
+
+use strict;
+use v5.10;
+
+our (@MyInitVariables, $HtmlHeaders);
+
+AddModuleDescription('wordcount.pl', 'Word Count Extension');
+
+push(@MyInitVariables, \&WordcountAddScript);
+
+sub WordcountAddScript {
+	$HtmlHeaders .= "<script type='text/javascript'>
+	function addEvent(obj, evType, fn) {
+		if (obj.addEventListener) {
+			obj.addEventListener(evType, fn, true);
+			return true;
+		} else if (obj.attachEvent) {
+			var r = obj.attachEvent('on'+evType, fn);
+			return r;
+		} else { return false; }
+	}
+
+	addEvent(window, 'load', function() {
+		document.getElementById('textWordCount').innerHTML = numWords(document.getElementById('text').value);
+		document.getElementById('text').onkeyup = function() {
+			document.getElementById('textWordCount').innerHTML = numWords(document.getElementById('text').value);
+		}
+	});
+
+	function numWords(string) {
+		string = string + ' ';
+		string = string.replace(/^[^A-Za-z0-9]+/gi, '');
+		string = string.replace(/[^A-Za-z0-9]+/gi, ' ');
+		var items = string.split(' ');
+		return items.length -1;
+	}
+	</script>";
+}