[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [publictransport] engine/timetablemate/src: Update script template, add HAFAS script template
From: Friedrich_Karl_Tilman_Pülz <fpuelz () gmx ! de>
Date: 2012-11-30 20:36:57
Message-ID: 20121130203657.AC286A60DD () git ! kde ! org
[Download RAW message or body]
Git commit b6ee3ec0f2225b74089852d50eb681d4dae7dc1a by Friedrich Karl Tilman Pülz.
Committed on 28/11/2012 at 18:48.
Pushed by fkpulz into branch 'master'.
Update script template, add HAFAS script template
Use available information from the project for templates,
eg. the provider ID and the author name.
M +145 -19 engine/timetablemate/src/project.cpp
M +3 -2 engine/timetablemate/src/project.h
http://commits.kde.org/publictransport/b6ee3ec0f2225b74089852d50eb681d4dae7dc1a
diff --git a/engine/timetablemate/src/project.cpp \
b/engine/timetablemate/src/project.cpp index a157e04..ada5f95 100644
--- a/engine/timetablemate/src/project.cpp
+++ b/engine/timetablemate/src/project.cpp
@@ -161,12 +161,17 @@ public:
#ifdef BUILD_PROVIDER_TYPE_SCRIPT
static QString scriptTemplateText( Project::ScriptTemplateType templateType
- = Project::DefaultScriptTemplate )
+ = Project::DefaultScriptTemplate,
+ const ServiceProviderData *data = 0 )
{
+ // Insert provider ID and author if available, otherwise insert template \
placeholders + const QString providerId = data && !data->id().isEmpty()
+ ? data->url() : "${Service Provider}";
+ const QString author = data && !data->author().isEmpty() ? data->author() : \
"${Author}"; QString templateText = QString::fromUtf8(
- "/** Service provider plugin for ${Service Provider}\n"
- " * © ${year}, ${Author} */\n"
- "\n" );
+ "/** Service provider plugin for %1\n"
+ " * © %2, %3 */\n"
+ "\n").arg(providerId).arg(QDate::currentDate().year()).arg(author);
switch ( templateType ) {
case Project::ScriptRubyTemplate:
@@ -201,13 +206,21 @@ public:
break;
case Project::ScriptQtScriptTemplate:
templateText +=
- // TODO
"\n// This function gets called to determine the features of the \
service provider\n"
- "function features() {\n" // TODO
- " // Return a list of TimetableInformation values, that are \
used by this script.\n"
- " // Required values like DepartureDateTime/DepartureTime or \
TypeOfVehicle\n"
- " // are not needed here\n"
- " return [ 'Arrivals', 'StopID', 'RouteStops' ];\n"
+ "function features() {\n"
+ " // Return a list of ProviderFeature's, that are supported \
by this script.\n" + " // Some features like ProvidesDepartures \
are recognized automatically\n" + " // by implementing the \
associated script function\n" + " return [ \
PublicTransport.ProvidesArrivals,\n" + " \
PublicTransport.ProvidesDelays,\n" + " \
PublicTransport.ProvidesNews,\n" + " \
PublicTransport.ProvidesPlatform,\n" + " \
PublicTransport.ProvidesStopID,\n" + " \
PublicTransport.ProvidesStopGeoPosition,\n" + " \
PublicTransport.ProvidesStopsByGeoPosition,\n" + " \
PublicTransport.ProvidesPricing,\n" + " \
PublicTransport.ProvidesRouteInformation,\n" + " \
PublicTransport.ProvidesMoreJourneys ];\n" "}\n"
"\n"
"// This function gets called when departures/arrivals are \
requested\n" @@ -235,15 +248,25 @@ public:
"// This function is connected to the finished signal of network \
requests\n" "// started in getTimetable()\n"
"function parseTimetable( html, hasError, errorString ) {\n"
- " // TODO: Parse the contents of the received document and \
add results \n"
- " // using result.addData()\n"
+ " if ( hasError ) {\n"
+ " // The network request failed,\n"
+ " // if the script has no other way to get the timetable \
data\n" + " // an error should be thrown like here:\n"
+ " throw Error( errorString );\n"
+ " }\n"
+ "\n"
+ " // Decode the received document\n"
+ " html = helper.decode( html, \"utf8\" );\n"
+ "\n"
+ " // TODO: Parse the contents of the document and add found \
timetable items\n" + " // to the result set using \
result.addData()\n"
" // Use helper.findHtmlTags(), helper.findFirstHtmlTag() or \
\n"
" // helper.findNamedHtmlTags() to parse HTML documents (see \
documentation)\n" " ${cursor}\n"
"}\n"
"\n"
"// This function gets called when stop suggestions are \
requested\n"
- "function getStopSuggestions( values ) {\n"
+ "function getStopSuggestions( values ) {\n"
" // Construct an URL from the given values\n"
" var url = \"http://www.page.com?stop=\" + values.stop;\n"
"\n"
@@ -252,6 +275,9 @@ public:
"\n"
" // Check if the download was completed successfully\n"
" if ( !network.lastDownloadAborted ) {\n"
+ " // Decode the received document\n"
+ " html = helper.decode( html, \"utf8\" );\n"
+ "\n"
" // TODO: Find all stop suggestions\n"
" result.addData({ StopName: \"Test-Stop\",\n"
" StopID: \"123\",\n"
@@ -263,6 +289,102 @@ public:
"}\n"
"\n"
"// TODO: To parse journeys implement getJourneys()\n";
+ break;
+ case Project::ScriptQtScriptHafasTemplate:
+ templateText +=
+ "\n// Include the base script for HAFAS providers\n"
+ "include(\"base_hafas.js\");\n"
+ "\n"
+ "// Create instance of the Hafas class (from the base HAFAS \
script).\n" + "// Some available options are shown below, but are \
commented, because they\n" + "// are optional and use the default \
values. Uncomment and change the values\n" + "// to use those \
options. See \"base_hafas.js\" for more information.\n" + "var \
hafas = Hafas({\n" + " baseUrl: \"${Base URL}\", // The base \
HAFAS API URL excluding '/bin/...'\n" + "// binDir: \"bin\", // \
The relative path to add to baseUrl to get the \n" + " \
// binary API URL, \"bin\" is the default.\n" + "// \
programExtension: \"exe\", // The extension to add to HAFAS programs\n" + \
" // eg. 'stboard', \"exe\" is the default.'\n" + "// \
language: \"d\", // One character identifying the language to request,\n" + \
" // the default is 'd' for german, as most HAFAS providers are\n" + \
" // for germany. Use eg. 'e' for english, 's' for swedish, etc.\n" + \
"// urlDateFormat: \"dd.MM.yy\", // Format of dates in URLs,\n" + \
" // 'dd.MM.yy' is the default.'\n" + "// \
urlTimeFormat: \"hh:mm\", // Format of times in URLs,\n" + " \
// 'hh:mm' is the default.'\n" + "// xmlDateFormat: \
\"dd.MM.yy\", // Format of dates in received XML\n" + " \
// documents, 'dd.MM.yy' is the default.'\n" + "// \
xmlTimeFormat: \"hh:mm\", // Format of times in received XML documents,\n" + \
" // 'hh:mm' is the default.'\n" + "// format: \
Hafas.XmlFormat // Default format of received documents,\n" + " \
// this determines the parser function to use\n" + "});\n"
+ "\n"
+ "// To remove a feature from eg. the departure/arrival \
processor, because the\n" + "// provider does not support the \
required parts of the HAFAS API\n" + "// use code like this:\n"
+ "// hafas.timetable.removeFeature( \
PublicTransport.ProvidesArrivals );\n" + "\n"
+ "// This function gets called to determine the features of the \
service provider.\n" + "// The features supported by the HAFAS \
base script can be concatenated like\n" + "// shown below.\n"
+ "function features() {\n"
+ " return hafas.stopSuggestions.features.concat(\n"
+ " hafas.timetable.features,\n"
+ " hafas.timetable.additionalData.features,\n"
+ " hafas.journeys.features );\n"
+ "}\n"
+ "\n"
+ "// The script functions can directly use implementations from \
the base HAFAS\n" + "// script. These get() functions will \
generate an URL, download it and then\n" + "// parse the received \
document using the parser specified by the 'format'\n" + "// \
option. The get() functions also accept an options argument, which will\n" + \
"// overwrite global options given in the Hafas constructor.\n" + \
"var getStopSuggestions = hafas.stopSuggestions.get;\n" + "var \
getTimetable = hafas.timetable.get;\n" + "var getAdditionalData = \
hafas.timetable.additionalData.get;\n" + "var getJourneys = \
hafas.journeys.get;\n" + "\n"
+ "// The default format for additional timetable data, that can \
be downloaded\n" + "// later is Hafas.HtmlMobileFormat \
(hafas.timetable.additionalData.format).\n" + "// Uncomment the \
following line to change the format to eg. plain text:\n" + "// \
hafas.timetable.additionalData.format = Hafas.TextFormat;\n" + "// \
You can implement a parser function for each available format, eg.\n" + \
"// parseText() for TextFormat, parseXml() for XmlFormat, parseHtml() for \n" + \
"// HtmlFormat, etc.\n" + "// Standard formats like XML are \
supported by the base HAFAS script.\n" + "// Add implementations \
of route data parser functions for non-standard formats\n" + "// \
to hafas.routeData.parser. It gets used to parse the document at the found\n" + \
"// RouteDataUrl.\n" + "hafas.timetable.parser.parseHtmlMobile = \
function( html, hasError, errorString ) {\n" + " if ( hasError \
) {\n" + " throw Error( errorString );\n"
+ " }\n"
+ " if ( html.length == 0 ) {\n"
+ " throw Error(\"parseTimetableMobile(): Received HTML \
document is empty\");\n" + " }\n"
+ "\n"
+ " Decode the received document, TODO: Use correct encoding\n"
+ " html = helper.decode( html, \"latin1\" );\n"
+ "\n"
+ " // Initialize return value\n"
+ " var departures = [];\n"
+ "\n"
+ " // TODO: Implement code that parses the (mobile) HTML \
document,\n" + " // only the shown data needs to be added, but \
it must equal the data\n" + " // that was read from the XML \
HAFAS format, because the RouteDataUrl\n" + " // gets \
associated with the already received timetable item that matches\n" + \
" // the data found here:\n" + " var departure = { \
RouteDataUrl: \"traininfo.exe-URL\",\n" + " \
TransportLine: \"Test-Line\",\n" + " Target: \
\"Test-Target\",\n" + " DepartureDateTime: \
new Date() };\n" + "\n"
+ " departures.push( departure );\n"
+ " return departures;\n"
+ "}\n"
+ "\n";
+ break;
default:
break;
}
@@ -938,7 +1060,7 @@ public:
if ( templateInterface ) {
// Insert a template with author information
templateInterface->insertTemplateText( KTextEditor::Cursor(),
- scriptTemplateText(templateType), QMap<QString, QString>() );
+ scriptTemplateText(templateType, data()), QMap<QString, \
QString>() ); }
};
#endif
@@ -5095,9 +5217,10 @@ QIcon Project::scriptIcon() const
}
#ifdef BUILD_PROVIDER_TYPE_SCRIPT
-QString Project::scriptTemplateText( ScriptTemplateType templateType )
+QString Project::scriptTemplateText( ScriptTemplateType templateType,
+ const ServiceProviderData *data )
{
- return ProjectPrivate::scriptTemplateText( templateType );
+ return ProjectPrivate::scriptTemplateText( templateType, data );
}
void Project::scriptAdded( const QString &fileName )
@@ -5563,7 +5686,7 @@ void Project::showSettingsDialog( QWidget *parent )
if ( dialog->newScriptTemplateType() != Project::NoScriptTemplate ) {
// A new script file was set in the dialog
// Load the chosen template
- setScriptText( \
Project::scriptTemplateText(dialog->newScriptTemplateType()) ); + \
setScriptText( Project::scriptTemplateText(dialog->newScriptTemplateType(), \
d->data()) ); }
#endif
}
@@ -5755,7 +5878,8 @@ Project::ScriptTemplateType \
Project::getScriptTemplateTypeInput( QWidget *parent bool ok;
QStringList templates;
parent = d->parentWidget( parent );
- templates << i18nc("@info/plain", "Complete JavaScript Template")
+ templates << i18nc("@info/plain", "JavaScript Template")
+ << i18nc("@info/plain", "JavaScript HAFAS Template")
<< i18nc("@info/plain", "Simple Ruby Template")
<< i18nc("@info/plain", "Simple Python Template");
const QString scriptType = KInputDialog::getItem(
@@ -5770,8 +5894,10 @@ Project::ScriptTemplateType \
Project::getScriptTemplateTypeInput( QWidget *parent if( selectedTemplate == 0 ) {
return ScriptQtScriptTemplate;
} else if( selectedTemplate == 1 ) {
- return ScriptRubyTemplate;
+ return ScriptQtScriptHafasTemplate;
} else if( selectedTemplate == 2 ) {
+ return ScriptRubyTemplate;
+ } else if( selectedTemplate == 3 ) {
return ScriptPythonTemplate;
} else {
kWarning() << "Unexpected script type" << scriptType;
diff --git a/engine/timetablemate/src/project.h b/engine/timetablemate/src/project.h
index bbf1439..3196bcb 100644
--- a/engine/timetablemate/src/project.h
+++ b/engine/timetablemate/src/project.h
@@ -193,7 +193,7 @@ public:
NoScriptTemplate = 0,
ScriptQtScriptTemplate, /**< A template for script content written in \
QtScript. */
ScriptQtScriptHafasTemplate, /**< A template for script content written in \
QtScript,
- * using the base HAFAS script. */ // TODO
+ * using the base HAFAS script. */
ScriptRubyTemplate, /**< A template for script content written in ruby. */
ScriptPythonTemplate, /**< A template for script content written in python. \
*/
@@ -773,7 +773,8 @@ public:
#ifdef BUILD_PROVIDER_TYPE_SCRIPT
/** @brief Get the script template text for @p templateType. */
Q_INVOKABLE static QString scriptTemplateText(
- ScriptTemplateType templateType = DefaultScriptTemplate );
+ ScriptTemplateType templateType = DefaultScriptTemplate,
+ const ServiceProviderData *data = 0 );
#endif
/**
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic