Fájlbetöltés kész, stíluslap elkezve
This commit is contained in:
		
							parent
							
								
									0203cc0dd6
								
							
						
					
					
						commit
						e1823c9aec
					
				
							
								
								
									
										24
									
								
								index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								index.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="hu">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8"/>
 | 
			
		||||
    <title>MKK Közivezető-választás</title>
 | 
			
		||||
    <script src="js/req.js"></script>
 | 
			
		||||
    <script src="js/mkkkvv.js"></script>
 | 
			
		||||
    <link rel="stylesheet" href="mkkkvv.css"/>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<section id="mainbox">
 | 
			
		||||
    <input oninput="search_in_names(this.value)" type="text" placeholder="Ki legyen a Közivezető? :)" id="nameinput">
 | 
			
		||||
    <section id="hintzone">
 | 
			
		||||
        <section id="hintbox">
 | 
			
		||||
 | 
			
		||||
        </section>
 | 
			
		||||
    </section>
 | 
			
		||||
</section>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										92
									
								
								interface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								interface.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,92 @@
 | 
			
		||||
<?php
 | 
			
		||||
define("DUPLICATE_NAME_IN_SAME_GROUP", true);
 | 
			
		||||
 | 
			
		||||
// kiolvassa a választható emberek listáját
 | 
			
		||||
