Change metadata

This commit is contained in:
2025-05-27 15:43:44 +02:00
parent d2a8ddad8a
commit ef09a717dd
10 changed files with 2519 additions and 0 deletions

45
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,45 @@
{
// Verwendet IntelliSense zum Ermitteln möglicher Attribute.
// Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen.
// Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'no-man-sky'",
"cargo": {
"args": [
"build",
"--bin=no-man-sky",
"--package=no-man-sky"
],
"filter": {
"name": "no-man-sky",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'no-man-sky'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=no-man-sky",
"--package=no-man-sky"
],
"filter": {
"name": "no-man-sky",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

16
Cargo.toml Normal file
View File

@@ -0,0 +1,16 @@
[package]
name = "no-man-sky"
version = "0.1.0"
edition = "2024"
publish = ["merlin"]
description = "Utility functions to read environment with fallback and values from a file"
license = "MIT"
repository = "ssh://git@gitea.merlinserver.de:2222/Stefan/merlin_env_helper.git"
[dependencies]
ego-tree = "0.10.0"
env_logger = "0.11.8"
log = "0.4.27"
merlin_env_helper = { version = "0.2.0", registry = "merlin" }
reqwest = {version="0.12.15", features=["blocking"]}
scraper = "0.23.1"

76
snipped.html Normal file
View File

@@ -0,0 +1,76 @@
<span
class="resource-substanzmithoherenergie"
style="border: 1px solid #d3d3d3"
>
<span class="mw-valign-text-bottom" typeof="mw:File">
<a href="/de/wiki/Diwasserstoff" title="Diwasserstoff">
<img
class="mw-file-element lazyload"
data-image-key="SUBSTANCE.LAUNCHSUB.1.png"
data-image-name="SUBSTANCE.LAUNCHSUB.1.png"
data-relevant="1"
data-src="https://static.wikia.nocookie.net/nomanssky_gamepedia/images/0/03/SUBSTANCE.LAUNCHSUB.1.png/revision/latest/scale-to-width-down/18?cb=20180725071716"
decoding="async"
height="18"
loading="lazy"
src="data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D"
width="18"
/>
</a>
</span>
</span>
<a href="/de/wiki/Diwasserstoff" title="Diwasserstoff">
<span class="itemlink ajaxttlink">Diwasserstoff</span>
</a>
x1&nbsp;&nbsp;+&nbsp;&nbsp;
<span
class="resource-konzentrierterflüssigtreibstoff"
style="border: 1px solid #d3d3d3"
>
<span class="mw-valign-text-bottom" typeof="mw:File">
<a href="/de/wiki/Sauerstoff" title="Sauerstoff">
<img
class="mw-file-element lazyload"
data-image-key="SUBSTANCE.AIR.1.png"
data-image-name="SUBSTANCE.AIR.1.png"
data-relevant="1"
data-src="https://static.wikia.nocookie.net/nomanssky_gamepedia/images/e/ec/SUBSTANCE.AIR.1.png/revision/latest/scale-to-width-down/18?cb=20221007220715"
decoding="async"
height="18"
loading="lazy"
src="data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D"
width="18"
/>
</a>
</span>
</span>
<a href="/de/wiki/Sauerstoff" title="Sauerstoff">
<span class="itemlink ajaxttlink">Sauerstoff</span>
</a>
x1&nbsp;&nbsp;&nbsp;&nbsp;
<span
class="resource-aquatischesmineral-extrakt"
style="border: 1px solid #d3d3d3"
>
<span class="mw-valign-text-bottom" typeof="mw:File">
<a href="/de/wiki/Salz" title="Salz">
<img
class="mw-file-element lazyload"
data-image-key="SUBSTANCE.WATER.1.png"
data-image-name="SUBSTANCE.WATER.1.png"
data-relevant="1"
data-src="https://static.wikia.nocookie.net/nomanssky_gamepedia/images/9/9f/SUBSTANCE.WATER.1.png/revision/latest/scale-to-width-down/18?cb=20180726042119"
decoding="async"
height="18"
loading="lazy"
src="data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D"
width="18"
/>
</a>
</span>
</span>
<strong class="mw-selflink selflink">
<span class="itemlink ajaxttlink">Salz</span>
</strong>
x1&nbsp;&nbsp;
<small>( <i>"Schnelle Formation/Verdunstung"</i>,&nbsp;0,08 sek./Stück)</small>

155
src/main.rs Normal file
View File

@@ -0,0 +1,155 @@
use std::{fs::File, io::{Read}};
use scraper::{ElementRef, Node};
use ego_tree::NodeRef;
fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let html = read("test.html")?;
parse(&html)?;
Ok(())
}
fn _download_file(url: &str, _path: &str) -> Result<String, Box<dyn std::error::Error>> {
// Some simple CLI args requirements...
eprintln!("Fetching {url:?}...");
// reqwest::blocking::get() is a convenience function.
//
// In most cases, you should create/build a reqwest::Client and reuse
// it for all requests.
let res = reqwest::blocking::get(url)?;
let body = res.text()?;
Ok(body)
}
fn read(path: &str) -> Result<String, std::io::Error> {
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn parse(html: &str) -> Result<bool, Box<dyn std::error::Error>> {
// Parse the HTML content
let document = scraper::Html::parse_document(html);
let selector_quelle = scraper::Selector::parse("#Quelle").unwrap();
let selector_verwendung = scraper::Selector::parse("#Verwendung").unwrap();
let selector_li = scraper::Selector::parse("li").unwrap();
let elt_quelle= document.select(&selector_quelle).next();
if elt_quelle.is_none() {
eprintln!("No element found with the selector '#Quelle'");
return Ok(false);
}
let elt_quelle = elt_quelle.unwrap();
let mut elt_quelle = elt_quelle.parent().unwrap();
let mut c = 0;
let mut elt_ul = None;
while elt_quelle. next_sibling().is_some() {
elt_quelle = elt_quelle.next_sibling().unwrap();
if !elt_quelle.value().is_element(){
continue;
}
let elt = elt_quelle.value().as_element().unwrap();
if elt.name() == "ul" {
c += 1;
if c > 1 {
elt_ul = Some(elt_quelle);
break;
}
}
if elt.name() == "h2" {
eprintln!("Found 'h2' element, stopping search for 'ul'");
break;
}
}
if elt_ul.is_none() {
eprintln!("No second 'ul' element found after '#Quelle'");
return Ok(false);
}
let elt_ul = ElementRef::wrap(elt_ul.unwrap()).unwrap();
let li = elt_ul.select(&selector_li);
for item in li
{
parse_li_to_resource(item);
}
let elt_verwendung= document.select(&selector_verwendung).next();
if elt_verwendung.is_none() {
eprintln!("No element found with the selector '#Verwendung'");
return Ok(false);
}
let elt_verwendung = elt_verwendung.unwrap();
Ok(true)
}
fn parse_li_to_resource(item: ElementRef<'_>) {
if !item.has_children() {
println!("Item has no children, skipping.");
return;
}
let mut resource_items = Vec::new();
let first_child = item.first_child().unwrap();
resource_items.push(first_child);
let iter = first_child.next_siblings();
for next in iter {
if next.value().is_text() {
resource_items.push(next);
}
else if next.value().is_element() {
if next.value().as_element().unwrap().name() == "span" {
parse_resource (resource_items);
resource_items = Vec::new();
}
resource_items.push(next);
}
}
println!("======================");
}
fn parse_resource(resource_items: Vec<NodeRef<'_, Node>>) {
if resource_items.is_empty() {
println!("No resource items to parse.");
return;
}
println!("Parsing resource items...");
for item in resource_items {
if item.value().is_text() {
println!("Text: {}", item.value().as_text().unwrap().text.trim_ascii());
continue;
}
println!("Resource: {:?}", item.value());
}
println!("------------------");
}

8
src/test.html Normal file
View File

@@ -0,0 +1,8 @@
<html>
<body>
<img
src="data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D"
width="18"
/>
</body>
</html>

2
src/types/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod types;
pub use types::*;

0
src/types/types.rs Normal file
View File

3
src/util/cmd.rs Normal file
View File

@@ -0,0 +1,3 @@
pub fn parse_command_line_args() -> Vec<String> {
std::env::args().skip(1).collect()
}

2
src/util/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod cmd;
pub use cmd::*;

2212
test.html Normal file

File diff suppressed because one or more lines are too long