# -*- coding:cp932 -*- # チェック用のjavascriptをつくるか選択 config_need_client_check = True # hiddenタグ書きやすくする def hidden_tag(name, value): return '' % (name, value) # アンケートフォームをつくるクラス # 特定の仕様のCGIに最適化したやつだけど class FormRenderer(object): # いろいろ初期設定 def __init__(self, id="no_name", action="", after="thankyou.html"): self.id = id self.action = action self.after = after # テキストボックスつくるよ(size - maxlength) def render_textbox(self, elem, lines): (size, limit) = lines[0][3:].split("-") return '' % (elem, size, limit) # テキストエリアつくるよ(cols x rows) def render_textarea(self, elem, lines): (cols, rows) = lines[0][3:].split("x") return '' % (elem, cols, rows) # チェックボックスつくるよ def render_checkbox(self, elem, lines): value = lines[0][3:] return '' % (elem, value) # リストボックスつくるよ def render_listbox(self, elem, lines): t = ['') return "\n".join(t) # ラジオボタン群つくるよ def render_radio_buttons(self, elem, lines): t = [] ord = 0 for i in lines: if i.startswith(" - "): ord = ord + 1 (opt, value) = i[3:].split(":") if opt.startswith("*"): checked = "checked" opt = opt[1:] else: checked = "" order = "%s_%d" % (elem, ord) if value == "-": value = opt t.append( '' % (elem, order, value, checked, order, opt)) return "\n".join(t) # サブミットボタンつくるよ def render_submit_button(self, elem, lines): label = lines[0][3:] return '' % label # エレメント登録(各種フォーム部品の総合窓口) def register_from_markup(self, lines): g = lines.pop(0) (kind, elem, short_q, long_qw) = g.split(":") if kind.startswith("*"): mand = 1 kind = kind[1:] else: mand = 0 if self.renderer_table.has_key(kind): if kind != "submit": self.questions.append((elem, short_q, kind)) if mand: self.mand_list.append((elem, short_q, kind)) self.form_elements.append((long_qw, self.renderer_table[kind](elem, lines))) # 複数項目の記述をいっぺんに処理するのはここに専用テキストを投げる def parse_markup(self, text): self.questions = [] self.mand_list = [] self.form_elements = [] self.renderer_table = { "text": self.render_textbox, "textarea": self.render_textarea, "check": self.render_checkbox, "list": self.render_listbox, "radio": self.render_radio_buttons, "submit": self.render_submit_button, } buf = [] for line in text.split("\n"): if not line: if buf: self.register_from_markup(buf) buf = [] continue else: buf.append(line) if buf: self.register_from_markup(buf) # 提出前の必須項目チェックのためのJavascript def checker_javascript(self): b = [] b.append("""function radio_checked(obj) { var i; for (i=0; i ") return "\n".join(b) # フォームの前半のhidden項目など def render_form_header(self): b = [] if config_need_client_check: extra_handler = 'onSubmit="return check_form()"' else: extra_handler = '' b.append('
' % (self.action, extra_handler)) b.append(hidden_tag('id', self.id)) b.append(hidden_tag('after', self.after)) b.append(hidden_tag('mode', 'preview')) q_st = "|".join([i[0] for i in self.questions]) b.append(hidden_tag('questions', q_st)) for i in self.questions: b.append(hidden_tag("%s_title" % i[0], i[1])) return "\n".join(b) # フォームの描写。ここのフォーマットをいじって、table型や # ただの改行型などに表示を調整できる def render_form_body(self): b = [] #for i in self.form_elements: # b.append('%s
\n%s
' % (i[0], i[1])) b.append('') for i in self.form_elements: b.append('' % (i[0], i[1])) b.append('
%s%s
') return "\n".join(b) # フォームやjavascriptなどを含んだ全HTMLの描写 def output_form(self): outs = open("%s.html" % self.id, "w") outs.write(self.html_header_and_maybe_script()) outs.write(self.render_form_header()) outs.write(self.render_form_body()) outs.write("
") outs.close() # # こんな風に実行。 # フォームidと、cgiの場所(action)と、回答後の表示URLと、フォーム定義ファイルの場所。 # r = FormRenderer(id="testform", action="../cgi-bin/enq3.cgi") r.parse_markup(open("form_def1.txt").read()) r.output_form()