You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
6.8 KiB
213 lines
6.8 KiB
/*************************************************************************** |
|
* Copyright (C) 2008 by Pino Toscano <pino@kde.org> * |
|
* Copyright (C) 2008 by Harri Porten <porten@kde.org> * |
|
* * |
|
* This program is free software; you can redistribute it and/or modify * |
|
* it under the terms of the GNU General Public License as published by * |
|
* the Free Software Foundation; either version 2 of the License, or * |
|
* (at your option) any later version. * |
|
***************************************************************************/ |
|
|
|
#include "kjs_util_p.h" |
|
|
|
#include <kjs/kjsobject.h> |
|
#include <kjs/kjsprototype.h> |
|
#include <kjs/kjsarguments.h> |
|
|
|
#include <QUrl> |
|
#include <QLocale> |
|
#include <QDebug> |
|
#include <QRegularExpression> |
|
#include <QDateTime> |
|
|
|
#include <cmath> |
|
|
|
using namespace Okular; |
|
|
|
static KJSPrototype *g_utilProto; |
|
|
|
static KJSObject crackURL( KJSContext *context, void *, |
|
const KJSArguments &arguments ) |
|
{ |
|
if ( arguments.count() < 1 ) |
|
{ |
|
return context->throwException( QStringLiteral("Missing URL argument") ); |
|
} |
|
QString cURL = arguments.at( 0 ).toString( context ); |
|
QUrl url(QUrl::fromLocalFile(cURL) ); |
|
if ( !url.isValid() ) |
|
{ |
|
return context->throwException( QStringLiteral("Invalid URL") ); |
|
} |
|
if ( url.scheme() != QLatin1String( "file" ) |
|
|| url.scheme() != QLatin1String( "http" ) |
|
|| url.scheme() != QLatin1String( "https" ) ) |
|
{ |
|
return context->throwException( QStringLiteral("Protocol not valid: '") + url.scheme() + QLatin1Char('\'') ); |
|
} |
|
|
|
KJSObject obj; |
|
obj.setProperty( context, QStringLiteral("cScheme"), url.scheme() ); |
|
if ( !url.userName().isEmpty() ) |
|
obj.setProperty( context, QStringLiteral("cUser"), url.userName() ); |
|
if ( !url.password().isEmpty() ) |
|
obj.setProperty( context, QStringLiteral("cPassword"), url.password() ); |
|
obj.setProperty( context, QStringLiteral("cHost"), url.host() ); |
|
obj.setProperty( context, QStringLiteral("nPort"), url.port( 80 ) ); |
|
// TODO cPath (Optional) The path portion of the URL. |
|
// TODO cParameters (Optional) The parameter string portion of the URL. |
|
if ( url.hasFragment() ) |
|
obj.setProperty( context, QStringLiteral("cFragments"), url.fragment(QUrl::FullyDecoded) ); |
|
|
|
return obj; |
|
} |
|
|
|
static KJSObject printd( KJSContext *context, void *, |
|
const KJSArguments &arguments ) |
|
{ |
|
if ( arguments.count() < 2 ) |
|
{ |
|
return context->throwException( QStringLiteral("Invalid arguments") ); |
|
} |
|
|
|
KJSObject oFormat = arguments.at( 0 ); |
|
QString format; |
|
QLocale defaultLocale; |
|
|
|
if( oFormat.isNumber() ) |
|
{ |
|
int formatType = oFormat.toInt32( context ); |
|
switch( formatType ) |
|
{ |
|
case 0: |
|
format = QStringLiteral( "D:yyyyMMddHHmmss" ); |
|
break; |
|
case 1: |
|
format = QStringLiteral( "yyyy.MM.dd HH:mm:ss"); |
|
break; |
|
case 2: |
|
format = defaultLocale.dateTimeFormat( QLocale::ShortFormat ); |
|
if( !format.contains( QStringLiteral( "ss" ) ) ) |
|
format.insert( format.indexOf( QStringLiteral( "mm" ) ) + 2, QStringLiteral( ":ss" ) ); |
|
break; |
|
} |
|
} |
|
else |
|
{ |
|
format = arguments.at( 0 ).toString( context ).replace( QLatin1String("tt"), QLatin1String("ap") ); |
|
format.replace( 't', 'a' ); |
|
for( QChar &formatChar : format ) |
|
{ |
|
if( formatChar == 'M' ) |
|
formatChar = 'm'; |
|
else if( formatChar == 'm' ) |
|
formatChar = 'M'; |
|
} |
|
} |
|
|
|
QLocale locale( QStringLiteral("en_US") ); |
|
const QStringList str = arguments.at( 1 ).toString( context ).split( QRegularExpression( QStringLiteral("\\W") ) ); |
|
QString myStr = QStringLiteral( "%1/%2/%3 %4:%5:%6" ).arg( str[1], str[2], str[3], str[4], str[5], str[6] ); |
|
QDateTime date = locale.toDateTime( myStr, QStringLiteral( "MMM/d/yyyy H:m:s" ) ); |
|
|
|
|
|
return KJSString( defaultLocale.toString( date, format ) ); |
|
} |
|
|
|
/** Converts a Number to a String using l10n |
|
* |
|
* String numberToString( Number number, String format = 'g', int precision = 6, |
|
* String LocaleName = system ) |
|
*/ |
|
static KJSObject numberToString ( KJSContext *context, void *, |
|
const KJSArguments &arguments ) |
|
{ |
|
if ( arguments.count() < 1 ) |
|
{ |
|
return context->throwException( QStringLiteral( "Invalid arguments" ) ); |
|
} |
|
|
|
const double number = arguments.at( 0 ).toNumber( context ); |
|
if ( std::isnan( number ) ) |
|
{ |
|
return KJSString( "NaN" ); |
|
} |
|
|
|
QChar format = QLatin1Char( 'g' ); |
|
if ( arguments.count() >= 2 ) |
|
{ |
|
const QString fmt = arguments.at( 1 ).toString( context ); |
|
if ( !fmt.isEmpty() ) |
|
{ |
|
format = fmt[0]; |
|
} |
|
} |
|
|
|
int precision = 6; |
|
if ( arguments.count() >= 3 ) |
|
{ |
|
precision = arguments.at( 2 ).toInt32( context ); |
|
} |
|
|
|
QLocale locale; |
|
if ( arguments.count() == 4 ) |
|
{ |
|
locale = QLocale( arguments.at( 3 ).toString( context ) ); |
|
} |
|
|
|
return KJSString( locale.toString( number, format.toLatin1(), precision ) ); |
|
} |
|
|
|
/** Converts a String to a Number using l10n. |
|
* |
|
* Number stringToNumber( String number, String LocaleName = system ) */ |
|
static KJSObject stringToNumber ( KJSContext *context, void *, |
|
const KJSArguments &arguments ) |
|
{ |
|
if ( arguments.count() < 1 ) |
|
{ |
|
return context->throwException( QStringLiteral( "Invalid arguments" ) ); |
|
} |
|
|
|
const QString number = arguments.at( 0 ).toString( context ); |
|
if ( number.isEmpty() ) |
|
{ |
|
return KJSNumber( 0 ); |
|
} |
|
|
|
QLocale locale; |
|
if ( arguments.count() == 2 ) |
|
{ |
|
locale = QLocale( arguments.at( 1 ).toString( context ) ); |
|
} |
|
|
|
bool ok; |
|
const double converted = locale.toDouble( number, &ok ); |
|
|
|
if ( !ok ) |
|
{ |
|
return KJSNumber( std::nan( "" ) ); |
|
} |
|
|
|
return KJSNumber( converted ); |
|
} |
|
|
|
void JSUtil::initType( KJSContext *ctx ) |
|
{ |
|
static bool initialized = false; |
|
if ( initialized ) |
|
return; |
|
initialized = true; |
|
|
|
g_utilProto = new KJSPrototype(); |
|
g_utilProto->defineFunction( ctx, QStringLiteral("crackURL"), crackURL ); |
|
g_utilProto->defineFunction( ctx, QStringLiteral("printd"), printd ); |
|
g_utilProto->defineFunction( ctx, QStringLiteral("stringToNumber"), stringToNumber ); |
|
g_utilProto->defineFunction( ctx, QStringLiteral("numberToString"), numberToString ); |
|
} |
|
|
|
KJSObject JSUtil::object( KJSContext *ctx ) |
|
{ |
|
return g_utilProto->constructObject( ctx, nullptr ); |
|
} |
|
|
|
|