Newer
Older
tabeleditor / tabeleditor.inc.php
<?php
// $Id: tabeleditor.inc.php,v 0.1 2019/10/06
// Copyright
//   2019 Kwansei Gakuin University comp-staff
// License: GPL v2
// Tabeleditor plugin
// naming candidate  "TableEditor", "TabetElroid" -> "Tabetemas", "Tabeleditor"

function plugin_tabeleditor_action()
{
    global $vars, $now, $_title_updated, $_no_name;
    global $_msg_tabeleditor_collided, $_title_tabeleditor_collided;
    global $_tabeleditor_plugin_fail_msg;

    if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');

    $head = '';
    $match = array();

    $tabeleditor_added = TRUE;
    $cell_counter = 0;
    foreach (get_source($vars['refer']) as $line) {
        if (strpos($line, "|") === 0) {
            preg_match("/([fh])$/", $line, $match);
            $postamble = $match[1];
            $line = preg_replace("/^\\|(.*)\\|[fh]?$[^|]*/", "$1", $line);
            $postdata .= "|";
            foreach(explode("|", $line) as $cell) {
                if (strpos($cell,"~")===FALSE) {
                    $entry_name = "__buttons_" . $cell_counter;
                    //$postdata .= $cell_counter;
                    if ($vars[$entry_name]!==null) { 
                        $postdata .= $vars[$entry_name] . "|";
                    } else {
                        $postdata .= $cell . "|";
                    }
                    $cell_counter++;
                } else {
                    $postdata .= $cell . "|";
                }
            }
            $postdata .= "$postamble\n";
        } else {
            $postdata .= $line;
        }
    }

    $title = $_title_updated;
    $body = $postdata;
    if ($tabeleditor_added) {
        // new table created
        if (md5(get_source($vars['refer'], TRUE, TRUE)) !== $vars['digest']) {
            $title = $_title_tabeleditor_collided;
            $body  = $_msg_tabeleditor_collided . make_pagelink($vars['refer']);
        }
        page_write($vars['refer'], $postdata);
    } else {
        // failed to add new table
        $title = $_title_tabeleditor_collided;
        $body  = $_tabeleditor_plugin_fail_msg . make_pagelink($vars['refer']);
    }
    $retvars['msg']  = $vars['name'];
    $retvars['body'] = $vars['body'];
    $vars['page'] = $vars['refer'];
    return $retvars;
}

function plugin_tabeleditor_convert()
{
    global $vars, $digest, $_btn_tabeleditor, $_btn_name, $_msg_tabeleditor;
    static $numbers = array();

    if (PKWK_READONLY) return ''; // Show nothing

    $page = $vars['page'];
    if (! isset($numbers[$page])) $numbers[$page] = 0;
    $tabeleditor_no = $numbers[$page]++;

    $options = func_num_args() ? func_get_args() : array();

    $script = get_script_uri();
    $s_page = htmlsc($page);
    $string = <<<EOD
<style>
 .style_td input {
    font-size: 100%;
    background: linear-gradient(#6af 0%, #fef 10%, #dde 85%, #fff 100%);
}
</style>
<script>
  function blur_handler(e) {
    var value = e.target.value;
    var elm   = e.target.parentNode;
    var cellid = elm.cellid;
    var entry_name = "__buttons_"+cellid;
    var entry = document.getElementById(entry_name);

    elm.style = "";
    if (elm.initial_value != value) {
        elm.style.color= "red";
        document.getElementById("__buttons").style.visibility = "visible";
        if (!entry) {
            entry = document.createElement("input");
            entry.className = "changed";
            entry.type = "hidden";
            entry.name = entry.id = entry_name;
            document.getElementById("tabform").appendChild(entry);
        } 
        entry.value = value;
    } else {
        elm.style.color= "";
        if (entry) {
            entry.remove();
            if (document.querySelectorAll(".changed").length == 0) {
                document.getElementById("__buttons").style.visibility = "hidden";
            }
        }
    }
    value = value.replace(/&br;/g, "<br class=\"spacer\">");
    elm.onclick = click_handler;
    elm.innerHTML = value;
  }
  function key_handler(e) {
    if (e.keyCode == 13) e.target.blur();
    else if (e.keyCode == 27) {
        e.target.value = e.target.parentNode.initial_value;
        e.target.blur();
    }
  }
  function click_handler(e) {
    e.target.onclick = null;
    var elm = document.createElement("input");
    var value = e.target.innerHTML;
    value = value.replace(/<br class=\"spacer\">/g, "&br;");

    console.log(e.target.cellid);

    var container = document.querySelector('.style_td');
    var style = window.getComputedStyle(container);
    var pad = style.getPropertyValue("padding");

    elm.value = value;
    elm.style.width = e.target.clientWidth + "px";
    elm.style.height = e.target.clientHeight + "px";
    elm.style.outline = elm.style.margin = 
    elm.style.padding = elm.style.border = "0px";
    elm.onblur = blur_handler;
    elm.onkeydown = key_handler;

    e.target.innerHTML="";
    e.target.style.padding = "0px";
    e.target.appendChild(elm);

    elm.focus();
  }

  (function() {
     var node_td = document.getElementsByClassName("style_td");
     for (let i = 0; i< node_td.length; i++) {
       node_td[i].cellid = i;
       node_td[i].onclick = click_handler; 
       node_td[i].initial_value = node_td[i].innerHTML;
     }
   })();
</script>

<form id="tabform" action="$script" method="post">
  <input type="hidden" name="plugin" value="tabeleditor" />
  <input type="hidden" name="refer"  value="$s_page" />
  <input type="hidden" name="digest" value="$digest" />
  <div id="__buttons" class="style_buttons" style="padding:10px;background:#f5f0f0;margin:0px 26% 0px 26%;text-align:right;visibility:hidden;">
      <input type="submit" name="tabeleditor" value="SUBMIT" />
      <input type="button" name="tabeleditor" onclick="location.reload();" value="CANCEL" />
  </div>
 </div>
</form>
EOD;

    return $string;
}