22#include <QStringBuilder>
24using namespace Qt::StringLiterals;
27 : mMetadata( metadata )
32 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
33 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Fees" ) + u
"</td><td>"_s +
QgsStringUtils::insertLinks( mMetadata.fees() ) + u
"</td></tr>\n"_s;
34 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Licenses" ) + u
"</td><td>"_s +
QgsStringUtils::insertLinks( mMetadata.licenses().join(
"<br />"_L1 ) ) + u
"</td></tr>\n"_s;
35 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Rights" ) + u
"</td><td>"_s +
QgsStringUtils::insertLinks( mMetadata.rights().join(
"<br />"_L1 ) ) + u
"</td></tr>\n"_s;
36 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Constraints" ) + u
"</td><td>"_s;
37 const QList<QgsLayerMetadata::Constraint> &constraints = mMetadata.constraints();
38 bool notFirstRow =
false;
43 myMetadata +=
"<br />"_L1;
48 myMetadata +=
"</td></tr>\n"_L1;
49 myMetadata +=
"</table>\n"_L1;
55 const QList<QgsAbstractMetadataBase::Contact> &contacts = mMetadata.contacts();
57 if ( contacts.isEmpty() )
59 myMetadata += u
"<p>"_s + tr(
"No contact yet." ) + u
"</p>"_s;
63 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
64 myMetadata +=
"<tr><th>"_L1
71 + tr(
"Organization" )
88 rowClass = u
"class=\"odd-row\""_s;
89 myMetadata +=
"<tr "_L1
92 + QString::number( i )
98 + contact.organization
101 + u
"</td><td><a href=\"mailto:%1\">%1</a></td><td>"_s.arg( contact.email )
106 bool notFirstRow =
false;
111 myMetadata +=
"<br />\n"_L1;
113 if ( !oneAddress.
type.isEmpty() )
115 myMetadata += oneAddress.
type + u
"<br />"_s;
117 if ( !oneAddress.
address.isEmpty() )
119 myMetadata += oneAddress.
address + u
"<br />"_s;
123 myMetadata += oneAddress.
postalCode + u
"<br />"_s;
125 if ( !oneAddress.
city.isEmpty() )
127 myMetadata += oneAddress.
city + u
"<br />"_s;
133 if ( !oneAddress.
country.isEmpty() )
135 myMetadata += oneAddress.
country;
139 myMetadata +=
"</td></tr>\n"_L1;
142 myMetadata +=
"</table>\n"_L1;
150 bool notFirstRow =
false;
151 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
152 if ( showSpatialExtent )
154 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"CRS" ) + u
"</td><td>"_s;
155 if ( mMetadata.crs().isValid() )
157 myMetadata += mMetadata.crs().userFriendlyIdentifier() + u
" - "_s;
158 if ( mMetadata.crs().isGeographic() )
159 myMetadata += tr(
"Geographic" );
161 myMetadata += tr(
"Projected" );
163 myMetadata +=
"</td></tr>\n"_L1;
165 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Spatial Extent" ) + u
"</td><td>"_s;
166 const QList< QgsLayerMetadata::SpatialExtent > spatialExtents = extent.
spatialExtents();
169 if ( spatialExtent.bounds.isNull() || spatialExtent.bounds.toRectangle().isNull() )
174 myMetadata +=
"<br />\n"_L1;
176 myMetadata += u
"<strong>"_s + tr(
"CRS" ) + u
": </strong>"_s + spatialExtent.extentCrs.userFriendlyIdentifier() + u
" - "_s;
177 if ( spatialExtent.extentCrs.isGeographic() )
178 myMetadata += tr(
"Geographic" );
180 myMetadata += tr(
"Projected" );
181 myMetadata +=
"<br />"_L1;
182 myMetadata += u
"<strong>"_s + tr(
"X Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.xMinimum() ) + u
"<br />"_s;
183 myMetadata += u
"<strong>"_s + tr(
"Y Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.yMinimum() ) + u
"<br />"_s;
184 myMetadata += u
"<strong>"_s + tr(
"X Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.xMaximum() ) + u
"<br />"_s;
185 myMetadata += u
"<strong>"_s + tr(
"Y Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.yMaximum() ) + u
"<br />"_s;
186 if ( spatialExtent.bounds.zMinimum() || spatialExtent.bounds.zMaximum() )
188 myMetadata += u
"<strong>"_s + tr(
"Z Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.zMinimum() ) + u
"<br />"_s;
189 myMetadata += u
"<strong>"_s + tr(
"Z Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.zMaximum() );
193 myMetadata +=
"</td></tr>\n"_L1;
195 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Temporal Extent" ) + u
"</td><td>"_s;
196 const QList< QgsDateTimeRange > temporalExtents = extent.
temporalExtents();
202 myMetadata +=
"<br />\n"_L1;
204 if ( temporalExtent.isInstant() )
206 myMetadata += u
"<strong>"_s + tr(
"Instant:" ) + u
" </strong>"_s + temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate );
210 myMetadata += u
"<strong>"_s + tr(
"Start:" ) + u
" </strong>"_s + temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) + u
"<br />\n"_s;
211 myMetadata += u
"<strong>"_s + tr(
"End:" ) + u
" </strong>"_s + temporalExtent.end().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate );
215 myMetadata +=
"</td></tr>\n"_L1;
216 myMetadata +=
"</table>\n"_L1;
222 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
225 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Identifier" ) + u
"</td><td>"_s + mMetadata.identifier() + u
"</td></tr>\n"_s;
228 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Parent Identifier" ) + u
"</td><td>"_s + mMetadata.parentIdentifier() + u
"</td></tr>\n"_s;
231 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Title" ) + u
"</td><td>"_s + mMetadata.title() + u
"</td></tr>\n"_s;
234 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Type" ) + u
"</td><td>"_s + mMetadata.type() + u
"</td></tr>\n"_s;
237 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Language" ) + u
"</td><td>"_s + mMetadata.language() + u
"</td></tr>\n"_s;
240 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Abstract" ) + u
"</td><td>"_s +
QgsStringUtils::insertLinks( mMetadata.abstract() ).replace(
'\n',
"<br>"_L1 ) + u
"</td></tr>\n"_s;
243 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Categories" ) + u
"</td><td>"_s + mMetadata.categories().join(
", "_L1 ) + u
"</td></tr>\n"_s;
246 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Keywords" ) + u
"</td><td>\n"_s;
247 QMapIterator<QString, QStringList> i( mMetadata.keywords() );
250 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
251 myMetadata +=
"<tr><th>"_L1 + tr(
"Vocabulary" ) +
"</th><th>"_L1 + tr(
"Items" ) +
"</th></tr>\n"_L1;
253 while ( i.hasNext() )
258 rowClass = u
"class=\"odd-row\""_s;
259 myMetadata +=
"<tr "_L1 + rowClass +
"><td>"_L1 + i.key() +
"</td><td>"_L1 + i.value().join(
", "_L1 ) +
"</td></tr>\n"_L1;
262 myMetadata +=
"</table>\n"_L1;
264 myMetadata +=
"</td></tr>\n"_L1;
265 myMetadata +=
"</table>\n"_L1;
272 const QStringList historyItems = mMetadata.history();
273 if ( historyItems.isEmpty() )
275 myMetadata += u
"<p>"_s + tr(
"No history yet." ) + u
"</p>\n"_s;
279 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
280 myMetadata +=
"<tr><th>"_L1 + tr(
"ID" ) +
"</th><th>"_L1 + tr(
"Action" ) +
"</th></tr>\n"_L1;
282 for (
const QString &history : historyItems )
286 rowClass = u
"class=\"odd-row\""_s;
287 myMetadata +=
"<tr "_L1 + rowClass +
"><td width=\"5%\">"_L1 + QString::number( i ) +
"</td><td>"_L1 +
QgsStringUtils::insertLinks( history ) +
"</td></tr>\n"_L1;
290 myMetadata +=
"</table>\n"_L1;
298 const QList<QgsAbstractMetadataBase::Link> &links = mMetadata.links();
299 if ( links.isEmpty() )
301 myMetadata += u
"<p>"_s + tr(
"No links yet." ) + u
"</p>\n"_s;
305 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
306 myMetadata +=
"<tr><th>"_L1
315 + tr(
"Description" )
328 rowClass = u
"class=\"odd-row\""_s;
329 myMetadata +=
"<tr "_L1
332 + QString::number( i )
337 + u
"</td><td><a href=\"%1\">%1</a></td><td>"_s.arg( link.url )
348 myMetadata +=
"</table>\n"_L1;
static QString insertLinks(const QString &string, bool *foundLinks=nullptr)
Returns a string with any URL (e.g., http(s)/ftp) and mailto: text converted to valid HTML <a ....
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.