OSDN Git Service

Now support almost all 2ch-like bbs.
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Fri, 8 Sep 2006 01:50:42 +0000 (10:50 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Fri, 8 Sep 2006 01:50:42 +0000 (10:50 +0900)
src/FukuiNoNamari/BbsType/bbs_type_2ch.py
src/FukuiNoNamari/BbsType/bbs_type_base.py [new file with mode: 0644]
src/FukuiNoNamari/BbsType/bbs_type_judge_uri.py
src/FukuiNoNamari/BbsType/bbs_type_other.py [new file with mode: 0644]
src/FukuiNoNamari/BbsType/bbs_type_yy.py

index 8ca3f2b..b4c6a22 100644 (file)
@@ -19,73 +19,18 @@ import re
 import copy
 
 from bbs_type_exception import BbsTypeError
+from bbs_type_base import BaseType
 
 
 _base_reg_expr = re.compile("http://(?P<host>[^./]+\.2ch\.net)/(?P<board>[^/]+)/$")
 _cgi_reg_expr = re.compile("http://(?P<host>[^./]+\.2ch\.net)/test/read.cgi/(?P<board>[^/]+)/(?P<thread>[^/]+)/.*")
 
 
-class Type2ch:
+class Type2ch(BaseType):
     bbs_type = "2ch"
     _base_reg = _base_reg_expr
     _cgi_reg = _cgi_reg_expr
 
-    def __init__(self, uri):
-        self.uri = uri
-        self.host = None
-        self.board = None
-        self.thread = None
-
-        self._parse_uri(uri)
-
-    def _parse_uri(self, uri):
-
-        m = self._base_reg.match(self.uri)
-        if m:
-            self.host = m.group("host")
-            self.board = m.group("board")
-        else:
-            m = self._cgi_reg.match(self.uri)
-            if m:
-                self.host = m.group("host")
-                self.board = m.group("board")
-                self.thread = m.group("thread")
-            else:
-                raise BbsTypeError, \
-                      "the uri %s does not represent %s" \
-                      % (self.uri, self.bbs_type)
-
-    def is_board(self):
-        return not self.thread
-
-    def is_thread(self):
-        return self.thread
-
-    def clone_with_thread(self, thread):
-        if not thread:
-            raise ValueError, "parameter must not be empty"
-        another = copy.copy(self)
-        another.thread = thread
-        another.uri = another.get_thread_uri()
-        return another
-
-    def get_uri_base(self):
-        return "http://" + self.host + "/" + self.board + "/"
-
-    def get_subject_txt_uri(self):
-        return self.get_uri_base() + "subject.txt"
-
-    def get_dat_uri(self):
-        if not self.thread:
-            raise BbsTypeError, "not specified thread"
-        return self.get_uri_base() + "dat/" + self.thread + ".dat"
-
-    def get_thread_uri(self):
-        if not self.thread:
-            raise BbsTypeError, "not specified thread"
-        return "http://" + self.host + "/test/read.cgi/" + \
-                  self.board + "/" + self.thread + "/"
-
     def get_board_dir_path(self):
         """Returns board dir path from logs dir downward, not full path"""
 
diff --git a/src/FukuiNoNamari/BbsType/bbs_type_base.py b/src/FukuiNoNamari/BbsType/bbs_type_base.py
new file mode 100644 (file)
index 0000000..e0c5c6f
--- /dev/null
@@ -0,0 +1,90 @@
+# Copyright (C) 2006 by Aiwota Programmer
+# aiwotaprog@tetteke.tk
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import re
+import copy
+
+from bbs_type_exception import BbsTypeError
+
+
+class BaseType:
+    """Base of bbs type. Do not instantiate directly"""
+
+    bbs_type = "other"
+    _base_reg = None
+    _cgi_reg = None
+
+    def __init__(self, uri):
+        self.uri = uri
+        self.host = None
+        self.board = None
+        self.thread = None
+
+        self._parse_uri(uri)
+
+    def _parse_uri(self, uri):
+
+        m = self._base_reg.match(self.uri)
+        if m:
+            self.host = m.group("host")
+            self.board = m.group("board")
+        else:
+            m = self._cgi_reg.match(self.uri)
+            if m:
+                self.host = m.group("host")
+                self.board = m.group("board")
+                self.thread = m.group("thread")
+            else:
+                raise BbsTypeError, \
+                      "the uri %s does not represent %s" \
+                      % (self.uri, self.bbs_type)
+
+    def is_board(self):
+        return not self.thread
+
+    def is_thread(self):
+        return self.thread
+
+    def clone_with_thread(self, thread):
+        if not thread:
+            raise ValueError, "parameter must not be empty"
+        another = copy.copy(self)
+        another.thread = thread
+        another.uri = another.get_thread_uri()
+        return another
+
+    def get_uri_base(self):
+        return "http://" + self.host + "/" + self.board + "/"
+
+    def get_subject_txt_uri(self):
+        return self.get_uri_base() + "subject.txt"
+
+    def get_dat_uri(self):
+        if not self.thread:
+            raise BbsTypeError, "not specified thread"
+        return self.get_uri_base() + "dat/" + self.thread + ".dat"
+
+    def get_thread_uri(self):
+        if not self.thread:
+            raise BbsTypeError, "not specified thread"
+        return "http://" + self.host + "/test/read.cgi/" + \
+                  self.board + "/" + self.thread + "/"
+
+    def get_board_dir_path(self):
+        """Returns board dir path from logs dir downward, not full path"""
+
+        return self.bbs_type + "/" + self.host + "/" + self.board
index 6eb20d8..6d8fe5b 100644 (file)
@@ -19,9 +19,10 @@ import traceback
 
 from bbs_type_2ch import Type2ch
 from bbs_type_yy import TypeYY
+from bbs_type_other import TypeOther
 from bbs_type_exception import BbsTypeError
 
-_typelist = [Type2ch, TypeYY]
+_typelist = [Type2ch, TypeYY, TypeOther]
 
 def get_type(uri):
     for type_class in _typelist:
diff --git a/src/FukuiNoNamari/BbsType/bbs_type_other.py b/src/FukuiNoNamari/BbsType/bbs_type_other.py
new file mode 100644 (file)
index 0000000..75f7783
--- /dev/null
@@ -0,0 +1,62 @@
+# Copyright (C) 2006 by Aiwota Programmer
+# aiwotaprog@tetteke.tk
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import re
+import os.path
+import traceback
+
+from bbs_type_2ch import BaseType
+
+_whitelist = []
+
+whitelist_path = os.path.expanduser("~/.fukui-no-namari/whitelist")
+try:
+    for line in file(whitelist_path):
+        _whitelist.append(line.rstrip())
+except IOError:
+    traceback.print_exc()
+
+_board_reg_expr = re.compile("http://(?P<host>.+)/(?P<board>[^/]+)/$")
+
+
+class TypeOther(BaseType):
+    bbs_type = "other"
+    _board_reg = _board_reg_expr
+
+    def _parse_uri(self, uri):
+        for iru in _whitelist:
+            match = self._board_reg.match(iru)
+            if match:
+                host = match.group("host")
+                board = match.group("board")
+                if uri == iru:
+                    self.host = host
+                    self.board = board
+                    return
+                else:
+                    match = re.match(
+                        "http://%s/test/read.cgi/%s/(?P<thread>[^/]+)/" \
+                        % (host, board), uri)
+                    if match:
+                        self.host = host
+                        self.board = board
+                        self.thread = match.group("thread")
+                        return
+            else:
+                print "%s in whitelist is not supported" % iru
+
+        raise BbsTypeError, "the uri %s is not supported" % uri
index b4cdc5a..68f3aa5 100644 (file)
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 import re
-import copy
 
-from bbs_type_exception import BbsTypeError
-from bbs_type_2ch import Type2ch
+from bbs_type_2ch import BaseType
 
 _base_reg_expr = re.compile("http://(?P<host>yy\d{2}\.(?:kakiko\.com|60\.kg))/(?P<board>[^/]+)/$")
 _cgi_reg_expr = re.compile("http://(?P<host>yy\d{2}\.(?:kakiko\.com|60\.kg))/test/read.cgi/(?P<board>[^/]+)/(?P<thread>[^/]+)/.*")
 
 
-class TypeYY(Type2ch):
+class TypeYY(BaseType):
     bbs_type = "yy"
     _base_reg = _base_reg_expr
     _cgi_reg = _cgi_reg_expr
-
-    def get_board_dir_path(self):
-        """Returns board dir path from logs dir downward, not full path"""
-
-        return self.bbs_type + "/" + self.host + "/" + self.board