StrictDoc Documentation
strictdoc/features/search/view_object.py
Source file coverage
Path:
strictdoc/features/search/view_object.py
Lines:
133
Non-empty lines:
114
Non-empty lines covered with requirements:
114 / 114 (100.0%)
Functions:
14
Functions covered by requirements:
14 / 14 (100.0%)
1
"""
2
@relation(SDOC-SRS-155, scope=file)
3
"""
4
 
5
from dataclasses import dataclass
6
from typing import Iterator, List, Optional, Union
7
 
8
from markupsafe import Markup
9
 
10
from strictdoc import __version__
11
from strictdoc.backend.sdoc.models.anchor import Anchor
12
from strictdoc.backend.sdoc.models.document import SDocDocument
13
from strictdoc.backend.sdoc.models.document_view import DocumentView
14
from strictdoc.backend.sdoc.models.model import (
15
    SDocDocumentIF,
16
    SDocExtendedElementIF,
17
    SDocNodeIF,
18
)
19
from strictdoc.backend.sdoc.models.node import SDocNode
20
from strictdoc.core.document_tree import DocumentTree
21
from strictdoc.core.document_tree_iterator import DocumentTreeIterator
22
from strictdoc.core.file_system.file_tree import FileOrFolderEntry
23
from strictdoc.core.file_system.source_tree import SourceFile
24
from strictdoc.core.project_config import ProjectConfig
25
from strictdoc.core.traceability_index import TraceabilityIndex
26
from strictdoc.export.html.document_type import DocumentType
27
from strictdoc.export.html.html_templates import HTMLTemplates, JinjaEnvironment
28
from strictdoc.export.html.renderers.link_renderer import LinkRenderer
29
from strictdoc.export.html.renderers.markup_renderer import MarkupRenderer
30
from strictdoc.helpers.cast import assert_cast
31
 
32
 
33
@dataclass
34
class SearchScreenViewObject:
35
    def __init__(
36
        self,
37
        *,
38
        traceability_index: TraceabilityIndex,
39
        project_config: ProjectConfig,
40
        templates: HTMLTemplates,
41
        search_results: List[SDocExtendedElementIF],
42
        search_value: str,
43
        error: Optional[str],
44
    ) -> None:
45
        self.traceability_index: TraceabilityIndex = traceability_index
46
        self.project_config: ProjectConfig = project_config
47
        self.templates: HTMLTemplates = templates
48
        self.search_results: List[SDocExtendedElementIF] = search_results
49
        self.search_value: str = search_value
50
        self.error: Optional[str] = error
51
 
52
        link_renderer = LinkRenderer(
53
            root_path="", static_path=project_config.dir_for_sdoc_assets
54
        )
55
        markup_renderer = MarkupRenderer.create(
56
            "RST",
57
            traceability_index,
58
            link_renderer,
59
            templates,
60
            project_config,
61
            None,
62
        )
63
 
64
        self.link_renderer: LinkRenderer = link_renderer
65
        self.markup_renderer: MarkupRenderer = markup_renderer
66
        self.document_tree_iterator: DocumentTreeIterator = (
67
            DocumentTreeIterator(
68
                assert_cast(traceability_index.document_tree, DocumentTree)
69
            )
70
        )
71
        self.is_running_on_server: bool = project_config.is_running_on_server
72
        self.strictdoc_version = __version__
73
        self.current_view = DocumentView.create_default(None).views[0]
74
        self.document_type: DocumentType = DocumentType.DOCUMENT
75
        self.link_document_type: DocumentType = DocumentType.DOCUMENT
76
        self.document: Optional[SDocDocument] = None
77
 
78
    def get_document_level(self) -> int:
79
        return 0
80
 
81
    def render_truncated_node_statement(self, node: SDocNode) -> Markup:
82
        return self.markup_renderer.render_truncated_node_statement(
83
            self.document_type, node
84
        )
85
 
86
    def render_screen(self, jinja_environment: JinjaEnvironment) -> Markup:
87
        return jinja_environment.render_template_as_markup(
88
            "features/search/index.jinja", view_object=self
89
        )
90
 
91
    def is_empty_tree(self) -> bool:
92
        return self.document_tree_iterator.is_empty_tree()
93
 
94
    def iterator_files_first(self) -> Iterator[FileOrFolderEntry]:
95
        yield from self.document_tree_iterator.iterator_files_first()
96
 
97
    def render_url(self, url: str) -> Markup:
98
        return Markup(self.link_renderer.render_url(url))
99
 
100
    def render_static_url_with_prefix(self, url: str) -> str:
101
        return self.link_renderer.render_static_url_with_prefix(url)
102
 
103
    def render_node_link(
104
        self, incoming_link: Union[SDocDocument, SDocNode, Anchor]
105
    ) -> str:
106
        return self.link_renderer.render_node_link(
107
            incoming_link, None, DocumentType.DOCUMENT
108
        )
109
 
110
    def render_static_url(self, url: str) -> str:
111
        return self.link_renderer.render_static_url(url)
112
 
113
    def render_source_file_link_from_root_2(
114
        self, source_file: SourceFile
115
    ) -> str:
116
        return Markup(
117
            self.link_renderer.render_source_file_link_from_root_2(source_file)
118
        )
119
 
120
    def render_local_anchor(
121
        self, node: Union[Anchor, SDocNode, SDocDocument]
122
    ) -> str:
123
        return self.link_renderer.render_local_anchor(node)
124
 
125
    def render_issues(
126
        self,
127
        node: Union[SDocNodeIF, SDocDocumentIF],  # noqa: ARG002
128
        field: Optional[str] = None,  # noqa: ARG002
129
    ) -> str:
130
        """
131
        FIXME: It is not great that this method is called from here.
132
        """
133
        return ""