教案生成器(.doc格式),教案生成器.doc格式,# -*- coding


# -*- coding:utf-8 -*-import datetime  # , calendarfrom copy import deepcopyfrom BeautifulSoup import BeautifulSoup#~ from pyquery import PyQuery as pqimport sysreload(sys)sys.setdefaultencoding('utf-8')class Util(object):    """    教案生成器,自动填写表头,产生 .doc 格式文档    """    @classmethod    def read_config(cls):        """ 通过配置文件获取课程配置 """        conf = None        input_config = sys.argv[1] if len(sys.argv) > 1 else "conf.xml"        with open(input_config, 'rb') as conf_file:            soup = BeautifulSoup(conf_file.read(), fromEncoding="gbk")            conf = {'class': soup.find('class').text.strip(),                    'lesson': soup.find('lesson').text.strip(),                    'book': soup.find('book').text.strip(),                    'press': soup.find('press').text.strip(),                    'term': soup.find('term').text.strip(),                    'year': soup.find('year').text.strip(),                    'begin': soup.find('begin').text.strip(),                    'weeks': int(soup.find('weeks').text),                    'holiday': soup.find('holiday').text.strip(),            }            conf['holidays'] = [x.split(':') for x in conf['holiday'].split(',')]            # 日期条件检查器            always = lambda x: True            odd = lambda x: x % 2 == 1  # 单周            even = lambda x: x % 2 == 0            schedule = {}            for week in soup.findAll('week'):                func = always                if 'select' in week:                    func = odd if odd(int(week['select'])) else even                schedule[int(week['n'])] = [func, week.text]                #~ {5:[f, '5, 6'], 3:[f, '3, 4'], 1:[f, '1, 2'], 6:[fo, '5, 6']}            conf['schedule'] = schedule            #~ print schedule.keys()        return conf    @classmethod    def holiday(cls, day, holidays):        """ 判断是否节假日 """        for hd in holidays:            begin = hd[0]            span = int(hd[1]) if len(hd) > 1 else 1            hdt = datetime.datetime.strptime(begin, "%Y-%m-%d")            if 0 < (day - hdt).days + 1 <= span:                return True        return False    @classmethod    def date_list(cls, begin_time, end_time, schedule):        """ 获取工作日列表 """        oneday = datetime.timedelta(days=1)        day_time = begin_time        work_weeks = schedule.keys()        while day_time <= end_time:            for it in work_weeks:                week = day_time.weekday() + 1                if week <= it:                    day_time += datetime.timedelta(it - week)                    week_ith = (day_time - begin_time).days / 7 + 1                    #~ print 'week_th:', week_ith                    #~ print day_time.strftime('%A, %Y-%m-%d')                    #~ print "lessons:", schedule[it][1:]                    # 日期条件检查                    if schedule[it][0](week_ith):                        yield day_time            day_time += oneday    @classmethod    def run(cls):        """ 生成教案 """        conf = cls.read_config()        with open("templet.dat", 'rb') as temp_file:            # read templet and generate            soup = BeautifulSoup(temp_file.read(), fromEncoding="gbk")            blank = soup.body.brTag # 指定Tag后缀写法            page = soup.body.div            page.find('span', {"name": "class"}).string = conf['class']            page.find('span', {"name": "lesson"}).string = conf['lesson']            page.find('span', {"name": "book"}).string = conf['book']            page.find('span', {"name": "press"}).string = conf['press']            page.find('span', {"name": "term"}).string = conf['term']            page.find('span', {"name": "year_range"}).string = conf['year']            begin_time = datetime.datetime.strptime(conf['begin'], "%Y-%m-%d")            end_time = begin_time + datetime.timedelta(days=conf['weeks']*7)            schedule = conf['schedule']            work_days = cls.date_list(begin_time, end_time, schedule)            for i, date in enumerate(work_days):                if cls.holiday(date, conf['holidays']):                    print '-- skip holiday:', date.strftime('%Y-%m-%d')                    continue                week = date.weekday() + 1                week_ith = (date - begin_time).days / 7 + 1                print "##", date.strftime('%Y-%m-%d'), '%s%s' % ("星期", CN_NUM[week]), "第", week_ith, "周"                page.find('span', {"name": "page_ith"}).string = str(i+1)                page.find('span', {"name": "week_ith"}).string = str(week_ith)                page.find('span', {"name": "lesson_ith"}).string = schedule[week][1]                page.find('span', {"name": "week"}).string = '%s%s' % ("星期", CN_NUM[week])                page.find('span', {"name": "year"}).string = str(date.year)                page.find('span', {"name": "month"}).string = '%02d' % date.month                page.find('span', {"name": "day"}).string = '%02d' % date.day                # 复制页面元素需要深拷贝,否则为移动元素                # 不能直接 insert str(page),因为 BS 会对其中 html 特殊字符转义                page = deepcopy(page)                soup.body.insert(len(soup.body), page)                blank = deepcopy(blank)                soup.body.insert(len(soup.body), blank)            year_span = conf['year'].split()            # 长行字符串写法            out_file_name = ''.join((year_span[0], '-', year_span[-1], '-',                    , conf['term'], '《' + conf['lesson'] + '》', '教案-教师', '.doc'))            with open(out_file_name, 'wb') as out_file:                out_file.write(str(soup))if __name__ == '__main__':    CN_NUM = {        0: '零',        1: '一',        2: '二',        3: '三',        4: '四',        5: '五',        6: '六',        7: '七',        8: '八',        9: '九',    }    Util.run()

评论关闭