1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use typst::foundations::Repr;
use typst::visualize::Color;
use crate::prelude::*;
/// The [`textDocument/colorPresentation`] request is sent from the client to
/// the server to obtain a list of presentations for a color value at a given
/// location.
///
/// [`textDocument/colorPresentation`]: https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation
///
/// Clients can use the result to:
///
/// * Modify a color reference
/// * Show in a color picker and let users pick one of the presentations
///
/// # Compatibility
///
/// This request was introduced in specification version 3.6.0.
///
/// This request has no special capabilities and registration options since it
/// is sent as a resolve request for the [`textDocument/documentColor`] request.
///
/// [`textDocument/documentColor`]: https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor
#[derive(Debug, Clone)]
pub struct ColorPresentationRequest {
/// The path of the document to request color presentations for.
pub path: PathBuf,
/// The color to request presentations for.
pub color: lsp_types::Color,
/// The range of the color to request presentations for.
pub range: LspRange,
}
impl ColorPresentationRequest {
/// Serve the request.
pub fn request(self) -> Option<Vec<ColorPresentation>> {
let color = typst::visualize::Color::Rgb(typst::visualize::Rgb::new(
self.color.red,
self.color.green,
self.color.blue,
self.color.alpha,
));
Some(vec![
simple(format!("{:?}", color.to_hex())),
simple(Color::Rgb(color.to_rgb()).repr().to_string()),
simple(Color::Luma(color.to_luma()).repr().to_string()),
simple(Color::Oklab(color.to_oklab()).repr().to_string()),
simple(Color::Oklch(color.to_oklch()).repr().to_string()),
simple(Color::Rgb(color.to_rgb()).repr().to_string()),
simple(Color::LinearRgb(color.to_linear_rgb()).repr().to_string()),
simple(Color::Cmyk(color.to_cmyk()).repr().to_string()),
simple(Color::Hsl(color.to_hsl()).repr().to_string()),
simple(Color::Hsv(color.to_hsv()).repr().to_string()),
])
}
}
fn simple(label: String) -> ColorPresentation {
ColorPresentation {
label,
..ColorPresentation::default()
}
}