22#include <QStringBuilder>
24using namespace Qt::StringLiterals;
27 : mMetadata( metadata )
33 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
34 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Fees" ) + u
"</td><td>"_s +
QgsStringUtils::insertLinks( mMetadata.fees() ) + u
"</td></tr>\n"_s;
35 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;
36 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;
37 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Constraints" ) + u
"</td><td>"_s;
38 const QList<QgsLayerMetadata::Constraint> &constraints = mMetadata.constraints();
39 bool notFirstRow =
false;
44 myMetadata +=
"<br />"_L1;
49 myMetadata +=
"</td></tr>\n"_L1;
50 myMetadata +=
"</table>\n"_L1;
56 const QList<QgsAbstractMetadataBase::Contact> &contacts = mMetadata.contacts();
58 if ( contacts.isEmpty() )
60 myMetadata += u
"<p>"_s + tr(
"No contact yet." ) + u
"</p>"_s;
64 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
65 myMetadata +=
"<tr><th>"_L1 + tr(
"ID" ) +
"</th><th>"_L1 + tr(
"Name" ) +
"</th><th>"_L1 + tr(
"Position" ) +
"</th><th>"_L1 + tr(
"Organization" ) +
"</th><th>"_L1 + tr(
"Role" ) +
"</th><th>"_L1 + tr(
"Email" ) +
"</th><th>"_L1 + tr(
"Voice" ) +
"</th><th>"_L1 + tr(
"Fax" ) +
"</th><th>"_L1 + tr(
"Addresses" ) +
"</th></tr>\n"_L1;
71 rowClass = u
"class=\"odd-row\""_s;
72 myMetadata +=
"<tr "_L1 + rowClass +
"><td>"_L1 + QString::number( i ) +
"</td><td>"_L1 + contact.name +
"</td><td>"_L1 + contact.position +
"</td><td>"_L1 + contact.organization +
"</td><td>"_L1 + contact.role + u
"</td><td><a href=\"mailto:%1\">%1</a></td><td>"_s.arg( contact.email ) + contact.voice +
"</td><td>"_L1 + contact.fax +
"</td><td>"_L1;
73 bool notFirstRow =
false;
78 myMetadata +=
"<br />\n"_L1;
80 if ( ! oneAddress.
type.isEmpty() )
82 myMetadata += oneAddress.
type + u
"<br />"_s;
84 if ( ! oneAddress.
address.isEmpty() )
86 myMetadata += oneAddress.
address + u
"<br />"_s;
90 myMetadata += oneAddress.
postalCode + u
"<br />"_s;
92 if ( ! oneAddress.
city.isEmpty() )
94 myMetadata += oneAddress.
city + u
"<br />"_s;
100 if ( ! oneAddress.
country.isEmpty() )
102 myMetadata += oneAddress.
country;
106 myMetadata +=
"</td></tr>\n"_L1;
109 myMetadata +=
"</table>\n"_L1;
117 bool notFirstRow =
false;
118 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
119 if ( showSpatialExtent )
121 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"CRS" ) + u
"</td><td>"_s;
122 if ( mMetadata.crs().isValid() )
124 myMetadata += mMetadata.crs().userFriendlyIdentifier() + u
" - "_s;
125 if ( mMetadata.crs().isGeographic() )
126 myMetadata += tr(
"Geographic" );
128 myMetadata += tr(
"Projected" );
130 myMetadata +=
"</td></tr>\n"_L1;
132 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Spatial Extent" ) + u
"</td><td>"_s;
133 const QList< QgsLayerMetadata::SpatialExtent > spatialExtents = extent.
spatialExtents();
136 if ( spatialExtent.bounds.isNull() || spatialExtent.bounds.toRectangle().isNull() )
141 myMetadata +=
"<br />\n"_L1;
143 myMetadata += u
"<strong>"_s + tr(
"CRS" ) + u
": </strong>"_s + spatialExtent.extentCrs.userFriendlyIdentifier() + u
" - "_s;
144 if ( spatialExtent.extentCrs.isGeographic() )
145 myMetadata += tr(
"Geographic" );
147 myMetadata += tr(
"Projected" );
148 myMetadata +=
"<br />"_L1;
149 myMetadata += u
"<strong>"_s + tr(
"X Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.xMinimum() ) + u
"<br />"_s;
150 myMetadata += u
"<strong>"_s + tr(
"Y Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.yMinimum() ) + u
"<br />"_s;
151 myMetadata += u
"<strong>"_s + tr(
"X Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.xMaximum() ) + u
"<br />"_s;
152 myMetadata += u
"<strong>"_s + tr(
"Y Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.yMaximum() ) + u
"<br />"_s;
153 if ( spatialExtent.bounds.zMinimum() || spatialExtent.bounds.zMaximum() )
155 myMetadata += u
"<strong>"_s + tr(
"Z Minimum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.zMinimum() ) + u
"<br />"_s;
156 myMetadata += u
"<strong>"_s + tr(
"Z Maximum:" ) + u
" </strong>"_s +
qgsDoubleToString( spatialExtent.bounds.zMaximum() );
160 myMetadata +=
"</td></tr>\n"_L1;
162 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Temporal Extent" ) + u
"</td><td>"_s;
163 const QList< QgsDateTimeRange > temporalExtents = extent.
temporalExtents();
169 myMetadata +=
"<br />\n"_L1;
171 if ( temporalExtent.isInstant() )
173 myMetadata += u
"<strong>"_s + tr(
"Instant:" ) + u
" </strong>"_s + temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate );
177 myMetadata += u
"<strong>"_s + tr(
"Start:" ) + u
" </strong>"_s + temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) + u
"<br />\n"_s;
178 myMetadata += u
"<strong>"_s + tr(
"End:" ) + u
" </strong>"_s + temporalExtent.end().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate );
182 myMetadata +=
"</td></tr>\n"_L1;
183 myMetadata +=
"</table>\n"_L1;
189 QString myMetadata = u
"<table class=\"list-view\">\n"_s;
192 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Identifier" ) + u
"</td><td>"_s + mMetadata.identifier() + u
"</td></tr>\n"_s;
195 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Parent Identifier" ) + u
"</td><td>"_s + mMetadata.parentIdentifier() + u
"</td></tr>\n"_s;
198 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Title" ) + u
"</td><td>"_s + mMetadata.title() + u
"</td></tr>\n"_s;
201 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Type" ) + u
"</td><td>"_s + mMetadata.type() + u
"</td></tr>\n"_s;
204 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Language" ) + u
"</td><td>"_s + mMetadata.language() + u
"</td></tr>\n"_s;
207 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;
210 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Categories" ) + u
"</td><td>"_s + mMetadata.categories().join(
", "_L1 ) + u
"</td></tr>\n"_s;
213 myMetadata += u
"<tr><td class=\"highlight\">"_s + tr(
"Keywords" ) + u
"</td><td>\n"_s;
214 QMapIterator<QString, QStringList> i( mMetadata.keywords() );
217 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
218 myMetadata +=
"<tr><th>"_L1 + tr(
"Vocabulary" ) +
"</th><th>"_L1 + tr(
"Items" ) +
"</th></tr>\n"_L1;
220 while ( i.hasNext() )
225 rowClass = u
"class=\"odd-row\""_s;
226 myMetadata +=
"<tr "_L1 + rowClass +
"><td>"_L1 + i.key() +
"</td><td>"_L1 + i.value().join(
", "_L1 ) +
"</td></tr>\n"_L1;
229 myMetadata +=
"</table>\n"_L1;
231 myMetadata +=
"</td></tr>\n"_L1;
232 myMetadata +=
"</table>\n"_L1;
239 const QStringList historyItems = mMetadata.history();
240 if ( historyItems.isEmpty() )
242 myMetadata += u
"<p>"_s + tr(
"No history yet." ) + u
"</p>\n"_s;
246 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
247 myMetadata +=
"<tr><th>"_L1 + tr(
"ID" ) +
"</th><th>"_L1 + tr(
"Action" ) +
"</th></tr>\n"_L1;
249 for (
const QString &history : historyItems )
253 rowClass = u
"class=\"odd-row\""_s;
254 myMetadata +=
"<tr "_L1 + rowClass +
"><td width=\"5%\">"_L1 + QString::number( i ) +
"</td><td>"_L1 +
QgsStringUtils::insertLinks( history ) +
"</td></tr>\n"_L1;
257 myMetadata +=
"</table>\n"_L1;
265 const QList<QgsAbstractMetadataBase::Link> &links = mMetadata.links();
266 if ( links.isEmpty() )
268 myMetadata += u
"<p>"_s + tr(
"No links yet." ) + u
"</p>\n"_s;
272 myMetadata +=
"<table width=\"100%\" class=\"tabular-view\">\n"_L1;
273 myMetadata +=
"<tr><th>"_L1 + tr(
"ID" ) +
"</th><th>"_L1 + tr(
"Name" ) +
"</th><th>"_L1 + tr(
"Type" ) +
"</th><th>"_L1 + tr(
"URL" ) +
"</th><th>"_L1 + tr(
"Description" ) +
"</th><th>"_L1 + tr(
"Format" ) +
"</th><th>"_L1 + tr(
"MIME Type" ) +
"</th><th>"_L1 + tr(
"Size" ) +
"</th></tr>\n"_L1;
279 rowClass = u
"class=\"odd-row\""_s;
280 myMetadata +=
"<tr "_L1 + rowClass +
"><td>"_L1 + QString::number( i ) +
"</td><td>"_L1 + link.name +
"</td><td>"_L1 + link.type + u
"</td><td><a href=\"%1\">%1</a></td><td>"_s.arg( link.url ) + link.description +
"</td><td>"_L1 + link.format +
"</td><td>"_L1 + link.mimeType +
"</td><td>"_L1 + link.size +
"</td></tr>\n"_L1;
283 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.