@@ -2,12 +2,14 @@ import { type App, type Component, Notice, type TFile } from 'obsidian';
22import { postponeButtonTitle , shouldShowPostponeButton } from '../DateTime/Postponer' ;
33import { QueryLayout } from '../Layout/QueryLayout' ;
44import { TaskLayout } from '../Layout/TaskLayout' ;
5+ import { State } from '../Obsidian/Cache' ;
56import type { GroupDisplayHeading } from '../Query/Group/GroupDisplayHeading' ;
67import type { QueryResult } from '../Query/QueryResult' ;
78import type { ListItem } from '../Task/ListItem' ;
89import type { Task } from '../Task/Task' ;
910import { PostponeMenu } from '../ui/Menus/PostponeMenu' ;
1011import { showMenu } from '../ui/Menus/TaskEditingMenu' ;
12+ import { MarkdownQueryResultsRenderer } from './MarkdownQueryResultsRenderer' ;
1113import type { QueryRendererParameters } from './QueryResultsRenderer' ;
1214import { QueryResultsRendererBase , type QueryResultsRendererGetters } from './QueryResultsRendererBase' ;
1315import { TaskLineRenderer , type TextRenderer , createAndAppendElement } from './TaskLineRenderer' ;
@@ -38,6 +40,8 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
3840
3941 private readonly queryRendererParameters : QueryRendererParameters ;
4042
43+ private readonly markdownRenderer : MarkdownQueryResultsRenderer ;
44+
4145 constructor (
4246 renderMarkdown : (
4347 app : App ,
@@ -67,6 +71,12 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
6771 taskLayoutOptions : this . getters . query ( ) . taskLayoutOptions ,
6872 queryLayoutOptions : this . getters . query ( ) . queryLayoutOptions ,
6973 } ) ;
74+
75+ this . markdownRenderer = new MarkdownQueryResultsRenderer ( getters ) ;
76+ }
77+
78+ protected beginRender ( ) : void {
79+ return ;
7080 }
7181
7282 protected renderSearchResultsHeader ( queryResult : QueryResult ) : void {
@@ -77,12 +87,12 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
7787 this . addTaskCount ( queryResult ) ;
7888 }
7989
80- protected renderErrorMessage ( errorMessage : string ) {
90+ protected renderErrorMessage ( errorMessage : string ) : void {
8191 const container = createAndAppendElement ( 'div' , this . content ) ;
8292 container . innerHTML = '<pre>' + `Tasks query: ${ errorMessage . replace ( / \n / g, '<br>' ) } ` + '</pre>' ;
8393 }
8494
85- protected renderLoadingMessage ( ) {
95+ protected renderLoadingMessage ( ) : void {
8696 this . content . textContent = 'Loading Tasks ...' ;
8797 }
8898
@@ -92,12 +102,14 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
92102 explanationsBlock . textContent = explanation ;
93103 }
94104
95- private addCopyButton ( queryResult : QueryResult ) {
105+ private addCopyButton ( _queryResult : QueryResult ) {
96106 const copyButton = createAndAppendElement ( 'button' , this . content ) ;
97107 copyButton . textContent = 'Copy results' ;
98108 copyButton . classList . add ( 'plugin-tasks-copy-button' ) ;
99109 copyButton . addEventListener ( 'click' , async ( ) => {
100- await navigator . clipboard . writeText ( queryResult . asMarkdown ( ) ) ;
110+ // TODO reimplement this using QueryResult.asMarkdown() when it supports trees and list items.
111+ await this . markdownRenderer . renderQuery ( State . Warm , this . queryRendererParameters . allTasks ( ) ) ;
112+ await navigator . clipboard . writeText ( this . markdownRenderer . markdown ) ;
101113 new Notice ( 'Results copied to clipboard' ) ;
102114 } ) ;
103115 }
@@ -126,7 +138,7 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
126138 this . ulElementStack . pop ( ) ;
127139 }
128140
129- protected beginListItem ( ) {
141+ protected beginListItem ( ) : void {
130142 const taskList = this . currentULElement ( ) ;
131143 this . lastLIElement = createAndAppendElement ( 'li' , taskList ) ;
132144 }
0 commit comments