summaryrefslogtreecommitdiffstats
path: root/languagetool/python_rules/allSentenceLengthRule.py
blob: 643d20476f8d8fdb0a6ef0d9293c8cb42d8f159c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Rule that checks for long sentences
# (c) 2003,2004 Daniel Naber <daniel.naber@t-online.de>
#
#$rcs = ' $Id$ ' ;
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import sys

import Rules
import Tools

class allSentenceLengthRule(Rules.Rule):
	"""Check if a sentence is 'too long'."""

	max_length = 30
	
	def __init__(self):
		Rules.Rule.__init__(self, "SENTENCE_LENGTH", "This sentence is too long.", 0, None)
		return

	def setMaxLength(self, max_length):
		"""Set the maximum length that's still okay. Limit 0 means no limit."""
		self.max_length = int(max_length)
		return
		
	def match(self, tagged_words, chunks=None, position_fix=0, line_fix=0, column_fix=0):
		"""Check if a sentence is too long, according to the limit set
		by setMaxLength(). Put the warning on the first word
		above the limit. Assumes that tagged_words is exactly one sentence."""
		if self.max_length == 0:		# 0 = no limit
			return []
		matches = []
		text_length = 0
		count = 0
		too_long = 0
		too_long_start = 0
		too_long_end = 0
		line_breaks = 0
		column = 0
		for (org_word, tagged_word, tagged_tag) in tagged_words:
			text_length = text_length + len(org_word)
			line_breaks_cur = Tools.Tools.countLinebreaks(org_word)
			if line_breaks_cur > 0 and not too_long:
				column = 0
			if not tagged_tag or not tagged_word:
				# don't count whitespace etc
				if line_breaks_cur == 0 and not too_long:
					column = column + len(org_word)
				continue
			count = count + 1
			if count > self.max_length and not too_long:
				too_long = 1
				too_long_start = text_length-len(org_word)
				too_long_end = text_length
			if line_breaks_cur == 0 and not too_long:
				column = column + len(org_word)
			line_breaks = line_breaks + line_breaks_cur
		if too_long:
			matches.append(Rules.RuleMatch(self.rule_id, too_long_start+position_fix,
				too_long_end+position_fix, line_breaks+line_fix, column+column_fix,
				"<message>This sentence is %d words long, which exceeds the "
				"configured limit of %d words.</message>" % (count, self.max_length)))
		return matches