<%
# =======================================================================
# 日本語文型パターンパーサ Webインタフェース
#      1st.version  : 2003.8/9 by Keichiro Katayama
#  current Version  : 2007/04/25
# =======================================================================

# wjpp.rhtml
# Version 3.0
# 2007/04/25

# =====================
# Kanji Code
# =====================
$KCODE = 'EUC'
ERuby.charset = 'euc-jp'

# =====================
# Load Library
# =====================

# Main Class
require 'lib/wjpp.rb'

# CGI Support Library
require 'cgi'

# DNS Lookup
require 'lib/dnslookup.rb'

# Initialize
cgi = CGI.new
wjpp = Wjpp.new( cgi )
wjpp_log_name = '/www/world/toribank/wjpp/wjpp_query_log/wjpp.log'
	
# =====================
# Query Check
# =====================
  # Default Value
  has_query = false
  error_msg = nil
  rs = nil

  # Japanese Sentence
  if cgi.has_key?('sentence') then
    wjpp.sentence = cgi.params['sentence'].first.strip.untaint
    has_query = true
  end

  # Pattern Level
  if cgi.has_key?('pattern') then
    case cgi.params['pattern'].first[0,1].upcase
    when 'W'
      wjpp.pattern_level = :word
    when 'P'
      wjpp.pattern_level = :phrase
    when 'C'
      wjpp.pattern_level = :clause
    when 'A'
      wjpp.pattern_level = :all
    else
      wjpp.pattern_level = :word
    end
  end

  if has_query then
    # Execute Pattern Matching
    begin
      rs = wjpp.do_matching
    rescue Wjpp::SentenceTooLong
      error_msg = "Too Long Sentence!(max=#{wjpp.config.sentence_limit})"
    rescue JppServer::MorphAnalyzeError
      rs = nil
      error_msg = "Can't analyze sentence!"
    rescue DRb::DRbUnknownError
      rs = nil
      error_msg = "Internal Error!(2)"
    rescue
      rs = nil
      error_msg = "Internal Error!(1)"
    end

    #  Log
    log_time = Time.now.strftime( "%Y/%m/%d %H:%M:%S" )
    log_addr = cgi.remote_addr.dup
    log_host = lookup_with_gethostbyaddr( log_addr )
    if log_addr == log_host then
      log_host = ''
    end
    log_data = [ log_time, log_addr, log_host, wjpp.sentence, wjpp.pattern_level_name ]
    
    if rs.nil? then
      log_data.push 'Error', error_msg.dup
    else
      if wjpp.exceed_limit? then
        log_data.push 'Success', 'Result: %d(%d)' % [ rs.solutions.length, wjpp.real_solution_num ]
      else
        log_data.push 'Success', 'Result: %d' % rs.solutions.length
      end
    end
      
    File.open( wjpp_log_name, 'a' ){ |log|
      begin
        log.flock( File::LOCK_EX )
        log.puts log_data.join( "\t" )
      ensure
        log.flock( File::LOCK_UN )
      end
    }

  end