function read_electable_people(string $fname): array
 | 
			
		||||
{
 | 
			
		||||
    $s = file_get_contents($fname);
 | 
			
		||||
 | 
			
		||||
    // szétszedés csoportnév-csoporttag sorozatra
 | 
			
		||||
    $group_name_seq = preg_split("/(\*\*)|(__)/", trim($s), -1, PREG_SPLIT_NO_EMPTY);
 | 
			
		||||
 | 
			
		||||
    // csoportok feldolgozása egyenként
 | 
			
		||||
    $ep = [];
 | 
			
		||||
    for ($i = 0; $i < count($group_name_seq); $i += 2) {
 | 
			
		||||
        $group = trim($group_name_seq[$i]); // csoport kiolvasása
 | 
			
		||||
        $names = preg_split("/(\n)|(\r\n)/", trim($group_name_seq[$i + 1]), -1, PREG_SPLIT_NO_EMPTY); // nevek a csoportból
 | 
			
		||||
 | 
			
		||||
        foreach ($names as $name) {
 | 
			
		||||
            if (trim($name) === "") { // üres sorokat átugorja
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            $new_rec = ["name" => $name, "group" => $group];
 | 
			
		||||
            if (DUPLICATE_NAME_IN_SAME_GROUP || !in_array($new_rec, $ep)) {
 | 
			
		||||
                $ep[] = $new_rec;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return $ep;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
define("MINIMUM_NEEDLE_LENGTH", 3);
 | 
			
		||||
 | 
			
		||||
// keresés a nevek között
 | 
			
		||||
function search_in_names(array $records, string $needle): array
 | 
			
		||||
{
 | 
			
		||||
    $needle = trim($needle);
 | 
			
		||||
 | 
			
		||||
    if (strlen($needle) < MINIMUM_NEEDLE_LENGTH) {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $hitpos_array = [];
 | 
			
		||||
 | 
			
		||||
    $filter = function(array $var) use (&$hitpos_array, $needle) : bool {
 | 
			
		||||
        $hitpos = stripos($var["name"], $needle);
 | 
			
		||||
 | 
			
		||||
        if ($hitpos != false) {
 | 
			
		||||
            $hitpos_array[] = $hitpos;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $hitpos !== false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    $filter_res = array_values(array_filter($records, $filter));
 | 
			
		||||
 | 
			
		||||
    if (count($filter_res) > 0) {
 | 
			
		||||
        for ($i = 0; $i < count($filter_res); $i++) {
 | 
			
		||||
            $filter_res[$i]["hitpos"] = $hitpos_array[$i];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $filter_res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --------------------------------
 | 
			
		||||
 | 
			
		||||
define("ELECTABLE_PEOPLE_DATABASE", "data/electable_people_test.md");
 | 
			
		||||
 | 
			
		||||
$action = json_decode($_POST["action"]) ?? "none";
 | 
			
		||||
 | 
			
		||||
$res = "";
 | 
			
		||||
 | 
			
		||||
switch ($action) {
 | 
			
		||||
    case "search":
 | 
			
		||||
        {
 | 
			
		||||
            $needle = json_decode($_POST["needle"]);
 | 
			
		||||
            $p = read_electable_people(ELECTABLE_PEOPLE_DATABASE);
 | 
			
		||||
            $hits = search_in_names($p, $needle);
 | 
			
		||||
            $res = $hits;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case "none":
 | 
			
		||||
        break;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo json_encode($res);
 | 
			
		||||
 | 
			
		||||
//$p = read_electable_people("data/electable_people_test.md");
 | 
			
		||||
 | 
			
		||||
return;
 | 
			
		||||
							
								
								
									
										63
									
								
								js/mkkkvv.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								js/mkkkvv.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
			
		||||
const MINIMUM_NEEDLE_LENGTH = 3;
 | 
			
		||||
const CANVAS = document.create
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// keresés indítása a nevek között
 | 
			
		||||
function search_in_names(needle) {
 | 
			
		||||
    let hintbox = document.getElementById("hintbox");
 | 
			
		||||
 | 
			
		||||
    if (needle.length < 3) {
 | 
			
		||||
        hintbox.innerHTML = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (needle.trim().length < MINIMUM_NEEDLE_LENGTH) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    request({
 | 
			
		||||
        action: "search",
 | 
			
		||||
        needle: needle
 | 
			
		||||
    }).then(resp => {
 | 
			
		||||
        hintbox.innerHTML = "";
 | 
			
		||||
        let hits = JSON.parse(resp);
 | 
			
		||||
        console.log(hits);
 | 
			
		||||
        hits.forEach((key, val) => {
 | 
			
		||||
            if (needle.length < 3) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let hit = document.createElement("span");
 | 
			
		||||
            hit.classList.add("hit");
 | 
			
		||||
 | 
			
		||||
            let name_node = document.createElement("span");
 | 
			
		||||
            name_node.classList.add("name");
 | 
			
		||||
 | 
			
		||||
            let hp = key["hitpos"];
 | 
			
		||||
            let name = key["name"];
 | 
			
		||||
 | 
			
		||||
            if (hp > 0) {
 | 
			
		||||
                let name_begin = name.slice(0, hp);
 | 
			
		||||
                name_node.appendChild(document.createTextNode(name_begin));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let hl = document.createElement("span");
 | 
			
		||||
            hl.classList.add("highlight");
 | 
			
		||||
            hl.innerText = name.slice(hp, hp + needle.length);
 | 
			
		||||
            name_node.appendChild(hl);
 | 
			
		||||
 | 
			
		||||
            if (hp + needle.length < name.length) {
 | 
			
		||||
                let name_end = name.slice(hp + needle.length, name.length);
 | 
			
		||||
                name_node.appendChild(document.createTextNode(name_end));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            hit.appendChild(name_node);
 | 
			
		||||
 | 
			
		||||
            let group = document.createElement("span");
 | 
			
		||||
            group.innerText = `(${key["group"]})`;
 | 
			
		||||
            group.classList.add("group");
 | 
			
		||||
            hit.appendChild(group);
 | 
			
		||||
 | 
			
		||||
            hintbox.appendChild(hit);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								js/req.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								js/req.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
// kérés indítása a szerver felé (eredeti: KL.)
 | 
			
		||||
function request(data, url = "interface.php", method = "POST") {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        var fd;
 | 
			
		||||
 | 
			
		||||
        // ha van adat megadva...
 | 
			
		||||
        if (data != null) {
 | 
			
		||||
            fd = new FormData();
 | 
			
		||||
 | 
			
		||||
            // mezők hozzáfűzése a kéréshez
 | 
			
		||||
            for (let prop in data) {
 | 
			
		||||
                if (Object.prototype.hasOwnProperty.call(data, prop)) {
 | 
			
		||||
                    fd.append(prop, JSON.stringify(data[prop]));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // kérés feladása
 | 
			
		||||
        fetch(url, {
 | 
			
		||||
            method: method,
 | 
			
		||||
            body: fd,
 | 
			
		||||
        })
 | 
			
		||||
            .then(response => response.text())
 | 
			
		||||
            .then(data => resolve(data))
 | 
			
		||||
            .catch((error) => {
 | 
			
		||||
                console.error('Error: ', error);
 | 
			
		||||
                reject(error);
 | 
			
		||||
            });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
@ -1,6 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
    // kiolvassa a választható emberek listáját
 | 
			
		||||
    function read_electable_people(string $fname) : array {
 | 
			
		||||
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										54
									
								
								mkkkvv.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								mkkkvv.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,54 @@
 | 
			
		||||
@import url('https://fonts.googleapis.com/css2?family=Faustina&display=swap');
 | 
			
		||||
 | 
			
		||||
body{
 | 
			
		||||
    --C_PRIMARY: #f89a17;
 | 
			
		||||
    --C_SEC: #44968e;
 | 
			
		||||
    --C_TER: #2a5999;
 | 
			
		||||
    --C_TRIADIC1: #85ea11;
 | 
			
		||||
    --C_TRIADIC2: #11ea76;
 | 
			
		||||
    --C_BG1: #c0ccdf;
 | 
			
		||||
    --C_BG2: #e3ecf3;
 | 
			
		||||
 | 
			
		||||
    font-family: 'Faustina', serif;
 | 
			
		||||
 | 
			
		||||
    --MAINBOX_WIDTH: 30em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type="text"] {
 | 
			
		||||
    font-family: 'Faustina', serif;
 | 
			
		||||
    font-size: 32px;
 | 
			
		||||
    border-color: #2a5999;
 | 
			
		||||
    border-width: 0 0 0.1em 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type="text"]:focus {
 | 
			
		||||
    outline: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input#nameinput {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
section#hintbox {
 | 
			
		||||
    background-color: var(--C_BG2);
 | 
			
		||||
    margin: 0.2em 0.5em;
 | 
			
		||||
    color: var(--C_TER);
 | 
			
		||||
    font-size: 24px;
 | 
			
		||||
    padding: 0.5em 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.hit {
 | 
			
		||||
    display: block;
 | 
			
		||||
    position: static;
 | 
			
		||||
    padding: 0.2em 0.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.highlight {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
section#mainbox {
 | 
			
		||||
    display: block;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    width: min(var(--MAINBOX_WIDTH), calc(100vw - 1em));
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user