diff --git a/layouts/partials/qmltype.html b/layouts/partials/qmltype.html
index 25ea2c4..d5a923c 100644
--- a/layouts/partials/qmltype.html
+++ b/layouts/partials/qmltype.html
@@ -1,7 +1,7 @@
{{- if eq .type "unknown" -}}
unknown
{{- else -}}
- {{- $link := "" -}}
+ {{- $link := "#ERROR" -}}
{{- if eq .type "qt" -}}
{{- $link = printf "https://doc.qt.io/qt-6/%s-%s.html" (lower (replace .module "." "-")) (lower .name) -}}
{{- else if eq .type "local" -}}
@@ -13,39 +13,30 @@
{{- $of = printf "<%s>" (partial "qmltype.html" .of) }}
{{- end -}}
- {{- $prefix := "" -}}
{{- $member := "" -}}
- {{- if .mtype -}}
- {{- if .type -}}
- {{- $member = printf ".%s" .mname -}}
- {{- else -}}
- {{- $member = .mname -}}
+ {{- if .prop -}}
+ {{- $member = printf ".%s" .prop -}}
+ {{- if eq .type "qt" -}}
+ {{- $link = printf "%s#%s-prop" $link .prop -}}
+ {{- else if eq .type "local" -}}
+ {{- $link = printf "%s#prop.%s" $link .prop -}}
{{- end -}}
-
- {{- if eq .mtype "prop" -}}
- {{- if eq .type "qt" -}}
- {{- $link = printf "%s#%s-prop" $link .mname -}}
- {{- else -}}
- {{- $link = printf "%s#prop.%s" $link .mname -}}
- {{- end -}}
- {{- else if eq .mtype "func" -}}
- {{- $member = printf "%s()" $member -}}
- {{- if eq .type "qt" -}}
- {{- $link = printf "%s#%s-method" $link .mname -}}
- {{- else -}}
- {{- $link = printf "%s#func.%s" $link .mname -}}
- {{- end -}}
- {{- else if eq .mtype "signal" -}}
- {{- $prefix = "[signal] " -}}
- {{- $member = printf "%s()" $member -}}
- {{- if eq .type "qt" -}}
- {{- $link = printf "%s#%s-signal" $link .mname -}}
- {{- else -}}
- {{- $link = printf "%s#signal.%s" $link .mname -}}
- {{- end -}}
+ {{- else if .func -}}
+ {{- $member = printf ".%s()" .func -}}
+ {{- if eq .type "qt" -}}
+ {{- $link = printf "%s#%s-method" $link .func -}}
+ {{- else if eq .type "local" -}}
+ {{- $link = printf "%s#func.%s" $link .func -}}
+ {{- end -}}
+ {{- else if .signal -}}
+ {{- $member = printf ".%s()" .signal -}}
+ {{- if eq .type "qt" -}}
+ {{- $link = printf "%s#%s-signal" $link .signal -}}
+ {{- else if eq .type "local" -}}
+ {{- $link = printf "%s#signal.%s" $link .signal -}}
{{- end -}}
{{- end -}}
- {{ $prefix }}{{ .name }}{{ $member }}{{ $of | safeHTML -}}
+ {{ .name }}{{ $member }}{{ $of | safeHTML -}}
{{- end -}}
diff --git a/typegen/src/parse.rs b/typegen/src/parse.rs
index 9d9644f..24966fb 100644
--- a/typegen/src/parse.rs
+++ b/typegen/src/parse.rs
@@ -650,12 +650,13 @@ fn parse_details(comment: Comment) -> String {
let separators = [
('$', true),
(' ', false),
+ ('.', false),
(',', false),
(';', false),
(':', false),
];
- let (mut end, mut ty) = src.chars().enumerate()
+ let (end, ty) = src.chars().enumerate()
.find_map(|(i, char)| {
separators.iter()
.find(|(sc, _)| char == *sc)
@@ -663,62 +664,40 @@ fn parse_details(comment: Comment) -> String {
})
.unwrap_or_else(|| (src.len(), src));
- // special case for . as it is contained in valid types as well
- if ty.ends_with('.') {
- end -= 1;
- ty = &ty[..ty.len() - 1];
+ let mut split = ty.rsplit_once('.').unwrap_or(("", ty));
+
+ let member = split
+ .1
+ .chars()
+ .next()
+ .unwrap()
+ .is_lowercase()
+ .then(|| {
+ let prop = split.1;
+ split = split.0.rsplit_once('.').unwrap_or(("", split.0));
+ prop
+ })
+ .unwrap_or("");
+
+ let (prop, func, signal) = match member {
+ name if name.ends_with("()") => ("", &name[..name.len() - 2], ""),
+ name if name.ends_with("(s)") => ("", "", &name[..name.len() - 3]),
+ name => (name, "", ""),
+ };
+
+ let (mut module, name) = split;
+
+ if module.is_empty() {
+ module = comment.module;
}
- let (ty, member) = match ty.chars().next() {
- None => (None, None),
- Some(c) if c.is_lowercase() => (None, Some(ty)),
- Some(_) => {
- let mut split = ty.rsplit_once('.').unwrap_or(("", ty));
-
- let member = split
- .1
- .chars()
- .next()
- .unwrap()
- .is_lowercase()
- .then(|| {
- let prop = split.1;
- split = split.0.rsplit_once('.').unwrap_or(("", split.0));
- prop
- })
- .unwrap_or("");
-
- let (mut module, name) = split;
-
- if module.is_empty() {
- module = comment.module;
- }
-
- (Some((module, name)), Some(member))
- },
- };
-
- let (membertype, membername) = match member {
- None => ("", ""),
- Some(name) if name.ends_with("()") => ("func", &name[..name.len() - 2]),
- Some(name) if name.ends_with("(s)") => ("signal", &name[..name.len() - 3]),
- Some(name) => ("prop", name),
- };
-
- let ((linktype, module), name) = match ty {
- Some((module, name)) => {
- let module = match module {
- module if module.starts_with("Quickshell") => ("local", module.to_string()),
- module => ("qt", format!("qml.{module}")),
- };
-
- (module, name)
- },
- None => (("", String::new()), ""),
+ let (linktype, module) = match module.starts_with("Quickshell") {
+ true => ("local", module.to_string()),
+ false => ("qt", format!("qml.{module}")),
};
accum += &format!(
- r#"{{{{< qmltypelink type="{linktype}" module="{module}" name="{name}" mtype="{membertype}" mname="{membername}" >}}}}"#
+ r#"{{{{< qmltypelink type="{linktype}" module="{module}" name="{name}" prop="{prop}" func="{func}" signal="{signal}" >}}}}"#
);
src = &src[end..];
}