diff --git a/amanuensis/parser/__init__.py b/amanuensis/parser/__init__.py
index 1b89b90..7c39cf5 100644
--- a/amanuensis/parser/__init__.py
+++ b/amanuensis/parser/__init__.py
@@ -2,5 +2,6 @@
Module encapsulating all markdown parsing functionality
"""
+from amanuensis.parser.analyze import WordCounter
from amanuensis.parser.text import parse_raw_markdown
-from amanuensis.parser.render import PreviewHtmlRenderer, WordCounter
\ No newline at end of file
+from amanuensis.parser.render import PreviewHtmlRenderer
\ No newline at end of file
diff --git a/amanuensis/parser/analyze.py b/amanuensis/parser/analyze.py
new file mode 100644
index 0000000..f503463
--- /dev/null
+++ b/amanuensis/parser/analyze.py
@@ -0,0 +1,24 @@
+"""
+Internal module encapsulating visitors that compute metrics on articles
+for verification against constraints.
+"""
+
+import re
+
+class WordCounter():
+ def TextSpan(self, span):
+ return len(re.split('\s+', span.innertext.strip()))
+ def LineBreak(self, span):
+ return 0
+ def ParsedArticle(self, span):
+ return sum(span.recurse(self))
+ def BodyParagraph(self, span):
+ return sum(span.recurse(self))
+ def SignatureParagraph(self, span):
+ return sum(span.recurse(self))
+ def BoldSpan(self, span):
+ return sum(span.recurse(self))
+ def ItalicSpan(self, span):
+ return sum(span.recurse(self))
+ def CitationSpan(self, span):
+ return sum(span.recurse(self))
diff --git a/amanuensis/parser/render.py b/amanuensis/parser/render.py
index 7cddcc8..3beb4b5 100644
--- a/amanuensis/parser/render.py
+++ b/amanuensis/parser/render.py
@@ -1,10 +1,8 @@
"""
-Internal module encapsulating the render logic for parsed articles. Rendering
-is done via a rough approximation of the visitor pattern.
+Internal module encapsulating visitors that render articles into
+readable formats.
"""
-import re
-
class PreviewHtmlRenderer():
def TextSpan(self, span):
@@ -25,21 +23,3 @@ class PreviewHtmlRenderer():
return f'{"".join(span.recurse(self))}'
def CitationSpan(self, span):
return f'{"".join(span.recurse(self))}'
-
-class WordCounter():
- def TextSpan(self, span):
- return len(re.split('\s+', span.innertext.strip()))
- def LineBreak(self, span):
- return 0
- def ParsedArticle(self, span):
- return sum(span.recurse(self))
- def BodyParagraph(self, span):
- return sum(span.recurse(self))
- def SignatureParagraph(self, span):
- return sum(span.recurse(self))
- def BoldSpan(self, span):
- return sum(span.recurse(self))
- def ItalicSpan(self, span):
- return sum(span.recurse(self))
- def CitationSpan(self, span):
- return sum(span.recurse(self))