# end of setup
# =======================================================================
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
  <head>
    <meta name="ROBOTS" content="NOINDEX,NOFOLLOW">
    <meta http-equiv="Content-type" content="text/html; charset=EUC-JP">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <link rel="stylesheet" type="text/css" href="css/main.css">
    <title>wjpp</title>
    <script language="JavaScript"><%
      js_style_data = []
      wjpp.config.client_style.each_pair { |key, value|
        js_style_data << 'new Array("' + key + '", ' + value.collect{ |v| '"' + v + '"' }.join( ', ' ) + ')'
      }
    %>
      var aStyles = new Array( <%= js_style_data.join( ', ' ) %> );
    </script>
    <script language="JavaScript" type="text/javascript" src="<%= wjpp.config.client_js %>"></script>
  </head>
  <body>
    <div class="header">
      <h1>パターンパーサ</h1>
    </div>

    <h3>日本語入力文</h3>
    <div class="search">
      <div class="form">
        <form action="<%= cgi.script_name %>" method="GET">
          <table>
            <tr>
              <th>Japanese Sentence</th>
              <td>
		      <input type="text" class="textbox" size="60" name="sentence"<% if has_query then %> value="<%= wjpp.sentence %>"<% end %>><br>
		      <span class="additional">注意事項：重文・複文を入力してください。また、句読点（。、）を用いてください。ピリオド・カンマ（．，）は受け付けません。</span>
              </td>
            </tr>
            <tr>
              <th>Pattern Level</th>
              <td>
                <select name="pattern" class="textbox">
                  <% Wjpp::PATTERN_LEVEL_SET.each{ |level| %>
                  <option value="<%= level.to_s.slice(0,1).upcase %>"<% if level == wjpp.pattern_level then %> selected<% end %>><%= level.to_s.capitalize %></option>
                  <% } %>
                </select>
              </td>
            </tr>
            <tr>
              <td class="buttons" colspan="2">
                <input type="submit" value=" ○ Matching " class="button"> <input type="reset" value=" × Reset " class="button">
              </td>
            </tr>
          </table>
        </form>
      </div>
    </div>

  <% if ! error_msg.nil? then  %>
     <h3>Error</h3>
     <div class="result"><p><%= error_msg %></p></div>
  <% elsif has_query then
     if rs.solutions.nil? || rs.solutions.empty? then
  %>
    <h3>Error</h3>
    <div class="result">
      <p>No Match</p>
      <ul>
        <li>重文・複文を入力してください。単文は対象外です。</li>
	<li>Pattern Levelを変えてみてください。(Word→Phrase, Phrase→Clauseなど)</li>
        <li>読点（、）を追加または削除を行ってみてください。</li>
	<li>形態素解析ミスの可能性があります。表現を変えてみてください。</li>
      </ul>
    </div>
  <%   else %>
    <h3>Result</h3>
    <div class="result">
      <p>Pattern Level: <span class="value"><%= wjpp.pattern_level_name %></span>, Number of Pattern: <span class="value"><%= num2comstr( wjpp.pattern_num ) %></span></p>
      <p>Number of Matched Pattern: <span class="value"><%= rs.solutions.length %></span>, Best Coverage: <span class="value"><%= sprintf( "%5.2f%", rs.solutions.first.coverage * 100 ) %></span></p>
      <% if wjpp.exceed_limit? then %>
      <p><strong>Exceed Max Pattern Limit!(Real Number of Matched Pattern: <%= num2comstr(wjpp.real_solution_num) %>)</strong></p>
      <% end %>
      <table id="result-frame">
        <tr id="header">
          <th>Rank<br>Coverage<br>Pattern ID</th>
          <th>Matching Result<br>Matched Pattern Pair<br>Example of Japanese/English Translation</th>
        </tr>

        <%# Loop each Solution... %>
        <%
          last_coverage = nil
          sol_rank = 1
	  same_rank = 0
	  
	  rs.solutions.each{ |sol|
            if sol.coverage == last_coverage then
              same_rank += 1
            else
              last_coverage = sol.coverage
              sol_rank += same_rank
              same_rank = 1
            end
	    html_mrp, html_var, html_pj, html_pe = sol.make_html_with_morph( rs.morph_data )
        %>
        <tr class="result-record">
          <td class="result-info">
            <span class="rank"><%= sol_rank %></span><br>
            <span class="coverage"><%= sprintf( "%5.2f%", sol.coverage * 100 ) %></span><br>
            <span class="pattern-id"><%= CGI.escapeHTML(sol.pattern_id) %></span>
          </td>
          <td class="result-data" id="<%= sprintf( "wjpp%d", sol.object_id ) %>">
            <table class="result-data-frame">
              <tr class="matched-chars">
                <th>Matched Characters:</th>
                <td>
                  <table>
                    <tr class="sents"><%= html_mrp %></tr>
                    <tr class="vars"><%= html_var %></tr>
                  </table>
                </td>
              </tr>
            </table>

            <div class="similars1">
            <table class="result-data-frame">
              <tr class="matched-jpn-pat">
                <th>Matched Japanese Pattern:</th>
                <td><%= html_pj %></td>
              </tr>
              <tr class="cor-eng-pat">
                <th>Corresponding English Pattern:</th>
                <td><%= html_pe %></td>
              </tr>
            </table>
            </div>
          </td>
        </tr>
        <% } # end of each sol %>
      </table>
    </div>
  <%   end # rs.nil? %>
  <% end # has_query %>

    <div class="copyright">
      <hr>
      <p><a href="../"><img src="images/point.png" alt="">Top</a></p>
      <p>WJPP(Web interface for JPP) version <%= Wjpp::VERSION %> by K.Katayama<br>jpp2: <%= wjpp.config.jpp_version %><br>Pattern Dic: 15.a.1-Imi6.1.0(Limit)</a></p>
    </div>
  </body>
</html>

