Ansico-diagnosekoder/ansico-diagnosekoder/includes/class-ansico-diagnosekoder-parser.php

199 lines
6 KiB
PHP
Raw Permalink Normal View History

2026-04-18 22:06:24 +00:00
<?php
if (!defined('ABSPATH')) {
exit;
}
class Ansico_Diagnosekoder_Parser {
public static function parse_file($file_path) {
if (!file_exists($file_path) || !is_readable($file_path)) {
return [
'rows' => [],
'meta' => [
'error' => __('Filen kunne ikke læses.', 'ansico-diagnosekoder'),
],
];
}
$handle = fopen($file_path, 'r');
if (!$handle) {
return [
'rows' => [],
'meta' => [
'error' => __('Filen kunne ikke åbnes.', 'ansico-diagnosekoder'),
],
];
}
$rows = [];
$header_found = false;
$line_number = 0;
while (($line = fgets($handle)) !== false) {
$line_number++;
$line = trim($line);
if ($line === '') {
continue;
}
$columns = str_getcsv($line, ';', '"', '\\');
if (!is_array($columns) || count($columns) < 2) {
continue;
}
$col1 = isset($columns[0]) ? trim((string) $columns[0]) : '';
$col2 = isset($columns[1]) ? trim((string) $columns[1]) : '';
if (!$header_found) {
if (strcasecmp($col1, 'Kode') === 0 && strcasecmp($col2, 'Tekst') === 0) {
$header_found = true;
}
continue;
}
if ($col1 === '' || $col2 === '') {
continue;
}
$rows[] = [
'code' => sanitize_text_field($col1),
'text' => sanitize_text_field($col2),
];
}
fclose($handle);
return [
'rows' => $rows,
'meta' => [
'imported_at' => current_time('mysql'),
'row_count' => count($rows),
'source_name' => basename($file_path),
'header_found' => $header_found,
'line_count' => $line_number,
],
];
}
public static function search($query, $limit = 50, $favorite_codes = [], $links = []) {
$query = trim((string) $query);
if ($query === '') {
return [];
}
$data = get_option(ANSICO_DIAGNOSEKODER_OPTION_DATA, []);
if (!is_array($data) || empty($data)) {
return [];
}
$limit = $limit > 0 ? min($limit, 100) : 50;
$query_lower = function_exists('mb_strtolower') ? mb_strtolower($query, 'UTF-8') : strtolower($query);
$favorite_lookup = [];
foreach ((array) $favorite_codes as $favorite_code) {
$favorite_lookup[self::normalize_code($favorite_code)] = true;
}
$link_lookup = is_array($links) ? $links : [];
$results = [];
foreach ($data as $index => $row) {
if (!is_array($row) || empty($row['code']) || empty($row['text'])) {
continue;
}
$code = (string) $row['code'];
$text = (string) $row['text'];
$normalized_code = self::normalize_code($code);
$haystack_code = function_exists('mb_strtolower') ? mb_strtolower($code, 'UTF-8') : strtolower($code);
$haystack_text = function_exists('mb_strtolower') ? mb_strtolower($text, 'UTF-8') : strtolower($text);
if (strpos($haystack_code, $query_lower) === false && strpos($haystack_text, $query_lower) === false) {
continue;
}
$results[] = [
'code' => $code,
'text' => $text,
'is_favorite' => isset($favorite_lookup[$normalized_code]),
'linked_url' => isset($link_lookup[$normalized_code]) ? $link_lookup[$normalized_code] : '',
'_original_index' => $index,
];
}
if (empty($results)) {
return [];
}
usort($results, static function ($a, $b) {
$a_favorite = !empty($a['is_favorite']);
$b_favorite = !empty($b['is_favorite']);
if ($a_favorite !== $b_favorite) {
return $a_favorite ? -1 : 1;
}
return ((int) ($a['_original_index'] ?? 0)) <=> ((int) ($b['_original_index'] ?? 0));
});
foreach ($results as &$result) {
unset($result['_original_index']);
}
unset($result);
return array_slice($results, 0, $limit);
}
public static function get_rows_by_codes($codes = []) {
$normalized_codes = [];
foreach ((array) $codes as $code) {
$normalized = self::normalize_code($code);
if ($normalized !== '') {
$normalized_codes[] = $normalized;
}
}
$normalized_codes = array_values(array_unique($normalized_codes));
if (empty($normalized_codes)) {
return [];
}
$lookup = array_fill_keys($normalized_codes, true);
$data = get_option(ANSICO_DIAGNOSEKODER_OPTION_DATA, []);
if (!is_array($data) || empty($data)) {
return [];
}
$rows = [];
foreach ($data as $row) {
if (!is_array($row) || empty($row['code']) || empty($row['text'])) {
continue;
}
$code = (string) $row['code'];
$normalized_code = self::normalize_code($code);
if (!isset($lookup[$normalized_code])) {
continue;
}
$rows[$normalized_code] = [
'code' => $code,
'text' => (string) $row['text'],
];
}
$ordered = [];
foreach ($normalized_codes as $normalized_code) {
if (isset($rows[$normalized_code])) {
$ordered[] = $rows[$normalized_code];
}
}
return $ordered;
}
protected static function normalize_code($code) {
$code = sanitize_text_field((string) $code);
$code = preg_replace('/\s+/', '', $code);
return strtoupper((string) $code);
}
}